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