xref: /openbmc/linux/net/bridge/br_private_mrp.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
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