FD.io VPP  v16.06
Vector Packet Processing
interface.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  * ethernet_interface.c: ethernet interfaces
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 #include <vnet/vnet.h>
41 #include <vnet/ip/ip.h>
42 #include <vnet/pg/pg.h>
43 #include <vnet/ethernet/ethernet.h>
44 #include <vnet/l2/l2_input.h>
45 
47  u32 sw_if_index,
48  u32 l3_type,
49  void * dst_address,
50  void * rewrite,
51  uword max_rewrite_bytes)
52 {
53  vnet_sw_interface_t * sub_sw = vnet_get_sw_interface (vnm, sw_if_index);
54  vnet_sw_interface_t * sup_sw = vnet_get_sup_sw_interface (vnm, sw_if_index);
55  vnet_hw_interface_t * hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
58  ethernet_header_t * h = rewrite;
60  uword n_bytes = sizeof (h[0]);
61 
62  if (sub_sw != sup_sw) {
63  if (sub_sw->sub.eth.flags.one_tag) {
64  n_bytes += sizeof (ethernet_vlan_header_t);
65  } else if (sub_sw->sub.eth.flags.two_tags) {
66  n_bytes += 2 * (sizeof (ethernet_vlan_header_t));
67  }
68  // Check for encaps that are not supported for L3 interfaces
69  if (!(sub_sw->sub.eth.flags.exact_match) ||
70  (sub_sw->sub.eth.flags.default_sub) ||
71  (sub_sw->sub.eth.flags.outer_vlan_id_any) ||
72  (sub_sw->sub.eth.flags.inner_vlan_id_any)) {
73  return 0;
74  }
75  }
76 
77  if (n_bytes > max_rewrite_bytes)
78  return 0;
79 
80  switch (l3_type) {
81 #define _(a,b) case VNET_L3_PACKET_TYPE_##a: type = ETHERNET_TYPE_##b; break
82  _ (IP4, IP4);
83  _ (IP6, IP6);
84  _ (MPLS_UNICAST, MPLS_UNICAST);
85  _ (MPLS_MULTICAST, MPLS_MULTICAST);
86  _ (ARP, ARP);
87 #undef _
88  default:
89  return 0;
90  }
91 
93  clib_memcpy (h->src_address, ei->address, sizeof (h->src_address));
94  if (dst_address)
95  clib_memcpy (h->dst_address, dst_address, sizeof (h->dst_address));
96  else
97  memset (h->dst_address, ~0, sizeof (h->dst_address)); /* broadcast */
98 
99  if (sub_sw->sub.eth.flags.one_tag) {
100  ethernet_vlan_header_t * outer = (void *) (h + 1);
101 
102  h->type = sub_sw->sub.eth.flags.dot1ad ?
103  clib_host_to_net_u16 (ETHERNET_TYPE_DOT1AD) :
104  clib_host_to_net_u16 (ETHERNET_TYPE_VLAN);
105  outer->priority_cfi_and_id = clib_host_to_net_u16 (sub_sw->sub.eth.outer_vlan_id);
106  outer->type = clib_host_to_net_u16 (type);
107 
108  } else if (sub_sw->sub.eth.flags.two_tags) {
109  ethernet_vlan_header_t * outer = (void *) (h + 1);
110  ethernet_vlan_header_t * inner = (void *) (outer + 1);
111 
112  h->type = sub_sw->sub.eth.flags.dot1ad ?
113  clib_host_to_net_u16 (ETHERNET_TYPE_DOT1AD) :
114  clib_host_to_net_u16 (ETHERNET_TYPE_VLAN);
115  outer->priority_cfi_and_id = clib_host_to_net_u16 (sub_sw->sub.eth.outer_vlan_id);
116  outer->type = clib_host_to_net_u16 (ETHERNET_TYPE_VLAN);
117  inner->priority_cfi_and_id = clib_host_to_net_u16 (sub_sw->sub.eth.inner_vlan_id);
118  inner->type = clib_host_to_net_u16 (type);
119 
120  } else {
121  h->type = clib_host_to_net_u16 (type);
122  }
123 
124  return n_bytes;
125 }
126 
128  .name = "Ethernet",
129  .format_address = format_ethernet_address,
130  .format_header = format_ethernet_header_with_length,
131  .unformat_hw_address = unformat_ethernet_address,
132  .unformat_header = unformat_ethernet_header,
133  .set_rewrite = ethernet_set_rewrite,
134 };
135 
137 {
138  vnet_main_t * vnm = va_arg (*args, vnet_main_t *);
139  u32 * result = va_arg (*args, u32 *);
140  u32 hw_if_index;
142  ethernet_interface_t * eif;
143 
144  if (! unformat_user (input, unformat_vnet_hw_interface, vnm, &hw_if_index))
145  return 0;
146 
147  eif = ethernet_get_interface (em, hw_if_index);
148  if (eif)
149  {
150  *result = hw_if_index;
151  return 1;
152  }
153  return 0;
154 }
155 
156 clib_error_t *
158  u32 dev_class_index,
159  u32 dev_instance,
160  u8 * address,
161  u32 * hw_if_index_return,
163 {
167  clib_error_t * error = 0;
168  u32 hw_if_index;
169 
170  pool_get (em->interfaces, ei);
171  ei->flag_change = flag_change;
172 
173  hw_if_index = vnet_register_interface
174  (vnm,
175  dev_class_index, dev_instance,
177  ei - em->interfaces);
178  *hw_if_index_return = hw_if_index;
179 
180  hi = vnet_get_hw_interface (vnm, hw_if_index);
181 
183 
187  /* preamble */ 8 + /* inter frame gap */ 12;
188 
189  /* Standard default ethernet MTU. */
191 
192  clib_memcpy (ei->address, address, sizeof (ei->address));
193  vec_free (hi->hw_address);
194  vec_add (hi->hw_address, address, sizeof (ei->address));
195 
196  if (error)
197  {
198  pool_put (em->interfaces, ei);
199  return error;
200  }
201  return error;
202 }
203 
204 void
206 {
210  main_intf_t * main_intf;
211  vlan_table_t * vlan_table;
212  u32 idx;
213 
214  hi = vnet_get_hw_interface (vnm, hw_if_index);
215  ei = pool_elt_at_index (em->interfaces, hi->hw_instance);
216 
217  /* Delete vlan mapping table for dot1q and dot1ad. */
218  main_intf = vec_elt_at_index (em->main_intfs, hi->hw_if_index);
219  if (main_intf->dot1q_vlans) {
220  vlan_table = vec_elt_at_index (em->vlan_pool, main_intf->dot1q_vlans);
221  for (idx=0; idx<ETHERNET_N_VLAN; idx++ ) {
222  if (vlan_table->vlans[idx].qinqs) {
223  pool_put_index(em->qinq_pool, vlan_table->vlans[idx].qinqs);
224  }
225  }
226  pool_put_index(em->vlan_pool, main_intf->dot1q_vlans);
227  }
228  if (main_intf->dot1ad_vlans) {
229  vlan_table = vec_elt_at_index (em->vlan_pool, main_intf->dot1ad_vlans);
230  for (idx=0; idx<ETHERNET_N_VLAN; idx++ ) {
231  if (vlan_table->vlans[idx].qinqs) {
232  pool_put_index(em->qinq_pool, vlan_table->vlans[idx].qinqs);
233  }
234  }
235  pool_put_index(em->vlan_pool, main_intf->dot1ad_vlans);
236  }
237 
238  vnet_delete_hw_interface (vnm, hw_if_index);
239  pool_put (em->interfaces, ei);
240 }
241 
242 u32
244 {
248 
249  hi = vnet_get_hw_interface (vnm, hw_if_index);
250 
252 
253  ei = pool_elt_at_index (em->interfaces, hi->hw_instance);
254  if (ei->flag_change)
255  return ei->flag_change (vnm, hi, flags);
256  return (u32)~0;
257 }
258 
259 /* Echo packets back to ethernet/l2-input. */
260 static uword
262  vlib_node_runtime_t * node,
263  vlib_frame_t * frame)
264 {
265  u32 n_left_from, n_left_to_next, n_copy, * from, * to_next;
267  u32 i, next_node_index, bvi_flag, sw_if_index;
268  u32 n_pkts = 0, n_bytes = 0;
269  u32 cpu_index = vm->cpu_index;
270  vnet_main_t * vnm = vnet_get_main();
272  vlib_node_main_t * nm = &vm->node_main;
273  vlib_node_t *loop_node;
274  vlib_buffer_t * b;
275 
276  // check tx node index, it is ethernet-input on loopback create
277  // but can be changed to l2-input if loopback is configured as
278  // BVI of a BD (Bridge Domain).
279  loop_node = vec_elt (nm->nodes, node->node_index);
280  next_node_index = loop_node->next_nodes[next_index];
281  bvi_flag = (next_node_index == l2input_node.index)? 1 : 0;
282 
283  n_left_from = frame->n_vectors;
284  from = vlib_frame_args (frame);
285 
286  while (n_left_from > 0)
287  {
288  vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
289 
290  n_copy = clib_min (n_left_from, n_left_to_next);
291 
292  clib_memcpy (to_next, from, n_copy * sizeof (from[0]));
293  n_left_to_next -= n_copy;
294  n_left_from -= n_copy;
295  i = 0;
296  b = vlib_get_buffer (vm, from[i]);
297  sw_if_index = vnet_buffer (b)->sw_if_index[VLIB_TX];
298  while (1)
299  {
300  // Set up RX and TX indices as if received from a real driver
301  // unless loopback is used as a BVI. For BVI case, leave TX index
302  // and update l2_len in packet as required for l2 forwarding path
303  vnet_buffer (b)->sw_if_index[VLIB_RX] = sw_if_index;
304  if (bvi_flag) vnet_update_l2_len(b);
305  else vnet_buffer (b)->sw_if_index[VLIB_TX] = (u32) ~0;
306 
307  i++;
308  n_pkts++;
309  n_bytes += vlib_buffer_length_in_chain (vm, b);
310 
311  if (i < n_copy) b = vlib_get_buffer (vm, from[i]);
312  else break;
313  }
314 
315  vlib_put_next_frame (vm, node, next_index, n_left_to_next);
316 
317  /* increment TX interface stat */
320  cpu_index, sw_if_index, n_pkts, n_bytes);
321  }
322 
323  return n_left_from;
324 }
325 
326 static u8 * format_simulated_ethernet_name (u8 * s, va_list * args)
327 {
328  u32 dev_instance = va_arg (*args, u32);
329  return format (s, "loop%d", dev_instance);
330 }
331 
332 static clib_error_t *
334 {
335  u32 hw_flags = (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) ?
337  vnet_hw_interface_set_flags (vnm, hw_if_index, hw_flags);
338  return 0;
339 }
340 
341 VNET_DEVICE_CLASS (ethernet_simulated_device_class) = {
342  .name = "Loopback",
343  .format_device_name = format_simulated_ethernet_name,
344  .tx_function = simulated_ethernet_interface_tx,
345  .admin_up_down_function = simulated_ethernet_admin_up_down,
346  .no_flatten_output_chains = 1,
347 };
348 
349 int vnet_create_loopback_interface (u32 * sw_if_indexp, u8 *mac_address)
350 {
351  vnet_main_t * vnm = vnet_get_main();
352  vlib_main_t * vm = vlib_get_main();
353  clib_error_t * error;
354  static u32 instance;
355  u8 address[6];
356  u32 hw_if_index;
357  vnet_hw_interface_t * hw_if;
358  u32 slot;
359  int rv = 0;
360 
361  ASSERT(sw_if_indexp);
362 
363  *sw_if_indexp = (u32)~0;
364 
365  memset (address, 0, sizeof (address));
366 
367  /*
368  * Default MAC address (dead:0000:0000 + instance) is allocated
369  * if zero mac_address is configured. Otherwise, user-configurable MAC
370  * address is programmed on the loopback interface.
371  */
372  if (memcmp (address, mac_address, sizeof (address)))
373  clib_memcpy (address, mac_address, sizeof (address));
374  else
375  {
376  address[0] = 0xde;
377  address[1] = 0xad;
378  address[5] = instance;
379  }
380 
382  (vnm,
383  ethernet_simulated_device_class.index,
384  instance++,
385  address,
386  &hw_if_index,
387  /* flag change */ 0);
388 
389  if (error)
390  {
391  rv = VNET_API_ERROR_INVALID_REGISTRATION;
392  clib_error_report(error);
393  return rv;
394  }
395 
396  hw_if = vnet_get_hw_interface (vnm, hw_if_index);
398  (vm, hw_if->tx_node_index,
399  "ethernet-input",
402 
403  {
404  vnet_sw_interface_t * si = vnet_get_hw_sw_interface (vnm, hw_if_index);
405  *sw_if_indexp = si->sw_if_index;
406  }
407 
408  return 0;
409 }
410 
411 static clib_error_t *
413  unformat_input_t * input,
414  vlib_cli_command_t * cmd)
415 {
416  int rv;
417  u32 sw_if_index;
418  u8 mac_address[6];
419 
420  memset (mac_address, 0, sizeof (mac_address));
421 
423  {
424  if (unformat (input, "mac %U", unformat_ethernet_address, mac_address))
425  ;
426  else
427  break;
428  }
429 
430  rv = vnet_create_loopback_interface (&sw_if_index, mac_address);
431 
432  if (rv)
433  return clib_error_return (0, "vnet_create_loopback_interface failed");
434 
435  return 0;
436 }
437 
438 VLIB_CLI_COMMAND (create_simulated_ethernet_interface_command, static) = {
439  .path = "loopback create-interface",
440  .short_help = "Create Loopback ethernet interface [mac <mac-addr>]",
442 };
443 
444 VLIB_CLI_COMMAND (create_loopback_interface_command, static) = {
445  .path = "create loopback interface",
446  .short_help = "create loopback interface [mac <mac-addr>]",
448 };
449 
452 {
454  return (i->hw_class_index == ethernet_hw_interface_class.index
456  : 0);
457 }
458 
460 {
461  vnet_main_t * vnm = vnet_get_main();
462  vnet_sw_interface_t * si;
463 
465  sw_if_index))
466  return VNET_API_ERROR_INVALID_SW_IF_INDEX;
467 
468  si = vnet_get_sw_interface (vnm, sw_if_index);
470 
471  return 0;
472 }
473 
474 static clib_error_t *
476  unformat_input_t * input,
477  vlib_cli_command_t * cmd)
478 {
479  int rv;
480  u32 sw_if_index = ~0;
481  vnet_main_t * vnm = vnet_get_main();
482 
484  {
485  if (unformat (input, "intfc %U",
486  unformat_vnet_sw_interface, vnm, &sw_if_index))
487  ;
488  else
489  break;
490  }
491 
492  if (sw_if_index == ~0)
493  return clib_error_return (0, "interface not specified");
494 
495  rv = vnet_delete_loopback_interface (sw_if_index);
496 
497  if (rv)
498  return clib_error_return (0, "vnet_delete_loopback_interface failed");
499 
500  return 0;
501 }
502 
503 VLIB_CLI_COMMAND (delete_simulated_ethernet_interface_command, static) = {
504  .path = "loopback delete-interface",
505  .short_help = "Delete Loopback ethernet interface intfc <interface>",
507 };
508 
509 VLIB_CLI_COMMAND (delete_loopback_interface_command, static) = {
510  .path = "delete loopback interface",
511  .short_help = "delete loopback interface intfc <interface>",
513 };
struct vnet_sub_interface_t::@91 eth
unformat_function_t unformat_vnet_hw_interface
u32 * next_nodes
Definition: node.h:254
void vlib_put_next_frame(vlib_main_t *vm, vlib_node_runtime_t *r, u32 next_index, u32 n_vectors_left)
Definition: main.c:459
vmrglw vmrglh hi
int vnet_delete_loopback_interface(u32 sw_if_index)
Definition: interface.c:459
#define ETHERNET_N_VLAN
Definition: packet.h:79
sll srl srl sll sra u16x4 i
Definition: vector_sse2.h:267
#define clib_min(x, y)
Definition: clib.h:295
static clib_error_t * delete_simulated_ethernet_interfaces(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: interface.c:475
uword unformat(unformat_input_t *i, char *fmt,...)
Definition: unformat.c:942
clib_error_t * vnet_hw_interface_set_flags(vnet_main_t *vnm, u32 hw_if_index, u32 flags)
Definition: interface.c:454
bad routing header type(not 4)") sr_error (NO_MORE_SEGMENTS
vnet_interface_main_t interface_main
Definition: vnet.h:62
#define UNFORMAT_END_OF_INPUT
Definition: format.h:142
always_inline void ethernet_setup_node(vlib_main_t *vm, u32 node_index)
Definition: ethernet.h:293
ethernet_type_t
Definition: packet.h:43
static uword ethernet_set_rewrite(vnet_main_t *vnm, u32 sw_if_index, u32 l3_type, void *dst_address, void *rewrite, uword max_rewrite_bytes)
Definition: interface.c:46
u8 src_address[6]
Definition: packet.h:52
vlib_node_registration_t l2input_node
(constructor) VLIB_REGISTER_NODE (l2input_node)
Definition: l2_input.c:415
main_intf_t * main_intfs
Definition: ethernet.h:210
unformat_function_t unformat_vnet_sw_interface
#define clib_error_report(e)
Definition: error.h:126
#define VNET_HW_INTERFACE_FLAG_LINK_UP
Definition: interface.h:241
#define pool_get(P, E)
Definition: pool.h:186
always_inline vlib_main_t * vlib_get_main(void)
Definition: global_funcs.h:23
always_inline uword unformat_check_input(unformat_input_t *i)
Definition: format.h:168
#define vec_add(V, E, N)
Add N elements to end of vector V (no header, unspecified alignment)
Definition: vec.h:557
ethernet_main_t ethernet_main
Definition: ethernet.h:226
vnet_main_t * vnet_get_main(void)
Definition: misc.c:45
u8 * format_ethernet_address(u8 *s, va_list *args)
Definition: format.c:43
vlib_combined_counter_main_t * combined_sw_if_counters
Definition: interface.h:458
u8 dst_address[6]
Definition: packet.h:51
always_inline void vlib_increment_combined_counter(vlib_combined_counter_main_t *cm, u32 cpu_index, u32 index, u32 packet_increment, u32 byte_increment)
Definition: counter.h:210
vlib_node_t ** nodes
Definition: node.h:570
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
always_inline uword vlib_buffer_length_in_chain(vlib_main_t *vm, vlib_buffer_t *b)
Get length in bytes of the buffer chain.
Definition: buffer_funcs.h:112
u32 cpu_index
Definition: main.h:159
ethernet_flag_change_function_t * flag_change
Definition: ethernet.h:91
static clib_error_t * simulated_ethernet_admin_up_down(vnet_main_t *vnm, u32 hw_if_index, u32 flags)
Definition: interface.c:333
uword unformat_user(unformat_input_t *input, unformat_function_t *func,...)
Definition: unformat.c:953
u32 vnet_register_interface(vnet_main_t *vnm, u32 dev_class_index, u32 dev_instance, u32 hw_class_index, u32 hw_instance)
Definition: interface.c:583
u32 max_supported_packet_bytes
Definition: interface.h:299
u16 dot1q_vlans
Definition: ethernet.h:149
#define pool_elt_at_index(p, i)
Definition: pool.h:346
vnet_sub_interface_t sub
Definition: interface.h:404
vlib_main_t * vlib_main
Definition: vnet.h:78
#define pool_put(P, E)
Definition: pool.h:200
u16 dot1ad_vlans
Definition: ethernet.h:150
#define vlib_get_next_frame(vm, node, next_index, vectors, n_vectors_left)
Definition: node_funcs.h:265
always_inline void * vlib_frame_args(vlib_frame_t *f)
Definition: node_funcs.h:209
vnet_hw_interface_class_t ethernet_hw_interface_class
uword unformat_ethernet_interface(unformat_input_t *input, va_list *args)
Definition: interface.c:136
static clib_error_t * create_simulated_ethernet_interfaces(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: interface.c:412
u8 * format_ethernet_header_with_length(u8 *s, va_list *args)
Definition: format.c:70
VNET_HW_INTERFACE_CLASS(ethernet_hw_interface_class)
u16 n_vectors
Definition: node.h:307
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:298
#define clib_memcpy(a, b, c)
Definition: string.h:63
always_inline vnet_hw_interface_t * vnet_get_sup_hw_interface(vnet_main_t *vnm, u32 sw_if_index)
#define VNET_SIMULATED_ETHERNET_TX_NEXT_ETHERNET_INPUT
#define pool_is_free_index(P, I)
Definition: pool.h:197
int vnet_create_loopback_interface(u32 *sw_if_indexp, u8 *mac_address)
Definition: interface.c:349
always_inline vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
always_inline vnet_sw_interface_t * vnet_get_sup_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:150
static u8 * format_simulated_ethernet_name(u8 *s, va_list *args)
Definition: interface.c:326
void ethernet_delete_interface(vnet_main_t *vnm, u32 hw_if_index)
Definition: interface.c:205
static uword simulated_ethernet_interface_tx(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
Definition: interface.c:261
#define VNET_SW_INTERFACE_FLAG_ADMIN_UP
Definition: interface.h:373
u32 max_l3_packet_bytes[VLIB_N_RX_TX]
Definition: interface.h:313
uword unformat_ethernet_address(unformat_input_t *input, va_list *args)
Definition: format.c:187
#define pool_put_index(p, i)
Definition: pool.h:214
vlan_table_t * vlan_pool
Definition: ethernet.h:213
#define ASSERT(truth)
unsigned int u32
Definition: types.h:88
#define vnet_buffer(b)
Definition: buffer.h:300
clib_error_t * ethernet_register_interface(vnet_main_t *vnm, u32 dev_class_index, u32 dev_instance, u8 *address, u32 *hw_if_index_return, ethernet_flag_change_function_t flag_change)
Definition: interface.c:157
u8 * format(u8 *s, char *fmt,...)
Definition: format.c:405
u32( ethernet_flag_change_function_t)(vnet_main_t *vnm, struct vnet_hw_interface_t *hi, u32 flags)
Definition: ethernet.h:72
vlan_intf_t vlans[ETHERNET_N_VLAN]
Definition: ethernet.h:160
void vnet_delete_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
Definition: interface.c:736
u64 uword
Definition: types.h:112
#define vec_elt(v, i)
Get vector value at index i.
Definition: defs.h:46
unsigned char u8
Definition: types.h:56
static void vnet_update_l2_len(vlib_buffer_t *b)
Definition: l2_input.h:226
vlib_node_main_t node_main
Definition: main.h:115
always_inline vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
struct vnet_sub_interface_t::@91::@92::@94 flags
vnet_sw_interface_t * sw_interfaces
Definition: interface.h:449
u32 ethernet_set_flags(vnet_main_t *vnm, u32 hw_if_index, u32 flags)
Definition: interface.c:243
Definition: lisp_types.h:24
u32 min_supported_packet_bytes
Definition: interface.h:296
qinq_table_t * qinq_pool
Definition: ethernet.h:216
#define ETHERNET_MAX_PACKET_BYTES
Definition: ethernet.h:75
ethernet_interface_t * ethernet_get_interface(ethernet_main_t *em, u32 hw_if_index)
Definition: interface.c:451
u32 per_packet_overhead_bytes
Definition: interface.h:310
#define clib_error_return(e, args...)
Definition: error.h:112
VNET_DEVICE_CLASS(ethernet_simulated_device_class)
struct _unformat_input_t unformat_input_t
uword vlib_node_add_named_next_with_slot(vlib_main_t *vm, uword node, char *name, uword slot)
Definition: node.c:219
u32 flags
Definition: vhost-user.h:73
Definition: lisp_types.h:25
ethernet_interface_t * interfaces
Definition: ethernet.h:201
#define ETHERNET_MIN_PACKET_BYTES
Definition: ethernet.h:74
always_inline vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
Definition: buffer_funcs.h:69
Definition: defs.h:45
uword unformat_ethernet_header(unformat_input_t *input, va_list *args)
Definition: format.c:238
always_inline vnet_sw_interface_t * vnet_get_hw_sw_interface(vnet_main_t *vnm, u32 hw_if_index)