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