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