1
2
3#ifndef _BR_PRIVATE_CFM_H_
4#define _BR_PRIVATE_CFM_H_
5
6#include "br_private.h"
7#include <uapi/linux/cfm_bridge.h>
8
9struct br_cfm_mep_create {
10 enum br_cfm_domain domain;
11 enum br_cfm_mep_direction direction;
12 u32 ifindex;
13};
14
15int br_cfm_mep_create(struct net_bridge *br,
16 const u32 instance,
17 struct br_cfm_mep_create *const create,
18 struct netlink_ext_ack *extack);
19
20int br_cfm_mep_delete(struct net_bridge *br,
21 const u32 instance,
22 struct netlink_ext_ack *extack);
23
24struct br_cfm_mep_config {
25 u32 mdlevel;
26 u32 mepid;
27 struct mac_addr unicast_mac;
28};
29
30int br_cfm_mep_config_set(struct net_bridge *br,
31 const u32 instance,
32 const struct br_cfm_mep_config *const config,
33 struct netlink_ext_ack *extack);
34
35struct br_cfm_maid {
36 u8 data[CFM_MAID_LENGTH];
37};
38
39struct br_cfm_cc_config {
40
41 struct br_cfm_maid exp_maid;
42
43
44
45 enum br_cfm_ccm_interval exp_interval;
46
47 bool enable;
48};
49
50int br_cfm_cc_config_set(struct net_bridge *br,
51 const u32 instance,
52 const struct br_cfm_cc_config *const config,
53 struct netlink_ext_ack *extack);
54
55int br_cfm_cc_peer_mep_add(struct net_bridge *br, const u32 instance,
56 u32 peer_mep_id,
57 struct netlink_ext_ack *extack);
58int br_cfm_cc_peer_mep_remove(struct net_bridge *br, const u32 instance,
59 u32 peer_mep_id,
60 struct netlink_ext_ack *extack);
61
62
63
64
65
66int br_cfm_cc_rdi_set(struct net_bridge *br, const u32 instance,
67 const bool rdi, struct netlink_ext_ack *extack);
68
69
70struct br_cfm_cc_ccm_tx_info {
71 struct mac_addr dmac;
72
73
74
75
76 u32 period;
77
78 bool seq_no_update;
79 bool if_tlv;
80 u8 if_tlv_value;
81 bool port_tlv;
82 u8 port_tlv_value;
83
84
85
86};
87
88int 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);
91
92struct br_cfm_mep_status {
93
94 bool opcode_unexp_seen;
95 bool version_unexp_seen;
96 bool rx_level_low_seen;
97};
98
99struct br_cfm_cc_peer_status {
100
101 u8 port_tlv_value;
102 u8 if_tlv_value;
103
104
105 u8 ccm_defect:1;
106
107
108 u8 rdi:1;
109
110
111 u8 seen:1;
112 u8 tlv_seen:1;
113
114 u8 seq_unexp_seen:1;
115};
116
117struct br_cfm_mep {
118
119 struct hlist_node head;
120 u32 instance;
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
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;
130 u32 ccm_tx_snumber;
131 u32 ccm_rx_snumber;
132 struct br_cfm_mep_status status;
133 bool rdi;
134 struct rcu_head rcu;
135};
136
137struct br_cfm_peer_mep {
138 struct hlist_node head;
139 struct br_cfm_mep *mep;
140 struct delayed_work ccm_rx_dwork;
141 u32 mepid;
142 struct br_cfm_cc_peer_status cc_status;
143 u32 ccm_rx_count_miss;
144 struct rcu_head rcu;
145};
146
147#endif
148