1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 #ifndef _BR_PRIVATE_CFM_H_
4 #define _BR_PRIVATE_CFM_H_
6 #include "br_private.h"
7 #include <uapi/linux/cfm_bridge.h>
9 struct br_cfm_mep_create
{
10 enum br_cfm_domain domain
; /* Domain for this MEP */
11 enum br_cfm_mep_direction direction
; /* Up or Down MEP direction */
12 u32 ifindex
; /* Residence port */
15 int br_cfm_mep_create(struct net_bridge
*br
,
17 struct br_cfm_mep_create
*const create
,
18 struct netlink_ext_ack
*extack
);
20 int br_cfm_mep_delete(struct net_bridge
*br
,
22 struct netlink_ext_ack
*extack
);
24 struct br_cfm_mep_config
{
26 u32 mepid
; /* MEPID for this MEP */
27 struct mac_addr unicast_mac
; /* The MEP unicast MAC */
30 int br_cfm_mep_config_set(struct net_bridge
*br
,
32 const struct br_cfm_mep_config
*const config
,
33 struct netlink_ext_ack
*extack
);
36 u8 data
[CFM_MAID_LENGTH
];
39 struct br_cfm_cc_config
{
40 /* Expected received CCM PDU MAID. */
41 struct br_cfm_maid exp_maid
;
43 /* Expected received CCM PDU interval. */
44 /* Transmitting CCM PDU interval when CCM tx is enabled. */
45 enum br_cfm_ccm_interval exp_interval
;
47 bool enable
; /* Enable/disable CCM PDU handling */
50 int br_cfm_cc_config_set(struct net_bridge
*br
,
52 const struct br_cfm_cc_config
*const config
,
53 struct netlink_ext_ack
*extack
);
55 int br_cfm_cc_peer_mep_add(struct net_bridge
*br
, const u32 instance
,
57 struct netlink_ext_ack
*extack
);
58 int br_cfm_cc_peer_mep_remove(struct net_bridge
*br
, const u32 instance
,
60 struct netlink_ext_ack
*extack
);
62 /* Transmitted CCM Remote Defect Indication status set.
63 * This RDI is inserted in transmitted CCM PDUs if CCM transmission is enabled.
64 * See br_cfm_cc_ccm_tx() with interval != BR_CFM_CCM_INTERVAL_NONE
66 int br_cfm_cc_rdi_set(struct net_bridge
*br
, const u32 instance
,
67 const bool rdi
, struct netlink_ext_ack
*extack
);
69 /* OAM PDU Tx information */
70 struct br_cfm_cc_ccm_tx_info
{
72 /* The CCM will be transmitted for this period in seconds.
73 * Call br_cfm_cc_ccm_tx before timeout to keep transmission alive.
74 * When period is zero any ongoing transmission will be stopped.
78 bool seq_no_update
; /* Update Tx CCM sequence number */
79 bool if_tlv
; /* Insert Interface Status TLV */
80 u8 if_tlv_value
; /* Interface Status TLV value */
81 bool port_tlv
; /* Insert Port Status TLV */
82 u8 port_tlv_value
; /* Port Status TLV value */
84 * Organization-Specific TLV ??
88 int br_cfm_cc_ccm_tx(struct net_bridge
*br
, const u32 instance
,
89 const struct br_cfm_cc_ccm_tx_info
*const tx_info
,
90 struct netlink_ext_ack
*extack
);
92 struct br_cfm_mep_status
{
93 /* Indications that an OAM PDU has been seen. */
94 bool opcode_unexp_seen
; /* RX of OAM PDU with unexpected opcode */
95 bool version_unexp_seen
; /* RX of OAM PDU with unexpected version */
96 bool rx_level_low_seen
; /* Rx of OAM PDU with level low */
99 struct br_cfm_cc_peer_status
{
100 /* This CCM related status is based on the latest received CCM PDU. */
101 u8 port_tlv_value
; /* Port Status TLV value */
102 u8 if_tlv_value
; /* Interface Status TLV value */
104 /* CCM has not been received for 3.25 intervals */
107 /* (RDI == 1) for last received CCM PDU */
110 /* Indications that a CCM PDU has been seen. */
111 u8 seen
:1; /* CCM PDU received */
112 u8 tlv_seen
:1; /* CCM PDU with TLV received */
113 /* CCM PDU with unexpected sequence number received */
118 /* list header of MEP instances */
119 struct hlist_node head
;
121 struct br_cfm_mep_create create
;
122 struct br_cfm_mep_config config
;
123 struct br_cfm_cc_config cc_config
;
124 struct br_cfm_cc_ccm_tx_info cc_ccm_tx_info
;
125 /* List of multiple peer MEPs */
126 struct hlist_head peer_mep_list
;
127 struct net_bridge_port __rcu
*b_port
;
128 unsigned long ccm_tx_end
;
129 struct delayed_work ccm_tx_dwork
;
132 struct br_cfm_mep_status status
;
137 struct br_cfm_peer_mep
{
138 struct hlist_node head
;
139 struct br_cfm_mep
*mep
;
140 struct delayed_work ccm_rx_dwork
;
142 struct br_cfm_cc_peer_status cc_status
;
143 u32 ccm_rx_count_miss
;
147 #endif /* _BR_PRIVATE_CFM_H_ */