Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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 /* _NET_MRP_H */