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
12struct garp_pdu_hdr {
13	__be16	protocol;
14};
15
16struct garp_msg_hdr {
17	u8	attrtype;
18};
19
20enum 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
29struct garp_attr_hdr {
30	u8	len;
31	u8	event;
32	u8	data[];
33};
34
35struct garp_skb_cb {
36	u8	cur_type;
37};
38
39static 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
46enum 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
62enum 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
75enum garp_action {
76	GARP_ACTION_NONE,
77	GARP_ACTION_S_JOIN_IN,
78	GARP_ACTION_S_LEAVE_EMPTY,
79};
80
81struct 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
89enum garp_applications {
90	GARP_APPLICATION_GVRP,
91	__GARP_APPLICATION_MAX
92};
93#define GARP_APPLICATION_MAX	(__GARP_APPLICATION_MAX - 1)
94
95struct garp_application {
96	enum garp_applications	type;
97	unsigned int		maxattr;
98	struct stp_proto	proto;
99};
100
101struct 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
113struct garp_port {
114	struct garp_applicant __rcu	*applicants[GARP_APPLICATION_MAX + 1];
115	struct rcu_head			rcu;
116};
117
118int garp_register_application(struct garp_application *app);
119void garp_unregister_application(struct garp_application *app);
120
121int garp_init_applicant(struct net_device *dev, struct garp_application *app);
122void garp_uninit_applicant(struct net_device *dev,
123			   struct garp_application *app);
124
125int garp_request_join(const struct net_device *dev,
126		      const struct garp_application *app, const void *data,
127		      u8 len, u8 type);
128void 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