FD.io VPP  v21.10.1-2-g0a485f517
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 =
69  pool_elt_at_index (apm->interfaces, hi->dev_instance);
70 
72  {
73  error =
74  vnet_netlink_set_link_mtu (apif->host_if_index, hi->max_packet_bytes);
75 
76  if (error)
77  {
78  vlib_log_err (apm->log_class, "netlink failed to change MTU: %U",
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 {
96  if (error)
97  {
98  vlib_log_err (apm->log_class, "netlink failed to get MTU: %U",
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_QDISC_BYPASS, &opt, sizeof (opt)) <
196  0)
197  {
199  "Failed to set qdisc bypass error "
200  "handling option: %s (errno %d)",
201  strerror (errno), errno);
202  }
203 
204  if (setsockopt (*fd, SOL_PACKET, PACKET_RX_RING, rx_req, req_sz) < 0)
205  {
207  "Failed to set packet rx ring options: %s (errno %d)",
208  strerror (errno), errno);
209  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
210  goto error;
211  }
212 
213  if (setsockopt (*fd, SOL_PACKET, PACKET_TX_RING, tx_req, req_sz) < 0)
214  {
216  "Failed to set packet tx ring options: %s (errno %d)",
217  strerror (errno), errno);
218  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
219  goto error;
220  }
221 
222  *ring =
223  mmap (NULL, ring_sz, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, *fd,
224  0);
225  if (*ring == MAP_FAILED)
226  {
227  vlib_log_debug (apm->log_class, "mmap failure: %s (errno %d)",
228  strerror (errno), errno);
229  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
230  goto error;
231  }
232 
233  return 0;
234 error:
235  if (*fd >= 0)
236  {
237  close (*fd);
238  *fd = -1;
239  }
240  return ret;
241 }
242 
243 int
244 af_packet_create_if (vlib_main_t * vm, u8 * host_if_name, u8 * hw_addr_set,
245  u32 * sw_if_index)
246 {
248  int ret, fd = -1, fd2 = -1;
249  struct tpacket_req *rx_req = 0;
250  struct tpacket_req *tx_req = 0;
251  struct ifreq ifr;
252  u8 *ring = 0;
253  af_packet_if_t *apif = 0;
254  u8 hw_addr[6];
259  vnet_main_t *vnm = vnet_get_main ();
260  uword *p;
261  uword if_index;
262  u8 *host_if_name_dup = 0;
263  int host_if_index = -1;
264 
265  p = mhash_get (&apm->if_index_by_host_if_name, host_if_name);
266  if (p)
267  {
268  apif = vec_elt_at_index (apm->interfaces, p[0]);
269  *sw_if_index = apif->sw_if_index;
270  return VNET_API_ERROR_IF_ALREADY_EXISTS;
271  }
272 
273  host_if_name_dup = vec_dup (host_if_name);
274 
275  vec_validate (rx_req, 0);
276  rx_req->tp_block_size = AF_PACKET_RX_BLOCK_SIZE;
277  rx_req->tp_frame_size = AF_PACKET_RX_FRAME_SIZE;
278  rx_req->tp_block_nr = AF_PACKET_RX_BLOCK_NR;
279  rx_req->tp_frame_nr = AF_PACKET_RX_FRAME_NR;
280 
281  vec_validate (tx_req, 0);
282  tx_req->tp_block_size = AF_PACKET_TX_BLOCK_SIZE;
283  tx_req->tp_frame_size = AF_PACKET_TX_FRAME_SIZE;
284  tx_req->tp_block_nr = AF_PACKET_TX_BLOCK_NR;
285  tx_req->tp_frame_nr = AF_PACKET_TX_FRAME_NR;
286 
287  /*
288  * make sure host side of interface is 'UP' before binding AF_PACKET
289  * socket on it.
290  */
291  if ((fd2 = socket (AF_UNIX, SOCK_DGRAM, 0)) < 0)
292  {
294  "Failed to create AF_UNIX socket: %s (errno %d)",
295  strerror (errno), errno);
296  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
297  goto error;
298  }
299 
300  clib_memcpy (ifr.ifr_name, (const char *) host_if_name,
301  vec_len (host_if_name));
302  if (ioctl (fd2, SIOCGIFINDEX, &ifr) < 0)
303  {
305  "Failed to retrieve the interface (%s) index: %s (errno %d)",
306  host_if_name, strerror (errno), errno);
307  ret = VNET_API_ERROR_INVALID_INTERFACE;
308  goto error;
309  }
310 
311  host_if_index = ifr.ifr_ifindex;
312  if (ioctl (fd2, SIOCGIFFLAGS, &ifr) < 0)
313  {
315  "Failed to get the active flag: %s (errno %d)",
316  strerror (errno), errno);
317  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
318  goto error;
319  }
320 
321  if (!(ifr.ifr_flags & IFF_UP))
322  {
323  ifr.ifr_flags |= IFF_UP;
324  if (ioctl (fd2, SIOCSIFFLAGS, &ifr) < 0)
325  {
327  "Failed to set the active flag: %s (errno %d)",
328  strerror (errno), errno);
329  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
330  goto error;
331  }
332  }
333 
334  if (fd2 > -1)
335  {
336  close (fd2);
337  fd2 = -1;
338  }
339 
340  ret = create_packet_v2_sock (host_if_index, rx_req, tx_req, &fd, &ring);
341 
342  if (ret != 0)
343  goto error;
344 
345  ret = is_bridge (host_if_name);
346 
347  if (ret == 0) /* is a bridge, ignore state */
348  host_if_index = -1;
349 
350  /* So far everything looks good, let's create interface */
351  pool_get (apm->interfaces, apif);
352  if_index = apif - apm->interfaces;
353 
354  apif->host_if_index = host_if_index;
355  apif->fd = fd;
356  apif->rx_ring = ring;
357  apif->tx_ring = ring + rx_req->tp_block_size * rx_req->tp_block_nr;
358  apif->rx_req = rx_req;
359  apif->tx_req = tx_req;
360  apif->host_if_name = host_if_name_dup;
361  apif->per_interface_next_index = ~0;
362  apif->next_tx_frame = 0;
363  apif->next_rx_frame = 0;
364 
365  ret = af_packet_read_mtu (apif);
366  if (ret != 0)
367  goto error;
368 
369  if (tm->n_vlib_mains > 1)
370  clib_spinlock_init (&apif->lockp);
371 
372  /*use configured or generate random MAC address */
373  if (hw_addr_set)
374  clib_memcpy (hw_addr, hw_addr_set, 6);
375  else
376  {
377  f64 now = vlib_time_now (vm);
378  u32 rnd;
379  rnd = (u32) (now * 1e6);
380  rnd = random_u32 (&rnd);
381 
382  clib_memcpy (hw_addr + 2, &rnd, sizeof (rnd));
383  hw_addr[0] = 2;
384  hw_addr[1] = 0xfe;
385  }
386 
388  if_index, hw_addr, &apif->hw_if_index,
390 
391  if (error)
392  {
393  clib_memset (apif, 0, sizeof (*apif));
394  pool_put (apm->interfaces, apif);
395  vlib_log_err (apm->log_class, "Unable to register interface: %U",
398  ret = VNET_API_ERROR_SYSCALL_ERROR_1;
399  goto error;
400  }
401 
402  sw = vnet_get_hw_sw_interface (vnm, apif->hw_if_index);
403  hw = vnet_get_hw_interface (vnm, apif->hw_if_index);
404  apif->sw_if_index = sw->sw_if_index;
406  af_packet_input_node.index);
409 
413 
417  {
418  clib_file_t template = { 0 };
420  template.file_descriptor = fd;
421  template.private_data = if_index;
423  template.description =
424  format (0, "%U", format_af_packet_device_name, if_index);
425  apif->clib_file_index = clib_file_add (&file_main, &template);
426  }
428  apif->clib_file_index);
429 
430  mhash_set_mem (&apm->if_index_by_host_if_name, host_if_name_dup, &if_index,
431  0);
432  if (sw_if_index)
433  *sw_if_index = apif->sw_if_index;
434 
435  return 0;
436 
437 error:
438  if (fd2 > -1)
439  {
440  close (fd2);
441  fd2 = -1;
442  }
443  vec_free (host_if_name_dup);
444  vec_free (rx_req);
445  vec_free (tx_req);
446  return ret;
447 }
448 
449 int
451 {
452  vnet_main_t *vnm = vnet_get_main ();
454  af_packet_if_t *apif;
455  uword *p;
456  uword if_index;
457  u32 ring_sz;
458 
459  p = mhash_get (&apm->if_index_by_host_if_name, host_if_name);
460  if (p == NULL)
461  {
462  vlib_log_warn (apm->log_class, "Host interface %s does not exist",
463  host_if_name);
464  return VNET_API_ERROR_SYSCALL_ERROR_1;
465  }
466  apif = pool_elt_at_index (apm->interfaces, p[0]);
467  if_index = apif - apm->interfaces;
468 
469  /* bring down the interface */
471 
472  /* clean up */
473  if (apif->clib_file_index != ~0)
474  {
476  apif->clib_file_index = ~0;
477  }
478  else
479  close (apif->fd);
480 
481  ring_sz = apif->rx_req->tp_block_size * apif->rx_req->tp_block_nr +
482  apif->tx_req->tp_block_size * apif->tx_req->tp_block_nr;
483  if (munmap (apif->rx_ring, ring_sz))
484  vlib_log_warn (apm->log_class,
485  "Host interface %s could not free rx/tx ring",
486  host_if_name);
487  apif->rx_ring = NULL;
488  apif->tx_ring = NULL;
489  apif->fd = -1;
490 
491  vec_free (apif->rx_req);
492  apif->rx_req = NULL;
493  vec_free (apif->tx_req);
494  apif->tx_req = NULL;
495 
496  vec_free (apif->host_if_name);
497  apif->host_if_name = NULL;
498  apif->host_if_index = -1;
499 
500  mhash_unset (&apm->if_index_by_host_if_name, host_if_name, &if_index);
501 
503 
504  pool_put (apm->interfaces, apif);
505 
506  return 0;
507 }
508 
509 int
511 {
512  vnet_main_t *vnm = vnet_get_main ();
514 
516 
517  if (hw->dev_class_index != af_packet_device_class.index)
518  return VNET_API_ERROR_INVALID_INTERFACE;
519 
520  if (set)
521  {
524  }
525  else
526  {
529  }
530  return 0;
531 }
532 
533 int
535 {
537  af_packet_if_t *apif;
538  af_packet_if_detail_t *r_af_packet_ifs = NULL;
539  af_packet_if_detail_t *af_packet_if = NULL;
540 
541  /* *INDENT-OFF* */
542  pool_foreach (apif, apm->interfaces)
543  {
544  vec_add2 (r_af_packet_ifs, af_packet_if, 1);
545  af_packet_if->sw_if_index = apif->sw_if_index;
546  if (apif->host_if_name)
547  {
548  clib_memcpy (af_packet_if->host_if_name, apif->host_if_name,
549  MIN (ARRAY_LEN (af_packet_if->host_if_name) - 1,
550  strlen ((const char *) apif->host_if_name)));
551  }
552  }
553  /* *INDENT-ON* */
554 
555  *out_af_packet_ifs = r_af_packet_ifs;
556 
557  return 0;
558 }
559 
560 static clib_error_t *
562 {
565 
566  clib_memset (apm, 0, sizeof (af_packet_main_t));
567 
569 
572 
573  apm->log_class = vlib_log_register_class ("af_packet", 0);
574  vlib_log_debug (apm->log_class, "initialized");
575 
576  return 0;
577 }
578 
580 
581 /*
582  * fd.io coding-style-patch-verification: ON
583  *
584  * Local Variables:
585  * eval: (c-set-style "gnu")
586  * End:
587  */
vlib.h
clib_spinlock_init
static void clib_spinlock_init(clib_spinlock_t *p)
Definition: lock.h:65
VNET_HW_IF_RXQ_THREAD_ANY
#define VNET_HW_IF_RXQ_THREAD_ANY
Definition: interface.h:598
AF_PACKET_TX_FRAME_NR
#define AF_PACKET_TX_FRAME_NR
Definition: af_packet.c:44
file_main
clib_file_main_t file_main
Definition: main.c:63
AF_PACKET_RX_BLOCK_NR
#define AF_PACKET_RX_BLOCK_NR
Definition: af_packet.c:51
af_packet_if_t::tx_req
struct tpacket_req * tx_req
Definition: af_packet.h:38
af_packet_input_node
vlib_node_registration_t af_packet_input_node
(constructor) VLIB_REGISTER_NODE (af_packet_input_node)
Definition: node.c:391
vnet_sw_interface_t
Definition: interface.h:869
af_packet_if_t::host_if_name
u8 * host_if_name
Definition: af_packet.h:34
vnet_hw_interface_t::caps
vnet_hw_interface_capabilities_t caps
Definition: interface.h:645
af_packet_main
af_packet_main_t af_packet_main
Definition: af_packet.c:39
clib_memcpy
#define clib_memcpy(d, s, n)
Definition: string.h:197
af_packet_if_t
Definition: af_packet.h:30
vnet_hw_if_set_rx_queue_mode
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
pool_elt_at_index
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:549
af_packet_if_t::hw_if_index
u32 hw_if_index
Definition: af_packet.h:41
af_packet_if_detail_t::host_if_name
u8 host_if_name[64]
Definition: af_packet.h:27
vlib_log_register_class
vlib_log_class_t vlib_log_register_class(char *class, char *subclass)
Definition: log.c:339
clib_file::read_function
clib_file_function_t * read_function
Definition: file.h:67
vlib_log_warn
#define vlib_log_warn(...)
Definition: log.h:134
if_nametoindex
unsigned int if_nametoindex(const char *ifname)
clib_file::private_data
u64 private_data
Definition: file.h:64
is_bridge
static int is_bridge(const u8 *host_if_name)
Definition: af_packet.c:123
pool_put
#define pool_put(P, E)
Free an object E in pool P.
Definition: pool.h:305
mhash_get
static uword * mhash_get(mhash_t *h, const void *key)
Definition: mhash.h:110
af_packet_create_if
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:244
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
VNET_HW_INTERFACE_FLAG_LINK_UP
@ VNET_HW_INTERFACE_FLAG_LINK_UP
Definition: interface.h:509
af_packet_if_t::host_if_index
int host_if_index
Definition: af_packet.h:35
af_packet_if_t::clib_file_index
u32 clib_file_index
Definition: af_packet.h:43
hi
vl_api_ip4_address_t hi
Definition: arp.api:37
AF_PACKET_TX_BLOCK_SIZE
#define AF_PACKET_TX_BLOCK_SIZE
Definition: af_packet.c:46
af_packet_if_t::tx_ring
u8 * tx_ring
Definition: af_packet.h:40
af_packet_main_t
Definition: af_packet.h:54
af_packet_device_class
vnet_device_class_t af_packet_device_class
ethernet.h
error
Definition: cJSON.c:88
sysfs.h
vlib_log_err
#define vlib_log_err(...)
Definition: log.h:133
format_clib_error
__clib_export u8 * format_clib_error(u8 *s, va_list *va)
Definition: error.c:191
af_packet_main_t::rx_buffers
u32 ** rx_buffers
Definition: af_packet.h:63
random_u32
static u32 random_u32(u32 *seed)
32-bit random number generator
Definition: random.h:69
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM
@ VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM
Definition: interface.h:524
set
description can t DF set
Definition: map.api:451
vnet_sw_interface_t::sw_if_index
u32 sw_if_index
Definition: interface.h:876
af_packet_main_t::pending_input_bitmap
uword * pending_input_bitmap
Definition: af_packet.h:60
vlib_thread_main_t::n_vlib_mains
u32 n_vlib_mains
Definition: threads.h:262
pool_foreach
#define pool_foreach(VAR, POOL)
Iterate through pool.
Definition: pool.h:534
tpacket_req_t
struct tpacket_req tpacket_req_t
Definition: af_packet.c:60
vec_len
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
Definition: vec_bootstrap.h:142
UNIX_FILE_EVENT_EDGE_TRIGGERED
#define UNIX_FILE_EVENT_EDGE_TRIGGERED
Definition: file.h:58
af_packet_if_t::next_rx_frame
u32 next_rx_frame
Definition: af_packet.h:45
af_packet_if_t::rx_req
struct tpacket_req * rx_req
Definition: af_packet.h:37
vec_add2
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
Definition: vec.h:644
af_packet_delete_if
int af_packet_delete_if(vlib_main_t *vm, u8 *host_if_name)
Definition: af_packet.c:450
vec_dup
#define vec_dup(V)
Return copy of vector (no header, no alignment)
Definition: vec.h:444
vec_elt_at_index
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
Definition: vec_bootstrap.h:203
vnet_get_hw_interface
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
Definition: interface_funcs.h:44
vnet_get_main
vnet_main_t * vnet_get_main(void)
Definition: pnat_test_stubs.h:56
clib_file
Definition: file.h:51
AF_PACKET_TX_FRAME_SIZE
#define AF_PACKET_TX_FRAME_SIZE
Definition: af_packet.c:42
AF_PACKET_RX_FRAME_NR
#define AF_PACKET_RX_FRAME_NR
Definition: af_packet.c:52
MIN
#define MIN(x, y)
Definition: node.h:31
ARRAY_LEN
#define ARRAY_LEN(x)
Definition: clib.h:70
rx_queue_funcs.h
vec_validate_aligned
#define vec_validate_aligned(V, I, A)
Make sure vector is long enough for given index (no header, specified alignment)
Definition: vec.h:534
af_packet_main_t::log_class
vlib_log_class_t log_class
log class
Definition: af_packet.h:69
af_packet_main_t::interfaces
af_packet_if_t * interfaces
Definition: af_packet.h:57
mhash_init_vec_string
static void mhash_init_vec_string(mhash_t *h, uword n_value_bytes)
Definition: mhash.h:84
uword
u64 uword
Definition: types.h:112
vnet_hw_interface_t::dev_class_index
u32 dev_class_index
Definition: interface.h:659
vnet_hw_if_update_runtime_data
void vnet_hw_if_update_runtime_data(vnet_main_t *vnm, u32 hw_if_index)
Definition: runtime.c:58
VNET_HW_IF_RX_MODE_INTERRUPT
@ VNET_HW_IF_RX_MODE_INTERRUPT
Definition: interface.h:57
f64
double f64
Definition: types.h:142
ETHERNET_INTERFACE_FLAG_MTU
#define ETHERNET_INTERFACE_FLAG_MTU
Definition: ethernet.h:165
pool_get
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
Definition: pool.h:255
vlib_log_debug
#define vlib_log_debug(...)
Definition: log.h:137
vec_validate
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment)
Definition: vec.h:523
vnet_hw_if_rx_queue_set_int_pending
static_always_inline void vnet_hw_if_rx_queue_set_int_pending(vnet_main_t *vnm, u32 queue_index)
Definition: rx_queue_funcs.h:52
af_packet_fd_read_ready
static clib_error_t * af_packet_fd_read_ready(clib_file_t *uf)
Definition: af_packet.c:107
clib_file_main_t::file_pool
clib_file_t * file_pool
Definition: file.h:88
clib_bitmap_set
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
af_packet_set_l4_cksum_offload
int af_packet_set_l4_cksum_offload(vlib_main_t *vm, u32 sw_if_index, u8 set)
Definition: af_packet.c:510
CLIB_CACHE_LINE_BYTES
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:58
af_packet_eth_flag_change
static u32 af_packet_eth_flag_change(vnet_main_t *vnm, vnet_hw_interface_t *hi, u32 flags)
Definition: af_packet.c:63
vnet_hw_if_set_rx_queue_file_index
void vnet_hw_if_set_rx_queue_file_index(vnet_main_t *vnm, u32 queue_index, u32 file_index)
Definition: rx_queue.c:144
AF_PACKET_TX_BLOCK_NR
#define AF_PACKET_TX_BLOCK_NR
Definition: af_packet.c:43
format_af_packet_device_name
format_function_t format_af_packet_device_name
Definition: af_packet.h:83
af_packet_dump_ifs
int af_packet_dump_ifs(af_packet_if_detail_t **out_af_packet_ifs)
Definition: af_packet.c:534
vnet_hw_interface_t
Definition: interface.h:638
vnet_main_t
Definition: vnet.h:76
vec_free
#define vec_free(V)
Free vector's memory (no header).
Definition: vec.h:395
af_packet_if_t::fd
int fd
Definition: af_packet.h:36
format
description fragment has unexpected format
Definition: map.api:433
clib_file_del
static void clib_file_del(clib_file_main_t *um, clib_file_t *f)
Definition: file.h:109
af_packet_if_t::host_mtu
u32 host_mtu
Definition: af_packet.h:51
vnet_get_hw_sw_interface
static vnet_sw_interface_t * vnet_get_hw_sw_interface(vnet_main_t *vnm, u32 hw_if_index)
Definition: interface_funcs.h:72
ip.h
u32
unsigned int u32
Definition: types.h:88
af_packet_if_detail_t
Definition: af_packet.h:24
VLIB_INIT_FUNCTION
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:172
vnet_get_sup_hw_interface
static vnet_hw_interface_t * vnet_get_sup_hw_interface(vnet_main_t *vnm, u32 sw_if_index)
Definition: interface_funcs.h:92
ethernet_delete_interface
void ethernet_delete_interface(vnet_main_t *vnm, u32 hw_if_index)
Definition: interface.c:393
vlib_thread_main_t
Definition: threads.h:243
AF_PACKET_RX_BLOCK_SIZE
#define AF_PACKET_RX_BLOCK_SIZE
Definition: af_packet.c:54
af_packet.h
clib_file_add
static uword clib_file_add(clib_file_main_t *um, clib_file_t *template)
Definition: file.h:96
af_packet_read_mtu
static int af_packet_read_mtu(af_packet_if_t *apif)
Definition: af_packet.c:91
now
f64 now
Definition: nat44_ei_out2in.c:710
af_packet_if_t::sw_if_index
u32 sw_if_index
Definition: af_packet.h:42
clib_memset
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
vlib_main_t
Definition: main.h:102
vnet_hw_if_register_rx_queue
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
u8
unsigned char u8
Definition: types.h:56
clib_error_t
Definition: clib_error.h:21
vnet_hw_interface_set_flags
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
unix.h
vlib_init_function_t
clib_error_t *() vlib_init_function_t(struct vlib_main_t *vm)
Definition: init.h:51
af_packet_if_t::queue_index
u32 queue_index
Definition: af_packet.h:50
af_packet_if_t::next_tx_frame
u32 next_tx_frame
Definition: af_packet.h:46
VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM
@ VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM
Definition: interface.h:525
af_packet_if_t::rx_ring
u8 * rx_ring
Definition: af_packet.h:39
VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE
@ VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE
Definition: interface.h:550
clib_error_free
#define clib_error_free(e)
Definition: error.h:86
clib_error_t::flags
uword flags
Definition: clib_error.h:29
vlib_time_now
static f64 vlib_time_now(vlib_main_t *vm)
Definition: main.h:327
vlib_get_thread_main
static vlib_thread_main_t * vlib_get_thread_main()
Definition: global_funcs.h:56
AF_PACKET_RX_FRAME_SIZE
#define AF_PACKET_RX_FRAME_SIZE
Definition: af_packet.c:50
sw_if_index
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34
mhash_set_mem
__clib_export uword mhash_set_mem(mhash_t *h, void *key, uword *new_value, uword *old_value)
Definition: mhash.c:264
mhash_unset
__clib_export uword mhash_unset(mhash_t *h, void *key, uword *old_value)
Definition: mhash.c:346
af_packet_if_t::per_interface_next_index
u32 per_interface_next_index
Definition: af_packet.h:48
ethernet_register_interface
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
vnet_hw_if_set_input_node
void vnet_hw_if_set_input_node(vnet_main_t *vnm, u32 hw_if_index, u32 node_index)
Definition: rx_queue.c:157
af_packet_init
static clib_error_t * af_packet_init(vlib_main_t *vm)
Definition: af_packet.c:561
af_packet_main_t::if_index_by_host_if_name
mhash_t if_index_by_host_if_name
Definition: af_packet.h:66
create_packet_v2_sock
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
af_packet_if_t::lockp
clib_spinlock_t lockp
Definition: af_packet.h:33
af_packet_if_detail_t::sw_if_index
u32 sw_if_index
Definition: af_packet.h:26
flags
vl_api_wireguard_peer_flags_t flags
Definition: wireguard.api:105