]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | /* SPDX-License-Identifier: BSD-3-Clause |
2 | * Copyright(c) 2010-2014 Intel Corporation | |
7c673cae FG |
3 | */ |
4 | ||
5 | #ifndef RTE_ETH_BOND_8023AD_PRIVATE_H_ | |
6 | #define RTE_ETH_BOND_8023AD_PRIVATE_H_ | |
7 | ||
8 | #include <stdint.h> | |
9 | ||
10 | #include <rte_ether.h> | |
11 | #include <rte_byteorder.h> | |
12 | #include <rte_atomic.h> | |
11fdf7f2 | 13 | #include <rte_flow.h> |
7c673cae FG |
14 | |
15 | #include "rte_eth_bond_8023ad.h" | |
16 | ||
17 | #define BOND_MODE_8023AX_UPDATE_TIMEOUT_MS 100 | |
18 | /** Maximum number of packets to one slave queued in TX ring. */ | |
19 | #define BOND_MODE_8023AX_SLAVE_RX_PKTS 3 | |
20 | /** Maximum number of LACP packets from one slave queued in TX ring. */ | |
21 | #define BOND_MODE_8023AX_SLAVE_TX_PKTS 1 | |
22 | /** | |
23 | * Timeouts deffinitions (5.4.4 in 802.1AX documentation). | |
24 | */ | |
25 | #define BOND_8023AD_FAST_PERIODIC_MS 900 | |
26 | #define BOND_8023AD_SLOW_PERIODIC_MS 29000 | |
27 | #define BOND_8023AD_SHORT_TIMEOUT_MS 3000 | |
28 | #define BOND_8023AD_LONG_TIMEOUT_MS 90000 | |
29 | #define BOND_8023AD_CHURN_DETECTION_TIMEOUT_MS 60000 | |
30 | #define BOND_8023AD_AGGREGATE_WAIT_TIMEOUT_MS 2000 | |
31 | #define BOND_8023AD_TX_MACHINE_PERIOD_MS 500 | |
32 | #define BOND_8023AD_RX_MARKER_PERIOD_MS 2000 | |
33 | ||
34 | /** | |
35 | * Interval of showing warning message from state machines. All messages will | |
36 | * be held (and gathered together) to prevent flooding. | |
37 | * This is no parto of 802.1AX standard. | |
38 | */ | |
39 | #define BOND_8023AD_WARNINGS_PERIOD_MS 1000 | |
40 | ||
41 | ||
42 | ||
43 | /** | |
44 | * State machine flags | |
45 | */ | |
46 | #define SM_FLAGS_BEGIN 0x0001 | |
47 | #define SM_FLAGS_LACP_ENABLED 0x0002 | |
48 | #define SM_FLAGS_ACTOR_CHURN 0x0004 | |
49 | #define SM_FLAGS_PARTNER_CHURN 0x0008 | |
50 | #define SM_FLAGS_MOVED 0x0100 | |
51 | #define SM_FLAGS_PARTNER_SHORT_TIMEOUT 0x0200 | |
52 | #define SM_FLAGS_NTT 0x0400 | |
53 | ||
54 | #define BOND_LINK_FULL_DUPLEX_KEY 0x01 | |
55 | #define BOND_LINK_SPEED_KEY_10M 0x02 | |
56 | #define BOND_LINK_SPEED_KEY_100M 0x04 | |
57 | #define BOND_LINK_SPEED_KEY_1000M 0x08 | |
58 | #define BOND_LINK_SPEED_KEY_10G 0x10 | |
59 | #define BOND_LINK_SPEED_KEY_20G 0x11 | |
60 | #define BOND_LINK_SPEED_KEY_40G 0x12 | |
61 | ||
62 | #define WRN_RX_MARKER_TO_FAST 0x01 | |
63 | #define WRN_UNKNOWN_SLOW_TYPE 0x02 | |
64 | #define WRN_UNKNOWN_MARKER_TYPE 0x04 | |
65 | #define WRN_NOT_LACP_CAPABLE 0x08 | |
66 | #define WRN_RX_QUEUE_FULL 0x10 | |
67 | #define WRN_TX_QUEUE_FULL 0x20 | |
68 | ||
69 | #define CHECK_FLAGS(_variable, _f) ((_variable) & (_f)) | |
70 | #define SET_FLAGS(_variable, _f) ((_variable) |= (_f)) | |
71 | #define CLEAR_FLAGS(_variable, _f) ((_variable) &= ~(_f)) | |
72 | ||
73 | #define SM_FLAG(_p, _f) (!!CHECK_FLAGS((_p)->sm_flags, SM_FLAGS_ ## _f)) | |
74 | #define SM_FLAG_SET(_p, _f) SET_FLAGS((_p)->sm_flags, SM_FLAGS_ ## _f) | |
75 | #define SM_FLAG_CLR(_p, _f) CLEAR_FLAGS((_p)->sm_flags, SM_FLAGS_ ## _f) | |
76 | ||
77 | #define ACTOR_STATE(_p, _f) (!!CHECK_FLAGS((_p)->actor_state, STATE_ ## _f)) | |
78 | #define ACTOR_STATE_SET(_p, _f) SET_FLAGS((_p)->actor_state, STATE_ ## _f) | |
79 | #define ACTOR_STATE_CLR(_p, _f) CLEAR_FLAGS((_p)->actor_state, STATE_ ## _f) | |
80 | ||
81 | #define PARTNER_STATE(_p, _f) (!!CHECK_FLAGS((_p)->partner_state, STATE_ ## _f)) | |
82 | #define PARTNER_STATE_SET(_p, _f) SET_FLAGS((_p)->partner_state, STATE_ ## _f) | |
83 | #define PARTNER_STATE_CLR(_p, _f) CLEAR_FLAGS((_p)->partner_state, STATE_ ## _f) | |
84 | ||
85 | /** Variables associated with each port (5.4.7 in 802.1AX documentation). */ | |
86 | struct port { | |
87 | /** | |
88 | * The operational values of the Actor's state parameters. Bitmask | |
89 | * of port states. | |
90 | */ | |
91 | uint8_t actor_state; | |
92 | ||
93 | /** The operational Actor's port parameters */ | |
94 | struct port_params actor; | |
95 | ||
96 | /** | |
97 | * The operational value of the Actor's view of the current values of | |
98 | * the Partner's state parameters. The Actor sets this variable either | |
99 | * to the value received from the Partner in an LACPDU, or to the value | |
100 | * of Partner_Admin_Port_State. Bitmask of port states. | |
101 | */ | |
102 | uint8_t partner_state; | |
103 | ||
104 | /** The operational Partner's port parameters */ | |
105 | struct port_params partner; | |
106 | ||
107 | /* Additional port parameters not listed in documentation */ | |
108 | /** State machine flags */ | |
109 | uint16_t sm_flags; | |
110 | enum rte_bond_8023ad_selection selected; | |
111 | ||
112 | uint64_t current_while_timer; | |
113 | uint64_t periodic_timer; | |
114 | uint64_t wait_while_timer; | |
115 | uint64_t tx_machine_timer; | |
116 | uint64_t tx_marker_timer; | |
117 | /* Agregator parameters */ | |
118 | /** Used aggregator port ID */ | |
119 | uint16_t aggregator_port_id; | |
120 | ||
121 | /** Memory pool used to allocate rings */ | |
122 | struct rte_mempool *mbuf_pool; | |
123 | ||
124 | /** Ring of LACP packets from RX burst function */ | |
125 | struct rte_ring *rx_ring; | |
126 | ||
127 | /** Ring of slow protocol packets (LACP and MARKERS) to TX burst function */ | |
128 | struct rte_ring *tx_ring; | |
129 | ||
130 | /** Timer which is also used as mutex. If is 0 (not running) RX marker | |
131 | * packet might be responded. Otherwise shall be dropped. It is zeroed in | |
132 | * mode 4 callback function after expire. */ | |
133 | volatile uint64_t rx_marker_timer; | |
134 | ||
135 | uint64_t warning_timer; | |
136 | volatile uint16_t warnings_to_show; | |
11fdf7f2 TL |
137 | |
138 | /** Memory pool used to allocate slow queues */ | |
139 | struct rte_mempool *slow_pool; | |
7c673cae FG |
140 | }; |
141 | ||
142 | struct mode8023ad_private { | |
143 | uint64_t fast_periodic_timeout; | |
144 | uint64_t slow_periodic_timeout; | |
145 | uint64_t short_timeout; | |
146 | uint64_t long_timeout; | |
147 | uint64_t aggregate_wait_timeout; | |
148 | uint64_t tx_period_timeout; | |
149 | uint64_t rx_marker_timeout; | |
150 | uint64_t update_timeout_us; | |
151 | rte_eth_bond_8023ad_ext_slowrx_fn slowrx_cb; | |
152 | uint8_t external_sm; | |
9f95a23c | 153 | struct ether_addr mac_addr; |
11fdf7f2 TL |
154 | |
155 | struct rte_eth_link slave_link; | |
156 | /***< slave link properties */ | |
157 | ||
158 | /** | |
159 | * Configuration of dedicated hardware queues for control plane | |
160 | * traffic | |
161 | */ | |
162 | struct { | |
163 | uint8_t enabled; | |
164 | ||
165 | struct rte_flow *flow[RTE_MAX_ETHPORTS]; | |
166 | ||
167 | uint16_t rx_qid; | |
168 | uint16_t tx_qid; | |
169 | } dedicated_queues; | |
170 | enum rte_bond_8023ad_agg_selection agg_selection; | |
7c673cae FG |
171 | }; |
172 | ||
173 | /** | |
174 | * @internal | |
175 | * The pool of *port* structures. The size of the pool | |
176 | * is configured at compile-time in the <rte_eth_bond_8023ad.c> file. | |
177 | */ | |
9f95a23c | 178 | extern struct port bond_mode_8023ad_ports[]; |
7c673cae FG |
179 | |
180 | /* Forward declaration */ | |
181 | struct bond_dev_private; | |
182 | ||
183 | ||
184 | /** | |
185 | * @internal | |
186 | * | |
187 | * Set mode 4 configuration of bonded interface. | |
188 | * | |
189 | * @pre Bonded interface must be stopped. | |
190 | * | |
191 | * @param dev Bonded interface | |
192 | * @param conf new configuration. If NULL set default configuration. | |
193 | */ | |
194 | void | |
195 | bond_mode_8023ad_setup(struct rte_eth_dev *dev, | |
196 | struct rte_eth_bond_8023ad_conf *conf); | |
197 | ||
198 | /** | |
199 | * @internal | |
200 | * | |
201 | * Enables 802.1AX mode and all active slaves on bonded interface. | |
202 | * | |
203 | * @param dev Bonded interface | |
204 | * @return | |
205 | * 0 on success, negative value otherwise. | |
206 | */ | |
207 | int | |
208 | bond_mode_8023ad_enable(struct rte_eth_dev *dev); | |
209 | ||
210 | /** | |
211 | * @internal | |
212 | * | |
213 | * Disables 802.1AX mode of the bonded interface and slaves. | |
214 | * | |
215 | * @param dev Bonded interface | |
216 | * @return | |
217 | * 0 on success, negative value otherwise. | |
218 | */ | |
219 | int bond_mode_8023ad_disable(struct rte_eth_dev *dev); | |
220 | ||
221 | /** | |
222 | * @internal | |
223 | * | |
224 | * Starts 802.3AX state machines management logic. | |
225 | * @param dev Bonded interface | |
226 | * @return | |
227 | * 0 if machines was started, 1 if machines was already running, | |
228 | * negative value otherwise. | |
229 | */ | |
230 | int | |
231 | bond_mode_8023ad_start(struct rte_eth_dev *dev); | |
232 | ||
233 | /** | |
234 | * @internal | |
235 | * | |
236 | * Stops 802.3AX state machines management logic. | |
237 | * @param dev Bonded interface | |
238 | * @return | |
239 | * 0 if this call stopped state machines, -ENOENT if alarm was not set. | |
240 | */ | |
241 | void | |
242 | bond_mode_8023ad_stop(struct rte_eth_dev *dev); | |
243 | ||
244 | /** | |
245 | * @internal | |
246 | * | |
247 | * Passes given slow packet to state machines management logic. | |
248 | * @param internals Bonded device private data. | |
249 | * @param slave_id Slave port id. | |
250 | * @param slot_pkt Slow packet. | |
251 | */ | |
252 | void | |
253 | bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals, | |
11fdf7f2 | 254 | uint16_t slave_id, struct rte_mbuf *pkt); |
7c673cae FG |
255 | |
256 | /** | |
257 | * @internal | |
258 | * | |
259 | * Appends given slave used slave | |
260 | * | |
261 | * @param dev Bonded interface. | |
262 | * @param port_id Slave port ID to be added | |
263 | * | |
264 | * @return | |
265 | * 0 on success, negative value otherwise. | |
266 | */ | |
267 | void | |
11fdf7f2 | 268 | bond_mode_8023ad_activate_slave(struct rte_eth_dev *dev, uint16_t port_id); |
7c673cae FG |
269 | |
270 | /** | |
271 | * @internal | |
272 | * | |
273 | * Denitializes and removes given slave from 802.1AX mode. | |
274 | * | |
275 | * @param dev Bonded interface. | |
276 | * @param slave_num Position of slave in active_slaves array | |
277 | * | |
278 | * @return | |
279 | * 0 on success, negative value otherwise. | |
280 | */ | |
281 | int | |
11fdf7f2 | 282 | bond_mode_8023ad_deactivate_slave(struct rte_eth_dev *dev, uint16_t slave_pos); |
7c673cae FG |
283 | |
284 | /** | |
285 | * Updates state when MAC was changed on bonded device or one of its slaves. | |
286 | * @param bond_dev Bonded device | |
287 | */ | |
288 | void | |
289 | bond_mode_8023ad_mac_address_update(struct rte_eth_dev *bond_dev); | |
290 | ||
11fdf7f2 TL |
291 | int |
292 | bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev, | |
293 | uint16_t slave_port); | |
294 | ||
295 | int | |
296 | bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint16_t slave_port); | |
297 | ||
298 | int | |
299 | bond_8023ad_slow_pkt_hw_filter_supported(uint16_t port_id); | |
300 | ||
7c673cae | 301 | #endif /* RTE_ETH_BOND_8023AD_H_ */ |