forked from Minki/linux
a806ad8ee2
This is the second commit of the implementation of the CFM protocol according to 802.1Q section 12.14. Functionality is extended with CCM frame transmission. Interface is extended with these functions: br_cfm_cc_rdi_set() br_cfm_cc_ccm_tx() br_cfm_cc_config_set() A MEP Continuity Check feature can be configured by br_cfm_cc_config_set() The Continuity Check parameters can be configured to be used when transmitting CCM. A MEP can be configured to start or stop transmission of CCM frames by br_cfm_cc_ccm_tx() The CCM will be transmitted for a selected period in seconds. Must call this function before timeout to keep transmission alive. A MEP transmitting CCM can be configured with inserted RDI in PDU by br_cfm_cc_rdi_set() Signed-off-by: Henrik Bjoernlund <henrik.bjoernlund@microchip.com> Reviewed-by: Horatiu Vultur <horatiu.vultur@microchip.com> Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
116 lines
3.3 KiB
C
116 lines
3.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#ifndef _BR_PRIVATE_CFM_H_
|
|
#define _BR_PRIVATE_CFM_H_
|
|
|
|
#include "br_private.h"
|
|
#include <uapi/linux/cfm_bridge.h>
|
|
|
|
struct br_cfm_mep_create {
|
|
enum br_cfm_domain domain; /* Domain for this MEP */
|
|
enum br_cfm_mep_direction direction; /* Up or Down MEP direction */
|
|
u32 ifindex; /* Residence port */
|
|
};
|
|
|
|
int br_cfm_mep_create(struct net_bridge *br,
|
|
const u32 instance,
|
|
struct br_cfm_mep_create *const create,
|
|
struct netlink_ext_ack *extack);
|
|
|
|
int br_cfm_mep_delete(struct net_bridge *br,
|
|
const u32 instance,
|
|
struct netlink_ext_ack *extack);
|
|
|
|
struct br_cfm_mep_config {
|
|
u32 mdlevel;
|
|
u32 mepid; /* MEPID for this MEP */
|
|
struct mac_addr unicast_mac; /* The MEP unicast MAC */
|
|
};
|
|
|
|
int br_cfm_mep_config_set(struct net_bridge *br,
|
|
const u32 instance,
|
|
const struct br_cfm_mep_config *const config,
|
|
struct netlink_ext_ack *extack);
|
|
|
|
struct br_cfm_maid {
|
|
u8 data[CFM_MAID_LENGTH];
|
|
};
|
|
|
|
struct br_cfm_cc_config {
|
|
/* Expected received CCM PDU MAID. */
|
|
struct br_cfm_maid exp_maid;
|
|
|
|
/* Expected received CCM PDU interval. */
|
|
/* Transmitting CCM PDU interval when CCM tx is enabled. */
|
|
enum br_cfm_ccm_interval exp_interval;
|
|
};
|
|
|
|
int br_cfm_cc_config_set(struct net_bridge *br,
|
|
const u32 instance,
|
|
const struct br_cfm_cc_config *const config,
|
|
struct netlink_ext_ack *extack);
|
|
|
|
int br_cfm_cc_peer_mep_add(struct net_bridge *br, const u32 instance,
|
|
u32 peer_mep_id,
|
|
struct netlink_ext_ack *extack);
|
|
int br_cfm_cc_peer_mep_remove(struct net_bridge *br, const u32 instance,
|
|
u32 peer_mep_id,
|
|
struct netlink_ext_ack *extack);
|
|
|
|
/* Transmitted CCM Remote Defect Indication status set.
|
|
* This RDI is inserted in transmitted CCM PDUs if CCM transmission is enabled.
|
|
* See br_cfm_cc_ccm_tx() with interval != BR_CFM_CCM_INTERVAL_NONE
|
|
*/
|
|
int br_cfm_cc_rdi_set(struct net_bridge *br, const u32 instance,
|
|
const bool rdi, struct netlink_ext_ack *extack);
|
|
|
|
/* OAM PDU Tx information */
|
|
struct br_cfm_cc_ccm_tx_info {
|
|
struct mac_addr dmac;
|
|
/* The CCM will be transmitted for this period in seconds.
|
|
* Call br_cfm_cc_ccm_tx before timeout to keep transmission alive.
|
|
* When period is zero any ongoing transmission will be stopped.
|
|
*/
|
|
u32 period;
|
|
|
|
bool seq_no_update; /* Update Tx CCM sequence number */
|
|
bool if_tlv; /* Insert Interface Status TLV */
|
|
u8 if_tlv_value; /* Interface Status TLV value */
|
|
bool port_tlv; /* Insert Port Status TLV */
|
|
u8 port_tlv_value; /* Port Status TLV value */
|
|
/* Sender ID TLV ??
|
|
* Organization-Specific TLV ??
|
|
*/
|
|
};
|
|
|
|
int br_cfm_cc_ccm_tx(struct net_bridge *br, const u32 instance,
|
|
const struct br_cfm_cc_ccm_tx_info *const tx_info,
|
|
struct netlink_ext_ack *extack);
|
|
|
|
struct br_cfm_mep {
|
|
/* list header of MEP instances */
|
|
struct hlist_node head;
|
|
u32 instance;
|
|
struct br_cfm_mep_create create;
|
|
struct br_cfm_mep_config config;
|
|
struct br_cfm_cc_config cc_config;
|
|
struct br_cfm_cc_ccm_tx_info cc_ccm_tx_info;
|
|
/* List of multiple peer MEPs */
|
|
struct hlist_head peer_mep_list;
|
|
struct net_bridge_port __rcu *b_port;
|
|
unsigned long ccm_tx_end;
|
|
struct delayed_work ccm_tx_dwork;
|
|
u32 ccm_tx_snumber;
|
|
bool rdi;
|
|
struct rcu_head rcu;
|
|
};
|
|
|
|
struct br_cfm_peer_mep {
|
|
struct hlist_node head;
|
|
struct br_cfm_mep *mep;
|
|
u32 mepid;
|
|
struct rcu_head rcu;
|
|
};
|
|
|
|
#endif /* _BR_PRIVATE_CFM_H_ */
|