0001
0002 #ifndef _NET_MRP_H
0003 #define _NET_MRP_H
0004
0005 #include <linux/netdevice.h>
0006 #include <linux/skbuff.h>
0007 #include <linux/types.h>
0008
0009 #define MRP_END_MARK 0x0
0010
0011 struct mrp_pdu_hdr {
0012 u8 version;
0013 };
0014
0015 struct mrp_msg_hdr {
0016 u8 attrtype;
0017 u8 attrlen;
0018 };
0019
0020 struct mrp_vecattr_hdr {
0021 __be16 lenflags;
0022 unsigned char firstattrvalue[];
0023 #define MRP_VECATTR_HDR_LEN_MASK cpu_to_be16(0x1FFF)
0024 #define MRP_VECATTR_HDR_FLAG_LA cpu_to_be16(0x2000)
0025 };
0026
0027 enum mrp_vecattr_event {
0028 MRP_VECATTR_EVENT_NEW,
0029 MRP_VECATTR_EVENT_JOIN_IN,
0030 MRP_VECATTR_EVENT_IN,
0031 MRP_VECATTR_EVENT_JOIN_MT,
0032 MRP_VECATTR_EVENT_MT,
0033 MRP_VECATTR_EVENT_LV,
0034 __MRP_VECATTR_EVENT_MAX
0035 };
0036
0037 struct mrp_skb_cb {
0038 struct mrp_msg_hdr *mh;
0039 struct mrp_vecattr_hdr *vah;
0040 unsigned char attrvalue[];
0041 };
0042
0043 static inline struct mrp_skb_cb *mrp_cb(struct sk_buff *skb)
0044 {
0045 BUILD_BUG_ON(sizeof(struct mrp_skb_cb) >
0046 sizeof_field(struct sk_buff, cb));
0047 return (struct mrp_skb_cb *)skb->cb;
0048 }
0049
0050 enum mrp_applicant_state {
0051 MRP_APPLICANT_INVALID,
0052 MRP_APPLICANT_VO,
0053 MRP_APPLICANT_VP,
0054 MRP_APPLICANT_VN,
0055 MRP_APPLICANT_AN,
0056 MRP_APPLICANT_AA,
0057 MRP_APPLICANT_QA,
0058 MRP_APPLICANT_LA,
0059 MRP_APPLICANT_AO,
0060 MRP_APPLICANT_QO,
0061 MRP_APPLICANT_AP,
0062 MRP_APPLICANT_QP,
0063 __MRP_APPLICANT_MAX
0064 };
0065 #define MRP_APPLICANT_MAX (__MRP_APPLICANT_MAX - 1)
0066
0067 enum mrp_event {
0068 MRP_EVENT_NEW,
0069 MRP_EVENT_JOIN,
0070 MRP_EVENT_LV,
0071 MRP_EVENT_TX,
0072 MRP_EVENT_R_NEW,
0073 MRP_EVENT_R_JOIN_IN,
0074 MRP_EVENT_R_IN,
0075 MRP_EVENT_R_JOIN_MT,
0076 MRP_EVENT_R_MT,
0077 MRP_EVENT_R_LV,
0078 MRP_EVENT_R_LA,
0079 MRP_EVENT_REDECLARE,
0080 MRP_EVENT_PERIODIC,
0081 __MRP_EVENT_MAX
0082 };
0083 #define MRP_EVENT_MAX (__MRP_EVENT_MAX - 1)
0084
0085 enum mrp_tx_action {
0086 MRP_TX_ACTION_NONE,
0087 MRP_TX_ACTION_S_NEW,
0088 MRP_TX_ACTION_S_JOIN_IN,
0089 MRP_TX_ACTION_S_JOIN_IN_OPTIONAL,
0090 MRP_TX_ACTION_S_IN_OPTIONAL,
0091 MRP_TX_ACTION_S_LV,
0092 };
0093
0094 struct mrp_attr {
0095 struct rb_node node;
0096 enum mrp_applicant_state state;
0097 u8 type;
0098 u8 len;
0099 unsigned char value[];
0100 };
0101
0102 enum mrp_applications {
0103 MRP_APPLICATION_MVRP,
0104 __MRP_APPLICATION_MAX
0105 };
0106 #define MRP_APPLICATION_MAX (__MRP_APPLICATION_MAX - 1)
0107
0108 struct mrp_application {
0109 enum mrp_applications type;
0110 unsigned int maxattr;
0111 struct packet_type pkttype;
0112 unsigned char group_address[ETH_ALEN];
0113 u8 version;
0114 };
0115
0116 struct mrp_applicant {
0117 struct mrp_application *app;
0118 struct net_device *dev;
0119 struct timer_list join_timer;
0120 struct timer_list periodic_timer;
0121
0122 spinlock_t lock;
0123 struct sk_buff_head queue;
0124 struct sk_buff *pdu;
0125 struct rb_root mad;
0126 struct rcu_head rcu;
0127 };
0128
0129 struct mrp_port {
0130 struct mrp_applicant __rcu *applicants[MRP_APPLICATION_MAX + 1];
0131 struct rcu_head rcu;
0132 };
0133
0134 int mrp_register_application(struct mrp_application *app);
0135 void mrp_unregister_application(struct mrp_application *app);
0136
0137 int mrp_init_applicant(struct net_device *dev, struct mrp_application *app);
0138 void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *app);
0139
0140 int mrp_request_join(const struct net_device *dev,
0141 const struct mrp_application *app,
0142 const void *value, u8 len, u8 type);
0143 void mrp_request_leave(const struct net_device *dev,
0144 const struct mrp_application *app,
0145 const void *value, u8 len, u8 type);
0146
0147 #endif