12f1a11aeSHoratiu Vultur /* SPDX-License-Identifier: GPL-2.0-or-later */ 22f1a11aeSHoratiu Vultur 32f1a11aeSHoratiu Vultur #ifndef _BR_PRIVATE_MRP_H_ 42f1a11aeSHoratiu Vultur #define _BR_PRIVATE_MRP_H_ 52f1a11aeSHoratiu Vultur 62f1a11aeSHoratiu Vultur #include "br_private.h" 72f1a11aeSHoratiu Vultur #include <uapi/linux/mrp_bridge.h> 82f1a11aeSHoratiu Vultur 9*f7458934SHoratiu Vultur #define MRP_OPT_PADDING 0x2 10*f7458934SHoratiu Vultur 112f1a11aeSHoratiu Vultur struct br_mrp { 122f1a11aeSHoratiu Vultur /* list of mrp instances */ 130169b820SHoratiu Vultur struct hlist_node list; 142f1a11aeSHoratiu Vultur 152f1a11aeSHoratiu Vultur struct net_bridge_port __rcu *p_port; 162f1a11aeSHoratiu Vultur struct net_bridge_port __rcu *s_port; 1778c1b4fbSHoratiu Vultur struct net_bridge_port __rcu *i_port; 182f1a11aeSHoratiu Vultur 192f1a11aeSHoratiu Vultur u32 ring_id; 2078c1b4fbSHoratiu Vultur u16 in_id; 214b3a61b0SHoratiu Vultur u16 prio; 222f1a11aeSHoratiu Vultur 232f1a11aeSHoratiu Vultur enum br_mrp_ring_role_type ring_role; 242f1a11aeSHoratiu Vultur u8 ring_role_offloaded; 252f1a11aeSHoratiu Vultur enum br_mrp_ring_state_type ring_state; 262f1a11aeSHoratiu Vultur u32 ring_transitions; 272f1a11aeSHoratiu Vultur 2878c1b4fbSHoratiu Vultur enum br_mrp_in_role_type in_role; 2978c1b4fbSHoratiu Vultur u8 in_role_offloaded; 3078c1b4fbSHoratiu Vultur enum br_mrp_in_state_type in_state; 3178c1b4fbSHoratiu Vultur u32 in_transitions; 3278c1b4fbSHoratiu Vultur 332f1a11aeSHoratiu Vultur struct delayed_work test_work; 342f1a11aeSHoratiu Vultur u32 test_interval; 352f1a11aeSHoratiu Vultur unsigned long test_end; 362f1a11aeSHoratiu Vultur u32 test_count_miss; 372f1a11aeSHoratiu Vultur u32 test_max_miss; 38c6676e7dSHoratiu Vultur bool test_monitor; 392f1a11aeSHoratiu Vultur 4078c1b4fbSHoratiu Vultur struct delayed_work in_test_work; 4178c1b4fbSHoratiu Vultur u32 in_test_interval; 4278c1b4fbSHoratiu Vultur unsigned long in_test_end; 4378c1b4fbSHoratiu Vultur u32 in_test_count_miss; 4478c1b4fbSHoratiu Vultur u32 in_test_max_miss; 4578c1b4fbSHoratiu Vultur 462f1a11aeSHoratiu Vultur u32 seq_id; 472f1a11aeSHoratiu Vultur 482f1a11aeSHoratiu Vultur struct rcu_head rcu; 492f1a11aeSHoratiu Vultur }; 502f1a11aeSHoratiu Vultur 51e1bd99d0SHoratiu Vultur /* This type is returned by br_mrp_switchdev functions that allow to have a SW 52e1bd99d0SHoratiu Vultur * backup in case the HW can't implement completely the protocol. 53e1bd99d0SHoratiu Vultur * BR_MRP_NONE - means the HW can't run at all the protocol, so the SW stops 54e1bd99d0SHoratiu Vultur * configuring the node anymore. 55e1bd99d0SHoratiu Vultur * BR_MRP_SW - the HW can help the SW to run the protocol, by redirecting MRP 56e1bd99d0SHoratiu Vultur * frames to CPU. 57e1bd99d0SHoratiu Vultur * BR_MRP_HW - the HW can implement completely the protocol. 58e1bd99d0SHoratiu Vultur */ 59e1bd99d0SHoratiu Vultur enum br_mrp_hw_support { 60e1bd99d0SHoratiu Vultur BR_MRP_NONE, 61e1bd99d0SHoratiu Vultur BR_MRP_SW, 62e1bd99d0SHoratiu Vultur BR_MRP_HW, 63e1bd99d0SHoratiu Vultur }; 64e1bd99d0SHoratiu Vultur 652f1a11aeSHoratiu Vultur /* br_mrp.c */ 662f1a11aeSHoratiu Vultur int br_mrp_add(struct net_bridge *br, struct br_mrp_instance *instance); 672f1a11aeSHoratiu Vultur int br_mrp_del(struct net_bridge *br, struct br_mrp_instance *instance); 682f1a11aeSHoratiu Vultur int br_mrp_set_port_state(struct net_bridge_port *p, 692f1a11aeSHoratiu Vultur enum br_mrp_port_state_type state); 702f1a11aeSHoratiu Vultur int br_mrp_set_port_role(struct net_bridge_port *p, 7120f6a05eSHoratiu Vultur enum br_mrp_port_role_type role); 722f1a11aeSHoratiu Vultur int br_mrp_set_ring_state(struct net_bridge *br, 732f1a11aeSHoratiu Vultur struct br_mrp_ring_state *state); 742f1a11aeSHoratiu Vultur int br_mrp_set_ring_role(struct net_bridge *br, struct br_mrp_ring_role *role); 752f1a11aeSHoratiu Vultur int br_mrp_start_test(struct net_bridge *br, struct br_mrp_start_test *test); 76537ed567SHoratiu Vultur int br_mrp_set_in_state(struct net_bridge *br, struct br_mrp_in_state *state); 77537ed567SHoratiu Vultur int br_mrp_set_in_role(struct net_bridge *br, struct br_mrp_in_role *role); 78537ed567SHoratiu Vultur int br_mrp_start_in_test(struct net_bridge *br, 79537ed567SHoratiu Vultur struct br_mrp_start_in_test *test); 802f1a11aeSHoratiu Vultur 812f1a11aeSHoratiu Vultur /* br_mrp_switchdev.c */ 822f1a11aeSHoratiu Vultur int br_mrp_switchdev_add(struct net_bridge *br, struct br_mrp *mrp); 832f1a11aeSHoratiu Vultur int br_mrp_switchdev_del(struct net_bridge *br, struct br_mrp *mrp); 841a3ddb0bSHoratiu Vultur enum br_mrp_hw_support 851a3ddb0bSHoratiu Vultur br_mrp_switchdev_set_ring_role(struct net_bridge *br, struct br_mrp *mrp, 862f1a11aeSHoratiu Vultur enum br_mrp_ring_role_type role); 872f1a11aeSHoratiu Vultur int br_mrp_switchdev_set_ring_state(struct net_bridge *br, struct br_mrp *mrp, 882f1a11aeSHoratiu Vultur enum br_mrp_ring_state_type state); 891a3ddb0bSHoratiu Vultur enum br_mrp_hw_support 901a3ddb0bSHoratiu Vultur br_mrp_switchdev_send_ring_test(struct net_bridge *br, struct br_mrp *mrp, 91c6676e7dSHoratiu Vultur u32 interval, u8 max_miss, u32 period, 92c6676e7dSHoratiu Vultur bool monitor); 93b2bdba1cSHoratiu Vultur int br_mrp_port_switchdev_set_state(struct net_bridge_port *p, u32 state); 942f1a11aeSHoratiu Vultur int br_mrp_port_switchdev_set_role(struct net_bridge_port *p, 952f1a11aeSHoratiu Vultur enum br_mrp_port_role_type role); 961a3ddb0bSHoratiu Vultur enum br_mrp_hw_support 971a3ddb0bSHoratiu Vultur br_mrp_switchdev_set_in_role(struct net_bridge *br, struct br_mrp *mrp, 98f23f0db3SHoratiu Vultur u16 in_id, u32 ring_id, 99f23f0db3SHoratiu Vultur enum br_mrp_in_role_type role); 100f23f0db3SHoratiu Vultur int br_mrp_switchdev_set_in_state(struct net_bridge *br, struct br_mrp *mrp, 101f23f0db3SHoratiu Vultur enum br_mrp_in_state_type state); 1021a3ddb0bSHoratiu Vultur enum br_mrp_hw_support 1031a3ddb0bSHoratiu Vultur br_mrp_switchdev_send_in_test(struct net_bridge *br, struct br_mrp *mrp, 104f23f0db3SHoratiu Vultur u32 interval, u8 max_miss, u32 period); 1052f1a11aeSHoratiu Vultur 1062f1a11aeSHoratiu Vultur /* br_mrp_netlink.c */ 1074cc625c6SHoratiu Vultur int br_mrp_ring_port_open(struct net_device *dev, u8 loc); 1084139d4b5SHoratiu Vultur int br_mrp_in_port_open(struct net_device *dev, u8 loc); 1092f1a11aeSHoratiu Vultur 11067819390SRasmus Villemoes /* MRP protocol data units */ 11167819390SRasmus Villemoes struct br_mrp_tlv_hdr { 11267819390SRasmus Villemoes __u8 type; 11367819390SRasmus Villemoes __u8 length; 11467819390SRasmus Villemoes }; 11567819390SRasmus Villemoes 11667819390SRasmus Villemoes struct br_mrp_common_hdr { 11767819390SRasmus Villemoes __be16 seq_id; 11867819390SRasmus Villemoes __u8 domain[MRP_DOMAIN_UUID_LENGTH]; 11967819390SRasmus Villemoes }; 12067819390SRasmus Villemoes 12167819390SRasmus Villemoes struct br_mrp_ring_test_hdr { 12267819390SRasmus Villemoes __be16 prio; 12367819390SRasmus Villemoes __u8 sa[ETH_ALEN]; 12467819390SRasmus Villemoes __be16 port_role; 12567819390SRasmus Villemoes __be16 state; 12667819390SRasmus Villemoes __be16 transitions; 12767819390SRasmus Villemoes __be32 timestamp; 12867819390SRasmus Villemoes } __attribute__((__packed__)); 12967819390SRasmus Villemoes 13067819390SRasmus Villemoes struct br_mrp_in_test_hdr { 13167819390SRasmus Villemoes __be16 id; 13267819390SRasmus Villemoes __u8 sa[ETH_ALEN]; 13367819390SRasmus Villemoes __be16 port_role; 13467819390SRasmus Villemoes __be16 state; 13567819390SRasmus Villemoes __be16 transitions; 13667819390SRasmus Villemoes __be32 timestamp; 13767819390SRasmus Villemoes } __attribute__((__packed__)); 13867819390SRasmus Villemoes 139*f7458934SHoratiu Vultur struct br_mrp_oui_hdr { 140*f7458934SHoratiu Vultur __u8 oui[MRP_OUI_LENGTH]; 141*f7458934SHoratiu Vultur }; 142*f7458934SHoratiu Vultur 143*f7458934SHoratiu Vultur struct br_mrp_sub_option1_hdr { 144*f7458934SHoratiu Vultur __u8 type; 145*f7458934SHoratiu Vultur __u8 data[MRP_MANUFACTURE_DATA_LENGTH]; 146*f7458934SHoratiu Vultur }; 147*f7458934SHoratiu Vultur 1482f1a11aeSHoratiu Vultur #endif /* _BR_PRIVATE_MRP_H */ 149