FD.io VPP  v17.01.1-3-gc6833f8
Vector Packet Processing
interface_cli.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 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 /*
16  * interface_cli.c: interface CLI
17  *
18  * Copyright (c) 2008 Eliot Dresselhaus
19  *
20  * Permission is hereby granted, free of charge, to any person obtaining
21  * a copy of this software and associated documentation files (the
22  * "Software"), to deal in the Software without restriction, including
23  * without limitation the rights to use, copy, modify, merge, publish,
24  * distribute, sublicense, and/or sell copies of the Software, and to
25  * permit persons to whom the Software is furnished to do so, subject to
26  * the following conditions:
27  *
28  * The above copyright notice and this permission notice shall be
29  * included in all copies or substantial portions of the Software.
30  *
31  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38  */
39 
40 /**
41  * @file
42  * Interface CLI.
43  */
44 
45 #include <vnet/vnet.h>
46 #include <vnet/ip/ip.h>
47 #include <vppinfra/bitmap.h>
48 #include <vnet/fib/ip4_fib.h>
49 #include <vnet/fib/ip6_fib.h>
50 
51 static int
52 compare_interface_names (void *a1, void *a2)
53 {
54  u32 *hi1 = a1;
55  u32 *hi2 = a2;
56 
57  return vnet_hw_interface_compare (vnet_get_main (), *hi1, *hi2);
58 }
59 
60 static clib_error_t *
62  unformat_input_t * input,
63  vlib_cli_command_t * cmd)
64 {
65  clib_error_t *error = 0;
66  vnet_main_t *vnm = vnet_get_main ();
69  u32 hw_if_index, *hw_if_indices = 0;
70  int i, verbose = -1, is_show, show_bond = 0;
71 
72  is_show = strstr (cmd->path, "show") != 0;
74  {
75  /* See if user wants to show a specific interface. */
76  if (unformat
77  (input, "%U", unformat_vnet_hw_interface, vnm, &hw_if_index))
78  vec_add1 (hw_if_indices, hw_if_index);
79 
80  /* See if user wants to show an interface with a specific hw_if_index. */
81  else if (unformat (input, "%u", &hw_if_index))
82  vec_add1 (hw_if_indices, hw_if_index);
83 
84  else if (unformat (input, "verbose"))
85  verbose = 1; /* this is also the default */
86 
87  else if (unformat (input, "detail"))
88  verbose = 2;
89 
90  else if (unformat (input, "brief"))
91  verbose = 0;
92 
93  else if (unformat (input, "bond"))
94  {
95  show_bond = 1;
96  if (verbose < 0)
97  verbose = 0; /* default to brief for link bonding */
98  }
99 
100  else
101  {
102  error = clib_error_return (0, "unknown input `%U'",
103  format_unformat_error, input);
104  goto done;
105  }
106  }
107 
108  /* Gather interfaces. */
109  if (vec_len (hw_if_indices) == 0)
110  pool_foreach (hi, im->hw_interfaces,
111  vec_add1 (hw_if_indices, hi - im->hw_interfaces));
112 
113  if (verbose < 0)
114  verbose = 1; /* default to verbose (except bond) */
115 
116  if (is_show)
117  {
118  /* Sort by name. */
120 
121  vlib_cli_output (vm, "%U\n", format_vnet_hw_interface, vnm, 0, verbose);
122  for (i = 0; i < vec_len (hw_if_indices); i++)
123  {
124  hi = vnet_get_hw_interface (vnm, hw_if_indices[i]);
125  if (show_bond == 0) /* show all interfaces */
126  vlib_cli_output (vm, "%U\n", format_vnet_hw_interface, vnm,
127  hi, verbose);
128  else if ((hi->bond_info) &&
130  { /* show only bonded interface and all its slave interfaces */
131  int hw_idx;
132  vnet_hw_interface_t *shi;
133  vlib_cli_output (vm, "%U\n", format_vnet_hw_interface, vnm,
134  hi, verbose);
135 
136  /* *INDENT-OFF* */
137  clib_bitmap_foreach (hw_idx, hi->bond_info,
138  ({
139  shi = vnet_get_hw_interface(vnm, hw_idx);
140  vlib_cli_output (vm, "%U\n",
141  format_vnet_hw_interface, vnm, shi, verbose);
142  }));
143  /* *INDENT-ON* */
144  }
145  }
146  }
147  else
148  {
149  for (i = 0; i < vec_len (hw_if_indices); i++)
150  {
152 
153  hi = vnet_get_hw_interface (vnm, hw_if_indices[i]);
155 
156  if (dc->clear_counters)
157  dc->clear_counters (hi->dev_instance);
158  }
159  }
160 
161 done:
162  vec_free (hw_if_indices);
163  return error;
164 }
165 
166 /* *INDENT-OFF* */
167 /*?
168  * Displays various information about the state of the current terminal
169  * session.
170  *
171  * @cliexpar
172  * @cliexstart{show hardware}
173  * Name Link Hardware
174  * GigabitEthernet2/0/0 up GigabitEthernet2/0/0
175  * Ethernet address 00:50:56:b7:7c:83
176  * Intel 82545em_copper
177  * link up, media 1000T full-duplex, master,
178  * 0 unprocessed, 384 total buffers on rx queue 0 ring
179  * 237 buffers in driver rx cache
180  * rx total packets 1816
181  * rx total bytes 181084
182  * rx good packets 1816
183  * rx good bytes 181084
184  * rx 65 127 byte packets 1586
185  * rx 256 511 byte packets 230
186  * tx total packets 346
187  * tx total bytes 90224
188  * tx good packets 346
189  * tx good bytes 88840
190  * tx 64 byte packets 1
191  * tx 65 127 byte packets 115
192  * tx 256 511 byte packets 230
193  * @cliexend
194  ?*/
195 VLIB_CLI_COMMAND (show_hw_interfaces_command, static) = {
196  .path = "show hardware-interfaces",
197  .short_help = "show hardware-interfaces [brief|verbose|detail] [bond] [<if-name1> <if-name2> ...]",
198  .function = show_or_clear_hw_interfaces,
199 };
200 /* *INDENT-ON* */
201 
202 /* *INDENT-OFF* */
203 VLIB_CLI_COMMAND (clear_hw_interface_counters_command, static) = {
204  .path = "clear hardware-interfaces",
205  .short_help = "Clear hardware interfaces statistics",
206  .function = show_or_clear_hw_interfaces,
207 };
208 /* *INDENT-ON* */
209 
210 static int
211 sw_interface_name_compare (void *a1, void *a2)
212 {
213  vnet_sw_interface_t *si1 = a1;
214  vnet_sw_interface_t *si2 = a2;
215 
217  si1->sw_if_index, si2->sw_if_index);
218 }
219 
220 static clib_error_t *
222  unformat_input_t * input, vlib_cli_command_t * cmd)
223 {
224  clib_error_t *error = 0;
225  vnet_main_t *vnm = vnet_get_main ();
227  vnet_sw_interface_t *si, *sorted_sis = 0;
228  u32 sw_if_index = ~(u32) 0;
229  u8 show_addresses = 0;
230  u8 show_features = 0;
231  u8 show_tag = 0;
232 
234  {
235  /* See if user wants to show specific interface */
236  if (unformat
237  (input, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index))
238  {
239  si = pool_elt_at_index (im->sw_interfaces, sw_if_index);
240  vec_add1 (sorted_sis, si[0]);
241  }
242  else if (unformat (input, "address") || unformat (input, "addr"))
243  show_addresses = 1;
244  else if (unformat (input, "features") || unformat (input, "feat"))
245  show_features = 1;
246  else if (unformat (input, "tag"))
247  show_tag = 1;
248  else
249  {
250  error = clib_error_return (0, "unknown input `%U'",
251  format_unformat_error, input);
252  goto done;
253  }
254  }
255 
256  if (show_features || show_tag)
257  {
258  if (sw_if_index == ~(u32) 0)
259  return clib_error_return (0, "Interface not specified...");
260  }
261 
262  if (show_features)
263  {
264  vnet_interface_features_show (vm, sw_if_index);
265  return 0;
266  }
267  if (show_tag)
268  {
269  u8 *tag;
270  tag = vnet_get_sw_interface_tag (vnm, sw_if_index);
271  vlib_cli_output (vm, "%U: %s",
272  format_vnet_sw_if_index_name, vnm, sw_if_index,
273  tag ? (char *) tag : "(none)");
274  return 0;
275  }
276 
277  if (!show_addresses)
278  vlib_cli_output (vm, "%U\n", format_vnet_sw_interface, vnm, 0);
279 
280  if (vec_len (sorted_sis) == 0) /* Get all interfaces */
281  {
282  /* Gather interfaces. */
283  sorted_sis =
285  _vec_len (sorted_sis) = 0;
286  pool_foreach (si, im->sw_interfaces, (
287  {
288  vec_add1 (sorted_sis, si[0]);
289  }
290  ));
291 
292  /* Sort by name. */
294  }
295 
296  if (show_addresses)
297  {
298  vec_foreach (si, sorted_sis)
299  {
301  ip4_main_t *im4 = &ip4_main;
302  ip6_main_t *im6 = &ip6_main;
303  ip_lookup_main_t *lm4 = &im4->lookup_main;
304  ip_lookup_main_t *lm6 = &im6->lookup_main;
305  ip_interface_address_t *ia = 0;
306  ip4_address_t *r4;
307  ip6_address_t *r6;
308  u32 fib_index4 = 0, fib_index6 = 0;
309  ip4_fib_t *fib4;
310  ip6_fib_t *fib6;
311  l2_input_config_t *config;
312 
314  fib_index4 = vec_elt (im4->fib_index_by_sw_if_index,
315  si->sw_if_index);
316 
318  fib_index6 = vec_elt (im6->fib_index_by_sw_if_index,
319  si->sw_if_index);
320 
321  fib4 = ip4_fib_get (fib_index4);
322  fib6 = ip6_fib_get (fib_index6);
323 
326  (vm, "%U (%s): \n unnumbered, use %U",
328  vnm, si->sw_if_index,
329  (si->flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) ? "up" : "dn",
331 
332  else
333  {
334  vlib_cli_output (vm, "%U (%s):",
336  vnm, si->sw_if_index,
338  ? "up" : "dn");
339  }
340 
341  /* Display any L2 addressing info */
342  vec_validate (l2m->configs, si->sw_if_index);
343  config = vec_elt_at_index (l2m->configs, si->sw_if_index);
344  if (config->bridge)
345  {
346  u32 bd_id = l2input_main.bd_configs[config->bd_index].bd_id;
347  vlib_cli_output (vm, " l2 bridge bd_id %d%s%d", bd_id,
348  config->bvi ? " bvi shg " : " shg ",
349  config->shg);
350  }
351  else if (config->xconnect)
352  {
353  vlib_cli_output (vm, " l2 xconnect %U",
355  vnm, config->output_sw_if_index);
356  }
357 
358  /* Display any IP4 addressing info */
359  /* *INDENT-OFF* */
361  1 /* honor unnumbered */,
362  ({
363  r4 = ip_interface_address_get_address (lm4, ia);
364  if (fib4->table_id)
365  {
366  vlib_cli_output (vm, " %U/%d table %d",
367  format_ip4_address, r4,
368  ia->address_length,
369  fib4->table_id);
370  }
371  else
372  {
373  vlib_cli_output (vm, " %U/%d",
374  format_ip4_address, r4,
375  ia->address_length);
376  }
377  }));
378  /* *INDENT-ON* */
379 
380  /* Display any IP6 addressing info */
381  /* *INDENT-OFF* */
383  1 /* honor unnumbered */,
384  ({
385  r6 = ip_interface_address_get_address (lm6, ia);
386  if (fib6->table_id)
387  {
388  vlib_cli_output (vm, " %U/%d table %d",
389  format_ip6_address, r6,
390  ia->address_length,
391  fib6->table_id);
392  }
393  else
394  {
395  vlib_cli_output (vm, " %U/%d",
396  format_ip6_address, r6,
397  ia->address_length);
398  }
399  }));
400  /* *INDENT-ON* */
401  }
402  }
403  else
404  {
405  vec_foreach (si, sorted_sis)
406  {
407  vlib_cli_output (vm, "%U\n", format_vnet_sw_interface, vnm, si);
408  }
409  }
410 
411 done:
412  vec_free (sorted_sis);
413  return error;
414 }
415 
416 /* *INDENT-OFF* */
417 VLIB_CLI_COMMAND (show_sw_interfaces_command, static) = {
418  .path = "show interfaces",
419  .short_help = "show interfaces [address|addr|features|feat] [<if-name1> <if-name2> ...]",
420  .function = show_sw_interfaces,
421 };
422 /* *INDENT-ON* */
423 
424 /* Root of all interface commands. */
425 /* *INDENT-OFF* */
426 VLIB_CLI_COMMAND (vnet_cli_interface_command, static) = {
427  .path = "interface",
428  .short_help = "Interface commands",
429 };
430 /* *INDENT-ON* */
431 
432 /* *INDENT-OFF* */
433 VLIB_CLI_COMMAND (vnet_cli_set_interface_command, static) = {
434  .path = "set interface",
435  .short_help = "Interface commands",
436 };
437 /* *INDENT-ON* */
438 
439 static clib_error_t *
441  unformat_input_t * input, vlib_cli_command_t * cmd)
442 {
443  vnet_main_t *vnm = vnet_get_main ();
447  static vnet_main_t **my_vnet_mains;
448  int i, j, n_counters;
449 
450  vec_reset_length (my_vnet_mains);
451 
452  for (i = 0; i < vec_len (vnet_mains); i++)
453  {
454  if (vnet_mains[i])
455  vec_add1 (my_vnet_mains, vnet_mains[i]);
456  }
457 
458  if (vec_len (vnet_mains) == 0)
459  vec_add1 (my_vnet_mains, vnm);
460 
461  n_counters = vec_len (im->combined_sw_if_counters);
462 
463  for (j = 0; j < n_counters; j++)
464  {
465  for (i = 0; i < vec_len (my_vnet_mains); i++)
466  {
467  im = &my_vnet_mains[i]->interface_main;
468  cm = im->combined_sw_if_counters + j;
470  }
471  }
472 
473  n_counters = vec_len (im->sw_if_counters);
474 
475  for (j = 0; j < n_counters; j++)
476  {
477  for (i = 0; i < vec_len (my_vnet_mains); i++)
478  {
479  im = &my_vnet_mains[i]->interface_main;
480  sm = im->sw_if_counters + j;
482  }
483  }
484 
485  return 0;
486 }
487 
488 /* *INDENT-OFF* */
489 VLIB_CLI_COMMAND (clear_interface_counters_command, static) = {
490  .path = "clear interfaces",
491  .short_help = "Clear interfaces statistics",
492  .function = clear_interface_counters,
493 };
494 /* *INDENT-ON* */
495 
496 /**
497  * Parse subinterface names.
498  *
499  * The following subinterface syntax is supported. The first two are for
500  * backwards compatability:
501  *
502  * <intf-name> <id>
503  * - a subinterface with the name <intf-name>.<id>. The subinterface
504  * is a single dot1q vlan with vlan id <id> and exact-match semantics.
505  *
506  * <intf-name> <min_id>-<max_id>
507  * - a set of the above subinterfaces, repeating for each id
508  * in the range <min_id> to <max_id>
509  *
510  * In the following, exact-match semantics (i.e. the number of vlan tags on the
511  * packet must match the number of tags in the configuration) are used only if
512  * the keyword exact-match is present. Non-exact match is the default.
513  *
514  * <intf-name> <id> dot1q <outer_id> [exact-match]
515  * - a subinterface with the name <intf-name>.<id>. The subinterface
516  * is a single dot1q vlan with vlan id <outer_id>.
517  *
518  * <intf-name> <id> dot1q any [exact-match]
519  * - a subinterface with the name <intf-name>.<id>. The subinterface
520  * is a single dot1q vlan with any vlan id.
521  *
522  * <intf-name> <id> dot1q <outer_id> inner-dot1q <inner_id> [exact-match]
523  * - a subinterface with the name <intf-name>.<id>. The subinterface
524  * is a double dot1q vlan with outer vlan id <outer_id> and inner vlan id
525  * <inner_id>.
526  *
527  * <intf-name> <id> dot1q <outer_id> inner-dot1q any [exact-match]
528  * - a subinterface with the name <intf-name>.<id>. The subinterface
529  * is a double dot1q vlan with outer vlan id <id> and any inner vlan id.
530  *
531  * <intf-name> <id> dot1q any inner-dot1q any [exact-match]
532  *
533  * - a subinterface with the name <intf-name>.<id>. The subinterface
534  * is a double dot1q vlan with any outer vlan id and any inner vlan id.
535  *
536  * For each of the above CLI, there is a duplicate that uses the keyword
537  * "dot1ad" in place of the first "dot1q". These interfaces use ethertype
538  * 0x88ad in place of 0x8100 for the outer ethertype. Note that for double-
539  * tagged packets the inner ethertype is always 0x8100. Also note that
540  * the dot1q and dot1ad naming spaces are independent, so it is legal to
541  * have both "Gig3/0/0.1 dot1q 100" and "Gig3/0/0.2 dot1ad 100". For example:
542  *
543  * <intf-name> <id> dot1ad <outer_id> inner-dot1q <inner_id> [exact-match]
544  * - a subinterface with the name <intf-name>.<id>. The subinterface
545  * is a double dot1ad vlan with outer vlan id <outer_id> and inner vlan
546  * id <inner_id>.
547  *
548  * <intf-name> <id> untagged
549  * - a subinterface with the name <intf-name>.<id>. The subinterface
550  * has no vlan tags. Only one can be specified per interface.
551  *
552  * <intf-name> <id> default
553  * - a subinterface with the name <intf-name>.<id>. This is associated
554  * with a packet that did not match any other configured subinterface
555  * on this interface. Only one can be specified per interface.
556  */
557 
558 static clib_error_t *
560  vnet_sw_interface_t * template)
561 {
562  clib_error_t *error = 0;
563  u32 inner_vlan, outer_vlan;
564 
565  if (unformat (input, "any inner-dot1q any"))
566  {
567  template->sub.eth.flags.two_tags = 1;
568  template->sub.eth.flags.outer_vlan_id_any = 1;
569  template->sub.eth.flags.inner_vlan_id_any = 1;
570  }
571  else if (unformat (input, "any"))
572  {
573  template->sub.eth.flags.one_tag = 1;
574  template->sub.eth.flags.outer_vlan_id_any = 1;
575  }
576  else if (unformat (input, "%d inner-dot1q any", &outer_vlan))
577  {
578  template->sub.eth.flags.two_tags = 1;
579  template->sub.eth.flags.inner_vlan_id_any = 1;
580  template->sub.eth.outer_vlan_id = outer_vlan;
581  }
582  else if (unformat (input, "%d inner-dot1q %d", &outer_vlan, &inner_vlan))
583  {
584  template->sub.eth.flags.two_tags = 1;
585  template->sub.eth.outer_vlan_id = outer_vlan;
586  template->sub.eth.inner_vlan_id = inner_vlan;
587  }
588  else if (unformat (input, "%d", &outer_vlan))
589  {
590  template->sub.eth.flags.one_tag = 1;
591  template->sub.eth.outer_vlan_id = outer_vlan;
592  }
593  else
594  {
595  error = clib_error_return (0, "expected dot1q config, got `%U'",
596  format_unformat_error, input);
597  goto done;
598  }
599 
601  {
602  if (unformat (input, "exact-match"))
603  {
604  template->sub.eth.flags.exact_match = 1;
605  }
606  }
607 
608 done:
609  return error;
610 }
611 
612 static clib_error_t *
614  unformat_input_t * input, vlib_cli_command_t * cmd)
615 {
616  vnet_main_t *vnm = vnet_get_main ();
617  clib_error_t *error = 0;
618  u32 hw_if_index, sw_if_index;
620  u32 id, id_min, id_max;
621  vnet_sw_interface_t template;
622 
623  hw_if_index = ~0;
624  if (!unformat_user (input, unformat_vnet_hw_interface, vnm, &hw_if_index))
625  {
626  error = clib_error_return (0, "unknown interface `%U'",
627  format_unformat_error, input);
628  goto done;
629  }
630 
631  memset (&template, 0, sizeof (template));
632  template.sub.eth.raw_flags = 0;
633 
634  if (unformat (input, "%d default", &id_min))
635  {
636  id_max = id_min;
637  template.sub.eth.flags.default_sub = 1;
638  }
639  else if (unformat (input, "%d untagged", &id_min))
640  {
641  id_max = id_min;
642  template.sub.eth.flags.no_tags = 1;
643  template.sub.eth.flags.exact_match = 1;
644  }
645  else if (unformat (input, "%d dot1q", &id_min))
646  {
647  /* parse dot1q config */
648  id_max = id_min;
649  error = parse_vlan_sub_interfaces (input, &template);
650  if (error)
651  goto done;
652  }
653  else if (unformat (input, "%d dot1ad", &id_min))
654  {
655  /* parse dot1ad config */
656  id_max = id_min;
657  template.sub.eth.flags.dot1ad = 1;
658  error = parse_vlan_sub_interfaces (input, &template);
659  if (error)
660  goto done;
661  }
662  else if (unformat (input, "%d-%d", &id_min, &id_max))
663  {
664  template.sub.eth.flags.one_tag = 1;
665  template.sub.eth.flags.exact_match = 1;
666  if (id_min > id_max)
667  goto id_error;
668  }
669  else if (unformat (input, "%d", &id_min))
670  {
671  id_max = id_min;
672  template.sub.eth.flags.one_tag = 1;
673  template.sub.eth.outer_vlan_id = id_min;
674  template.sub.eth.flags.exact_match = 1;
675  }
676  else
677  {
678  id_error:
679  error = clib_error_return (0, "expected ID or ID MIN-MAX, got `%U'",
680  format_unformat_error, input);
681  goto done;
682  }
683 
684  hi = vnet_get_hw_interface (vnm, hw_if_index);
685 
687  {
688  error =
690  "not allowed as %v belong to a BondEthernet interface",
691  hi->name);
692  goto done;
693  }
694 
695  for (id = id_min; id <= id_max; id++)
696  {
697  uword *p;
699  u64 sup_and_sub_key = ((u64) (hi->sw_if_index) << 32) | (u64) id;
700  u64 *kp;
701 
702  p = hash_get_mem (im->sw_if_index_by_sup_and_sub, &sup_and_sub_key);
703  if (p)
704  {
705  if (CLIB_DEBUG > 0)
706  clib_warning ("sup sw_if_index %d, sub id %d already exists\n",
707  hi->sw_if_index, id);
708  continue;
709  }
710 
711  kp = clib_mem_alloc (sizeof (*kp));
712  *kp = sup_and_sub_key;
713 
714  template.type = VNET_SW_INTERFACE_TYPE_SUB;
715  template.flood_class = VNET_FLOOD_CLASS_NORMAL;
716  template.sup_sw_if_index = hi->sw_if_index;
717  template.sub.id = id;
718  if (id_min < id_max)
719  template.sub.eth.outer_vlan_id = id;
720 
721  error = vnet_create_sw_interface (vnm, &template, &sw_if_index);
722  if (error)
723  goto done;
724 
725  hash_set (hi->sub_interface_sw_if_index_by_id, id, sw_if_index);
726  hash_set_mem (im->sw_if_index_by_sup_and_sub, kp, sw_if_index);
728  vnet_get_main (), sw_if_index);
729  }
730 
731 done:
732  return error;
733 }
734 
735 /* *INDENT-OFF* */
736 /*?
737  * Create vlan subinterfaces
738  *
739  * @cliexpar
740  * @cliexstart{create sub-interfaces}
741  *
742  * To create a vlan subinterface 11 to process packets on 802.1q VLAN id 11, use:
743  *
744  * vpp# create sub GigabitEthernet2/0/0 11
745  *
746  * This shorthand is equivalent to:
747  * vpp# create sub GigabitEthernet2/0/0 11 dot1q 11 exact-match
748  *
749  * You can specify a subinterface number that is different from the vlan id:
750  * vpp# create sub GigabitEthernet2/0/0 11 dot1q 100
751  *
752  * You can create qinq and q-in-any interfaces:
753  * vpp# create sub GigabitEthernet2/0/0 11 dot1q 100 inner-dot1q 200
754  * vpp# create sub GigabitEthernet2/0/0 12 dot1q 100 inner-dot1q any
755  *
756  * You can also create dot1ad interfaces:
757  * vpp# create sub GigabitEthernet2/0/0 11 dot1ad 11
758  * vpp# create sub GigabitEthernet2/0/0 12 dot1q 100 inner-dot1q 200
759  *
760  * Subinterfaces can be configured as either exact-match or non-exact match.
761  * Non-exact match is the CLI default. If exact-match is specified,
762  * packets must have the same number of vlan tags as the configuration.
763  * For non-exact-match, packets must at least that number of tags.
764  * L3 (routed) interfaces must be configured as exact-match.
765  * L2 interfaces are typically configured as non-exact-match.
766  *
767  * For example, a packet with outer vlan 100 and inner 200 would match this interface:
768  * vpp# create sub GigabitEthernet2/0/0 5 dot1q 100
769  *
770  * but would not match this interface:
771  * vpp# create sub GigabitEthernet2/0/0 5 dot1q 100 exact-match
772  *
773  * There are two special subinterfaces that can be configured. Subinterface untagged has no vlan tags:
774  * vpp# create sub GigabitEthernet2/0/0 5 untagged
775  *
776  * The subinterface default matches any packet that does not match any other subinterface:
777  * vpp# create sub GigabitEthernet2/0/0 7 default
778  * @cliexend
779  ?*/
780 VLIB_CLI_COMMAND (create_sub_interfaces_command, static) = {
781  .path = "create sub-interfaces",
782  .short_help = "create sub-interfaces <nn>[-<nn>] [dot1q|dot1ad|default|untagged]",
783  .function = create_sub_interfaces,
784 };
785 /* *INDENT-ON* */
786 
787 static clib_error_t *
789  unformat_input_t * input, vlib_cli_command_t * cmd)
790 {
791  vnet_main_t *vnm = vnet_get_main ();
792  clib_error_t *error;
793  u32 sw_if_index, flags;
794 
795  sw_if_index = ~0;
796  if (!unformat_user (input, unformat_vnet_sw_interface, vnm, &sw_if_index))
797  {
798  error = clib_error_return (0, "unknown interface `%U'",
799  format_unformat_error, input);
800  goto done;
801  }
802 
803  if (!unformat (input, "%U", unformat_vnet_sw_interface_flags, &flags))
804  {
805  error = clib_error_return (0, "unknown flags `%U'",
806  format_unformat_error, input);
807  goto done;
808  }
809 
810  error = vnet_sw_interface_set_flags (vnm, sw_if_index, flags);
811  if (error)
812  goto done;
813 
814 done:
815  return error;
816 }
817 
818 
819 /* *INDENT-OFF* */
820 /*?
821  * Interface admin up/down
822  *
823  * @cliexpar
824  * @cliexstart{set interface state}
825  * vpp# set interface state GigabitEthernet2/0/0 up
826  * vpp# set interface state GigabitEthernet2/0/0 down
827  * @cliexend
828  ?*/
829 VLIB_CLI_COMMAND (set_state_command, static) = {
830  .path = "set interface state",
831  .short_help = "Set interface state",
832  .function = set_state,
833 };
834 /* *INDENT-ON* */
835 
836 static clib_error_t *
838  unformat_input_t * input, vlib_cli_command_t * cmd)
839 {
840  vnet_main_t *vnm = vnet_get_main ();
841  u32 unnumbered_sw_if_index;
842  u32 inherit_from_sw_if_index;
844  int is_set = 0;
845  int is_del = 0;
846 
847  if (unformat (input, "%U use %U",
848  unformat_vnet_sw_interface, vnm, &unnumbered_sw_if_index,
849  unformat_vnet_sw_interface, vnm, &inherit_from_sw_if_index))
850  is_set = 1;
851  else if (unformat (input, "del %U",
853  &unnumbered_sw_if_index))
854  is_del = 1;
855  else
856  return clib_error_return (0, "parse error '%U'",
857  format_unformat_error, input);
858 
859  si = vnet_get_sw_interface (vnm, unnumbered_sw_if_index);
860  if (is_del)
861  {
863  si->unnumbered_sw_if_index = (u32) ~ 0;
864  ip4_sw_interface_enable_disable (unnumbered_sw_if_index, 0);
865  ip6_sw_interface_enable_disable (unnumbered_sw_if_index, 0);
866  }
867  else if (is_set)
868  {
870  si->unnumbered_sw_if_index = inherit_from_sw_if_index;
871  ip4_sw_interface_enable_disable (unnumbered_sw_if_index, 1);
872  ip6_sw_interface_enable_disable (unnumbered_sw_if_index, 1);
873  }
874 
875  return 0;
876 }
877 
878 /* *INDENT-OFF* */
879 VLIB_CLI_COMMAND (set_unnumbered_command, static) = {
880  .path = "set interface unnumbered",
881  .short_help = "set interface unnumbered [<intfc> use <intfc> | del <intfc>]",
882  .function = set_unnumbered,
883 };
884 /* *INDENT-ON* */
885 
886 
887 
888 static clib_error_t *
890  unformat_input_t * input, vlib_cli_command_t * cmd)
891 {
892  vnet_main_t *vnm = vnet_get_main ();
894  clib_error_t *error;
895  u32 hw_if_index, hw_class_index;
896 
897  hw_if_index = ~0;
898  if (!unformat_user (input, unformat_vnet_hw_interface, vnm, &hw_if_index))
899  {
900  error = clib_error_return (0, "unknown hardware interface `%U'",
901  format_unformat_error, input);
902  goto done;
903  }
904 
905  if (!unformat_user (input, unformat_hash_string,
906  im->hw_interface_class_by_name, &hw_class_index))
907  {
908  error = clib_error_return (0, "unknown hardware class `%U'",
909  format_unformat_error, input);
910  goto done;
911  }
912 
913  error = vnet_hw_interface_set_class (vnm, hw_if_index, hw_class_index);
914  if (error)
915  goto done;
916 
917 done:
918  return error;
919 }
920 
921 /* *INDENT-OFF* */
922 VLIB_CLI_COMMAND (set_hw_class_command, static) = {
923  .path = "set interface hw-class",
924  .short_help = "Set interface hardware class",
925  .function = set_hw_class,
926 };
927 /* *INDENT-ON* */
928 
929 static clib_error_t *
931 {
932  return 0;
933 }
934 
936 
937 static clib_error_t *
939  unformat_input_t * input,
940  vlib_cli_command_t * cmd)
941 {
942  u32 hw_if_index;
943  u32 new_dev_instance;
944  vnet_main_t *vnm = vnet_get_main ();
945  int rv;
946 
947  if (!unformat_user (input, unformat_vnet_hw_interface, vnm, &hw_if_index))
948  return clib_error_return (0, "unknown hardware interface `%U'",
949  format_unformat_error, input);
950 
951  if (!unformat (input, "%d", &new_dev_instance))
952  return clib_error_return (0, "new dev instance missing");
953 
954  rv = vnet_interface_name_renumber (hw_if_index, new_dev_instance);
955 
956  switch (rv)
957  {
958  case 0:
959  break;
960 
961  default:
962  return clib_error_return (0, "vnet_interface_name_renumber returned %d",
963  rv);
964 
965  }
966 
967  return 0;
968 }
969 
970 
971 /* *INDENT-OFF* */
972 VLIB_CLI_COMMAND (renumber_interface_command, static) = {
973  .path = "renumber interface",
974  .short_help = "renumber interface <if-name> <new-dev-instance>",
975  .function = renumber_interface_command_fn,
976 };
977 /* *INDENT-ON* */
978 
979 static clib_error_t *
981  unformat_input_t * input, vlib_cli_command_t * cmd)
982 {
983  vnet_main_t *vnm = vnet_get_main ();
984  u32 hw_if_index;
988 
989  if (unformat (input, "on %U",
990  unformat_vnet_hw_interface, vnm, &hw_if_index))
991  ;
992  else if (unformat (input, "off %U",
993  unformat_ethernet_interface, vnm, &hw_if_index))
994  flags = 0;
995  else
996  return clib_error_return (0, "unknown input `%U'",
997  format_unformat_error, input);
998 
999  eif = ethernet_get_interface (em, hw_if_index);
1000  if (!eif)
1001  return clib_error_return (0, "not supported");
1002 
1003  ethernet_set_flags (vnm, hw_if_index, flags);
1004  return 0;
1005 }
1006 
1007 /* *INDENT-OFF* */
1008 VLIB_CLI_COMMAND (set_interface_promiscuous_cmd, static) = {
1009  .path = "set interface promiscuous",
1010  .short_help = "set interface promiscuous [on | off] <intfc>",
1011  .function = promiscuous_cmd,
1012 };
1013 /* *INDENT-ON* */
1014 
1015 static clib_error_t *
1017 {
1018  vnet_main_t *vnm = vnet_get_main ();
1019  u32 hw_if_index, mtu;
1022 
1023  if (unformat (input, "%d %U", &mtu,
1024  unformat_vnet_hw_interface, vnm, &hw_if_index))
1025  {
1026  vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index);
1027  ethernet_interface_t *eif = ethernet_get_interface (em, hw_if_index);
1028 
1029  if (!eif)
1030  return clib_error_return (0, "not supported");
1031 
1032  if (mtu < hi->min_supported_packet_bytes)
1033  return clib_error_return (0, "Invalid mtu (%d): "
1034  "must be >= min pkt bytes (%d)", mtu,
1036 
1037  if (mtu > hi->max_supported_packet_bytes)
1038  return clib_error_return (0, "Invalid mtu (%d): must be <= (%d)", mtu,
1040 
1041  if (hi->max_packet_bytes != mtu)
1042  {
1043  hi->max_packet_bytes = mtu;
1044  ethernet_set_flags (vnm, hw_if_index, flags);
1045  }
1046  }
1047  else
1048  return clib_error_return (0, "unknown input `%U'",
1049  format_unformat_error, input);
1050  return 0;
1051 }
1052 
1053 /* *INDENT-OFF* */
1054 VLIB_CLI_COMMAND (set_interface_mtu_cmd, static) = {
1055  .path = "set interface mtu",
1056  .short_help = "set interface mtu <value> <intfc>",
1057  .function = mtu_cmd,
1058 };
1059 /* *INDENT-ON* */
1060 
1061 static clib_error_t *
1063  vlib_cli_command_t * cmd)
1064 {
1065  vnet_main_t *vnm = vnet_get_main ();
1066  clib_error_t *error = 0;
1067  u32 sw_if_index = ~0;
1068  u64 mac = 0;
1069 
1070  if (!unformat_user (input, unformat_vnet_sw_interface, vnm, &sw_if_index))
1071  {
1072  error = clib_error_return (0, "unknown interface `%U'",
1073  format_unformat_error, input);
1074  goto done;
1075  }
1076  if (!unformat_user (input, unformat_ethernet_address, &mac))
1077  {
1078  error = clib_error_return (0, "expected mac address `%U'",
1079  format_unformat_error, input);
1080  goto done;
1081  }
1082  error = vnet_hw_interface_change_mac_address (vnm, sw_if_index, mac);
1083 done:
1084  return error;
1085 }
1086 
1087 /*?
1088  * The '<em>set interface mac address </em>' command allows to set MAC address of given interface.
1089  * In case of NIC interfaces the one has to support MAC address change. A side effect of MAC address
1090  * change are changes of MAC addresses in FIB tables (ipv4 and ipv6).
1091  *
1092  * @cliexpar
1093  * @parblock
1094  * Example of how to change MAC Address of interface:
1095  * @cliexcmd{set interface mac address GigabitEthernet0/8/0 aa:bb:cc:dd:ee:01}
1096  * @cliexcmd{set interface mac address host-vpp0 aa:bb:cc:dd:ee:02}
1097  * @cliexcmd{set interface mac address tap-0 aa:bb:cc:dd:ee:03}
1098  * @cliexcmd{set interface mac address pg0 aa:bb:cc:dd:ee:04}
1099  * @endparblock
1100 ?*/
1101 /* *INDENT-OFF* */
1102 VLIB_CLI_COMMAND (set_interface_mac_address_cmd, static) = {
1103  .path = "set interface mac address",
1104  .short_help = "set interface mac address <intfc> <mac-address>",
1105  .function = set_interface_mac_address,
1106 };
1107 /* *INDENT-ON* */
1108 
1109 static clib_error_t *
1111 {
1112  vnet_main_t *vnm = vnet_get_main ();
1113  u32 sw_if_index = ~0;
1114  u8 *tag = 0;
1115 
1116  if (!unformat (input, "%U %s", unformat_vnet_sw_interface,
1117  vnm, &sw_if_index, &tag))
1118  return clib_error_return (0, "unknown input `%U'",
1119  format_unformat_error, input);
1120 
1121  vnet_set_sw_interface_tag (vnm, tag, sw_if_index);
1122 
1123  return 0;
1124 }
1125 
1126 /* *INDENT-OFF* */
1127 VLIB_CLI_COMMAND (set_tag_command, static) = {
1128  .path = "set interface tag",
1129  .short_help = "set interface tag <intfc> <tag>",
1130  .function = set_tag,
1131 };
1132 /* *INDENT-ON* */
1133 
1134 static clib_error_t *
1136  vlib_cli_command_t * cmd)
1137 {
1138  vnet_main_t *vnm = vnet_get_main ();
1139  u32 sw_if_index = ~0;
1140 
1141  if (!unformat (input, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index))
1142  return clib_error_return (0, "unknown input `%U'",
1143  format_unformat_error, input);
1144 
1145  vnet_clear_sw_interface_tag (vnm, sw_if_index);
1146 
1147  return 0;
1148 }
1149 
1150 /* *INDENT-OFF* */
1151 VLIB_CLI_COMMAND (clear_tag_command, static) = {
1152  .path = "clear interface tag",
1153  .short_help = "clear interface tag <intfc>",
1154  .function = clear_tag,
1155 };
1156 /* *INDENT-ON* */
1157 
1158 
1159 /*
1160  * fd.io coding-style-patch-verification: ON
1161  *
1162  * Local Variables:
1163  * eval: (c-set-style "gnu")
1164  * End:
1165  */
unformat_function_t unformat_vnet_hw_interface
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:396
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
Definition: lookup.h:460
static clib_error_t * clear_interface_counters(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define VNET_SW_INTERFACE_FLAG_UNNUMBERED
Definition: interface.h:535
vmrglw vmrglh hi
format_function_t format_vnet_sw_interface
static clib_error_t * create_sub_interfaces(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define hash_set(h, key, value)
Definition: hash.h:254
l2_input_config_t * configs
Definition: l2_input.h:66
sll srl srl sll sra u16x4 i
Definition: vector_sse2.h:343
static clib_error_t * promiscuous_cmd(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * set_hw_class(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
uword unformat(unformat_input_t *i, char *fmt,...)
Definition: unformat.c:966
static int sw_interface_name_compare(void *a1, void *a2)
static clib_error_t * set_state(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static ip6_fib_t * ip6_fib_get(fib_node_index_t index)
Definition: ip6_fib.h:106
static clib_error_t * set_interface_mac_address(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
unformat_function_t unformat_hash_string
Definition: hash.h:681
vnet_interface_main_t interface_main
Definition: vnet.h:57
clib_error_t * vnet_hw_interface_change_mac_address(vnet_main_t *vnm, u32 hw_if_index, u64 mac_address)
Definition: interface.c:1353
#define UNFORMAT_END_OF_INPUT
Definition: format.h:143
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
vnet_main_t ** vnet_mains
Definition: vnet.h:83
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:482
word vnet_sw_interface_compare(vnet_main_t *vnm, uword sw_if_index0, uword sw_if_index1)
Definition: interface.c:1109
int vnet_interface_name_renumber(u32 sw_if_index, u32 new_show_dev_instance)
Definition: interface.c:1246
static void vnet_clear_sw_interface_tag(vnet_main_t *vnm, u32 sw_if_index)
static clib_error_t * set_tag(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static clib_error_t * renumber_interface_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define hash_set_mem(h, key, value)
Definition: hash.h:274
ip_lookup_main_t lookup_main
Definition: ip4.h:97
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
uword * sub_interface_sw_if_index_by_id
Definition: interface.h:452
u32 * fib_index_by_sw_if_index
Table index indexed by software interface.
Definition: ip4.h:105
unformat_function_t unformat_vnet_sw_interface
struct _vnet_device_class vnet_device_class_t
format_function_t format_vnet_sw_if_index_name
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
ethernet_main_t ethernet_main
Definition: ethernet.h:270
vnet_main_t * vnet_get_main(void)
Definition: misc.c:46
format_function_t format_vnet_hw_interface
uword flags
Definition: error.h:83
void vlib_clear_combined_counters(vlib_combined_counter_main_t *cm)
Clear a collection of combined counters.
Definition: counter.c:67
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
Definition: pool.h:348
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:111
u32 output_sw_if_index
Definition: l2_input.h:35
#define vec_new(T, N)
Create new vector of given type and length (unspecified alignment, no header).
Definition: vec.h:270
vlib_combined_counter_main_t * combined_sw_if_counters
Definition: interface.h:615
static clib_error_t * parse_vlan_sub_interfaces(unformat_input_t *input, vnet_sw_interface_t *template)
Parse subinterface names.
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
#define clib_warning(format, args...)
Definition: error.h:59
unsigned long u64
Definition: types.h:89
uword unformat_user(unformat_input_t *input, unformat_function_t *func,...)
Definition: unformat.c:977
static clib_error_t * set_unnumbered(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
A collection of simple counters.
Definition: counter.h:59
static clib_error_t * mtu_cmd(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u32 max_supported_packet_bytes
Definition: interface.h:435
vnet_hw_interface_t * hw_interfaces
Definition: interface.h:592
#define clib_bitmap_foreach(i, ai, body)
Macro to iterate across set bits in a bitmap.
Definition: bitmap.h:361
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:369
void ip4_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
Definition: ip4_forward.c:807
uword * sw_if_index_by_sup_and_sub
Definition: interface.h:609
static clib_error_t * show_sw_interfaces(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
vlib_simple_counter_main_t * sw_if_counters
Definition: interface.h:614
word vnet_hw_interface_compare(vnet_main_t *vnm, uword hw_if_index0, uword hw_if_index1)
Definition: interface.c:1123
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:576
static int compare_interface_names(void *a1, void *a2)
Definition: interface_cli.c:52
uword * hw_interface_class_by_name
Definition: interface.h:602
#define VNET_HW_INTERFACE_BOND_INFO_SLAVE
Definition: interface.h:463
void vnet_interface_features_show(vlib_main_t *vm, u32 sw_if_index)
Display the set of driver features configured on a specific interface Called by "show interface" hand...
Definition: feature.c:314
static clib_error_t * clear_tag(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:300
static ip4_fib_t * ip4_fib_get(u32 index)
Get the FIB at the given index.
Definition: ip4_fib.h:71
Definition: ip6.h:66
Definition: ip4.h:48
#define ETHERNET_INTERFACE_FLAG_MTU
Definition: ethernet.h:118
#define ETHERNET_INTERFACE_FLAG_ACCEPT_ALL
Definition: ethernet.h:113
static clib_error_t * show_or_clear_hw_interfaces(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: interface_cli.c:61
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:154
#define VNET_SW_INTERFACE_FLAG_ADMIN_UP
Definition: interface.h:528
uword unformat_ethernet_address(unformat_input_t *input, va_list *args)
Definition: format.c:245
unsigned int u32
Definition: types.h:88
u8 * format_unformat_error(u8 *s, va_list *va)
Definition: unformat.c:91
ip6_main_t ip6_main
Definition: ip6_forward.c:2828
ip_lookup_main_t lookup_main
Definition: ip6.h:135
IPv4 main type.
Definition: ip4.h:95
static void vnet_set_sw_interface_tag(vnet_main_t *vnm, u8 *tag, u32 sw_if_index)
Bitmaps built as vectors of machine words.
char * path
Definition: cli.h:95
static u8 * vnet_get_sw_interface_tag(vnet_main_t *vnm, u32 sw_if_index)
static void * clib_mem_alloc(uword size)
Definition: mem.h:109
uword unformat_ethernet_interface(unformat_input_t *input, va_list *args)
Definition: interface.c:205
u64 uword
Definition: types.h:112
#define vec_elt(v, i)
Get vector value at index i.
l2input_main_t l2input_main
Definition: l2_input.c:87
ethernet_interface_t * ethernet_get_interface(ethernet_main_t *em, u32 hw_if_index)
Definition: interface.c:563
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
unsigned char u8
Definition: types.h:56
unformat_function_t unformat_vnet_sw_interface_flags
static clib_error_t * vnet_interface_cli_init(vlib_main_t *vm)
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
Definition: vec.h:920
vnet_sw_interface_t * sw_interfaces
Definition: interface.h:606
l2_bridge_domain_t * bd_configs
Definition: l2_input.h:69
A collection of combined counters.
Definition: counter.h:212
#define hash_get_mem(h, key)
Definition: hash.h:268
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:169
u32 min_supported_packet_bytes
Definition: interface.h:432
void vlib_clear_simple_counters(vlib_simple_counter_main_t *cm)
Clear a collection of simple counters.
Definition: counter.c:43
ip4_main_t ip4_main
Global ip4 main structure.
Definition: ip4_forward.c:1099
#define vec_foreach(var, vec)
Vector iterator.
clib_error_t * vnet_sw_interface_set_flags(vnet_main_t *vnm, u32 sw_if_index, u32 flags)
Definition: interface.c:539
vnet_device_class_t * device_classes
Definition: interface.h:599
#define clib_error_return(e, args...)
Definition: error.h:111
struct _unformat_input_t unformat_input_t
clib_error_t * vnet_create_sw_interface(vnet_main_t *vnm, vnet_sw_interface_t *template, u32 *sw_if_index)
Definition: interface.c:600
u32 flags
Definition: vhost-user.h:75
u32 * fib_index_by_sw_if_index
Definition: ip6.h:144
void ip6_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
Definition: ip6_forward.c:391
u32 ethernet_set_flags(vnet_main_t *vnm, u32 hw_if_index, u32 flags)
Definition: interface.c:319
clib_error_t * vnet_hw_interface_set_class(vnet_main_t *vnm, u32 hw_if_index, u32 hw_class_index)
Definition: interface.c:1068
static uword pool_elts(void *v)
Number of active elements in a pool.
Definition: pool.h:109