132 lines · 2.7 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 */#ifndef _NET_GARP_H#define _NET_GARP_H #include <linux/if_ether.h>#include <linux/types.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) >		     sizeof_field(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_GVRP,	__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 rcu_head		rcu;}; struct garp_port {	struct garp_applicant __rcu	*applicants[GARP_APPLICATION_MAX + 1];	struct rcu_head			rcu;}; int garp_register_application(struct garp_application *app);void garp_unregister_application(struct garp_application *app); int garp_init_applicant(struct net_device *dev, struct garp_application *app);void garp_uninit_applicant(struct net_device *dev,			   struct garp_application *app); int garp_request_join(const struct net_device *dev,		      const struct garp_application *app, const void *data,		      u8 len, u8 type);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 */