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