FD.io VPP  v18.04-17-g3a0d853
Vector Packet Processing
node.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef __included_vnet_bonding_node_h__
16 #define __included_vnet_bonding_node_h__
17 
18 #include <vlib/vlib.h>
19 #include <vlib/unix/unix.h>
20 #include <vppinfra/format.h>
21 #include <vppinfra/hash.h>
22 #include <vnet/ethernet/ethernet.h>
23 #include <vnet/interface.h>
24 
25 #define LACP_FAST_PERIODIC_TIMER 1.0
26 #define LACP_SHORT_TIMOUT_TIME (LACP_FAST_PERIODIC_TIMER * 3)
27 #define LACP_SLOW_PERIODIC_TIMER 30.0
28 #define LACP_LONG_TIMOUT_TIME (LACP_SLOW_PERIODIC_TIMER * 3)
29 
30 #ifndef MIN
31 #define MIN(x,y) (((x)<(y))?(x):(y))
32 #endif
33 
34 #define BOND_MODULO_SHORTCUT(a) \
35  (((a) == 2) || ((a) == 4) || ((a) == 8) || ((a) == 16))
36 
37 #define foreach_bond_mode \
38  _ (1, ROUND_ROBIN, "round-robin") \
39  _ (2, ACTIVE_BACKUP, "active-backup") \
40  _ (3, XOR, "xor") \
41  _ (4, BROADCAST, "broadcast") \
42  _ (5, LACP, "lacp")
43 
44 typedef enum
45 {
46 #define _(v, f, s) BOND_MODE_##f = v,
48 #undef _
49 } bond_mode_t;
50 
51 /* configurable load-balances */
52 #define foreach_bond_lb \
53  _ (2, L23, "l23", l23) \
54  _ (1, l34 , "l34", l34) \
55  _ (0, L2, "l2", l2)
56 
57 /* load-balance functions implemented in bond-output */
58 #define foreach_bond_lb_algo \
59  _ (0, L2, "l2", l2) \
60  _ (1, l34 , "l34", l34) \
61  _ (2, L23, "l23", l23) \
62  _ (3, RR, "round-robin", round_robin) \
63  _ (4, BC, "broadcast", broadcast) \
64  _ (5, AB, "active-backup", active_backup)
65 
66 typedef enum
67 {
68 #define _(v, f, s, p) BOND_LB_##f = v,
70 #undef _
72 
73 typedef struct
74 {
76  u8 hw_addr[6];
78  u8 lb;
79  /* return */
81  int rv;
84 
85 typedef struct
86 {
87  /* slave's sw_if_index */
89  /* bond's sw_if_index */
93  /* return */
94  int rv;
97 
98 typedef struct
99 {
101  /* return */
102  int rv;
105 
106 /** BOND interface details struct */
107 typedef struct
108 {
110  u8 interface_name[64];
116 
117 /** slave interface details struct */
118 typedef struct
119 {
121  u8 interface_name[64];
126 
127 typedef CLIB_PACKED (struct
128  {
129  u16 system_priority;
130  u8 system[6];
131  u16 key; u16 port_priority; u16 port_number;
132  u8 state;
133  }) lacp_port_info_t;
134 
135 typedef struct
136 {
138 
140 
141 typedef struct
142 {
146 
147  /* the last slave index for the rr lb */
149 
153 
154  /* Configured slaves */
156 
157  /* Slaves that are in DISTRIBUTING state */
159 
160  /* rapidly find an active slave */
162 
163  lacp_port_info_t partner;
164  lacp_port_info_t actor;
166 
170  u8 hw_address[6];
171 
174 } bond_if_t;
175 
176 typedef struct
177 {
178  u8 persistent_hw_address[6];
179 
180  /* neighbor's vlib software interface index */
182 
183  /* Neighbor time-to-live (usually 3s) */
185 
186  /* 1 = interface is configured with long timeout (60s) */
188 
189  /* 1 = debug is on; 0 = debug is off */
191 
192  /* tx packet template id for this neighbor */
194 
195  /* Info we actually keep about each neighbor */
196 
197  /* Jenkins hash optimization: avoid tlv scan, send short keepalive msg */
200 
201  /* last received lacp packet, for the J-hash optimization */
203 
204  /* last marker packet */
206 
207  /* neighbor vlib hw_if_index */
209 
210  /* actor does not initiate the protocol exchange */
212 
213  /* Partner port information */
214  lacp_port_info_t partner;
215  lacp_port_info_t partner_admin;;
216 
217  /* Partner port information */
218  lacp_port_info_t actor;
219  lacp_port_info_t actor_admin;
220 
221  /* Need To Transmit flag */
223 
224  /* Link has been established and Aggregate Port is operable */
226 
227  /* Initialization or reinitialization of the lacp protocol entity */
229 
230  /* Aggregation Port is operating the lacp */
232 
233  /* MUX to indicate to the Selection Logic wait_while_timer expired */
235 
236  /* Selection Logic indicates al Aggregation Ports attached */
238 
239  /* Selection Logic selected an Aggregator */
240  int selected;
241 
242  /* RX machine indicates an Aggregation Port in PORT_DISABLED state */
244 
245  /* timer used to detect whether received protocol information has expired */
247 
248  /* timer used to detect actor churn states */
250 
251  /* time last lacpdu was sent */
253 
254  /* timer used to generate periodic transmission */
256 
257  /* timer used to detect partner churn states */
259 
260  /* provides hysteresis before performing an aggregation change */
262 
263  /* Implemention variables, not in the spec */
264  int rx_state;
265  int tx_state;
268 
269  /* actor admin key */
271 
273 
275 
277 
278  /* bond mode */
280 
282 } slave_if_t;
283 
285  slave_if_t * sif, u8 enable);
286 
287 typedef struct
288 {
289  /* pool of bonding interfaces */
291 
292  /* pool of lacp neighbors */
294 
295  /* rapidly find a bond by vlib software interface index */
297 
298  /* convenience variables */
301 
302  /* lacp plugin is loaded */
304 
306 
308 } bond_main_t;
309 
310 /* bond packet trace capture */
311 typedef struct
312 {
317 
319  vlib_node_runtime_t * node, bond_if_t * bif,
320  vlib_buffer_t * b0, uword slave_count);
321 
322 typedef struct
323 {
326 
329 extern bond_main_t bond_main;
330 
332  slave_if_t * sif);
334 u8 *format_bond_interface_name (u8 * s, va_list * args);
335 
337 int bond_delete_if (vlib_main_t * vm, u32 sw_if_index);
338 void bond_enslave (vlib_main_t * vm, bond_enslave_args_t * args);
340 int bond_dump_ifs (bond_interface_details_t ** out_bondids);
342  u32 bond_sw_if_index);
343 
344 static inline uword
345 unformat_bond_mode (unformat_input_t * input, va_list * args)
346 {
347  u8 *r = va_arg (*args, u8 *);
348 
349  if (0);
350 #define _(v, f, s) else if (unformat (input, s)) *r = BOND_MODE_##f;
352 #undef _
353  else
354  return 0;
355 
356  return 1;
357 }
358 
359 static inline u8 *
360 format_bond_mode (u8 * s, va_list * args)
361 {
362  u32 i = va_arg (*args, u32);
363  u8 *t = 0;
364 
365  switch (i)
366  {
367 #define _(v, f, s) case BOND_MODE_##f: t = (u8 *) s; break;
369 #undef _
370  default:
371  return format (s, "unknown");
372  }
373  return format (s, "%s", t);
374 }
375 
376 static inline uword
378 {
379  u8 *r = va_arg (*args, u8 *);
380 
381  if (0);
382 #define _(v, f, s, p) else if (unformat (input, s)) *r = BOND_LB_##f;
384 #undef _
385  else
386  return 0;
387 
388  return 1;
389 }
390 
391 static inline u8 *
392 format_bond_load_balance (u8 * s, va_list * args)
393 {
394  u32 i = va_arg (*args, u32);
395  u8 *t = 0;
396 
397  switch (i)
398  {
399 #define _(v, f, s, p) case BOND_LB_##f: t = (u8 *) s; break;
401 #undef _
402  default:
403  return format (s, "unknown");
404  }
405  return format (s, "%s", t);
406 }
407 
408 static inline void
410 {
411  bond_main_t *bm = &bond_main;
412 
413  bm->lacp_plugin_loaded = 1;
414  bm->lacp_enable_disable = func;
415 }
416 
417 static inline bond_if_t *
419 {
420  bond_main_t *bm = &bond_main;
421  uword *p;
422 
423  p = hash_get (bm->bond_by_sw_if_index, sw_if_index);
424  if (!p)
425  {
426  return 0;
427  }
428  return pool_elt_at_index (bm->interfaces, p[0]);
429 }
430 
431 static inline bond_if_t *
433 {
434  bond_main_t *bm = &bond_main;
435 
436  return pool_elt_at_index (bm->interfaces, dev_instance);
437 }
438 
439 static inline slave_if_t *
441 {
442  bond_main_t *bm = &bond_main;
443  slave_if_t *sif = 0;
444  uword p;
445 
446  if (sw_if_index < vec_len (bm->slave_by_sw_if_index))
447  {
448  p = bm->slave_by_sw_if_index[sw_if_index];
449  if (p)
450  sif = pool_elt_at_index (bm->neighbors, p >> 1);
451  }
452 
453  return sif;
454 }
455 
456 #endif /* __included_vnet_bonding_node_h__ */
457 
458 /*
459  * fd.io coding-style-patch-verification: ON
460  *
461  * Local Variables:
462  * eval: (c-set-style "gnu")
463  * End:
464  */
vnet_main_t * vnet_main
Definition: node.h:300
bond_mode_t
Definition: node.h:44
u32 dev_instance
Definition: node.h:150
u32 group
Definition: node.h:167
u32 hw_if_index
Definition: node.h:151
static uword unformat_bond_mode(unformat_input_t *input, va_list *args)
Definition: node.h:345
u8 individual_aggregator
Definition: node.h:165
int selected
Definition: node.h:240
u8 last_packet_signature_valid
Definition: node.h:198
u8 lb
Definition: node.h:145
clib_error_t * error
Definition: node.h:82
static bond_if_t * bond_get_master_by_sw_if_index(u32 sw_if_index)
Definition: node.h:418
u8 is_long_timeout
Definition: node.h:92
u8 * last_marker_pkt
Definition: node.h:205
void(* lacp_enable_disable_func)(vlib_main_t *vm, bond_if_t *bif, slave_if_t *sif, u8 enable)
Definition: node.h:284
int tx_state
Definition: node.h:265
vlib_frame_t ** frame
Definition: node.h:137
int i
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:419
lacp_enable_disable_func lacp_enable_disable
Definition: node.h:305
clib_spinlock_t lockp
Definition: node.h:281
struct _vnet_device_class vnet_device_class_t
f64 current_while_timer
Definition: node.h:246
u8 mode
Definition: node.h:279
f64 last_lacpdu_time
Definition: node.h:252
typedef CLIB_PACKED(struct{u16 system_priority;u8 system[6];u16 key;u16 port_priority;u16 port_number;u8 state;}) lacp_port_info_t
#define foreach_bond_lb
Definition: node.h:52
u8 ntt
Definition: node.h:222
f64 periodic_timer
Definition: node.h:255
u32(* load_balance_func)(vlib_main_t *vm, vlib_node_runtime_t *node, bond_if_t *bif, vlib_buffer_t *b0, uword slave_count)
Definition: node.h:318
float f32
Definition: types.h:143
static void bond_register_callback(lacp_enable_disable_func func)
Definition: node.h:409
f32 ttl_in_seconds
Definition: node.h:184
u8 use_custom_mac
Definition: node.h:169
bond_main_t bond_main
Definition: node.c:24
u32 sw_if_index
Definition: node.h:152
uword * active_slave_by_sw_if_index
Definition: node.h:161
vlib_main_t * vlib_main
Definition: node.h:299
lacp_port_info_t actor
Definition: node.h:164
u32 lb_rr_last_index
Definition: node.h:148
f64 partner_churn_timer
Definition: node.h:258
void bond_create_if(vlib_main_t *vm, bond_create_if_args_t *args)
Definition: cli.c:226
u8 * last_rx_pkt
Definition: node.h:202
bond_load_balance_t
Definition: node.h:66
#define hash_get(h, key)
Definition: hash.h:248
vnet_device_class_t bond_dev_class
u8 ready
Definition: node.h:237
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:461
u8 admin_up
Definition: node.h:143
int bond_delete_if(vlib_main_t *vm, u32 sw_if_index)
Definition: cli.c:171
bond_if_per_thread_t * per_thread_info
Definition: node.h:173
struct _unformat_input_t unformat_input_t
u8 port_moved
Definition: node.h:243
static uword unformat_bond_load_balance(unformat_input_t *input, va_list *args)
Definition: node.h:377
bond_if_t * interfaces
Definition: node.h:290
vlib_node_registration_t bond_input_node
(constructor) VLIB_REGISTER_NODE (bond_input_node)
Definition: node.c:422
u8 is_long_timeout
Definition: node.h:187
int ptx_state
Definition: node.h:267
u32 marker_tx_id
Definition: node.h:272
u32 * slaves
Definition: node.h:155
u8 is_passive
Definition: node.h:211
u8 mode
Definition: node.h:144
u32 sw_if_index
Definition: node.h:181
vlib_main_t * vm
Definition: buffer.c:294
lacp_port_info_t partner
Definition: node.h:214
uword * bond_by_sw_if_index
Definition: node.h:296
ethernet_header_t ethernet
Definition: node.h:313
u32 group
Definition: node.h:270
clib_spinlock_t lockp
Definition: node.h:172
int rx_state
Definition: node.h:264
void bond_detach_slave(vlib_main_t *vm, bond_detach_slave_args_t *args)
Definition: cli.c:575
BOND interface details struct.
Definition: node.h:107
#define foreach_bond_lb_algo
Definition: node.h:58
void bond_enable_collecting_distributing(vlib_main_t *vm, slave_if_t *sif)
Definition: cli.c:47
uword * slave_by_sw_if_index
Definition: node.h:307
u8 loopback_port
Definition: node.h:276
unsigned int u32
Definition: types.h:88
u8 lacp_plugin_loaded
Definition: node.h:303
static bond_if_t * bond_get_master_by_dev_instance(u32 dev_instance)
Definition: node.h:432
vhost_vring_state_t state
Definition: vhost-user.h:82
u32 bif_dev_instance
Definition: node.h:274
u8 debug
Definition: node.h:190
u32 * active_slaves
Definition: node.h:158
u8 ready_n
Definition: node.h:234
clib_error_t * error
Definition: node.h:95
u64 uword
Definition: types.h:112
clib_error_t * error
Definition: node.h:103
int bond_dump_ifs(bond_interface_details_t **out_bondids)
Definition: cli.c:63
struct _vlib_node_registration vlib_node_registration_t
u8 lacp_enabled
Definition: node.h:231
unsigned short u16
Definition: types.h:57
u8 begin
Definition: node.h:228
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
double f64
Definition: types.h:142
unsigned char u8
Definition: types.h:56
u8 * format_bond_interface_name(u8 *s, va_list *args)
Definition: device.c:66
uword * port_number_bitmap
Definition: node.h:168
lacp_port_info_t partner_admin
Definition: node.h:215
static u8 * format_bond_mode(u8 *s, va_list *args)
Definition: node.h:360
slave interface details struct
Definition: node.h:118
#define foreach_bond_mode
Definition: node.h:37
void bond_disable_collecting_distributing(vlib_main_t *vm, slave_if_t *sif)
Definition: cli.c:25
slave_if_t * neighbors
Definition: node.h:293
f64 actor_churn_timer
Definition: node.h:249
static u8 * format_bond_load_balance(u8 *s, va_list *args)
Definition: node.h:392
u8 port_enabled
Definition: node.h:225
static slave_if_t * bond_get_slave_by_sw_if_index(u32 sw_if_index)
Definition: node.h:440
void bond_enslave(vlib_main_t *vm, bond_enslave_args_t *args)
Definition: cli.c:403
lacp_port_info_t actor_admin
Definition: node.h:219
u32 bond_sw_if_index
Definition: node.h:315
uword last_packet_signature
Definition: node.h:199
u8 packet_template_index
Definition: node.h:193
f64 wait_while_timer
Definition: node.h:261
int bond_dump_slave_ifs(slave_interface_details_t **out_slaveids, u32 bond_sw_if_index)
Definition: cli.c:94
load_balance_func load_balance
Definition: node.h:324
u32 hw_if_index
Definition: node.h:208
int mux_state
Definition: node.h:266
lacp_port_info_t partner
Definition: node.h:163