xref: /openbmc/linux/net/bridge/br_private_cfm.h (revision cdd38c5f1ce4398ec58fec95904b75824daab7b5)
186a14b79SHenrik Bjoernlund /* SPDX-License-Identifier: GPL-2.0-or-later */
286a14b79SHenrik Bjoernlund 
386a14b79SHenrik Bjoernlund #ifndef _BR_PRIVATE_CFM_H_
486a14b79SHenrik Bjoernlund #define _BR_PRIVATE_CFM_H_
586a14b79SHenrik Bjoernlund 
686a14b79SHenrik Bjoernlund #include "br_private.h"
786a14b79SHenrik Bjoernlund #include <uapi/linux/cfm_bridge.h>
886a14b79SHenrik Bjoernlund 
986a14b79SHenrik Bjoernlund struct br_cfm_mep_create {
1086a14b79SHenrik Bjoernlund 	enum br_cfm_domain domain; /* Domain for this MEP */
1186a14b79SHenrik Bjoernlund 	enum br_cfm_mep_direction direction; /* Up or Down MEP direction */
1286a14b79SHenrik Bjoernlund 	u32 ifindex; /* Residence port */
1386a14b79SHenrik Bjoernlund };
1486a14b79SHenrik Bjoernlund 
1586a14b79SHenrik Bjoernlund int br_cfm_mep_create(struct net_bridge *br,
1686a14b79SHenrik Bjoernlund 		      const u32 instance,
1786a14b79SHenrik Bjoernlund 		      struct br_cfm_mep_create *const create,
1886a14b79SHenrik Bjoernlund 		      struct netlink_ext_ack *extack);
1986a14b79SHenrik Bjoernlund 
2086a14b79SHenrik Bjoernlund int br_cfm_mep_delete(struct net_bridge *br,
2186a14b79SHenrik Bjoernlund 		      const u32 instance,
2286a14b79SHenrik Bjoernlund 		      struct netlink_ext_ack *extack);
2386a14b79SHenrik Bjoernlund 
2486a14b79SHenrik Bjoernlund struct br_cfm_mep_config {
2586a14b79SHenrik Bjoernlund 	u32 mdlevel;
2686a14b79SHenrik Bjoernlund 	u32 mepid; /* MEPID for this MEP */
2786a14b79SHenrik Bjoernlund 	struct mac_addr unicast_mac; /* The MEP unicast MAC */
2886a14b79SHenrik Bjoernlund };
2986a14b79SHenrik Bjoernlund 
3086a14b79SHenrik Bjoernlund int br_cfm_mep_config_set(struct net_bridge *br,
3186a14b79SHenrik Bjoernlund 			  const u32 instance,
3286a14b79SHenrik Bjoernlund 			  const struct br_cfm_mep_config *const config,
3386a14b79SHenrik Bjoernlund 			  struct netlink_ext_ack *extack);
3486a14b79SHenrik Bjoernlund 
35a806ad8eSHenrik Bjoernlund struct br_cfm_maid {
36a806ad8eSHenrik Bjoernlund 	u8 data[CFM_MAID_LENGTH];
37a806ad8eSHenrik Bjoernlund };
38a806ad8eSHenrik Bjoernlund 
39a806ad8eSHenrik Bjoernlund struct br_cfm_cc_config {
40a806ad8eSHenrik Bjoernlund 	/* Expected received CCM PDU MAID. */
41a806ad8eSHenrik Bjoernlund 	struct br_cfm_maid exp_maid;
42a806ad8eSHenrik Bjoernlund 
43a806ad8eSHenrik Bjoernlund 	/* Expected received CCM PDU interval. */
44a806ad8eSHenrik Bjoernlund 	/* Transmitting CCM PDU interval when CCM tx is enabled. */
45a806ad8eSHenrik Bjoernlund 	enum br_cfm_ccm_interval exp_interval;
46*dc32cbb3SHenrik Bjoernlund 
47*dc32cbb3SHenrik Bjoernlund 	bool enable; /* Enable/disable CCM PDU handling */
48a806ad8eSHenrik Bjoernlund };
49a806ad8eSHenrik Bjoernlund 
50a806ad8eSHenrik Bjoernlund int br_cfm_cc_config_set(struct net_bridge *br,
51a806ad8eSHenrik Bjoernlund 			 const u32 instance,
52a806ad8eSHenrik Bjoernlund 			 const struct br_cfm_cc_config *const config,
53a806ad8eSHenrik Bjoernlund 			 struct netlink_ext_ack *extack);
54a806ad8eSHenrik Bjoernlund 
5586a14b79SHenrik Bjoernlund int br_cfm_cc_peer_mep_add(struct net_bridge *br, const u32 instance,
5686a14b79SHenrik Bjoernlund 			   u32 peer_mep_id,
5786a14b79SHenrik Bjoernlund 			   struct netlink_ext_ack *extack);
5886a14b79SHenrik Bjoernlund int br_cfm_cc_peer_mep_remove(struct net_bridge *br, const u32 instance,
5986a14b79SHenrik Bjoernlund 			      u32 peer_mep_id,
6086a14b79SHenrik Bjoernlund 			      struct netlink_ext_ack *extack);
6186a14b79SHenrik Bjoernlund 
62a806ad8eSHenrik Bjoernlund /* Transmitted CCM Remote Defect Indication status set.
63a806ad8eSHenrik Bjoernlund  * This RDI is inserted in transmitted CCM PDUs if CCM transmission is enabled.
64a806ad8eSHenrik Bjoernlund  * See br_cfm_cc_ccm_tx() with interval != BR_CFM_CCM_INTERVAL_NONE
65a806ad8eSHenrik Bjoernlund  */
66a806ad8eSHenrik Bjoernlund int br_cfm_cc_rdi_set(struct net_bridge *br, const u32 instance,
67a806ad8eSHenrik Bjoernlund 		      const bool rdi, struct netlink_ext_ack *extack);
68a806ad8eSHenrik Bjoernlund 
69a806ad8eSHenrik Bjoernlund /* OAM PDU Tx information */
70a806ad8eSHenrik Bjoernlund struct br_cfm_cc_ccm_tx_info {
71a806ad8eSHenrik Bjoernlund 	struct mac_addr dmac;
72a806ad8eSHenrik Bjoernlund 	/* The CCM will be transmitted for this period in seconds.
73a806ad8eSHenrik Bjoernlund 	 * Call br_cfm_cc_ccm_tx before timeout to keep transmission alive.
74a806ad8eSHenrik Bjoernlund 	 * When period is zero any ongoing transmission will be stopped.
75a806ad8eSHenrik Bjoernlund 	 */
76a806ad8eSHenrik Bjoernlund 	u32 period;
77a806ad8eSHenrik Bjoernlund 
78a806ad8eSHenrik Bjoernlund 	bool seq_no_update; /* Update Tx CCM sequence number */
79a806ad8eSHenrik Bjoernlund 	bool if_tlv; /* Insert Interface Status TLV */
80a806ad8eSHenrik Bjoernlund 	u8 if_tlv_value; /* Interface Status TLV value */
81a806ad8eSHenrik Bjoernlund 	bool port_tlv; /* Insert Port Status TLV */
82a806ad8eSHenrik Bjoernlund 	u8 port_tlv_value; /* Port Status TLV value */
83a806ad8eSHenrik Bjoernlund 	/* Sender ID TLV ??
84a806ad8eSHenrik Bjoernlund 	 * Organization-Specific TLV ??
85a806ad8eSHenrik Bjoernlund 	 */
86a806ad8eSHenrik Bjoernlund };
87a806ad8eSHenrik Bjoernlund 
88a806ad8eSHenrik Bjoernlund int br_cfm_cc_ccm_tx(struct net_bridge *br, const u32 instance,
89a806ad8eSHenrik Bjoernlund 		     const struct br_cfm_cc_ccm_tx_info *const tx_info,
90a806ad8eSHenrik Bjoernlund 		     struct netlink_ext_ack *extack);
91a806ad8eSHenrik Bjoernlund 
92*dc32cbb3SHenrik Bjoernlund struct br_cfm_mep_status {
93*dc32cbb3SHenrik Bjoernlund 	/* Indications that an OAM PDU has been seen. */
94*dc32cbb3SHenrik Bjoernlund 	bool opcode_unexp_seen; /* RX of OAM PDU with unexpected opcode */
95*dc32cbb3SHenrik Bjoernlund 	bool version_unexp_seen; /* RX of OAM PDU with unexpected version */
96*dc32cbb3SHenrik Bjoernlund 	bool rx_level_low_seen; /* Rx of OAM PDU with level low */
97*dc32cbb3SHenrik Bjoernlund };
98*dc32cbb3SHenrik Bjoernlund 
99*dc32cbb3SHenrik Bjoernlund struct br_cfm_cc_peer_status {
100*dc32cbb3SHenrik Bjoernlund 	/* This CCM related status is based on the latest received CCM PDU. */
101*dc32cbb3SHenrik Bjoernlund 	u8 port_tlv_value; /* Port Status TLV value */
102*dc32cbb3SHenrik Bjoernlund 	u8 if_tlv_value; /* Interface Status TLV value */
103*dc32cbb3SHenrik Bjoernlund 
104*dc32cbb3SHenrik Bjoernlund 	/* CCM has not been received for 3.25 intervals */
105*dc32cbb3SHenrik Bjoernlund 	u8 ccm_defect:1;
106*dc32cbb3SHenrik Bjoernlund 
107*dc32cbb3SHenrik Bjoernlund 	/* (RDI == 1) for last received CCM PDU */
108*dc32cbb3SHenrik Bjoernlund 	u8 rdi:1;
109*dc32cbb3SHenrik Bjoernlund 
110*dc32cbb3SHenrik Bjoernlund 	/* Indications that a CCM PDU has been seen. */
111*dc32cbb3SHenrik Bjoernlund 	u8 seen:1; /* CCM PDU received */
112*dc32cbb3SHenrik Bjoernlund 	u8 tlv_seen:1; /* CCM PDU with TLV received */
113*dc32cbb3SHenrik Bjoernlund 	/* CCM PDU with unexpected sequence number received */
114*dc32cbb3SHenrik Bjoernlund 	u8 seq_unexp_seen:1;
115*dc32cbb3SHenrik Bjoernlund };
116*dc32cbb3SHenrik Bjoernlund 
11786a14b79SHenrik Bjoernlund struct br_cfm_mep {
11886a14b79SHenrik Bjoernlund 	/* list header of MEP instances */
11986a14b79SHenrik Bjoernlund 	struct hlist_node		head;
12086a14b79SHenrik Bjoernlund 	u32				instance;
12186a14b79SHenrik Bjoernlund 	struct br_cfm_mep_create	create;
12286a14b79SHenrik Bjoernlund 	struct br_cfm_mep_config	config;
123a806ad8eSHenrik Bjoernlund 	struct br_cfm_cc_config		cc_config;
124a806ad8eSHenrik Bjoernlund 	struct br_cfm_cc_ccm_tx_info	cc_ccm_tx_info;
12586a14b79SHenrik Bjoernlund 	/* List of multiple peer MEPs */
12686a14b79SHenrik Bjoernlund 	struct hlist_head		peer_mep_list;
12786a14b79SHenrik Bjoernlund 	struct net_bridge_port __rcu	*b_port;
128a806ad8eSHenrik Bjoernlund 	unsigned long			ccm_tx_end;
129a806ad8eSHenrik Bjoernlund 	struct delayed_work		ccm_tx_dwork;
130a806ad8eSHenrik Bjoernlund 	u32				ccm_tx_snumber;
131*dc32cbb3SHenrik Bjoernlund 	u32				ccm_rx_snumber;
132*dc32cbb3SHenrik Bjoernlund 	struct br_cfm_mep_status	status;
133a806ad8eSHenrik Bjoernlund 	bool				rdi;
13486a14b79SHenrik Bjoernlund 	struct rcu_head			rcu;
13586a14b79SHenrik Bjoernlund };
13686a14b79SHenrik Bjoernlund 
13786a14b79SHenrik Bjoernlund struct br_cfm_peer_mep {
13886a14b79SHenrik Bjoernlund 	struct hlist_node		head;
13986a14b79SHenrik Bjoernlund 	struct br_cfm_mep		*mep;
140*dc32cbb3SHenrik Bjoernlund 	struct delayed_work		ccm_rx_dwork;
14186a14b79SHenrik Bjoernlund 	u32				mepid;
142*dc32cbb3SHenrik Bjoernlund 	struct br_cfm_cc_peer_status	cc_status;
143*dc32cbb3SHenrik Bjoernlund 	u32				ccm_rx_count_miss;
14486a14b79SHenrik Bjoernlund 	struct rcu_head			rcu;
14586a14b79SHenrik Bjoernlund };
14686a14b79SHenrik Bjoernlund 
14786a14b79SHenrik Bjoernlund #endif /* _BR_PRIVATE_CFM_H_ */
148