1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _NET_GARP_H
3 #define _NET_GARP_H
4 
5 #include <linux/if_ether.h>
6 #include <linux/types.h>
7 #include <net/stp.h>
8 
9 #define GARP_PROTOCOL_ID	0x1
10 #define GARP_END_MARK		0x0
11 
12 struct garp_pdu_hdr {
13 	__be16	protocol;
14 };
15 
16 struct garp_msg_hdr {
17 	u8	attrtype;
18 };
19 
20 enum garp_attr_event {
21 	GARP_LEAVE_ALL,
22 	GARP_JOIN_EMPTY,
23 	GARP_JOIN_IN,
24 	GARP_LEAVE_EMPTY,
25 	GARP_LEAVE_IN,
26 	GARP_EMPTY,
27 };
28 
29 struct garp_attr_hdr {
30 	u8	len;
31 	u8	event;
32 	u8	data[];
33 };
34 
35 struct garp_skb_cb {
36 	u8	cur_type;
37 };
38 
garp_cb(struct sk_buff * skb)39 static inline struct garp_skb_cb *garp_cb(struct sk_buff *skb)
40 {
41 	BUILD_BUG_ON(sizeof(struct garp_skb_cb) >
42 		     sizeof_field(struct sk_buff, cb));
43 	return (struct garp_skb_cb *)skb->cb;
44 }
45 
46 enum garp_applicant_state {
47 	GARP_APPLICANT_INVALID,
48 	GARP_APPLICANT_VA,
49 	GARP_APPLICANT_AA,
50 	GARP_APPLICANT_QA,
51 	GARP_APPLICANT_LA,
52 	GARP_APPLICANT_VP,
53 	GARP_APPLICANT_AP,
54 	GARP_APPLICANT_QP,
55 	GARP_APPLICANT_VO,
56 	GARP_APPLICANT_AO,
57 	GARP_APPLICANT_QO,
58 	__GARP_APPLICANT_MAX
59 };
60 #define GARP_APPLICANT_MAX	(__GARP_APPLICANT_MAX - 1)
61 
62 enum garp_event {
63 	GARP_EVENT_REQ_JOIN,
64 	GARP_EVENT_REQ_LEAVE,
65 	GARP_EVENT_R_JOIN_IN,
66 	GARP_EVENT_R_JOIN_EMPTY,
67 	GARP_EVENT_R_EMPTY,
68 	GARP_EVENT_R_LEAVE_IN,
69 	GARP_EVENT_R_LEAVE_EMPTY,
70 	GARP_EVENT_TRANSMIT_PDU,
71 	__GARP_EVENT_MAX
72 };
73 #define GARP_EVENT_MAX		(__GARP_EVENT_MAX - 1)
74 
75 enum garp_action {
76 	GARP_ACTION_NONE,
77 	GARP_ACTION_S_JOIN_IN,
78 	GARP_ACTION_S_LEAVE_EMPTY,
79 };
80 
81 struct garp_attr {
82 	struct rb_node			node;
83 	enum garp_applicant_state	state;
84 	u8				type;
85 	u8				dlen;
86 	unsigned char			data[];
87 };
88 
89 enum garp_applications {
90 	GARP_APPLICATION_GVRP,
91 	__GARP_APPLICATION_MAX
92 };
93 #define GARP_APPLICATION_MAX	(__GARP_APPLICATION_MAX - 1)
94 
95 struct garp_application {
96 	enum garp_applications	type;
97 	unsigned int		maxattr;
98 	struct stp_proto	proto;
99 };
100 
101 struct garp_applicant {
102 	struct garp_application	*app;
103 	struct net_device	*dev;
104 	struct timer_list	join_timer;
105 
106 	spinlock_t		lock;
107 	struct sk_buff_head	queue;
108 	struct sk_buff		*pdu;
109 	struct rb_root		gid;
110 	struct rcu_head		rcu;
111 };
112 
113 struct garp_port {
114 	struct garp_applicant __rcu	*applicants[GARP_APPLICATION_MAX + 1];
115 	struct rcu_head			rcu;
116 };
117 
118 int garp_register_application(struct garp_application *app);
119 void garp_unregister_application(struct garp_application *app);
120 
121 int garp_init_applicant(struct net_device *dev, struct garp_application *app);
122 void garp_uninit_applicant(struct net_device *dev,
123 			   struct garp_application *app);
124 
125 int garp_request_join(const struct net_device *dev,
126 		      const struct garp_application *app, const void *data,
127 		      u8 len, u8 type);
128 void garp_request_leave(const struct net_device *dev,
129 			const struct garp_application *app,
130 			const void *data, u8 len, u8 type);
131 
132 #endif /* _NET_GARP_H */
133