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 for (pos = 0; pos < members_count; pos++) { 208 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 337