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