1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #ifndef RTE_ETH_BOND_8023AD_H_
6 #define RTE_ETH_BOND_8023AD_H_
7 
8 #include <rte_ether.h>
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 /**
15  * Actor/partner states
16  */
17 #define STATE_LACP_ACTIVE                   0x01
18 #define STATE_LACP_SHORT_TIMEOUT            0x02
19 #define STATE_AGGREGATION                   0x04
20 #define STATE_SYNCHRONIZATION               0x08
21 #define STATE_COLLECTING                    0x10
22 #define STATE_DISTRIBUTING                  0x20
23 /** Partners parameters are defaulted */
24 #define STATE_DEFAULTED                     0x40
25 #define STATE_EXPIRED                       0x80
26 
27 #define TLV_TYPE_ACTOR_INFORMATION          0x01
28 #define TLV_TYPE_PARTNER_INFORMATION        0x02
29 #define TLV_TYPE_COLLECTOR_INFORMATION      0x03
30 #define TLV_TYPE_TERMINATOR_INFORMATION     0x00
31 
32 #define SLOW_SUBTYPE_LACP                   0x01
33 #define SLOW_SUBTYPE_MARKER                 0x02
34 
35 #define MARKER_TLV_TYPE_INFO                0x01
36 #define MARKER_TLV_TYPE_RESP                0x02
37 
38 typedef void (*rte_eth_bond_8023ad_ext_slowrx_fn)(uint16_t slave_id,
39 						  struct rte_mbuf *lacp_pkt);
40 
41 enum rte_bond_8023ad_selection {
42 	UNSELECTED,
43 	STANDBY,
44 	SELECTED
45 };
46 
47 enum rte_bond_8023ad_agg_selection {
48 	AGG_BANDWIDTH,
49 	AGG_COUNT,
50 	AGG_STABLE
51 };
52 
53 /** Generic slow protocol structure */
54 struct slow_protocol {
55 	uint8_t subtype;
56 	uint8_t reserved_119[119];
57 } __rte_packed;
58 
59 /** Generic slow protocol frame type structure */
60 struct slow_protocol_frame {
61 	struct rte_ether_hdr eth_hdr;
62 	struct slow_protocol slow_protocol;
63 } __rte_packed __rte_aligned(2);
64 
65 struct port_params {
66 	uint16_t system_priority;
67 	/**< System priority (unused in current implementation) */
68 	struct rte_ether_addr system;
69 	/**< System ID - Slave MAC address, same as bonding MAC address */
70 	uint16_t key;
71 	/**< Speed information (implementation dependednt) and duplex. */
72 	uint16_t port_priority;
73 	/**< Priority of this (unused in current implementation) */
74 	uint16_t port_number;
75 	/**< Port number. It corresponds to slave port id. */
76 } __rte_packed __rte_aligned(2);
77 
78 struct lacpdu_actor_partner_params {
79 	uint8_t tlv_type_info;
80 	uint8_t info_length;
81 	struct port_params port_params;
82 	uint8_t state;
83 	uint8_t reserved_3[3];
84 } __rte_packed __rte_aligned(2);
85 
86 /** LACPDU structure (5.4.2 in 802.1AX documentation). */
87 struct lacpdu {
88 	uint8_t subtype;
89 	uint8_t version_number;
90 
91 	struct lacpdu_actor_partner_params actor;
92 	struct lacpdu_actor_partner_params partner;
93 
94 	uint8_t tlv_type_collector_info;
95 	uint8_t collector_info_length;
96 	uint16_t collector_max_delay;
97 	uint8_t reserved_12[12];
98 
99 	uint8_t tlv_type_terminator;
100 	uint8_t terminator_length;
101 	uint8_t reserved_50[50];
102 } __rte_packed __rte_aligned(2);
103 
104 /** LACPDU frame: Contains ethernet header and LACPDU. */
105 struct lacpdu_header {
106 	struct rte_ether_hdr eth_hdr;
107 	struct lacpdu lacpdu;
108 } __rte_packed __rte_aligned(2);
109 
110 struct marker {
111 	uint8_t subtype;
112 	uint8_t version_number;
113 
114 	uint8_t tlv_type_marker;
115 	uint8_t info_length;
116 	uint16_t requester_port;
117 	struct rte_ether_addr requester_system;
118 	uint32_t requester_transaction_id;
119 	uint8_t reserved_2[2];
120 
121 	uint8_t tlv_type_terminator;
122 	uint8_t terminator_length;
123 	uint8_t reserved_90[90];
124 } __rte_packed __rte_aligned(2);
125 
126 struct marker_header {
127 	struct rte_ether_hdr eth_hdr;
128 	struct marker marker;
129 } __rte_packed __rte_aligned(2);
130 
131 struct rte_eth_bond_8023ad_conf {
132 	uint32_t fast_periodic_ms;
133 	uint32_t slow_periodic_ms;
134 	uint32_t short_timeout_ms;
135 	uint32_t long_timeout_ms;
136 	uint32_t aggregate_wait_timeout_ms;
137 	uint32_t tx_period_ms;
138 	uint32_t rx_marker_period_ms;
139 	uint32_t update_timeout_ms;
140 	rte_eth_bond_8023ad_ext_slowrx_fn slowrx_cb;
141 	enum rte_bond_8023ad_agg_selection agg_selection;
142 };
143 
144 struct rte_eth_bond_8023ad_slave_info {
145 	enum rte_bond_8023ad_selection selected;
146 	uint8_t actor_state;
147 	struct port_params actor;
148 	uint8_t partner_state;
149 	struct port_params partner;
150 	uint16_t agg_port_id;
151 };
152 
153 /**
154  * @internal
155  *
156  * Function returns current configuration of 802.3AX mode.
157  *
158  * @param port_id   Bonding device id
159  * @param conf		Pointer to timeout structure.
160  *
161  * @return
162  *   0 - if ok
163  *   -EINVAL if conf is NULL
164  */
165 int
166 rte_eth_bond_8023ad_conf_get(uint16_t port_id,
167 		struct rte_eth_bond_8023ad_conf *conf);
168 
169 /**
170  * @internal
171  *
172  * Function set new configuration of 802.3AX mode.
173  *
174  * @param port_id   Bonding device id
175  * @param conf		Configuration, if NULL set default configuration.
176  * @return
177  *   0 - if ok
178  *   -EINVAL if configuration is invalid.
179  */
180 int
181 rte_eth_bond_8023ad_setup(uint16_t port_id,
182 		struct rte_eth_bond_8023ad_conf *conf);
183 
184 /**
185  * @internal
186  *
187  * Function returns current state of given slave device.
188  *
189  * @param slave_id  Port id of valid slave.
190  * @param conf		buffer for configuration
191  * @return
192  *   0 - if ok
193  *   -EINVAL if conf is NULL or slave id is invalid (not a slave of given
194  *       bonded device or is not inactive).
195  */
196 int
197 rte_eth_bond_8023ad_slave_info(uint16_t port_id, uint16_t slave_id,
198 		struct rte_eth_bond_8023ad_slave_info *conf);
199 
200 #ifdef __cplusplus
201 }
202 #endif
203 
204 /**
205  * Configure a slave port to start collecting.
206  *
207  * @param port_id	Bonding device id
208  * @param slave_id	Port id of valid slave.
209  * @param enabled	Non-zero when collection enabled.
210  * @return
211  *   0 - if ok
212  *   -EINVAL if slave is not valid.
213  */
214 int
215 rte_eth_bond_8023ad_ext_collect(uint16_t port_id, uint16_t slave_id,
216 				int enabled);
217 
218 /**
219  * Get COLLECTING flag from slave port actor state.
220  *
221  * @param port_id	Bonding device id
222  * @param slave_id	Port id of valid slave.
223  * @return
224  *   0 - if not set
225  *   1 - if set
226  *   -EINVAL if slave is not valid.
227  */
228 int
229 rte_eth_bond_8023ad_ext_collect_get(uint16_t port_id, uint16_t slave_id);
230 
231 /**
232  * Configure a slave port to start distributing.
233  *
234  * @param port_id	Bonding device id
235  * @param slave_id	Port id of valid slave.
236  * @param enabled	Non-zero when distribution enabled.
237  * @return
238  *   0 - if ok
239  *   -EINVAL if slave is not valid.
240  */
241 int
242 rte_eth_bond_8023ad_ext_distrib(uint16_t port_id, uint16_t slave_id,
243 				int enabled);
244 
245 /**
246  * Get DISTRIBUTING flag from slave port actor state.
247  *
248  * @param port_id	Bonding device id
249  * @param slave_id	Port id of valid slave.
250  * @return
251  *   0 - if not set
252  *   1 - if set
253  *   -EINVAL if slave is not valid.
254  */
255 int
256 rte_eth_bond_8023ad_ext_distrib_get(uint16_t port_id, uint16_t slave_id);
257 
258 /**
259  * LACPDU transmit path for external 802.3ad state machine.  Caller retains
260  * ownership of the packet on failure.
261  *
262  * @param port_id	Bonding device id
263  * @param slave_id	Port ID of valid slave device.
264  * @param lacp_pkt	mbuf containing LACPDU.
265  *
266  * @return
267  *   0 on success, negative value otherwise.
268  */
269 int
270 rte_eth_bond_8023ad_ext_slowtx(uint16_t port_id, uint16_t slave_id,
271 		struct rte_mbuf *lacp_pkt);
272 
273 /**
274  * Enable dedicated hw queues for 802.3ad control plane traffic on on slaves
275  *
276  * This function creates an additional tx and rx queue on each slave for
277  * dedicated 802.3ad control plane traffic . A flow filtering rule is
278  * programmed on each slave to redirect all LACP slow packets to that rx queue
279  * for processing in the LACP state machine, this removes the need to filter
280  * these packets in the bonded devices data path. The additional tx queue is
281  * used to enable the LACP state machine to enqueue LACP packets directly to
282  * slave hw independently of the bonded devices data path.
283  *
284  * To use this feature all slaves must support the programming of the flow
285  * filter rule required for rx and have enough queues that one rx and tx queue
286  * can be reserved for the LACP state machines control packets.
287  *
288  * Bonding port must be stopped to change this configuration.
289  *
290  * @param port_id      Bonding device id
291  *
292  * @return
293  *   0 on success, negative value otherwise.
294  */
295 int
296 rte_eth_bond_8023ad_dedicated_queues_enable(uint16_t port_id);
297 
298 /**
299  * Disable slow queue on slaves
300  *
301  * This function disables hardware slow packet filter.
302  *
303  * Bonding port must be stopped to change this configuration.
304  *
305  * @see rte_eth_bond_8023ad_slow_pkt_hw_filter_enable
306  *
307  * @param port_id      Bonding device id
308  * @return
309  *   0 on success, negative value otherwise.
310  *
311  */
312 int
313 rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port_id);
314 
315 /*
316  * Get aggregator mode for 8023ad
317  * @param port_id Bonding device id
318  *
319  * @return
320  *   agregator mode on success, negative value otherwise
321  */
322 int
323 rte_eth_bond_8023ad_agg_selection_get(uint16_t port_id);
324 
325 /**
326  * Set aggregator mode for 8023ad
327  * @param port_id Bonding device id
328  * @return
329  *   0 on success, negative value otherwise
330  */
331 int
332 rte_eth_bond_8023ad_agg_selection_set(uint16_t port_id,
333 		enum rte_bond_8023ad_agg_selection agg_selection);
334 #endif /* RTE_ETH_BOND_8023AD_H_ */
335