FD.io VPP  v21.06
Vector Packet Processing
af_packet.c
Go to the documentation of this file.
1 /*
2  *------------------------------------------------------------------
3  * af_packet.c - linux kernel packet interface
4  *
5  * Copyright (c) 2016 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 <linux/if_ether.h>
21 #include <linux/if_packet.h>
22 #include <sys/ioctl.h>
23 #include <net/if.h>
24 #include <dirent.h>
25 #include <sys/stat.h>
26 #include <sys/types.h>
27 #include <fcntl.h>
28 
29 #include <vppinfra/linux/sysfs.h>
30 #include <vlib/vlib.h>
31 #include <vlib/unix/unix.h>
32 #include <vnet/ip/ip.h>
33 #include <vnet/devices/netlink.h>
34 #include <vnet/ethernet/ethernet.h>
36 
38 
40 
41 #define AF_PACKET_TX_FRAMES_PER_BLOCK 1024
42 #define AF_PACKET_TX_FRAME_SIZE (2048 * 5)
43 #define AF_PACKET_TX_BLOCK_NR 1
44 #define AF_PACKET_TX_FRAME_NR (AF_PACKET_TX_BLOCK_NR * \
45  AF_PACKET_TX_FRAMES_PER_BLOCK)
46 #define AF_PACKET_TX_BLOCK_SIZE (AF_PACKET_TX_FRAME_SIZE * \
47  AF_PACKET_TX_FRAMES_PER_BLOCK)
48 
49 #define AF_PACKET_RX_FRAMES_PER_BLOCK 1024
50 #define AF_PACKET_RX_FRAME_SIZE (2048 * 5)
51 #define AF_PACKET_RX_BLOCK_NR 1
52 #define AF_PACKET_RX_FRAME_NR (AF_PACKET_RX_BLOCK_NR * \
53  AF_PACKET_RX_FRAMES_PER_BLOCK)
54 #define AF_PACKET_RX_BLOCK_SIZE (AF_PACKET_RX_FRAME_SIZE * \
55  AF_PACKET_RX_FRAMES_PER_BLOCK)
56 
57 /*defined in net/if.h but clashes with dpdk headers */
58 unsigned int if_nametoindex (const char *ifname);
59 
60 typedef struct tpacket_req tpacket_req_t;
61 
62 static u32
64  u32 flags)
65 {
68  af_packet_if_t *apif =
70 
71  if (flags == ETHERNET_INTERFACE_FLAG_MTU)
72  {
73  error =
75 
76  if (error)
77  {
78  vlib_log_err (apm->log_class, "netlink failed to change MTU: %U",
79  format_clib_error, error);
80  clib_error_free (error);
81  return VNET_API_ERROR_SYSCALL_ERROR_1;
82  }
83  else
84  apif->host_mtu = hi->max_packet_bytes;
85  }
86 
87  return 0;
88 }
89 
90 static int
92 {
95  error = vnet_netlink_get_link_mtu (apif->host_if_index, &apif->host_mtu);
96  if (error)
97  {
98  vlib_log_err (apm->log_class, "netlink failed to get MTU: %U",
99  format_clib_error, error);
100  clib_error_free (error);
101  return VNET_API_ERROR_SYSCALL_ERROR_1;
102  }
103  return 0;
104 }
105 
106 static clib_error_t *
108 {
110  vnet_main_t *vnm = vnet_get_main ();
111  u32 idx = uf->private_data;
112  af_packet_if_t *apif = pool_elt_at_index (apm->interfaces, idx);
113 
114  apm->pending_input_bitmap =
115  clib_bitmap_set (apm->pending_input_bitmap, idx, 1);
116 
117  /* Schedule the rx node */
119  return 0;
120 }
121 
122 static int
123 is_bridge (const u8 * host_if_name)
124 {
125  u8 *s;
126  DIR *dir = NULL;
127 
128  s = format (0, "/sys/class/net/%s/bridge%c", host_if_name, 0);
129  dir = opendir ((char *) s);
130  vec_free (s);
131 
132  if (dir)
133  {
134  closedir (dir);
135  return 0;
136  }
137 
138  return -1;
139 }
140 
141 static int
142 create_packet_v2_sock (int host_if_index, tpacket_req_t * rx_req,
143  tpacket_req_t * tx_req, int *fd, u8 ** ring)
144 {
146  int ret;
147  struct sockaddr_ll sll;
148  int ver = TPACKET_V2;
149  socklen_t req_sz = sizeof (struct tpacket_req);
150  u32 ring_sz = rx_req->tp_block_size * rx_req->tp_block_nr +
151  tx_req->tp_block_size * tx_req->tp_block_nr;
152 
153  if ((*fd = socket (AF_PACKET, SOCK_RAW, htons (ETH_P_ALL))) < 0)
154  {
156  "Failed to create AF_PACKET socket: %s (errno %d)",
157  strerror (errno), errno);
158  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
159  goto error;
160  }
161 
162  /* bind before rx ring is cfged so we don't receive packets from other interfaces */
163  clib_memset (&sll, 0, sizeof (sll));
164  sll.sll_family = PF_PACKET;
165  sll.sll_protocol = htons (ETH_P_ALL);
166  sll.sll_ifindex = host_if_index;
167  if (bind (*fd, (struct sockaddr *) &sll, sizeof (sll)) < 0)
168  {
170  "Failed to bind rx packet socket: %s (errno %d)",
171  strerror (errno), errno);
172  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
173  goto error;
174  }
175 
176  if (setsockopt (*fd, SOL_PACKET, PACKET_VERSION, &ver, sizeof (ver)) < 0)
177  {
179  "Failed to set rx packet interface version: %s (errno %d)",
180  strerror (errno), errno);
181  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
182  goto error;
183  }
184 
185  int opt = 1;
186  if (setsockopt (*fd, SOL_PACKET, PACKET_LOSS, &opt, sizeof (opt)) < 0)
187  {
189  "Failed to set packet tx ring error handling option: %s (errno %d)",
190  strerror (errno), errno);
191  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
192  goto error;
193  }
194 
195  if (setsockopt (*fd, SOL_PACKET, PACKET_RX_RING, rx_req, req_sz) < 0)
196  {
198  "Failed to set packet rx ring options: %s (errno %d)",
199  strerror (errno), errno);
200  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
201  goto error;
202  }
203 
204  if (setsockopt (*fd, SOL_PACKET, PACKET_TX_RING, tx_req, req_sz) < 0)
205  {
207  "Failed to set packet tx ring options: %s (errno %d)",
208  strerror (errno), errno);
209  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
210  goto error;
211  }
212 
213  *ring =
214  mmap (NULL, ring_sz, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, *fd,
215  0);
216  if (*ring == MAP_FAILED)
217  {
218  vlib_log_debug (apm->log_class, "mmap failure: %s (errno %d)",
219  strerror (errno), errno);
220  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
221  goto error;
222  }
223 
224  return 0;
225 error:
226  if (*fd >= 0)
227  {
228  close (*fd);
229  *fd = -1;
230  }
231  return ret;
232 }
233 
234 int
235 af_packet_create_if (vlib_main_t * vm, u8 * host_if_name, u8 * hw_addr_set,
236  u32 * sw_if_index)
237 {
239  int ret, fd = -1, fd2 = -1;
240  struct tpacket_req *rx_req = 0;
241  struct tpacket_req *tx_req = 0;
242  struct ifreq ifr;
243  u8 *ring = 0;
244  af_packet_if_t *apif = 0;
245  u8 hw_addr[6];
250  vnet_main_t *vnm = vnet_get_main ();
251  uword *p;
252  uword if_index;
253  u8 *host_if_name_dup = 0;
254  int host_if_index = -1;
255 
256  p = mhash_get (&apm->if_index_by_host_if_name, host_if_name);
257  if (p)
258  {
259  apif = vec_elt_at_index (apm->interfaces, p[0]);
260  *sw_if_index = apif->sw_if_index;
261  return VNET_API_ERROR_IF_ALREADY_EXISTS;
262  }
263 
264  host_if_name_dup = vec_dup (host_if_name);
265 
266  vec_validate (rx_req, 0);
267  rx_req->tp_block_size = AF_PACKET_RX_BLOCK_SIZE;
268  rx_req->tp_frame_size = AF_PACKET_RX_FRAME_SIZE;
269  rx_req->tp_block_nr = AF_PACKET_RX_BLOCK_NR;
270  rx_req->tp_frame_nr = AF_PACKET_RX_FRAME_NR;
271 
272  vec_validate (tx_req, 0);
273  tx_req->tp_block_size = AF_PACKET_TX_BLOCK_SIZE;
274  tx_req->tp_frame_size = AF_PACKET_TX_FRAME_SIZE;
275  tx_req->tp_block_nr = AF_PACKET_TX_BLOCK_NR;
276  tx_req->tp_frame_nr = AF_PACKET_TX_FRAME_NR;
277 
278  /*
279  * make sure host side of interface is 'UP' before binding AF_PACKET
280  * socket on it.
281  */
282  if ((fd2 = socket (AF_UNIX, SOCK_DGRAM, 0)) < 0)
283  {
285  "Failed to create AF_UNIX socket: %s (errno %d)",
286  strerror (errno), errno);
287  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
288  goto error;
289  }
290 
291  clib_memcpy (ifr.ifr_name, (const char *) host_if_name,
292  vec_len (host_if_name));
293  if (ioctl (fd2, SIOCGIFINDEX, &ifr) < 0)
294  {
296  "Failed to retrieve the interface (%s) index: %s (errno %d)",
297  host_if_name, strerror (errno), errno);
298  ret = VNET_API_ERROR_INVALID_INTERFACE;
299  goto error;
300  }
301 
302  host_if_index = ifr.ifr_ifindex;
303  if (ioctl (fd2, SIOCGIFFLAGS, &ifr) < 0)
304  {
306  "Failed to get the active flag: %s (errno %d)",
307  strerror (errno), errno);
308  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
309  goto error;
310  }
311 
312  if (!(ifr.ifr_flags & IFF_UP))
313  {
314  ifr.ifr_flags |= IFF_UP;
315  if (ioctl (fd2, SIOCSIFFLAGS, &ifr) < 0)
316  {
318  "Failed to set the active flag: %s (errno %d)",
319  strerror (errno), errno);
320  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
321  goto error;
322  }
323  }
324 
325  if (fd2 > -1)
326  {
327  close (fd2);
328  fd2 = -1;
329  }
330 
331  ret = create_packet_v2_sock (host_if_index, rx_req, tx_req, &fd, &ring);
332 
333  if (ret != 0)
334  goto error;
335 
336  ret = is_bridge (host_if_name);
337 
338  if (ret == 0) /* is a bridge, ignore state */
339  host_if_index = -1;
340 
341  /* So far everything looks good, let's create interface */
342  pool_get (apm->interfaces, apif);
343  if_index = apif - apm->interfaces;
344 
345  apif->host_if_index = host_if_index;
346  apif->fd = fd;
347  apif->rx_ring = ring;
348  apif->tx_ring = ring + rx_req->tp_block_size * rx_req->tp_block_nr;
349  apif->rx_req = rx_req;
350  apif->tx_req = tx_req;
351  apif->host_if_name = host_if_name_dup;
352  apif->per_interface_next_index = ~0;
353  apif->next_tx_frame = 0;
354  apif->next_rx_frame = 0;
355 
356  ret = af_packet_read_mtu (apif);
357  if (ret != 0)
358  goto error;
359 
360  if (tm->n_vlib_mains > 1)
361  clib_spinlock_init (&apif->lockp);
362 
363  /*use configured or generate random MAC address */
364  if (hw_addr_set)
365  clib_memcpy (hw_addr, hw_addr_set, 6);
366  else
367  {
368  f64 now = vlib_time_now (vm);
369  u32 rnd;
370  rnd = (u32) (now * 1e6);
371  rnd = random_u32 (&rnd);
372 
373  clib_memcpy (hw_addr + 2, &rnd, sizeof (rnd));
374  hw_addr[0] = 2;
375  hw_addr[1] = 0xfe;
376  }
377 
379  if_index, hw_addr, &apif->hw_if_index,
381 
382  if (error)
383  {
384  clib_memset (apif, 0, sizeof (*apif));
385  pool_put (apm->interfaces, apif);
386  vlib_log_err (apm->log_class, "Unable to register interface: %U",
387  format_clib_error, error);
388  clib_error_free (error);
389  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
390  goto error;
391  }
392 
393  sw = vnet_get_hw_sw_interface (vnm, apif->hw_if_index);
394  hw = vnet_get_hw_interface (vnm, apif->hw_if_index);
395  apif->sw_if_index = sw->sw_if_index;
397  af_packet_input_node.index);
400 
404 
408  {
409  clib_file_t template = { 0 };
411  template.file_descriptor = fd;
412  template.private_data = if_index;
414  template.description =
415  format (0, "%U", format_af_packet_device_name, if_index);
416  apif->clib_file_index = clib_file_add (&file_main, &template);
417  }
419  apif->clib_file_index);
420 
421  mhash_set_mem (&apm->if_index_by_host_if_name, host_if_name_dup, &if_index,
422  0);
423  if (sw_if_index)
424  *sw_if_index = apif->sw_if_index;
425 
426  return 0;
427 
428 error:
429  if (fd2 > -1)
430  {
431  close (fd2);
432  fd2 = -1;
433  }
434  vec_free (host_if_name_dup);
435  vec_free (rx_req);
436  vec_free (tx_req);
437  return ret;
438 }
439 
440 int
442 {
443  vnet_main_t *vnm = vnet_get_main ();
445  af_packet_if_t *apif;
446  uword *p;
447  uword if_index;
448  u32 ring_sz;
449 
450  p = mhash_get (&apm->if_index_by_host_if_name, host_if_name);
451  if (p == NULL)
452  {
453  vlib_log_warn (apm->log_class, "Host interface %s does not exist",
454  host_if_name);
455  return VNET_API_ERROR_SYSCALL_ERROR_1;
456  }
457  apif = pool_elt_at_index (apm->interfaces, p[0]);
458  if_index = apif - apm->interfaces;
459 
460  /* bring down the interface */
462 
463  /* clean up */
464  if (apif->clib_file_index != ~0)
465  {
467  apif->clib_file_index = ~0;
468  }
469  else
470  close (apif->fd);
471 
472  ring_sz = apif->rx_req->tp_block_size * apif->rx_req->tp_block_nr +
473  apif->tx_req->tp_block_size * apif->tx_req->tp_block_nr;
474  if (munmap (apif->rx_ring, ring_sz))
475  vlib_log_warn (apm->log_class,
476  "Host interface %s could not free rx/tx ring",
477  host_if_name);
478  apif->rx_ring = NULL;
479  apif->tx_ring = NULL;
480  apif->fd = -1;
481 
482  vec_free (apif->rx_req);
483  apif->rx_req = NULL;
484  vec_free (apif->tx_req);
485  apif->tx_req = NULL;
486 
487  vec_free (apif->host_if_name);
488  apif->host_if_name = NULL;
489  apif->host_if_index = -1;
490 
491  mhash_unset (&apm->if_index_by_host_if_name, host_if_name, &if_index);
492 
494 
495  pool_put (apm->interfaces, apif);
496 
497  return 0;
498 }
499 
500 int
502 {
503  vnet_main_t *vnm = vnet_get_main ();
505 
506  hw = vnet_get_sup_hw_interface (vnm, sw_if_index);
507 
508  if (hw->dev_class_index != af_packet_device_class.index)
509  return VNET_API_ERROR_INVALID_INTERFACE;
510 
511  if (set)
512  {
515  }
516  else
517  {
520  }
521  return 0;
522 }
523 
524 int
526 {
528  af_packet_if_t *apif;
529  af_packet_if_detail_t *r_af_packet_ifs = NULL;
530  af_packet_if_detail_t *af_packet_if = NULL;
531 
532  /* *INDENT-OFF* */
533  pool_foreach (apif, apm->interfaces)
534  {
535  vec_add2 (r_af_packet_ifs, af_packet_if, 1);
536  af_packet_if->sw_if_index = apif->sw_if_index;
537  if (apif->host_if_name)
538  {
539  clib_memcpy (af_packet_if->host_if_name, apif->host_if_name,
540  MIN (ARRAY_LEN (af_packet_if->host_if_name) - 1,
541  strlen ((const char *) apif->host_if_name)));
542  }
543  }
544  /* *INDENT-ON* */
545 
546  *out_af_packet_ifs = r_af_packet_ifs;
547 
548  return 0;
549 }
550 
551 static clib_error_t *
553 {
556 
557  clib_memset (apm, 0, sizeof (af_packet_main_t));
558 
560 
563 
564  apm->log_class = vlib_log_register_class ("af_packet", 0);
565  vlib_log_debug (apm->log_class, "initialized");
566 
567  return 0;
568 }
569 
571 
572 /*
573  * fd.io coding-style-patch-verification: ON
574  *
575  * Local Variables:
576  * eval: (c-set-style "gnu")
577  * End:
578  */
vlib_log_class_t vlib_log_register_class(char *class, char *subclass)
Definition: log.c:339
u32 ** rx_buffers
Definition: af_packet.h:63
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:524
#define UNIX_FILE_EVENT_EDGE_TRIGGERED
Definition: file.h:58
static void clib_file_del(clib_file_main_t *um, clib_file_t *f)
Definition: file.h:109
vl_api_wireguard_peer_flags_t flags
Definition: wireguard.api:105
uword * pending_input_bitmap
Definition: af_packet.h:60
void ethernet_delete_interface(vnet_main_t *vnm, u32 hw_if_index)
Definition: interface.c:393
int af_packet_set_l4_cksum_offload(vlib_main_t *vm, u32 sw_if_index, u8 set)
Definition: af_packet.c:501
static vnet_hw_interface_t * vnet_get_sup_hw_interface(vnet_main_t *vnm, u32 sw_if_index)
#define pool_foreach(VAR, POOL)
Iterate through pool.
Definition: pool.h:534
#define AF_PACKET_TX_BLOCK_NR
Definition: af_packet.c:43
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
static f64 vlib_time_now(vlib_main_t *vm)
Definition: main.h:325
vnet_hw_interface_capabilities_t caps
Definition: interface.h:645
u64 private_data
Definition: file.h:64
struct tpacket_req * tx_req
Definition: af_packet.h:38
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
int af_packet_dump_ifs(af_packet_if_detail_t **out_af_packet_ifs)
Definition: af_packet.c:525
#define AF_PACKET_RX_FRAME_NR
Definition: af_packet.c:52
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
Definition: vec.h:645
static void mhash_init_vec_string(mhash_t *h, uword n_value_bytes)
Definition: mhash.h:84
static uword * clib_bitmap_set(uword *ai, uword i, uword value)
Sets the ith bit of a bitmap to new_value Removes trailing zeros from the bitmap. ...
Definition: bitmap.h:167
static_always_inline void vnet_hw_if_rx_queue_set_int_pending(vnet_main_t *vnm, u32 queue_index)
struct tpacket_req * rx_req
Definition: af_packet.h:37
#define vec_validate_aligned(V, I, A)
Make sure vector is long enough for given index (no header, specified alignment)
Definition: vec.h:535
clib_error_t * vnet_hw_interface_set_flags(vnet_main_t *vnm, u32 hw_if_index, vnet_hw_interface_flags_t flags)
Definition: interface.c:513
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
Definition: pool.h:255
unsigned char u8
Definition: types.h:56
clib_file_function_t * read_function
Definition: file.h:67
double f64
Definition: types.h:142
static vnet_sw_interface_t * vnet_get_hw_sw_interface(vnet_main_t *vnm, u32 hw_if_index)
unsigned int u32
Definition: types.h:88
#define clib_memcpy(d, s, n)
Definition: string.h:197
u8 * host_if_name
Definition: af_packet.h:34
clib_file_t * file_pool
Definition: file.h:88
af_packet_if_t * interfaces
Definition: af_packet.h:57
uword flags
Definition: clib_error.h:29
#define AF_PACKET_TX_BLOCK_SIZE
Definition: af_packet.c:46
clib_spinlock_t lockp
Definition: af_packet.h:33
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:172
u32 next_rx_frame
Definition: af_packet.h:45
description fragment has unexpected format
Definition: map.api:433
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
vnet_main_t * vnet_get_main(void)
clib_file_main_t file_main
Definition: main.c:63
#define MIN(x, y)
Definition: node.h:31
static void clib_spinlock_init(clib_spinlock_t *p)
Definition: lock.h:65
Definition: cJSON.c:88
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:553
u32 vnet_hw_if_register_rx_queue(vnet_main_t *vnm, u32 hw_if_index, u32 queue_id, u32 thread_index)
Definition: rx_queue.c:64
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34
format_function_t format_af_packet_device_name
Definition: af_packet.h:83
#define pool_put(P, E)
Free an object E in pool P.
Definition: pool.h:305
#define vec_dup(V)
Return copy of vector (no header, no alignment)
Definition: vec.h:444
#define AF_PACKET_RX_BLOCK_NR
Definition: af_packet.c:51
#define vlib_log_debug(...)
Definition: log.h:137
vlib_log_class_t log_class
log class
Definition: af_packet.h:69
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
void vnet_hw_if_update_runtime_data(vnet_main_t *vnm, u32 hw_if_index)
Definition: runtime.c:58
#define vlib_log_err(...)
Definition: log.h:133
int vnet_hw_if_set_rx_queue_mode(vnet_main_t *vnm, u32 queue_index, vnet_hw_if_rx_mode mode)
Definition: rx_queue.c:167
struct tpacket_req tpacket_req_t
Definition: af_packet.c:60
u32 next_tx_frame
Definition: af_packet.h:46
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:395
#define AF_PACKET_RX_BLOCK_SIZE
Definition: af_packet.c:54
#define ETHERNET_INTERFACE_FLAG_MTU
Definition: ethernet.h:166
u32 per_interface_next_index
Definition: af_packet.h:48
#define ARRAY_LEN(x)
Definition: clib.h:70
vlib_node_registration_t af_packet_input_node
(constructor) VLIB_REGISTER_NODE (af_packet_input_node)
Definition: node.c:391
static int af_packet_read_mtu(af_packet_if_t *apif)
Definition: af_packet.c:91
int host_if_index
Definition: af_packet.h:35
u32 clib_file_index
Definition: af_packet.h:43
af_packet_main_t af_packet_main
Definition: af_packet.c:39
static uword * mhash_get(mhash_t *h, const void *key)
Definition: mhash.h:110
static uword clib_file_add(clib_file_main_t *um, clib_file_t *template)
Definition: file.h:96
mhash_t if_index_by_host_if_name
Definition: af_packet.h:66
unsigned int if_nametoindex(const char *ifname)
vl_api_ip4_address_t hi
Definition: arp.api:37
vnet_device_class_t af_packet_device_class
static clib_error_t * af_packet_fd_read_ready(clib_file_t *uf)
Definition: af_packet.c:107
__clib_export uword mhash_unset(mhash_t *h, void *key, uword *old_value)
Definition: mhash.c:346
void vnet_hw_if_set_input_node(vnet_main_t *vnm, u32 hw_if_index, u32 node_index)
Definition: rx_queue.c:157
#define AF_PACKET_TX_FRAME_SIZE
Definition: af_packet.c:42
static int create_packet_v2_sock(int host_if_index, tpacket_req_t *rx_req, tpacket_req_t *tx_req, int *fd, u8 **ring)
Definition: af_packet.c:142
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
clib_error_t * ethernet_register_interface(vnet_main_t *vnm, u32 dev_class_index, u32 dev_instance, const u8 *address, u32 *hw_if_index_return, ethernet_flag_change_function_t flag_change)
Definition: interface.c:348
u64 uword
Definition: types.h:112
#define AF_PACKET_RX_FRAME_SIZE
Definition: af_packet.c:50
#define clib_error_free(e)
Definition: error.h:86
static u32 random_u32(u32 *seed)
32-bit random number generator
Definition: random.h:69
static vlib_thread_main_t * vlib_get_thread_main()
Definition: global_funcs.h:56
f64 now
static clib_error_t * af_packet_init(vlib_main_t *vm)
Definition: af_packet.c:552
static int is_bridge(const u8 *host_if_name)
Definition: af_packet.c:123
Definition: file.h:51
static u32 af_packet_eth_flag_change(vnet_main_t *vnm, vnet_hw_interface_t *hi, u32 flags)
Definition: af_packet.c:63
int af_packet_create_if(vlib_main_t *vm, u8 *host_if_name, u8 *hw_addr_set, u32 *sw_if_index)
Definition: af_packet.c:235
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:59
#define VNET_HW_IF_RXQ_THREAD_ANY
Definition: interface.h:598
__clib_export u8 * format_clib_error(u8 *s, va_list *va)
Definition: error.c:191
#define vlib_log_warn(...)
Definition: log.h:134
__clib_export uword mhash_set_mem(mhash_t *h, void *key, uword *new_value, uword *old_value)
Definition: mhash.c:264
#define AF_PACKET_TX_FRAME_NR
Definition: af_packet.c:44
void vnet_hw_if_set_rx_queue_file_index(vnet_main_t *vnm, u32 queue_index, u32 file_index)
Definition: rx_queue.c:144
int af_packet_delete_if(vlib_main_t *vm, u8 *host_if_name)
Definition: af_packet.c:441