Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / include / net / mrp.h
diff --git a/kernel/include/net/mrp.h b/kernel/include/net/mrp.h
new file mode 100644 (file)
index 0000000..31912c3
--- /dev/null
@@ -0,0 +1,142 @@
+#ifndef _NET_MRP_H
+#define _NET_MRP_H
+
+#define MRP_END_MARK           0x0
+
+struct mrp_pdu_hdr {
+       u8      version;
+};
+
+struct mrp_msg_hdr {
+       u8      attrtype;
+       u8      attrlen;
+};
+
+struct mrp_vecattr_hdr {
+       __be16  lenflags;
+       unsigned char   firstattrvalue[];
+#define MRP_VECATTR_HDR_LEN_MASK cpu_to_be16(0x1FFF)
+#define MRP_VECATTR_HDR_FLAG_LA cpu_to_be16(0x2000)
+};
+
+enum mrp_vecattr_event {
+       MRP_VECATTR_EVENT_NEW,
+       MRP_VECATTR_EVENT_JOIN_IN,
+       MRP_VECATTR_EVENT_IN,
+       MRP_VECATTR_EVENT_JOIN_MT,
+       MRP_VECATTR_EVENT_MT,
+       MRP_VECATTR_EVENT_LV,
+       __MRP_VECATTR_EVENT_MAX
+};
+
+struct mrp_skb_cb {
+       struct mrp_msg_hdr      *mh;
+       struct mrp_vecattr_hdr  *vah;
+       unsigned char           attrvalue[];
+};
+
+static inline struct mrp_skb_cb *mrp_cb(struct sk_buff *skb)
+{
+       BUILD_BUG_ON(sizeof(struct mrp_skb_cb) >
+                    FIELD_SIZEOF(struct sk_buff, cb));
+       return (struct mrp_skb_cb *)skb->cb;
+}
+
+enum mrp_applicant_state {
+       MRP_APPLICANT_INVALID,
+       MRP_APPLICANT_VO,
+       MRP_APPLICANT_VP,
+       MRP_APPLICANT_VN,
+       MRP_APPLICANT_AN,
+       MRP_APPLICANT_AA,
+       MRP_APPLICANT_QA,
+       MRP_APPLICANT_LA,
+       MRP_APPLICANT_AO,
+       MRP_APPLICANT_QO,
+       MRP_APPLICANT_AP,
+       MRP_APPLICANT_QP,
+       __MRP_APPLICANT_MAX
+};
+#define MRP_APPLICANT_MAX      (__MRP_APPLICANT_MAX - 1)
+
+enum mrp_event {
+       MRP_EVENT_NEW,
+       MRP_EVENT_JOIN,
+       MRP_EVENT_LV,
+       MRP_EVENT_TX,
+       MRP_EVENT_R_NEW,
+       MRP_EVENT_R_JOIN_IN,
+       MRP_EVENT_R_IN,
+       MRP_EVENT_R_JOIN_MT,
+       MRP_EVENT_R_MT,
+       MRP_EVENT_R_LV,
+       MRP_EVENT_R_LA,
+       MRP_EVENT_REDECLARE,
+       MRP_EVENT_PERIODIC,
+       __MRP_EVENT_MAX
+};
+#define MRP_EVENT_MAX          (__MRP_EVENT_MAX - 1)
+
+enum mrp_tx_action {
+       MRP_TX_ACTION_NONE,
+       MRP_TX_ACTION_S_NEW,
+       MRP_TX_ACTION_S_JOIN_IN,
+       MRP_TX_ACTION_S_JOIN_IN_OPTIONAL,
+       MRP_TX_ACTION_S_IN_OPTIONAL,
+       MRP_TX_ACTION_S_LV,
+};
+
+struct mrp_attr {
+       struct rb_node                  node;
+       enum mrp_applicant_state        state;
+       u8                              type;
+       u8                              len;
+       unsigned char                   value[];
+};
+
+enum mrp_applications {
+       MRP_APPLICATION_MVRP,
+       __MRP_APPLICATION_MAX
+};
+#define MRP_APPLICATION_MAX    (__MRP_APPLICATION_MAX - 1)
+
+struct mrp_application {
+       enum mrp_applications   type;
+       unsigned int            maxattr;
+       struct packet_type      pkttype;
+       unsigned char           group_address[ETH_ALEN];
+       u8                      version;
+};
+
+struct mrp_applicant {
+       struct mrp_application  *app;
+       struct net_device       *dev;
+       struct timer_list       join_timer;
+       struct timer_list       periodic_timer;
+
+       spinlock_t              lock;
+       struct sk_buff_head     queue;
+       struct sk_buff          *pdu;
+       struct rb_root          mad;
+       struct rcu_head         rcu;
+};
+
+struct mrp_port {
+       struct mrp_applicant __rcu      *applicants[MRP_APPLICATION_MAX + 1];
+       struct rcu_head                 rcu;
+};
+
+int mrp_register_application(struct mrp_application *app);
+void mrp_unregister_application(struct mrp_application *app);
+
+int mrp_init_applicant(struct net_device *dev, struct mrp_application *app);
+void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *app);
+
+int mrp_request_join(const struct net_device *dev,
+                    const struct mrp_application *app,
+                    const void *value, u8 len, u8 type);
+void mrp_request_leave(const struct net_device *dev,
+                      const struct mrp_application *app,
+                      const void *value, u8 len, u8 type);
+
+#endif /* _NET_MRP_H */