1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2febf018dSDavid Ward #ifndef _NET_MRP_H 3febf018dSDavid Ward #define _NET_MRP_H 4febf018dSDavid Ward 5febf018dSDavid Ward #define MRP_END_MARK 0x0 6febf018dSDavid Ward 7febf018dSDavid Ward struct mrp_pdu_hdr { 8febf018dSDavid Ward u8 version; 9febf018dSDavid Ward }; 10febf018dSDavid Ward 11febf018dSDavid Ward struct mrp_msg_hdr { 12febf018dSDavid Ward u8 attrtype; 13febf018dSDavid Ward u8 attrlen; 14febf018dSDavid Ward }; 15febf018dSDavid Ward 16febf018dSDavid Ward struct mrp_vecattr_hdr { 17febf018dSDavid Ward __be16 lenflags; 18febf018dSDavid Ward unsigned char firstattrvalue[]; 19febf018dSDavid Ward #define MRP_VECATTR_HDR_LEN_MASK cpu_to_be16(0x1FFF) 20febf018dSDavid Ward #define MRP_VECATTR_HDR_FLAG_LA cpu_to_be16(0x2000) 21febf018dSDavid Ward }; 22febf018dSDavid Ward 23febf018dSDavid Ward enum mrp_vecattr_event { 24febf018dSDavid Ward MRP_VECATTR_EVENT_NEW, 25febf018dSDavid Ward MRP_VECATTR_EVENT_JOIN_IN, 26febf018dSDavid Ward MRP_VECATTR_EVENT_IN, 27febf018dSDavid Ward MRP_VECATTR_EVENT_JOIN_MT, 28febf018dSDavid Ward MRP_VECATTR_EVENT_MT, 29febf018dSDavid Ward MRP_VECATTR_EVENT_LV, 30febf018dSDavid Ward __MRP_VECATTR_EVENT_MAX 31febf018dSDavid Ward }; 32febf018dSDavid Ward 33febf018dSDavid Ward struct mrp_skb_cb { 34febf018dSDavid Ward struct mrp_msg_hdr *mh; 35febf018dSDavid Ward struct mrp_vecattr_hdr *vah; 36febf018dSDavid Ward unsigned char attrvalue[]; 37febf018dSDavid Ward }; 38febf018dSDavid Ward 39febf018dSDavid Ward static inline struct mrp_skb_cb *mrp_cb(struct sk_buff *skb) 40febf018dSDavid Ward { 41febf018dSDavid Ward BUILD_BUG_ON(sizeof(struct mrp_skb_cb) > 42c593642cSPankaj Bharadiya sizeof_field(struct sk_buff, cb)); 43febf018dSDavid Ward return (struct mrp_skb_cb *)skb->cb; 44febf018dSDavid Ward } 45febf018dSDavid Ward 46febf018dSDavid Ward enum mrp_applicant_state { 47febf018dSDavid Ward MRP_APPLICANT_INVALID, 48febf018dSDavid Ward MRP_APPLICANT_VO, 49febf018dSDavid Ward MRP_APPLICANT_VP, 50febf018dSDavid Ward MRP_APPLICANT_VN, 51febf018dSDavid Ward MRP_APPLICANT_AN, 52febf018dSDavid Ward MRP_APPLICANT_AA, 53febf018dSDavid Ward MRP_APPLICANT_QA, 54febf018dSDavid Ward MRP_APPLICANT_LA, 55febf018dSDavid Ward MRP_APPLICANT_AO, 56febf018dSDavid Ward MRP_APPLICANT_QO, 57febf018dSDavid Ward MRP_APPLICANT_AP, 58febf018dSDavid Ward MRP_APPLICANT_QP, 59febf018dSDavid Ward __MRP_APPLICANT_MAX 60febf018dSDavid Ward }; 61febf018dSDavid Ward #define MRP_APPLICANT_MAX (__MRP_APPLICANT_MAX - 1) 62febf018dSDavid Ward 63febf018dSDavid Ward enum mrp_event { 64febf018dSDavid Ward MRP_EVENT_NEW, 65febf018dSDavid Ward MRP_EVENT_JOIN, 66febf018dSDavid Ward MRP_EVENT_LV, 67febf018dSDavid Ward MRP_EVENT_TX, 68febf018dSDavid Ward MRP_EVENT_R_NEW, 69febf018dSDavid Ward MRP_EVENT_R_JOIN_IN, 70febf018dSDavid Ward MRP_EVENT_R_IN, 71febf018dSDavid Ward MRP_EVENT_R_JOIN_MT, 72febf018dSDavid Ward MRP_EVENT_R_MT, 73febf018dSDavid Ward MRP_EVENT_R_LV, 74febf018dSDavid Ward MRP_EVENT_R_LA, 75febf018dSDavid Ward MRP_EVENT_REDECLARE, 76febf018dSDavid Ward MRP_EVENT_PERIODIC, 77febf018dSDavid Ward __MRP_EVENT_MAX 78febf018dSDavid Ward }; 79febf018dSDavid Ward #define MRP_EVENT_MAX (__MRP_EVENT_MAX - 1) 80febf018dSDavid Ward 81febf018dSDavid Ward enum mrp_tx_action { 82febf018dSDavid Ward MRP_TX_ACTION_NONE, 83febf018dSDavid Ward MRP_TX_ACTION_S_NEW, 84febf018dSDavid Ward MRP_TX_ACTION_S_JOIN_IN, 85febf018dSDavid Ward MRP_TX_ACTION_S_JOIN_IN_OPTIONAL, 86febf018dSDavid Ward MRP_TX_ACTION_S_IN_OPTIONAL, 87febf018dSDavid Ward MRP_TX_ACTION_S_LV, 88febf018dSDavid Ward }; 89febf018dSDavid Ward 90febf018dSDavid Ward struct mrp_attr { 91febf018dSDavid Ward struct rb_node node; 92febf018dSDavid Ward enum mrp_applicant_state state; 93febf018dSDavid Ward u8 type; 94febf018dSDavid Ward u8 len; 95febf018dSDavid Ward unsigned char value[]; 96febf018dSDavid Ward }; 97febf018dSDavid Ward 98febf018dSDavid Ward enum mrp_applications { 99febf018dSDavid Ward MRP_APPLICATION_MVRP, 100febf018dSDavid Ward __MRP_APPLICATION_MAX 101febf018dSDavid Ward }; 102febf018dSDavid Ward #define MRP_APPLICATION_MAX (__MRP_APPLICATION_MAX - 1) 103febf018dSDavid Ward 104febf018dSDavid Ward struct mrp_application { 105febf018dSDavid Ward enum mrp_applications type; 106febf018dSDavid Ward unsigned int maxattr; 107febf018dSDavid Ward struct packet_type pkttype; 108febf018dSDavid Ward unsigned char group_address[ETH_ALEN]; 109febf018dSDavid Ward u8 version; 110febf018dSDavid Ward }; 111febf018dSDavid Ward 112febf018dSDavid Ward struct mrp_applicant { 113febf018dSDavid Ward struct mrp_application *app; 114febf018dSDavid Ward struct net_device *dev; 115febf018dSDavid Ward struct timer_list join_timer; 1169fe34f5dSNoel Burton-Krahn struct timer_list periodic_timer; 117febf018dSDavid Ward 118febf018dSDavid Ward spinlock_t lock; 119febf018dSDavid Ward struct sk_buff_head queue; 120febf018dSDavid Ward struct sk_buff *pdu; 121febf018dSDavid Ward struct rb_root mad; 122febf018dSDavid Ward struct rcu_head rcu; 123febf018dSDavid Ward }; 124febf018dSDavid Ward 125febf018dSDavid Ward struct mrp_port { 126febf018dSDavid Ward struct mrp_applicant __rcu *applicants[MRP_APPLICATION_MAX + 1]; 127febf018dSDavid Ward struct rcu_head rcu; 128febf018dSDavid Ward }; 129febf018dSDavid Ward 130a5be1eb6SJoe Perches int mrp_register_application(struct mrp_application *app); 131a5be1eb6SJoe Perches void mrp_unregister_application(struct mrp_application *app); 132febf018dSDavid Ward 133a5be1eb6SJoe Perches int mrp_init_applicant(struct net_device *dev, struct mrp_application *app); 134a5be1eb6SJoe Perches void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *app); 135febf018dSDavid Ward 136a5be1eb6SJoe Perches int mrp_request_join(const struct net_device *dev, 137febf018dSDavid Ward const struct mrp_application *app, 138febf018dSDavid Ward const void *value, u8 len, u8 type); 139a5be1eb6SJoe Perches void mrp_request_leave(const struct net_device *dev, 140febf018dSDavid Ward const struct mrp_application *app, 141febf018dSDavid Ward const void *value, u8 len, u8 type); 142febf018dSDavid Ward 143febf018dSDavid Ward #endif /* _NET_MRP_H */ 144