Merge tag 'gpio-fixes-for-v5.15' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/kernel/linux-starfive.git] / net / bridge / br_private_cfm.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
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
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 */
13 };
14
15 int 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
20 int br_cfm_mep_delete(struct net_bridge *br,
21                       const u32 instance,
22                       struct netlink_ext_ack *extack);
23
24 struct br_cfm_mep_config {
25         u32 mdlevel;
26         u32 mepid; /* MEPID for this MEP */
27         struct mac_addr unicast_mac; /* The MEP unicast MAC */
28 };
29
30 int 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
35 struct br_cfm_maid {
36         u8 data[CFM_MAID_LENGTH];
37 };
38
39 struct br_cfm_cc_config {
40         /* Expected received CCM PDU MAID. */
41         struct br_cfm_maid exp_maid;
42
43         /* Expected received CCM PDU interval. */
44         /* Transmitting CCM PDU interval when CCM tx is enabled. */
45         enum br_cfm_ccm_interval exp_interval;
46
47         bool enable; /* Enable/disable CCM PDU handling */
48 };
49
50 int 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
55 int br_cfm_cc_peer_mep_add(struct net_bridge *br, const u32 instance,
56                            u32 peer_mep_id,
57                            struct netlink_ext_ack *extack);
58 int 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 /* 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
65  */
66 int br_cfm_cc_rdi_set(struct net_bridge *br, const u32 instance,
67                       const bool rdi, struct netlink_ext_ack *extack);
68
69 /* OAM PDU Tx information */
70 struct br_cfm_cc_ccm_tx_info {
71         struct mac_addr dmac;
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.
75          */
76         u32 period;
77
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 */
83         /* Sender ID TLV ??
84          * Organization-Specific TLV ??
85          */
86 };
87
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);
91
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 */
97 };
98
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 */
103
104         /* CCM has not been received for 3.25 intervals */
105         u8 ccm_defect:1;
106
107         /* (RDI == 1) for last received CCM PDU */
108         u8 rdi:1;
109
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 */
114         u8 seq_unexp_seen:1;
115 };
116
117 struct br_cfm_mep {
118         /* list header of MEP instances */
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         /* 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;
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
137 struct 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 /* _BR_PRIVATE_CFM_H_ */