FD.io VPP  v20.09-64-g4f7b92f0a
Vector Packet Processing
bond_api.c
Go to the documentation of this file.
1 /*
2  *------------------------------------------------------------------
3  * bond_api.c - vnet bonding device driver API support
4  *
5  * Copyright (c) 2017 Cisco and/or its affiliates.
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at:
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *------------------------------------------------------------------
18  */
19 
20 #include <vnet/vnet.h>
21 #include <vlibmemory/api.h>
22 
23 #include <vnet/interface.h>
24 #include <vnet/api_errno.h>
25 #include <vnet/ethernet/ethernet.h>
27 
28 #include <vnet/vnet_msg_enum.h>
29 
30 #define vl_typedefs /* define message structures */
31 #include <vnet/vnet_all_api_h.h>
32 #undef vl_typedefs
33 
34 #define vl_endianfun /* define message structures */
35 #include <vnet/vnet_all_api_h.h>
36 #undef vl_endianfun
37 
38 /* instantiate all the print functions we know about */
39 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
40 #define vl_printfun
41 #include <vnet/vnet_all_api_h.h>
42 #undef vl_printfun
43 
45 #include <vnet/bonding/node.h>
46 
47 #define foreach_bond_api_msg \
48 _(BOND_CREATE, bond_create) \
49 _(BOND_CREATE2, bond_create2) \
50 _(BOND_DELETE, bond_delete) \
51 _(BOND_ENSLAVE, bond_enslave) \
52 _(BOND_ADD_MEMBER, bond_add_member) \
53 _(SW_INTERFACE_SET_BOND_WEIGHT, sw_interface_set_bond_weight) \
54 _(BOND_DETACH_SLAVE, bond_detach_slave) \
55 _(BOND_DETACH_MEMBER, bond_detach_member) \
56 _(SW_INTERFACE_BOND_DUMP, sw_interface_bond_dump) \
57 _(SW_BOND_INTERFACE_DUMP, sw_bond_interface_dump) \
58 _(SW_INTERFACE_SLAVE_DUMP, sw_interface_slave_dump) \
59 _(SW_MEMBER_INTERFACE_DUMP, sw_member_interface_dump)
60 
61 static void
63 {
65  int rv;
66  vl_api_bond_delete_reply_t *rmp;
67  u32 sw_if_index = ntohl (mp->sw_if_index);
68 
69  rv = bond_delete_if (vm, sw_if_index);
70 
71  REPLY_MACRO (VL_API_BOND_DELETE_REPLY);
72 }
73 
74 static void
76 {
79  bond_create_if_args_t _a, *ap = &_a;
80 
81  clib_memset (ap, 0, sizeof (*ap));
82 
83  ap->id = ntohl (mp->id);
84 
85  if (mp->use_custom_mac)
86  {
88  ap->hw_addr_set = 1;
89  }
90 
91  ap->mode = ntohl (mp->mode);
92  ap->lb = ntohl (mp->lb);
93  ap->numa_only = mp->numa_only;
94  bond_create_if (vm, ap);
95 
96  int rv = ap->rv;
97 
98  /* *INDENT-OFF* */
99  REPLY_MACRO2(VL_API_BOND_CREATE_REPLY,
100  ({
101  rmp->sw_if_index = ntohl (ap->sw_if_index);
102  }));
103  /* *INDENT-ON* */
104 }
105 
106 static void
108 {
111  bond_create_if_args_t _a, *ap = &_a;
112 
113  clib_memset (ap, 0, sizeof (*ap));
114 
115  ap->id = ntohl (mp->id);
116 
117  if (mp->use_custom_mac)
118  {
120  ap->hw_addr_set = 1;
121  }
122 
123  ap->mode = ntohl (mp->mode);
124  ap->lb = ntohl (mp->lb);
125  ap->numa_only = mp->numa_only;
126  ap->gso = mp->enable_gso;
127  bond_create_if (vm, ap);
128 
129  int rv = ap->rv;
130 
131  /* *INDENT-OFF* */
132  REPLY_MACRO2(VL_API_BOND_CREATE2_REPLY,
133  ({
134  rmp->sw_if_index = ntohl (ap->sw_if_index);
135  }));
136  /* *INDENT-ON* */
137 }
138 
139 static void
141 {
144  bond_add_member_args_t _a, *ap = &_a;
145  int rv = 0;
146 
147  clib_memset (ap, 0, sizeof (*ap));
148 
149  ap->group = ntohl (mp->bond_sw_if_index);
151  ap->member = ntohl (mp->sw_if_index);
152  ap->is_passive = mp->is_passive;
154 
155  bond_add_member (vm, ap);
156  rv = ap->rv;
157 
159  REPLY_MACRO (VL_API_BOND_ADD_MEMBER_REPLY);
160 }
161 
162 static void
164 {
167  bond_add_member_args_t _a, *ap = &_a;
168  int rv = 0;
169 
170  clib_memset (ap, 0, sizeof (*ap));
171 
172  ap->group = ntohl (mp->bond_sw_if_index);
174  ap->member = ntohl (mp->sw_if_index);
175  ap->is_passive = mp->is_passive;
177 
178  bond_add_member (vm, ap);
179  rv = ap->rv;
180 
182  REPLY_MACRO (VL_API_BOND_ENSLAVE_REPLY);
183 }
184 
185 static void
188 {
190  bond_set_intf_weight_args_t _a, *ap = &_a;
191  vl_api_sw_interface_set_bond_weight_reply_t *rmp;
192  int rv = 0;
193 
194  clib_memset (ap, 0, sizeof (*ap));
195 
196  ap->sw_if_index = ntohl (mp->sw_if_index);
197  ap->weight = ntohl (mp->weight);
198 
199  bond_set_intf_weight (vm, ap);
200  rv = ap->rv;
201 
202  REPLY_MACRO (VL_API_SW_INTERFACE_SET_BOND_WEIGHT_REPLY);
203 }
204 
205 static void
207 {
209  vl_api_bond_detach_slave_reply_t *rmp;
210  bond_detach_member_args_t _a, *ap = &_a;
211  int rv = 0;
212 
213  clib_memset (ap, 0, sizeof (*ap));
214 
215  ap->member = ntohl (mp->sw_if_index);
216  bond_detach_member (vm, ap);
217  rv = ap->rv;
218 
219  REPLY_MACRO (VL_API_BOND_DETACH_SLAVE_REPLY);
220 }
221 
222 static void
224 {
226  vl_api_bond_detach_member_reply_t *rmp;
227  bond_detach_member_args_t _a, *ap = &_a;
228  int rv = 0;
229 
230  clib_memset (ap, 0, sizeof (*ap));
231 
232  ap->member = ntohl (mp->sw_if_index);
233  bond_detach_member (vm, ap);
234  rv = ap->rv;
235 
236  REPLY_MACRO (VL_API_BOND_DETACH_MEMBER_REPLY);
237 }
238 
239 static void
241  vl_api_registration_t * reg,
242  bond_interface_details_t * bond_if,
243  u32 context)
244 {
246 
247  mp = vl_msg_api_alloc (sizeof (*mp));
248  clib_memset (mp, 0, sizeof (*mp));
249  mp->_vl_msg_id = htons (VL_API_SW_INTERFACE_BOND_DETAILS);
250  mp->sw_if_index = htonl (bond_if->sw_if_index);
251  mp->id = htonl (bond_if->id);
253  MIN (ARRAY_LEN (mp->interface_name) - 1,
254  strlen ((const char *) bond_if->interface_name)));
255  mp->mode = htonl (bond_if->mode);
256  mp->lb = htonl (bond_if->lb);
257  mp->numa_only = bond_if->numa_only;
258  mp->active_slaves = htonl (bond_if->active_members);
259  mp->slaves = htonl (bond_if->members);
260 
261  mp->context = context;
262  vl_api_send_msg (reg, (u8 *) mp);
263 }
264 
265 static void
267 {
268  int rv;
271  bond_interface_details_t *bondifs = NULL;
272  bond_interface_details_t *bond_if = NULL;
273 
275  if (!reg)
276  return;
277 
278  rv = bond_dump_ifs (&bondifs);
279  if (rv)
280  return;
281 
282  vec_foreach (bond_if, bondifs)
283  {
284  bond_send_sw_interface_details (am, reg, bond_if, mp->context);
285  }
286 
287  vec_free (bondifs);
288 }
289 
290 static void
292  vl_api_registration_t * reg,
293  bond_interface_details_t * bond_if,
294  u32 context)
295 {
297 
298  mp = vl_msg_api_alloc (sizeof (*mp));
299  clib_memset (mp, 0, sizeof (*mp));
300  mp->_vl_msg_id = htons (VL_API_SW_BOND_INTERFACE_DETAILS);
301  mp->sw_if_index = htonl (bond_if->sw_if_index);
302  mp->id = htonl (bond_if->id);
304  MIN (ARRAY_LEN (mp->interface_name) - 1,
305  strlen ((const char *) bond_if->interface_name)));
306  mp->mode = htonl (bond_if->mode);
307  mp->lb = htonl (bond_if->lb);
308  mp->numa_only = bond_if->numa_only;
309  mp->active_members = htonl (bond_if->active_members);
310  mp->members = htonl (bond_if->members);
311 
312  mp->context = context;
313  vl_api_send_msg (reg, (u8 *) mp);
314 }
315 
316 static void
318 {
319  int rv;
322  bond_interface_details_t *bondifs = NULL;
323  bond_interface_details_t *bond_if = NULL;
324  u32 filter_sw_if_index;
325 
327  if (!reg)
328  return;
329 
330  filter_sw_if_index = htonl (mp->sw_if_index);
331  if (filter_sw_if_index != ~0)
333 
334  rv = bond_dump_ifs (&bondifs);
335  if (rv)
336  return;
337 
338  vec_foreach (bond_if, bondifs)
339  {
340  if ((filter_sw_if_index == ~0) ||
341  (bond_if->sw_if_index == filter_sw_if_index))
342  bond_send_sw_bond_interface_details (am, reg, bond_if, mp->context);
343  }
344 
346  vec_free (bondifs);
347 }
348 
349 static void
351  vl_api_registration_t * reg,
352  member_interface_details_t * member_if,
353  u32 context)
354 {
356 
357  mp = vl_msg_api_alloc (sizeof (*mp));
358  clib_memset (mp, 0, sizeof (*mp));
359  mp->_vl_msg_id = htons (VL_API_SW_INTERFACE_SLAVE_DETAILS);
360  mp->sw_if_index = htonl (member_if->sw_if_index);
361  clib_memcpy (mp->interface_name, member_if->interface_name,
362  MIN (ARRAY_LEN (mp->interface_name) - 1,
363  strlen ((const char *) member_if->interface_name)));
364  mp->is_passive = member_if->is_passive;
365  mp->is_long_timeout = member_if->is_long_timeout;
366  mp->is_local_numa = member_if->is_local_numa;
367  mp->weight = htonl (member_if->weight);
368 
369  mp->context = context;
370  vl_api_send_msg (reg, (u8 *) mp);
371 }
372 
373 static void
375  mp)
376 {
377  int rv;
380  member_interface_details_t *memberifs = NULL;
381  member_interface_details_t *member_if = NULL;
382 
384  if (!reg)
385  return;
386 
387  rv = bond_dump_member_ifs (&memberifs, ntohl (mp->sw_if_index));
388  if (rv)
389  return;
390 
391  vec_foreach (member_if, memberifs)
392  {
393  bond_send_sw_member_interface_details (am, reg, member_if, mp->context);
394  }
395 
396  vec_free (memberifs);
397 }
398 
399 static void
401  vl_api_registration_t * reg,
402  member_interface_details_t * member_if,
403  u32 context)
404 {
406 
407  mp = vl_msg_api_alloc (sizeof (*mp));
408  clib_memset (mp, 0, sizeof (*mp));
409  mp->_vl_msg_id = htons (VL_API_SW_MEMBER_INTERFACE_DETAILS);
410  mp->sw_if_index = htonl (member_if->sw_if_index);
411  clib_memcpy (mp->interface_name, member_if->interface_name,
412  MIN (ARRAY_LEN (mp->interface_name) - 1,
413  strlen ((const char *) member_if->interface_name)));
414  mp->is_passive = member_if->is_passive;
415  mp->is_long_timeout = member_if->is_long_timeout;
416  mp->is_local_numa = member_if->is_local_numa;
417  mp->weight = htonl (member_if->weight);
418 
419  mp->context = context;
420  vl_api_send_msg (reg, (u8 *) mp);
421 }
422 
423 static void
425  mp)
426 {
427  int rv;
430  member_interface_details_t *memberifs = NULL;
431  member_interface_details_t *member_if = NULL;
432 
434  if (!reg)
435  return;
436 
437  rv = bond_dump_member_ifs (&memberifs, ntohl (mp->sw_if_index));
438  if (rv)
439  return;
440 
441  vec_foreach (member_if, memberifs)
442  {
443  bond_send_member_interface_details (am, reg, member_if, mp->context);
444  }
445 
446  vec_free (memberifs);
447 }
448 
449 #define vl_msg_name_crc_list
450 #include <vnet/vnet_all_api_h.h>
451 #undef vl_msg_name_crc_list
452 
453 static void
455 {
456 #define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id);
457  foreach_vl_msg_name_crc_bond;
458 #undef _
459 }
460 
461 static clib_error_t *
463 {
464  api_main_t *am = vlibapi_get_main ();
465 
466 #define _(N,n) \
467  vl_msg_api_set_handlers(VL_API_##N, #n, \
468  vl_api_##n##_t_handler, \
469  vl_noop_handler, \
470  vl_api_##n##_t_endian, \
471  vl_api_##n##_t_print, \
472  sizeof(vl_api_##n##_t), 1);
474 #undef _
475 
476  /*
477  * Set up the (msg_name, crc, message-id) table
478  */
480 
481  return 0;
482 }
483 
485 
486 /*
487  * fd.io coding-style-patch-verification: ON
488  *
489  * Local Variables:
490  * eval: (c-set-style "gnu")
491  * End:
492  */
static void bond_send_sw_member_interface_details(vpe_api_main_t *am, vl_api_registration_t *reg, member_interface_details_t *member_if, u32 context)
Definition: bond_api.c:350
static clib_error_t * bond_api_hookup(vlib_main_t *vm)
Definition: bond_api.c:462
vl_api_interface_index_t sw_if_index
Definition: bond.api:114
void bond_create_if(vlib_main_t *vm, bond_create_if_args_t *args)
Definition: cli.c:377
vl_api_bond_mode_t mode
Definition: bond.api:64
void bond_detach_member(vlib_main_t *vm, bond_detach_member_args_t *args)
Definition: cli.c:829
static void vl_api_bond_detach_member_t_handler(vl_api_bond_detach_member_t *mp)
Definition: bond_api.c:223
vl_api_mac_address_t mac_address
Definition: bond.api:63
Reply for member dump request.
Definition: bond.api:325
vl_api_interface_index_t sw_if_index
Definition: bond.api:170
member interface details struct
Definition: node.h:137
Interface set bond weight.
Definition: bond.api:342
vl_api_bond_lb_algo_t lb
Definition: bond.api:235
static void vl_api_bond_detach_slave_t_handler(vl_api_bond_detach_slave_t *mp)
Definition: bond_api.c:206
#define foreach_bond_api_msg
Definition: bond_api.c:47
Reply for bond create reply.
Definition: bond.api:74
#define REPLY_MACRO2(t, body)
vl_api_interface_index_t sw_if_index
Definition: bond.api:126
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
static void bond_send_member_interface_details(vpe_api_main_t *am, vl_api_registration_t *reg, member_interface_details_t *member_if, u32 context)
Definition: bond_api.c:400
static void vl_api_send_msg(vl_api_registration_t *rp, u8 *elem)
Definition: api.h:35
static void vl_api_bond_create_t_handler(vl_api_bond_create_t *mp)
Definition: bond_api.c:75
Reply for bond add_member reply.
Definition: bond.api:180
static void vl_api_bond_delete_t_handler(vl_api_bond_delete_t *mp)
Definition: bond_api.c:62
Initialize a new bond interface with the given paramters.
Definition: bond.api:166
vlib_main_t * vm
Definition: in2out_ed.c:1582
vl_api_bond_mode_t mode
Definition: bond.api:265
void * vl_msg_api_alloc(int nbytes)
Initialize a new bond interface with the given paramters.
Definition: bond.api:92
vl_api_interface_index_t sw_if_index
Definition: bond.api:283
unsigned char u8
Definition: types.h:56
vl_api_interface_index_t sw_if_index
Definition: bond.api:314
Dump bond interfaces request.
Definition: bond.api:243
#define clib_memcpy(d, s, n)
Definition: string.h:180
static void vl_api_sw_interface_slave_dump_t_handler(vl_api_sw_interface_slave_dump_t *mp)
Definition: bond_api.c:374
static void vl_api_sw_interface_bond_dump_t_handler(vl_api_sw_interface_bond_dump_t *mp)
Definition: bond_api.c:266
Reply for bond enslave reply.
Definition: bond.api:152
void bond_add_member(vlib_main_t *vm, bond_add_member_args_t *args)
Definition: cli.c:599
static void vl_api_bond_create2_t_handler(vl_api_bond_create2_t *mp)
Definition: bond_api.c:107
unsigned int u32
Definition: types.h:88
vl_api_interface_index_t sw_if_index
Definition: bond.api:78
#define MIN(x, y)
Definition: node.h:31
vl_api_interface_index_t sw_if_index[default=0xffffffff]
Definition: bond.api:247
vl_api_interface_index_t sw_if_index
Definition: bond.api:142
vl_api_interface_index_t sw_if_index
Definition: bond.api:328
static void vl_api_bond_add_member_t_handler(vl_api_bond_add_member_t *mp)
Definition: bond_api.c:140
u32 id[default=0xFFFFFFFF]
Definition: bond.api:102
#define REPLY_MACRO(t)
VLIB_API_INIT_FUNCTION(bond_api_hookup)
static void vl_api_sw_bond_interface_dump_t_handler(vl_api_sw_bond_interface_dump_t *mp)
Definition: bond_api.c:317
static void vl_api_sw_interface_set_bond_weight_t_handler(vl_api_sw_interface_set_bond_weight_t *mp)
Definition: bond_api.c:187
static void bond_send_sw_interface_details(vpe_api_main_t *am, vl_api_registration_t *reg, bond_interface_details_t *bond_if, u32 context)
Definition: bond_api.c:240
vl_api_bond_mode_t mode
Definition: bond.api:234
Dump bond interfaces request.
Definition: bond.api:212
API main structure, used by both vpp and binary API clients.
Definition: api_common.h:227
Initialize a new bond interface with the given paramters.
Definition: bond.api:137
An API client registration, only in vpp/vlib.
Definition: api_common.h:47
#define BAD_SW_IF_INDEX_LABEL
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:380
vl_api_interface_index_t sw_if_index
Definition: bond.api:263
Initialize a new bond interface with the given paramters.
Definition: bond.api:56
vl_api_bond_mode_t mode
Definition: bond.api:96
int bond_dump_member_ifs(member_interface_details_t **out_memberifs, u32 bond_sw_if_index)
Definition: cli.c:212
Reply for bond create2 reply.
Definition: bond.api:110
#define ARRAY_LEN(x)
Definition: clib.h:67
static vl_api_registration_t * vl_api_client_index_to_registration(u32 index)
Definition: api.h:79
vl_api_interface_index_t sw_if_index
Definition: bond.api:196
Reply for bond dump request.
Definition: bond.api:260
BOND interface details struct.
Definition: node.h:124
bond detach slave
Definition: bond.api:191
vl_api_bond_lb_algo_t lb
Definition: bond.api:65
Reply for bond dump request.
Definition: bond.api:229
static void bond_setup_message_id_table(api_main_t *am)
Definition: bond_api.c:454
vl_api_interface_index_t bond_sw_if_index
Definition: bond.api:171
static void bond_send_sw_bond_interface_details(vpe_api_main_t *am, vl_api_registration_t *reg, bond_interface_details_t *bond_if, u32 context)
Definition: bond_api.c:291
Delete bond interface.
Definition: bond.api:122
static void vl_api_bond_enslave_t_handler(vl_api_bond_enslave_t *mp)
Definition: bond_api.c:163
vl_api_interface_index_t sw_if_index
Definition: bond.api:232
static vlib_main_t * vlib_get_main(void)
Definition: global_funcs.h:23
bond detach member
Definition: bond.api:204
vl_api_interface_index_t bond_sw_if_index
Definition: bond.api:143
vl_api_bond_lb_algo_t lb
Definition: bond.api:97
u32 id[default=0xFFFFFFFF]
Definition: bond.api:61
void bond_set_intf_weight(vlib_main_t *vm, bond_set_intf_weight_args_t *args)
Definition: cli.c:996
vl_api_bond_lb_algo_t lb
Definition: bond.api:266
int bond_delete_if(vlib_main_t *vm, u32 sw_if_index)
Definition: cli.c:336
Reply for slave dump request.
Definition: bond.api:294
static api_main_t * vlibapi_get_main(void)
Definition: api_common.h:389
vl_api_interface_index_t sw_if_index
Definition: bond.api:208
#define vec_foreach(var, vec)
Vector iterator.
int bond_dump_ifs(bond_interface_details_t **out_bondifs)
Definition: cli.c:177
vpe_api_main_t vpe_api_main
Definition: interface_api.c:54
void mac_address_decode(const u8 *in, mac_address_t *out)
Conversion functions to/from (decode/encode) API types to VPP internal types.
vl_api_interface_index_t sw_if_index
Definition: bond.api:346
vl_api_interface_index_t sw_if_index
Definition: bond.api:297
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:33
vl_api_mac_address_t mac_address
Definition: bond.api:101
#define VALIDATE_SW_IF_INDEX(mp)
static void vl_api_sw_member_interface_dump_t_handler(vl_api_sw_member_interface_dump_t *mp)
Definition: bond_api.c:424