4 * Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #ifndef _RTE_ETH_BOND_H_
35 #define _RTE_ETH_BOND_H_
38 * @file rte_eth_bond.h
40 * RTE Link Bonding Ethernet Device
41 * Link Bonding for 1GbE and 10GbE ports to allow the aggregation of multiple
42 * (slave) NICs into a single logical interface. The bonded device processes
43 * these interfaces based on the mode of operation specified and supported.
44 * This implementation supports 4 modes of operation round robin, active backup
45 * balance and broadcast. Providing redundant links, fault tolerance and/or
46 * load balancing of network ports
53 #include <rte_ether.h>
55 /* Supported modes of operation of link bonding library */
57 #define BONDING_MODE_ROUND_ROBIN (0)
58 /**< Round Robin (Mode 0).
59 * In this mode all transmitted packets will be balanced equally across all
60 * active slaves of the bonded in a round robin fashion. */
61 #define BONDING_MODE_ACTIVE_BACKUP (1)
62 /**< Active Backup (Mode 1).
63 * In this mode all packets transmitted will be transmitted on the primary
64 * slave until such point as the primary slave is no longer available and then
65 * transmitted packets will be sent on the next available slaves. The primary
66 * slave can be defined by the user but defaults to the first active slave
67 * available if not specified. */
68 #define BONDING_MODE_BALANCE (2)
69 /**< Balance (Mode 2).
70 * In this mode all packets transmitted will be balanced across the available
71 * slaves using one of three available transmit policies - l2, l2+3 or l3+4.
72 * See BALANCE_XMIT_POLICY macros definitions for further details on transmit
74 #ifdef RTE_MBUF_REFCNT
75 #define BONDING_MODE_BROADCAST (3)
76 /**< Broadcast (Mode 3).
77 * In this mode all transmitted packets will be transmitted on all available
78 * active slaves of the bonded. */
80 #define BONDING_MODE_8023AD (4)
81 /**< 802.3AD (Mode 4).
83 * This mode provides auto negotiation/configuration
84 * of peers and well as link status changes monitoring using out of band
85 * LACP (link aggregation control protocol) messages. For further details of
86 * LACP specification see the IEEE 802.3ad/802.1AX standards. It is also
88 * https://www.kernel.org/doc/Documentation/networking/bonding.txt.
90 * Important Usage Notes:
91 * - for LACP mode to work the rx/tx burst functions must be invoked
92 * at least once every 100ms, otherwise the out-of-band LACP messages will not
93 * be handled with the expected latency and this may cause the link status to be
94 * incorrectly marked as down or failure to correctly negotiate with peers.
95 * - For optimal performance during initial handshaking the array of mbufs provided
96 * to rx_burst should be at least 2 times the slave count size.
99 #define BONDING_MODE_ADAPTIVE_TRANSMIT_LOAD_BALANCING (5)
100 /**< Adaptive TLB (Mode 5)
101 * This mode provides an adaptive transmit load balancing. It dynamically
102 * changes the transmitting slave, according to the computed load. Statistics
103 * are collected in 100ms intervals and scheduled every 10ms */
105 /* Balance Mode Transmit Policies */
106 #define BALANCE_XMIT_POLICY_LAYER2 (0)
107 /**< Layer 2 (Ethernet MAC) */
108 #define BALANCE_XMIT_POLICY_LAYER23 (1)
109 /**< Layer 2+3 (Ethernet MAC + IP Addresses) transmit load balancing */
110 #define BALANCE_XMIT_POLICY_LAYER34 (2)
111 /**< Layer 3+4 (IP Addresses + UDP Ports) transmit load balancing */
114 * Create a bonded rte_eth_dev device
116 * @param name Name of new link bonding device.
117 * @param mode Mode to initialize bonding device in.
118 * @param socket_id Socket Id on which to allocate eth_dev resources.
121 * Port Id of created rte_eth_dev on success, negative value otherwise
124 rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id);
127 * Add a rte_eth_dev device as a slave to the bonded device
129 * @param bonded_port_id Port ID of bonded device.
130 * @param slave_port_id Port ID of slave device.
133 * 0 on success, negative value otherwise
136 rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id);
139 * Remove a slave rte_eth_dev device from the bonded device
141 * @param bonded_port_id Port ID of bonded device.
142 * @param slave_port_id Port ID of slave device.
145 * 0 on success, negative value otherwise
148 rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id);
151 * Set link bonding mode of bonded device
153 * @param bonded_port_id Port ID of bonded device.
154 * @param mode Bonding mode to set
157 * 0 on success, negative value otherwise
160 rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode);
163 * Get link bonding mode of bonded device
165 * @param bonded_port_id Port ID of bonded device.
168 * link bonding mode on success, negative value otherwise
171 rte_eth_bond_mode_get(uint8_t bonded_port_id);
174 * Set slave rte_eth_dev as primary slave of bonded device
176 * @param bonded_port_id Port ID of bonded device.
177 * @param slave_port_id Port ID of slave device.
180 * 0 on success, negative value otherwise
183 rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id);
186 * Get primary slave of bonded device
188 * @param bonded_port_id Port ID of bonded device.
191 * Port Id of primary slave on success, -1 on failure
194 rte_eth_bond_primary_get(uint8_t bonded_port_id);
197 * Populate an array with list of the slaves port id's of the bonded device
199 * @param bonded_port_id Port ID of bonded eth_dev to interrogate
200 * @param slaves Array to be populated with the current active slaves
201 * @param len Length of slaves array
204 * Number of slaves associated with bonded device on success,
205 * negative value otherwise
208 rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len);
211 * Populate an array with list of the active slaves port id's of the bonded
214 * @param bonded_port_id Port ID of bonded eth_dev to interrogate
215 * @param slaves Array to be populated with the current active slaves
216 * @param len Length of slaves array
219 * Number of active slaves associated with bonded device on success,
220 * negative value otherwise
223 rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
227 * Set explicit MAC address to use on bonded device and it's slaves.
229 * @param bonded_port_id Port ID of bonded device.
230 * @param mac_addr MAC Address to use on bonded device overriding
231 * slaves MAC addresses
234 * 0 on success, negative value otherwise
237 rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
238 struct ether_addr *mac_addr);
241 * Reset bonded device to use MAC from primary slave on bonded device and it's
244 * @param bonded_port_id Port ID of bonded device.
247 * 0 on success, negative value otherwise
250 rte_eth_bond_mac_address_reset(uint8_t bonded_port_id);
253 * Set the transmit policy for bonded device to use when it is operating in
254 * balance mode, this parameter is otherwise ignored in other modes of
257 * @param bonded_port_id Port ID of bonded device.
258 * @param policy Balance mode transmission policy.
261 * 0 on success, negative value otherwise.
264 rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy);
267 * Get the transmit policy set on bonded device for balance mode operation
269 * @param bonded_port_id Port ID of bonded device.
272 * Balance transmit policy on success, negative value otherwise.
275 rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id);
278 * Set the link monitoring frequency (in ms) for monitoring the link status of
281 * @param bonded_port_id Port ID of bonded device.
282 * @param internal_ms Monitoring interval in milliseconds
285 * 0 on success, negative value otherwise.
289 rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms);
292 * Get the current link monitoring frequency (in ms) for monitoring of the link
293 * status of slave devices
295 * @param bonded_port_id Port ID of bonded device.
298 * Monitoring interval on success, negative value otherwise.
301 rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id);
305 * Set the period in milliseconds for delaying the disabling of a bonded link
306 * when the link down status has been detected
308 * @param bonded_port_id Port ID of bonded device.
309 * @param delay_ms Delay period in milliseconds.
312 * 0 on success, negative value otherwise.
315 rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
318 * Get the period in milliseconds set for delaying the disabling of a bonded
319 * link when the link down status has been detected
321 * @param bonded_port_id Port ID of bonded device.
324 * Delay period on success, negative value otherwise.
327 rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id);
330 * Set the period in milliseconds for delaying the enabling of a bonded link
331 * when the link up status has been detected
333 * @param bonded_port_id Port ID of bonded device.
334 * @param delay_ms Delay period in milliseconds.
337 * 0 on success, negative value otherwise.
340 rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
343 * Get the period in milliseconds set for delaying the enabling of a bonded
344 * link when the link up status has been detected
346 * @param bonded_port_id Port ID of bonded device.
349 * Delay period on success, negative value otherwise.
352 rte_eth_bond_link_up_prop_delay_get(uint8_t bonded_port_id);