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