Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/net/garp.h
10817 views
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
9
struct garp_pdu_hdr {
10
__be16 protocol;
11
};
12
13
struct garp_msg_hdr {
14
u8 attrtype;
15
};
16
17
enum 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
26
struct garp_attr_hdr {
27
u8 len;
28
u8 event;
29
u8 data[];
30
};
31
32
struct garp_skb_cb {
33
u8 cur_type;
34
};
35
36
static 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
43
enum 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
59
enum 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
72
enum garp_action {
73
GARP_ACTION_NONE,
74
GARP_ACTION_S_JOIN_IN,
75
GARP_ACTION_S_LEAVE_EMPTY,
76
};
77
78
struct 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
86
enum garp_applications {
87
GARP_APPLICATION_GVRP,
88
__GARP_APPLICATION_MAX
89
};
90
#define GARP_APPLICATION_MAX (__GARP_APPLICATION_MAX - 1)
91
92
struct garp_application {
93
enum garp_applications type;
94
unsigned int maxattr;
95
struct stp_proto proto;
96
};
97
98
struct 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
110
struct garp_port {
111
struct garp_applicant __rcu *applicants[GARP_APPLICATION_MAX + 1];
112
struct rcu_head rcu;
113
};
114
115
extern int garp_register_application(struct garp_application *app);
116
extern void garp_unregister_application(struct garp_application *app);
117
118
extern int garp_init_applicant(struct net_device *dev,
119
struct garp_application *app);
120
extern void garp_uninit_applicant(struct net_device *dev,
121
struct garp_application *app);
122
123
extern int garp_request_join(const struct net_device *dev,
124
const struct garp_application *app,
125
const void *data, u8 len, u8 type);
126
extern void garp_request_leave(const struct net_device *dev,
127
const struct garp_application *app,
128
const void *data, u8 len, u8 type);
129
130
#endif /* _NET_GARP_H */
131
132