2020-04-26 16:22:02 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
# ifndef _BR_PRIVATE_MRP_H_
# define _BR_PRIVATE_MRP_H_
# include "br_private.h"
# include <uapi/linux/mrp_bridge.h>
2021-06-26 23:18:04 +03:00
# define MRP_OPT_PADDING 0x2
2020-04-26 16:22:02 +03:00
struct br_mrp {
/* list of mrp instances */
2020-11-07 00:50:49 +03:00
struct hlist_node list ;
2020-04-26 16:22:02 +03:00
struct net_bridge_port __rcu * p_port ;
struct net_bridge_port __rcu * s_port ;
2020-07-14 10:34:50 +03:00
struct net_bridge_port __rcu * i_port ;
2020-04-26 16:22:02 +03:00
u32 ring_id ;
2020-07-14 10:34:50 +03:00
u16 in_id ;
2020-05-30 21:09:47 +03:00
u16 prio ;
2020-04-26 16:22:02 +03:00
enum br_mrp_ring_role_type ring_role ;
u8 ring_role_offloaded ;
enum br_mrp_ring_state_type ring_state ;
u32 ring_transitions ;
2020-07-14 10:34:50 +03:00
enum br_mrp_in_role_type in_role ;
u8 in_role_offloaded ;
enum br_mrp_in_state_type in_state ;
u32 in_transitions ;
2020-04-26 16:22:02 +03:00
struct delayed_work test_work ;
u32 test_interval ;
unsigned long test_end ;
u32 test_count_miss ;
u32 test_max_miss ;
2020-05-30 21:09:48 +03:00
bool test_monitor ;
2020-04-26 16:22:02 +03:00
2020-07-14 10:34:50 +03:00
struct delayed_work in_test_work ;
u32 in_test_interval ;
unsigned long in_test_end ;
u32 in_test_count_miss ;
u32 in_test_max_miss ;
2020-04-26 16:22:02 +03:00
u32 seq_id ;
struct rcu_head rcu ;
} ;
2021-02-17 00:42:00 +03:00
/* This type is returned by br_mrp_switchdev functions that allow to have a SW
* backup in case the HW can ' t implement completely the protocol .
* BR_MRP_NONE - means the HW can ' t run at all the protocol , so the SW stops
* configuring the node anymore .
* BR_MRP_SW - the HW can help the SW to run the protocol , by redirecting MRP
* frames to CPU .
* BR_MRP_HW - the HW can implement completely the protocol .
*/
enum br_mrp_hw_support {
BR_MRP_NONE ,
BR_MRP_SW ,
BR_MRP_HW ,
} ;
2020-04-26 16:22:02 +03:00
/* br_mrp.c */
int br_mrp_add ( struct net_bridge * br , struct br_mrp_instance * instance ) ;
int br_mrp_del ( struct net_bridge * br , struct br_mrp_instance * instance ) ;
int br_mrp_set_port_state ( struct net_bridge_port * p ,
enum br_mrp_port_state_type state ) ;
int br_mrp_set_port_role ( struct net_bridge_port * p ,
2020-05-27 15:34:30 +03:00
enum br_mrp_port_role_type role ) ;
2020-04-26 16:22:02 +03:00
int br_mrp_set_ring_state ( struct net_bridge * br ,
struct br_mrp_ring_state * state ) ;
int br_mrp_set_ring_role ( struct net_bridge * br , struct br_mrp_ring_role * role ) ;
int br_mrp_start_test ( struct net_bridge * br , struct br_mrp_start_test * test ) ;
2020-07-14 10:34:54 +03:00
int br_mrp_set_in_state ( struct net_bridge * br , struct br_mrp_in_state * state ) ;
int br_mrp_set_in_role ( struct net_bridge * br , struct br_mrp_in_role * role ) ;
int br_mrp_start_in_test ( struct net_bridge * br ,
struct br_mrp_start_in_test * test ) ;
2020-04-26 16:22:02 +03:00
/* br_mrp_switchdev.c */
int br_mrp_switchdev_add ( struct net_bridge * br , struct br_mrp * mrp ) ;
int br_mrp_switchdev_del ( struct net_bridge * br , struct br_mrp * mrp ) ;
2021-02-17 00:42:01 +03:00
enum br_mrp_hw_support
br_mrp_switchdev_set_ring_role ( struct net_bridge * br , struct br_mrp * mrp ,
enum br_mrp_ring_role_type role ) ;
2020-04-26 16:22:02 +03:00
int br_mrp_switchdev_set_ring_state ( struct net_bridge * br , struct br_mrp * mrp ,
enum br_mrp_ring_state_type state ) ;
2021-02-17 00:42:01 +03:00
enum br_mrp_hw_support
br_mrp_switchdev_send_ring_test ( struct net_bridge * br , struct br_mrp * mrp ,
u32 interval , u8 max_miss , u32 period ,
bool monitor ) ;
2021-02-07 00:47:33 +03:00
int br_mrp_port_switchdev_set_state ( struct net_bridge_port * p , u32 state ) ;
2020-04-26 16:22:02 +03:00
int br_mrp_port_switchdev_set_role ( struct net_bridge_port * p ,
enum br_mrp_port_role_type role ) ;
2021-02-17 00:42:01 +03:00
enum br_mrp_hw_support
br_mrp_switchdev_set_in_role ( struct net_bridge * br , struct br_mrp * mrp ,
u16 in_id , u32 ring_id ,
enum br_mrp_in_role_type role ) ;
2020-07-14 10:34:53 +03:00
int br_mrp_switchdev_set_in_state ( struct net_bridge * br , struct br_mrp * mrp ,
enum br_mrp_in_state_type state ) ;
2021-02-17 00:42:01 +03:00
enum br_mrp_hw_support
br_mrp_switchdev_send_in_test ( struct net_bridge * br , struct br_mrp * mrp ,
u32 interval , u8 max_miss , u32 period ) ;
2020-04-26 16:22:02 +03:00
/* br_mrp_netlink.c */
2020-07-14 10:34:51 +03:00
int br_mrp_ring_port_open ( struct net_device * dev , u8 loc ) ;
2020-07-14 10:34:52 +03:00
int br_mrp_in_port_open ( struct net_device * dev , u8 loc ) ;
2020-04-26 16:22:02 +03:00
2021-01-21 23:40:37 +03:00
/* MRP protocol data units */
struct br_mrp_tlv_hdr {
__u8 type ;
__u8 length ;
} ;
struct br_mrp_common_hdr {
__be16 seq_id ;
__u8 domain [ MRP_DOMAIN_UUID_LENGTH ] ;
} ;
struct br_mrp_ring_test_hdr {
__be16 prio ;
__u8 sa [ ETH_ALEN ] ;
__be16 port_role ;
__be16 state ;
__be16 transitions ;
__be32 timestamp ;
} __attribute__ ( ( __packed__ ) ) ;
struct br_mrp_in_test_hdr {
__be16 id ;
__u8 sa [ ETH_ALEN ] ;
__be16 port_role ;
__be16 state ;
__be16 transitions ;
__be32 timestamp ;
} __attribute__ ( ( __packed__ ) ) ;
2021-06-26 23:18:04 +03:00
struct br_mrp_oui_hdr {
__u8 oui [ MRP_OUI_LENGTH ] ;
} ;
struct br_mrp_sub_option1_hdr {
__u8 type ;
__u8 data [ MRP_MANUFACTURE_DATA_LENGTH ] ;
} ;
2020-04-26 16:22:02 +03:00
# endif /* _BR_PRIVATE_MRP_H */