Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2010-2017 Intel Corporation
3 : : */
4 : :
5 : : #ifndef _ETH_BOND_PRIVATE_H_
6 : : #define _ETH_BOND_PRIVATE_H_
7 : :
8 : : #include <stdint.h>
9 : : #include <sys/queue.h>
10 : :
11 : : #include <ethdev_driver.h>
12 : : #include <rte_flow.h>
13 : : #include <rte_spinlock.h>
14 : : #include <rte_bitmap.h>
15 : : #include <rte_flow_driver.h>
16 : :
17 : : #include "rte_eth_bond.h"
18 : : #include "eth_bond_8023ad_private.h"
19 : : #include "rte_eth_bond_alb.h"
20 : :
21 : : #define PMD_BOND_MEMBER_PORT_KVARG ("member")
22 : : #define PMD_BOND_PRIMARY_MEMBER_KVARG ("primary")
23 : : #define PMD_BOND_MODE_KVARG ("mode")
24 : : #define PMD_BOND_AGG_MODE_KVARG ("agg_mode")
25 : : #define PMD_BOND_XMIT_POLICY_KVARG ("xmit_policy")
26 : : #define PMD_BOND_SOCKET_ID_KVARG ("socket_id")
27 : : #define PMD_BOND_MAC_ADDR_KVARG ("mac")
28 : : #define PMD_BOND_LSC_POLL_PERIOD_KVARG ("lsc_poll_period_ms")
29 : : #define PMD_BOND_LINK_UP_PROP_DELAY_KVARG ("up_delay")
30 : : #define PMD_BOND_LINK_DOWN_PROP_DELAY_KVARG ("down_delay")
31 : :
32 : : #define PMD_BOND_XMIT_POLICY_LAYER2_KVARG ("l2")
33 : : #define PMD_BOND_XMIT_POLICY_LAYER23_KVARG ("l23")
34 : : #define PMD_BOND_XMIT_POLICY_LAYER34_KVARG ("l34")
35 : :
36 : : extern int bond_logtype;
37 : : #define RTE_LOGTYPE_BOND bond_logtype
38 : :
39 : : #define RTE_BOND_LOG(lvl, ...) \
40 : : RTE_LOG_LINE_PREFIX(lvl, BOND, "%s(%d) - ", __func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
41 : :
42 : : #define BONDING_MODE_INVALID 0xFF
43 : :
44 : : extern const char *pmd_bond_init_valid_arguments[];
45 : :
46 : : extern struct rte_vdev_driver pmd_bond_drv;
47 : :
48 : : extern const struct rte_flow_ops bond_flow_ops;
49 : :
50 : : /** Port Queue Mapping Structure */
51 : : struct bond_rx_queue {
52 : : uint16_t queue_id;
53 : : /**< Next active_member to poll */
54 : : uint16_t active_member;
55 : : /**< Queue Id */
56 : : struct bond_dev_private *dev_private;
57 : : /**< Reference to eth_dev private structure */
58 : : uint16_t nb_rx_desc;
59 : : /**< Number of RX descriptors available for the queue */
60 : : struct rte_eth_rxconf rx_conf;
61 : : /**< Copy of RX configuration structure for queue */
62 : : struct rte_mempool *mb_pool;
63 : : /**< Reference to mbuf pool to use for RX queue */
64 : : };
65 : :
66 : : struct bond_tx_queue {
67 : : uint16_t queue_id;
68 : : /**< Queue Id */
69 : : struct bond_dev_private *dev_private;
70 : : /**< Reference to dev private structure */
71 : : uint16_t nb_tx_desc;
72 : : /**< Number of TX descriptors available for the queue */
73 : : struct rte_eth_txconf tx_conf;
74 : : /**< Copy of TX configuration structure for queue */
75 : : };
76 : :
77 : : /** Bonding member devices structure */
78 : : struct bond_ethdev_member_ports {
79 : : uint16_t members[RTE_MAX_ETHPORTS]; /**< Member port id array */
80 : : uint16_t member_count; /**< Number of members */
81 : : };
82 : :
83 : : struct bond_member_details {
84 : : uint16_t port_id;
85 : :
86 : : uint8_t link_status_poll_enabled;
87 : : uint8_t link_status_wait_to_complete;
88 : : uint8_t last_link_status;
89 : : /**< Port Id of member eth_dev */
90 : : struct rte_ether_addr persisted_mac_addr;
91 : :
92 : : uint16_t reta_size;
93 : : };
94 : :
95 : : struct rte_flow {
96 : : TAILQ_ENTRY(rte_flow) next;
97 : : /* Members flows */
98 : : struct rte_flow *flows[RTE_MAX_ETHPORTS];
99 : : /* Flow description for synchronization */
100 : : struct rte_flow_conv_rule rule;
101 : : uint8_t rule_data[];
102 : : };
103 : :
104 : : typedef void (*burst_xmit_hash_t)(struct rte_mbuf **buf, uint16_t nb_pkts,
105 : : uint16_t member_count, uint16_t *members);
106 : :
107 : : /** Link Bonding PMD device private configuration Structure */
108 : : struct bond_dev_private {
109 : : uint16_t port_id; /**< Port Id of Bonding Port */
110 : : uint8_t mode; /**< Link Bonding Mode */
111 : :
112 : : rte_spinlock_t lock;
113 : : rte_spinlock_t lsc_lock;
114 : :
115 : : uint16_t primary_port; /**< Primary Member Port */
116 : : uint16_t current_primary_port; /**< Primary Member Port */
117 : : uint16_t user_defined_primary_port;
118 : : /**< Flag for whether primary port is user defined or not */
119 : :
120 : : uint8_t balance_xmit_policy;
121 : : /**< Transmit policy - l2 / l23 / l34 for operation in balance mode */
122 : : burst_xmit_hash_t burst_xmit_hash;
123 : : /**< Transmit policy hash function */
124 : :
125 : : uint8_t user_defined_mac;
126 : : /**< Flag for whether MAC address is user defined or not */
127 : :
128 : : uint8_t link_status_polling_enabled;
129 : : uint32_t link_status_polling_interval_ms;
130 : :
131 : : uint32_t link_down_delay_ms;
132 : : uint32_t link_up_delay_ms;
133 : :
134 : : uint32_t speed_capa;
135 : : /**< Supported speeds bitmap (RTE_ETH_LINK_SPEED_). */
136 : :
137 : : uint16_t nb_rx_queues; /**< Total number of rx queues */
138 : : uint16_t nb_tx_queues; /**< Total number of tx queues*/
139 : :
140 : : uint16_t active_member_count; /**< Number of active members */
141 : : uint16_t active_members[RTE_MAX_ETHPORTS]; /**< Active member list */
142 : :
143 : : uint16_t member_count; /**< Number of bonding members */
144 : : struct bond_member_details members[RTE_MAX_ETHPORTS];
145 : : /**< Array of bonding members details */
146 : :
147 : : struct mode8023ad_private mode4;
148 : : uint16_t tlb_members_order[RTE_MAX_ETHPORTS];
149 : : /**< TLB active members send order */
150 : : struct mode_alb_private mode6;
151 : :
152 : : uint64_t rx_offload_capa; /** Rx offload capability */
153 : : uint64_t tx_offload_capa; /** Tx offload capability */
154 : : uint64_t rx_queue_offload_capa; /** per queue Rx offload capability */
155 : : uint64_t tx_queue_offload_capa; /** per queue Tx offload capability */
156 : :
157 : : /**< List of the configured flows */
158 : : TAILQ_HEAD(sub_flows, rte_flow) flow_list;
159 : :
160 : : /**< Flow isolation state */
161 : : int flow_isolated;
162 : : int flow_isolated_valid;
163 : :
164 : : /** Bit mask of RSS offloads, the bit offset also means flow type */
165 : : uint64_t flow_type_rss_offloads;
166 : :
167 : : struct rte_eth_rxconf default_rxconf; /**< Default RxQ conf. */
168 : : struct rte_eth_txconf default_txconf; /**< Default TxQ conf. */
169 : : struct rte_eth_desc_lim rx_desc_lim; /**< Rx descriptor limits */
170 : : struct rte_eth_desc_lim tx_desc_lim; /**< Tx descriptor limits */
171 : :
172 : : uint16_t reta_size;
173 : : struct rte_eth_rss_reta_entry64 reta_conf[RTE_ETH_RSS_RETA_SIZE_512 /
174 : : RTE_ETH_RETA_GROUP_SIZE];
175 : :
176 : : uint8_t rss_key[52]; /**< 52-byte hash key buffer. */
177 : : uint8_t rss_key_len; /**< hash key length in bytes. */
178 : :
179 : : struct rte_kvargs *kvlist;
180 : : uint8_t member_update_idx;
181 : :
182 : : bool kvargs_processing_is_done;
183 : :
184 : : uint32_t candidate_max_rx_pktlen;
185 : : uint32_t max_rx_pktlen;
186 : :
187 : : void *vlan_filter_bmpmem; /* enabled vlan filter bitmap */
188 : : struct rte_bitmap *vlan_filter_bmp;
189 : : };
190 : :
191 : : extern const struct eth_dev_ops default_dev_ops;
192 : :
193 : : int
194 : : check_for_main_bonding_ethdev(const struct rte_eth_dev *eth_dev);
195 : :
196 : : int
197 : : check_for_bonding_ethdev(const struct rte_eth_dev *eth_dev);
198 : :
199 : : /*
200 : : * Search given member array to find position of given id.
201 : : * Return member pos or members_count if not found.
202 : : */
203 : : static inline uint16_t
204 : : find_member_by_id(uint16_t *members, uint16_t members_count, uint16_t member_id) {
205 : :
206 : : uint16_t pos;
207 [ # # # # ]: 0 : for (pos = 0; pos < members_count; pos++) {
208 [ # # # # ]: 0 : if (member_id == members[pos])
209 : : break;
210 : : }
211 : :
212 : : return pos;
213 : : }
214 : :
215 : : int
216 : : valid_port_id(uint16_t port_id);
217 : :
218 : : int
219 : : valid_bonding_port_id(uint16_t port_id);
220 : :
221 : : int
222 : : valid_member_port_id(struct bond_dev_private *internals, uint16_t port_id);
223 : :
224 : : void
225 : : deactivate_member(struct rte_eth_dev *eth_dev, uint16_t port_id);
226 : :
227 : : void
228 : : activate_member(struct rte_eth_dev *eth_dev, uint16_t port_id);
229 : :
230 : : int
231 : : mac_address_set(struct rte_eth_dev *eth_dev,
232 : : struct rte_ether_addr *new_mac_addr);
233 : :
234 : : int
235 : : mac_address_get(struct rte_eth_dev *eth_dev,
236 : : struct rte_ether_addr *dst_mac_addr);
237 : :
238 : : int
239 : : mac_address_members_update(struct rte_eth_dev *bonding_eth_dev);
240 : :
241 : : int
242 : : member_add_mac_addresses(struct rte_eth_dev *bonding_eth_dev,
243 : : uint16_t member_port_id);
244 : :
245 : : int
246 : : member_remove_mac_addresses(struct rte_eth_dev *bonding_eth_dev,
247 : : uint16_t member_port_id);
248 : :
249 : : int
250 : : bond_ethdev_mode_set(struct rte_eth_dev *eth_dev, uint8_t mode);
251 : :
252 : : int
253 : : member_configure(struct rte_eth_dev *bonding_eth_dev,
254 : : struct rte_eth_dev *member_eth_dev);
255 : :
256 : : int
257 : : member_start(struct rte_eth_dev *bonding_eth_dev,
258 : : struct rte_eth_dev *member_eth_dev);
259 : :
260 : : void
261 : : member_remove(struct bond_dev_private *internals,
262 : : struct rte_eth_dev *member_eth_dev);
263 : :
264 : : void
265 : : member_add(struct bond_dev_private *internals,
266 : : struct rte_eth_dev *member_eth_dev);
267 : :
268 : : void
269 : : burst_xmit_l2_hash(struct rte_mbuf **buf, uint16_t nb_pkts,
270 : : uint16_t member_count, uint16_t *members);
271 : :
272 : : void
273 : : burst_xmit_l23_hash(struct rte_mbuf **buf, uint16_t nb_pkts,
274 : : uint16_t member_count, uint16_t *members);
275 : :
276 : : void
277 : : burst_xmit_l34_hash(struct rte_mbuf **buf, uint16_t nb_pkts,
278 : : uint16_t member_count, uint16_t *members);
279 : :
280 : :
281 : : void
282 : : bond_ethdev_primary_set(struct bond_dev_private *internals,
283 : : uint16_t member_port_id);
284 : :
285 : : int
286 : : bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type,
287 : : void *param, void *ret_param);
288 : :
289 : : int
290 : : bond_ethdev_parse_member_port_kvarg(const char *key,
291 : : const char *value, void *extra_args);
292 : :
293 : : int
294 : : bond_ethdev_parse_member_mode_kvarg(const char *key,
295 : : const char *value, void *extra_args);
296 : :
297 : : int
298 : : bond_ethdev_parse_member_agg_mode_kvarg(const char *key __rte_unused,
299 : : const char *value, void *extra_args);
300 : :
301 : : int
302 : : bond_ethdev_parse_socket_id_kvarg(const char *key,
303 : : const char *value, void *extra_args);
304 : :
305 : : int
306 : : bond_ethdev_parse_primary_member_port_id_kvarg(const char *key,
307 : : const char *value, void *extra_args);
308 : :
309 : : int
310 : : bond_ethdev_parse_balance_xmit_policy_kvarg(const char *key,
311 : : const char *value, void *extra_args);
312 : :
313 : : int
314 : : bond_ethdev_parse_bond_mac_addr_kvarg(const char *key,
315 : : const char *value, void *extra_args);
316 : :
317 : : int
318 : : bond_ethdev_parse_time_ms_kvarg(const char *key,
319 : : const char *value, void *extra_args);
320 : :
321 : : void
322 : : bond_tlb_disable(struct bond_dev_private *internals);
323 : :
324 : : void
325 : : bond_tlb_enable(struct bond_dev_private *internals);
326 : :
327 : : void
328 : : bond_tlb_activate_member(struct bond_dev_private *internals);
329 : :
330 : : int
331 : : bond_ethdev_stop(struct rte_eth_dev *eth_dev);
332 : :
333 : : int
334 : : bond_ethdev_close(struct rte_eth_dev *dev);
335 : :
336 : : #endif
|