mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
net: Add GARP applicant-only participant
Add an implementation of the GARP (Generic Attribute Registration Protocol) applicant-only participant. This will be used by the following patch to add GVRP support to the VLAN code. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
7c85fbf065
commit
eca9ebac65
@@ -740,6 +740,8 @@ struct net_device
|
|||||||
struct net_bridge_port *br_port;
|
struct net_bridge_port *br_port;
|
||||||
/* macvlan */
|
/* macvlan */
|
||||||
struct macvlan_port *macvlan_port;
|
struct macvlan_port *macvlan_port;
|
||||||
|
/* GARP */
|
||||||
|
struct garp_port *garp_port;
|
||||||
|
|
||||||
/* class/net/name entry */
|
/* class/net/name entry */
|
||||||
struct device dev;
|
struct device dev;
|
||||||
|
|||||||
@@ -0,0 +1,127 @@
|
|||||||
|
#ifndef _NET_GARP_H
|
||||||
|
#define _NET_GARP_H
|
||||||
|
|
||||||
|
#include <net/stp.h>
|
||||||
|
|
||||||
|
#define GARP_PROTOCOL_ID 0x1
|
||||||
|
#define GARP_END_MARK 0x0
|
||||||
|
|
||||||
|
struct garp_pdu_hdr {
|
||||||
|
__be16 protocol;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct garp_msg_hdr {
|
||||||
|
u8 attrtype;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum garp_attr_event {
|
||||||
|
GARP_LEAVE_ALL,
|
||||||
|
GARP_JOIN_EMPTY,
|
||||||
|
GARP_JOIN_IN,
|
||||||
|
GARP_LEAVE_EMPTY,
|
||||||
|
GARP_LEAVE_IN,
|
||||||
|
GARP_EMPTY,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct garp_attr_hdr {
|
||||||
|
u8 len;
|
||||||
|
u8 event;
|
||||||
|
u8 data[];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct garp_skb_cb {
|
||||||
|
u8 cur_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline struct garp_skb_cb *garp_cb(struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
BUILD_BUG_ON(sizeof(struct garp_skb_cb) >
|
||||||
|
FIELD_SIZEOF(struct sk_buff, cb));
|
||||||
|
return (struct garp_skb_cb *)skb->cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum garp_applicant_state {
|
||||||
|
GARP_APPLICANT_INVALID,
|
||||||
|
GARP_APPLICANT_VA,
|
||||||
|
GARP_APPLICANT_AA,
|
||||||
|
GARP_APPLICANT_QA,
|
||||||
|
GARP_APPLICANT_LA,
|
||||||
|
GARP_APPLICANT_VP,
|
||||||
|
GARP_APPLICANT_AP,
|
||||||
|
GARP_APPLICANT_QP,
|
||||||
|
GARP_APPLICANT_VO,
|
||||||
|
GARP_APPLICANT_AO,
|
||||||
|
GARP_APPLICANT_QO,
|
||||||
|
__GARP_APPLICANT_MAX
|
||||||
|
};
|
||||||
|
#define GARP_APPLICANT_MAX (__GARP_APPLICANT_MAX - 1)
|
||||||
|
|
||||||
|
enum garp_event {
|
||||||
|
GARP_EVENT_REQ_JOIN,
|
||||||
|
GARP_EVENT_REQ_LEAVE,
|
||||||
|
GARP_EVENT_R_JOIN_IN,
|
||||||
|
GARP_EVENT_R_JOIN_EMPTY,
|
||||||
|
GARP_EVENT_R_EMPTY,
|
||||||
|
GARP_EVENT_R_LEAVE_IN,
|
||||||
|
GARP_EVENT_R_LEAVE_EMPTY,
|
||||||
|
GARP_EVENT_TRANSMIT_PDU,
|
||||||
|
__GARP_EVENT_MAX
|
||||||
|
};
|
||||||
|
#define GARP_EVENT_MAX (__GARP_EVENT_MAX - 1)
|
||||||
|
|
||||||
|
enum garp_action {
|
||||||
|
GARP_ACTION_NONE,
|
||||||
|
GARP_ACTION_S_JOIN_IN,
|
||||||
|
GARP_ACTION_S_LEAVE_EMPTY,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct garp_attr {
|
||||||
|
struct rb_node node;
|
||||||
|
enum garp_applicant_state state;
|
||||||
|
u8 type;
|
||||||
|
u8 dlen;
|
||||||
|
unsigned char data[];
|
||||||
|
};
|
||||||
|
|
||||||
|
enum garp_applications {
|
||||||
|
__GARP_APPLICATION_MAX
|
||||||
|
};
|
||||||
|
#define GARP_APPLICATION_MAX (__GARP_APPLICATION_MAX - 1)
|
||||||
|
|
||||||
|
struct garp_application {
|
||||||
|
enum garp_applications type;
|
||||||
|
unsigned int maxattr;
|
||||||
|
struct stp_proto proto;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct garp_applicant {
|
||||||
|
struct garp_application *app;
|
||||||
|
struct net_device *dev;
|
||||||
|
struct timer_list join_timer;
|
||||||
|
|
||||||
|
spinlock_t lock;
|
||||||
|
struct sk_buff_head queue;
|
||||||
|
struct sk_buff *pdu;
|
||||||
|
struct rb_root gid;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct garp_port {
|
||||||
|
struct garp_applicant *applicants[GARP_APPLICATION_MAX + 1];
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int garp_register_application(struct garp_application *app);
|
||||||
|
extern void garp_unregister_application(struct garp_application *app);
|
||||||
|
|
||||||
|
extern int garp_init_applicant(struct net_device *dev,
|
||||||
|
struct garp_application *app);
|
||||||
|
extern void garp_uninit_applicant(struct net_device *dev,
|
||||||
|
struct garp_application *app);
|
||||||
|
|
||||||
|
extern int garp_request_join(const struct net_device *dev,
|
||||||
|
const struct garp_application *app,
|
||||||
|
const void *data, u8 len, u8 type);
|
||||||
|
extern void garp_request_leave(const struct net_device *dev,
|
||||||
|
const struct garp_application *app,
|
||||||
|
const void *data, u8 len, u8 type);
|
||||||
|
|
||||||
|
#endif /* _NET_GARP_H */
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
config STP
|
config STP
|
||||||
tristate
|
tristate
|
||||||
select LLC
|
select LLC
|
||||||
|
|
||||||
|
config GARP
|
||||||
|
tristate
|
||||||
|
select STP
|
||||||
|
|||||||
@@ -11,3 +11,4 @@ obj-$(CONFIG_HIPPI) += hippi.o
|
|||||||
obj-$(CONFIG_IPX) += p8022.o psnap.o p8023.o
|
obj-$(CONFIG_IPX) += p8022.o psnap.o p8023.o
|
||||||
obj-$(CONFIG_ATALK) += p8022.o psnap.o
|
obj-$(CONFIG_ATALK) += p8022.o psnap.o
|
||||||
obj-$(CONFIG_STP) += stp.o
|
obj-$(CONFIG_STP) += stp.o
|
||||||
|
obj-$(CONFIG_GARP) += garp.o
|
||||||
|
|||||||
+633
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user