]> git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/dpdk/drivers/net/bonding/rte_eth_bond_8023ad.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / spdk / dpdk / drivers / net / bonding / rte_eth_bond_8023ad.h
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 } __attribute__((__packed__));
58
59 /** Generic slow protocol frame type structure */
60 struct slow_protocol_frame {
61 struct ether_hdr eth_hdr;
62 struct slow_protocol slow_protocol;
63 } __attribute__((__packed__));
64
65 struct port_params {
66 uint16_t system_priority;
67 /**< System priority (unused in current implementation) */
68 struct 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 } __attribute__((__packed__));
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 } __attribute__((__packed__));
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 } __attribute__((__packed__));
103
104 /** LACPDU frame: Contains ethernet header and LACPDU. */
105 struct lacpdu_header {
106 struct ether_hdr eth_hdr;
107 struct lacpdu lacpdu;
108 } __attribute__((__packed__));
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 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 } __attribute__((__packed__));
125
126 struct marker_header {
127 struct ether_hdr eth_hdr;
128 struct marker marker;
129 } __attribute__((__packed__));
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_ */