bond: add mode 5
[dpdk.git] / lib / librte_pmd_bond / rte_eth_bond.h
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
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
16  *       distribution.
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.
20  *
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.
32  */
33
34 #ifndef _RTE_ETH_BOND_H_
35 #define _RTE_ETH_BOND_H_
36
37 /**
38  * @file rte_eth_bond.h
39  *
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
47  */
48
49 #ifdef __cplusplus
50 extern "C" {
51 #endif
52
53 #include <rte_ether.h>
54
55 /* Supported modes of operation of link bonding library  */
56
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
73  * policies. */
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. */
79 #endif
80 #define BONDING_MODE_8023AD                             (4)
81 /**< 802.3AD (Mode 4).
82  *
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
87  * described here
88  * https://www.kernel.org/doc/Documentation/networking/bonding.txt.
89  *
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.
97  *
98  */
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 */
104
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 */
112
113 /**
114  * Create a bonded rte_eth_dev device
115  *
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.
119  *
120  * @return
121  *      Port Id of created rte_eth_dev on success, negative value otherwise
122  */
123 int
124 rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id);
125
126 /**
127  * Add a rte_eth_dev device as a slave to the bonded device
128  *
129  * @param bonded_port_id        Port ID of bonded device.
130  * @param slave_port_id         Port ID of slave device.
131  *
132  * @return
133  *      0 on success, negative value otherwise
134  */
135 int
136 rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id);
137
138 /**
139  * Remove a slave rte_eth_dev device from the bonded device
140  *
141  * @param bonded_port_id        Port ID of bonded device.
142  * @param slave_port_id         Port ID of slave device.
143  *
144  * @return
145  *      0 on success, negative value otherwise
146  */
147 int
148 rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id);
149
150 /**
151  * Set link bonding mode of bonded device
152  *
153  * @param bonded_port_id        Port ID of bonded device.
154  * @param mode                          Bonding mode to set
155  *
156  * @return
157  *      0 on success, negative value otherwise
158  */
159 int
160 rte_eth_bond_mode_set(uint8_t bonded_port_id, uint8_t mode);
161
162 /**
163  * Get link bonding mode of bonded device
164  *
165  * @param bonded_port_id        Port ID of bonded device.
166  *
167  * @return
168  *      link bonding mode on success, negative value otherwise
169  */
170 int
171 rte_eth_bond_mode_get(uint8_t bonded_port_id);
172
173 /**
174  * Set slave rte_eth_dev as primary slave of bonded device
175  *
176  * @param bonded_port_id        Port ID of bonded device.
177  * @param slave_port_id         Port ID of slave device.
178  *
179  * @return
180  *      0 on success, negative value otherwise
181  */
182 int
183 rte_eth_bond_primary_set(uint8_t bonded_port_id, uint8_t slave_port_id);
184
185 /**
186  * Get primary slave of bonded device
187  *
188  * @param bonded_port_id        Port ID of bonded device.
189  *
190  * @return
191  *      Port Id of primary slave on success, -1 on failure
192  */
193 int
194 rte_eth_bond_primary_get(uint8_t bonded_port_id);
195
196 /**
197  * Populate an array with list of the slaves port id's of the bonded device
198  *
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
202  *
203  * @return
204  *      Number of slaves associated with bonded device on success,
205  *      negative value otherwise
206  */
207 int
208 rte_eth_bond_slaves_get(uint8_t bonded_port_id, uint8_t slaves[], uint8_t len);
209
210 /**
211  * Populate an array with list of the active slaves port id's of the bonded
212  * device.
213  *
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
217  *
218  * @return
219  *      Number of active slaves associated with bonded device on success,
220  *      negative value otherwise
221  */
222 int
223 rte_eth_bond_active_slaves_get(uint8_t bonded_port_id, uint8_t slaves[],
224                 uint8_t len);
225
226 /**
227  * Set explicit MAC address to use on bonded device and it's slaves.
228  *
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
232  *
233  * @return
234  *      0 on success, negative value otherwise
235  */
236 int
237 rte_eth_bond_mac_address_set(uint8_t bonded_port_id,
238                 struct ether_addr *mac_addr);
239
240 /**
241  * Reset bonded device to use MAC from primary slave on bonded device and it's
242  * slaves.
243  *
244  * @param bonded_port_id        Port ID of bonded device.
245  *
246  * @return
247  *      0 on success, negative value otherwise
248  */
249 int
250 rte_eth_bond_mac_address_reset(uint8_t bonded_port_id);
251
252 /**
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
255  * operation.
256  *
257  * @param bonded_port_id        Port ID of bonded device.
258  * @param policy                        Balance mode transmission policy.
259  *
260  * @return
261  *      0 on success, negative value otherwise.
262  */
263 int
264 rte_eth_bond_xmit_policy_set(uint8_t bonded_port_id, uint8_t policy);
265
266 /**
267  * Get the transmit policy set on bonded device for balance mode operation
268  *
269  * @param bonded_port_id        Port ID of bonded device.
270  *
271  * @return
272  *      Balance transmit policy on success, negative value otherwise.
273  */
274 int
275 rte_eth_bond_xmit_policy_get(uint8_t bonded_port_id);
276
277 /**
278  * Set the link monitoring frequency (in ms) for monitoring the link status of
279  * slave devices
280  *
281  * @param bonded_port_id        Port ID of bonded device.
282  * @param internal_ms           Monitoring interval in milliseconds
283  *
284  * @return
285  *      0 on success, negative value otherwise.
286  */
287
288 int
289 rte_eth_bond_link_monitoring_set(uint8_t bonded_port_id, uint32_t internal_ms);
290
291 /**
292  * Get the current link monitoring frequency (in ms) for monitoring of the link
293  * status of slave devices
294  *
295  * @param bonded_port_id        Port ID of bonded device.
296  *
297  * @return
298  *      Monitoring interval on success, negative value otherwise.
299  */
300 int
301 rte_eth_bond_link_monitoring_get(uint8_t bonded_port_id);
302
303
304 /**
305  * Set the period in milliseconds for delaying the disabling of a bonded link
306  * when the link down status has been detected
307  *
308  * @param bonded_port_id        Port ID of bonded device.
309  * @param delay_ms                      Delay period in milliseconds.
310  *
311  * @return
312  *  0 on success, negative value otherwise.
313  */
314 int
315 rte_eth_bond_link_down_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
316
317 /**
318  * Get the period in milliseconds set for delaying the disabling of a bonded
319  * link when the link down status has been detected
320  *
321  * @param bonded_port_id        Port ID of bonded device.
322  *
323  * @return
324  *  Delay period on success, negative value otherwise.
325  */
326 int
327 rte_eth_bond_link_down_prop_delay_get(uint8_t bonded_port_id);
328
329 /**
330  * Set the period in milliseconds for delaying the enabling of a bonded link
331  * when the link up status has been detected
332  *
333  * @param bonded_port_id        Port ID of bonded device.
334  * @param delay_ms                      Delay period in milliseconds.
335  *
336  * @return
337  *  0 on success, negative value otherwise.
338  */
339 int
340 rte_eth_bond_link_up_prop_delay_set(uint8_t bonded_port_id, uint32_t delay_ms);
341
342 /**
343  * Get the period in milliseconds set for delaying the enabling of a bonded
344  * link when the link up status has been detected
345  *
346  * @param bonded_port_id        Port ID of bonded device.
347  *
348  * @return
349  *  Delay period on success, negative value otherwise.
350  */
351 int
352 rte_eth_bond_link_up_prop_delay_get(uint8_t bonded_port_id);
353
354
355 #ifdef __cplusplus
356 }
357 #endif
358
359 #endif