FD.io VPP  v21.06
Vector Packet Processing
virtio.c
Go to the documentation of this file.
1 /*
2  *------------------------------------------------------------------
3  * Copyright (c) 2017 Cisco and/or its affiliates.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *------------------------------------------------------------------
16  */
17 
18 #include <sys/types.h>
19 #include <sys/stat.h>
20 #include <fcntl.h>
21 #include <net/if.h>
22 #include <linux/if_tun.h>
23 #include <sys/ioctl.h>
24 #include <sys/eventfd.h>
25 
26 #include <vlib/vlib.h>
27 #include <vlib/pci/pci.h>
28 #include <vlib/unix/unix.h>
29 #include <vnet/ethernet/ethernet.h>
30 #include <vnet/ip/ip4_packet.h>
31 #include <vnet/ip/ip6_packet.h>
36 
38 
39 #define _IOCTL(fd,a,...) \
40  if (ioctl (fd, a, __VA_ARGS__) < 0) \
41  { \
42  err = clib_error_return_unix (0, "ioctl(" #a ")"); \
43  goto error; \
44  }
45 
46 static clib_error_t *
48 {
49  vnet_main_t *vnm = vnet_get_main ();
50  u64 b;
51 
52  CLIB_UNUSED (ssize_t size) = read (uf->file_descriptor, &b, sizeof (b));
54 
55  return 0;
56 }
57 
58 
61 {
62  virtio_vring_t *vring;
63  int i;
64 
65  if (!is_pow2 (sz))
66  return clib_error_return (0, "ring size must be power of 2");
67 
68  if (sz > 32768)
69  return clib_error_return (0, "ring size must be 32768 or lower");
70 
71  if (sz == 0)
72  sz = 256;
73 
74  if (idx % 2)
75  {
79  vring = vec_elt_at_index (vif->txq_vrings, TX_QUEUE_ACCESS (idx));
80  if (thm->n_vlib_mains > vif->num_txqs)
81  clib_spinlock_init (&vring->lockp);
82  }
83  else
84  {
87  vring = vec_elt_at_index (vif->rxq_vrings, RX_QUEUE_ACCESS (idx));
88  }
89  i = sizeof (vring_desc_t) * sz;
92  clib_memset (vring->desc, 0, i);
93 
94  i = sizeof (vring_avail_t) + sz * sizeof (vring->avail->ring[0]);
97  clib_memset (vring->avail, 0, i);
98  // tell kernel that we don't need interrupt
100 
101  i = sizeof (vring_used_t) + sz * sizeof (vring_used_elem_t);
104  clib_memset (vring->used, 0, i);
105 
106  vring->queue_id = idx;
107  ASSERT (vring->buffers == 0);
109 
110  if (idx & 1)
111  {
112  clib_memset_u32 (vring->buffers, ~0, sz);
113  // tx path: suppress the interrupts from kernel
114  vring->call_fd = -1;
115  }
116  else
117  vring->call_fd = eventfd (0, EFD_NONBLOCK | EFD_CLOEXEC);
118 
119  vring->size = sz;
120  vring->kick_fd = eventfd (0, EFD_NONBLOCK | EFD_CLOEXEC);
121  virtio_log_debug (vif, "vring %u size %u call_fd %d kick_fd %d", idx,
122  vring->size, vring->call_fd, vring->kick_fd);
123 
124  return 0;
125 }
126 
127 inline void
129 {
130  u16 used = vring->desc_in_use;
131  u16 last = vring->last_used_idx;
132  u16 mask = vring->size - 1;
133 
134  while (used)
135  {
136  vlib_buffer_free (vm, &vring->buffers[last & mask], 1);
137  last++;
138  used--;
139  }
140 }
141 
142 clib_error_t *
144 {
145  virtio_vring_t *vring =
147 
149  close (vring->kick_fd);
150  close (vring->call_fd);
151  if (vring->used)
152  {
153  virtio_free_buffers (vm, vring);
154  clib_mem_free (vring->used);
155  }
156  if (vring->desc)
157  clib_mem_free (vring->desc);
158  if (vring->avail)
159  clib_mem_free (vring->avail);
160  vec_free (vring->buffers);
161  return 0;
162 }
163 
164 clib_error_t *
166 {
167  virtio_vring_t *vring =
169 
170  close (vring->kick_fd);
171  if (vring->used)
172  {
173  virtio_free_buffers (vm, vring);
174  clib_mem_free (vring->used);
175  }
176  if (vring->desc)
177  clib_mem_free (vring->desc);
178  if (vring->avail)
179  clib_mem_free (vring->avail);
180  vec_free (vring->buffers);
183  clib_spinlock_free (&vring->lockp);
184  return 0;
185 }
186 
187 void
189 {
190  vnet_main_t *vnm = vnet_get_main ();
192  virtio_vring_t *vring;
193  vif->packet_coalesce = 1;
194  vec_foreach (vring, vif->txq_vrings)
195  {
197  vif->type & (VIRTIO_IF_TYPE_TAP |
198  VIRTIO_IF_TYPE_PCI), hw->tx_node_index);
199  }
200 }
201 
202 clib_error_t *
204 {
205  vnet_main_t *vnm = vnet_get_main ();
207  virtio_vring_t *vring;
208  clib_error_t *error = 0;
209  vif->packet_buffering = 1;
210 
211  vec_foreach (vring, vif->txq_vrings)
212  {
213  if ((error =
215  buffering_size)))
216  {
217  break;
218  }
219  }
220 
221  return error;
222 }
223 
224 static void
226 {
227  if (vif->is_packed)
228  virtio_refill_vring_packed (vm, vif, vif->type, vring,
229  vif->virtio_net_hdr_sz,
230  virtio_input_node.index);
231  else
232  virtio_refill_vring_split (vm, vif, vif->type, vring,
233  vif->virtio_net_hdr_sz,
234  virtio_input_node.index);
235 }
236 
237 void
239 {
240  vnet_main_t *vnm = vnet_get_main ();
241  virtio_vring_t *vring;
242  u32 i = 0;
243 
245 
246  vec_foreach (vring, vif->rxq_vrings)
247  {
249  vnm, vif->hw_if_index, RX_QUEUE_ACCESS (vring->queue_id),
253  if (vif->type == VIRTIO_IF_TYPE_TAP || vif->type == VIRTIO_IF_TYPE_TUN)
254  {
255 
256  clib_file_t f = {
257  .read_function = call_read_ready,
259  .file_descriptor = vring->call_fd,
260  .private_data = vring->queue_index,
261  .description = format (0, "%U vring %u", format_virtio_device_name,
262  vif->dev_instance, vring->queue_id),
263  };
264 
265  vring->call_file_index = clib_file_add (&file_main, &f);
267  vring->call_file_index);
268  }
269  else if ((vif->type == VIRTIO_IF_TYPE_PCI) && (vif->support_int_mode) &&
271  {
272  u32 file_index;
273  file_index =
276  file_index);
277  i++;
278  }
282  virtio_vring_fill (vm, vif, vring);
283  }
285 }
286 
287 inline void
289 {
290  if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_MRG_RXBUF) ||
291  vif->features & VIRTIO_FEATURE (VIRTIO_F_VERSION_1))
292  vif->virtio_net_hdr_sz = sizeof (virtio_net_hdr_v1_t);
293  else
294  vif->virtio_net_hdr_sz = sizeof (virtio_net_hdr_t);
295 }
296 
297 inline void
298 virtio_show (vlib_main_t * vm, u32 * hw_if_indices, u8 show_descr, u32 type)
299 {
300  u32 i, j, hw_if_index;
301  virtio_if_t *vif;
302  vnet_main_t *vnm = &vnet_main;
303  virtio_main_t *mm = &virtio_main;
304  virtio_vring_t *vring;
305  struct feat_struct
306  {
307  u8 bit;
308  char *str;
309  };
310  struct feat_struct *feat_entry;
311 
312  static struct feat_struct feat_array[] = {
313 #define _(s,b) { .str = #s, .bit = b, },
315 #undef _
316  {.str = NULL}
317  };
318 
319  struct feat_struct *flag_entry;
320  static struct feat_struct flags_array[] = {
321 #define _(b,e,s) { .bit = b, .str = s, },
323 #undef _
324  {.str = NULL}
325  };
326 
327  if (!hw_if_indices)
328  return;
329 
330  for (hw_if_index = 0; hw_if_index < vec_len (hw_if_indices); hw_if_index++)
331  {
333  vnet_get_hw_interface (vnm, hw_if_indices[hw_if_index]);
334  vif = pool_elt_at_index (mm->interfaces, hi->dev_instance);
335  if (vif->type != type)
336  continue;
337  vlib_cli_output (vm, "Interface: %U (ifindex %d)",
339  hw_if_indices[hw_if_index], vif->hw_if_index);
340  if (type == VIRTIO_IF_TYPE_PCI)
341  {
342  vlib_cli_output (vm, " PCI Address: %U", format_vlib_pci_addr,
343  &vif->pci_addr);
344  }
345  if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_TUN))
346  {
347  u8 *str = 0;
348  if (vif->host_if_name)
349  vlib_cli_output (vm, " name \"%s\"", vif->host_if_name);
350  if (vif->net_ns)
351  vlib_cli_output (vm, " host-ns \"%s\"", vif->net_ns);
352  if (vif->host_mtu_size)
353  vlib_cli_output (vm, " host-mtu-size \"%d\"",
354  vif->host_mtu_size);
355  if (type == VIRTIO_IF_TYPE_TAP)
356  vlib_cli_output (vm, " host-mac-addr: %U",
358  vlib_cli_output (vm, " host-carrier-up: %u", vif->host_carrier_up);
359 
360  vec_foreach_index (i, vif->vhost_fds)
361  str = format (str, " %d", vif->vhost_fds[i]);
362  vlib_cli_output (vm, " vhost-fds%v", str);
363  vec_free (str);
364  vec_foreach_index (i, vif->tap_fds)
365  str = format (str, " %d", vif->tap_fds[i]);
366  vlib_cli_output (vm, " tap-fds%v", str);
367  vec_free (str);
368  }
369  vlib_cli_output (vm, " gso-enabled %d", vif->gso_enabled);
370  vlib_cli_output (vm, " csum-enabled %d", vif->csum_offload_enabled);
371  vlib_cli_output (vm, " packet-coalesce %d", vif->packet_coalesce);
372  vlib_cli_output (vm, " packet-buffering %d", vif->packet_buffering);
373  if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_PCI))
374  vlib_cli_output (vm, " Mac Address: %U", format_ethernet_address,
375  vif->mac_addr);
376  vlib_cli_output (vm, " Device instance: %u", vif->dev_instance);
377  vlib_cli_output (vm, " flags 0x%x", vif->flags);
378  flag_entry = (struct feat_struct *) &flags_array;
379  while (flag_entry->str)
380  {
381  if (vif->flags & (1ULL << flag_entry->bit))
382  vlib_cli_output (vm, " %s (%d)", flag_entry->str,
383  flag_entry->bit);
384  flag_entry++;
385  }
386  if (type == VIRTIO_IF_TYPE_PCI)
387  {
388  device_status (vm, vif);
389  }
390  vlib_cli_output (vm, " features 0x%lx", vif->features);
391  feat_entry = (struct feat_struct *) &feat_array;
392  while (feat_entry->str)
393  {
394  if (vif->features & (1ULL << feat_entry->bit))
395  vlib_cli_output (vm, " %s (%d)", feat_entry->str,
396  feat_entry->bit);
397  feat_entry++;
398  }
399  vlib_cli_output (vm, " remote-features 0x%lx", vif->remote_features);
400  feat_entry = (struct feat_struct *) &feat_array;
401  while (feat_entry->str)
402  {
403  if (vif->remote_features & (1ULL << feat_entry->bit))
404  vlib_cli_output (vm, " %s (%d)", feat_entry->str,
405  feat_entry->bit);
406  feat_entry++;
407  }
408  vlib_cli_output (vm, " Number of RX Virtqueue %u", vif->num_rxqs);
409  vlib_cli_output (vm, " Number of TX Virtqueue %u", vif->num_txqs);
410  if (vif->cxq_vring != NULL
411  && vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ))
412  vlib_cli_output (vm, " Number of CTRL Virtqueue 1");
413  vec_foreach_index (i, vif->rxq_vrings)
414  {
415  vring = vec_elt_at_index (vif->rxq_vrings, i);
416  vlib_cli_output (vm, " Virtqueue (RX) %d", vring->queue_id);
417  vlib_cli_output (vm,
418  " qsz %d, last_used_idx %d, desc_next %d, desc_in_use %d",
419  vring->size, vring->last_used_idx, vring->desc_next,
420  vring->desc_in_use);
421  if (vif->is_packed)
422  {
423  vlib_cli_output (vm,
424  " driver_event.flags 0x%x driver_event.off_wrap %d device_event.flags 0x%x device_event.off_wrap %d",
425  vring->driver_event->flags,
426  vring->driver_event->off_wrap,
427  vring->device_event->flags,
428  vring->device_event->off_wrap);
429  vlib_cli_output (vm,
430  " avail wrap counter %d, used wrap counter %d",
431  vring->avail_wrap_counter,
432  vring->used_wrap_counter);
433  }
434  else
435  vlib_cli_output (vm,
436  " avail.flags 0x%x avail.idx %d used.flags 0x%x used.idx %d",
437  vring->avail->flags, vring->avail->idx,
438  vring->used->flags, vring->used->idx);
439  if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_TUN))
440  {
441  vlib_cli_output (vm, " kickfd %d, callfd %d", vring->kick_fd,
442  vring->call_fd);
443  }
444  if (show_descr)
445  {
446  vlib_cli_output (vm, "\n descriptor table:\n");
447  vlib_cli_output (vm,
448  " id addr len flags next/id user_addr\n");
449  vlib_cli_output (vm,
450  " ===== ================== ===== ====== ======= ==================\n");
451  for (j = 0; j < vring->size; j++)
452  {
453  if (vif->is_packed)
454  {
455  vring_packed_desc_t *desc = &vring->packed_desc[j];
456  vlib_cli_output (vm,
457  " %-5d 0x%016lx %-5d 0x%04x %-8d 0x%016lx\n",
458  j, desc->addr,
459  desc->len,
460  desc->flags, desc->id, desc->addr);
461  }
462  else
463  {
464  vring_desc_t *desc = &vring->desc[j];
465  vlib_cli_output (vm,
466  " %-5d 0x%016lx %-5d 0x%04x %-8d 0x%016lx\n",
467  j, desc->addr,
468  desc->len,
469  desc->flags, desc->next, desc->addr);
470  }
471  }
472  }
473  }
474  vec_foreach_index (i, vif->txq_vrings)
475  {
476  vring = vec_elt_at_index (vif->txq_vrings, i);
477  vlib_cli_output (vm, " Virtqueue (TX) %d", vring->queue_id);
478  vlib_cli_output (vm,
479  " qsz %d, last_used_idx %d, desc_next %d, desc_in_use %d",
480  vring->size, vring->last_used_idx, vring->desc_next,
481  vring->desc_in_use);
482  if (vif->is_packed)
483  {
484  vlib_cli_output (vm,
485  " driver_event.flags 0x%x driver_event.off_wrap %d device_event.flags 0x%x device_event.off_wrap %d",
486  vring->driver_event->flags,
487  vring->driver_event->off_wrap,
488  vring->device_event->flags,
489  vring->device_event->off_wrap);
490  vlib_cli_output (vm,
491  " avail wrap counter %d, used wrap counter %d",
492  vring->avail_wrap_counter,
493  vring->used_wrap_counter);
494  }
495  else
496  vlib_cli_output (vm,
497  " avail.flags 0x%x avail.idx %d used.flags 0x%x used.idx %d",
498  vring->avail->flags, vring->avail->idx,
499  vring->used->flags, vring->used->idx);
500  if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_TUN))
501  {
502  vlib_cli_output (vm, " kickfd %d, callfd %d", vring->kick_fd,
503  vring->call_fd);
504  }
505  if (vring->flow_table)
506  {
508  vring->flow_table);
509  }
510  if (vif->packet_buffering)
511  {
513  vring->buffering);
514  }
515  if (show_descr)
516  {
517  vlib_cli_output (vm, "\n descriptor table:\n");
518  vlib_cli_output (vm,
519  " id addr len flags next/id user_addr\n");
520  vlib_cli_output (vm,
521  " ===== ================== ===== ====== ======== ==================\n");
522  for (j = 0; j < vring->size; j++)
523  {
524  if (vif->is_packed)
525  {
526  vring_packed_desc_t *desc = &vring->packed_desc[j];
527  vlib_cli_output (vm,
528  " %-5d 0x%016lx %-5d 0x%04x %-8d 0x%016lx\n",
529  j, desc->addr,
530  desc->len,
531  desc->flags, desc->id, desc->addr);
532  }
533  else
534  {
535  vring_desc_t *desc = &vring->desc[j];
536  vlib_cli_output (vm,
537  " %-5d 0x%016lx %-5d 0x%04x %-8d 0x%016lx\n",
538  j, desc->addr,
539  desc->len,
540  desc->flags, desc->next, desc->addr);
541  }
542  }
543  }
544  }
545  if (vif->cxq_vring != NULL
546  && vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ))
547  {
548  vring = vif->cxq_vring;
549  vlib_cli_output (vm, " Virtqueue (CTRL) %d", vring->queue_id);
550  vlib_cli_output (vm,
551  " qsz %d, last_used_idx %d, desc_next %d, desc_in_use %d",
552  vring->size, vring->last_used_idx,
553  vring->desc_next, vring->desc_in_use);
554  if (vif->is_packed)
555  {
556  vlib_cli_output (vm,
557  " driver_event.flags 0x%x driver_event.off_wrap %d device_event.flags 0x%x device_event.off_wrap %d",
558  vring->driver_event->flags,
559  vring->driver_event->off_wrap,
560  vring->device_event->flags,
561  vring->device_event->off_wrap);
562  vlib_cli_output (vm,
563  " avail wrap counter %d, used wrap counter %d",
564  vring->avail_wrap_counter,
565  vring->used_wrap_counter);
566  }
567  else
568  {
569  vlib_cli_output (vm,
570  " avail.flags 0x%x avail.idx %d used.flags 0x%x used.idx %d",
571  vring->avail->flags, vring->avail->idx,
572  vring->used->flags, vring->used->idx);
573  }
574  if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_TUN))
575  {
576  vlib_cli_output (vm, " kickfd %d, callfd %d", vring->kick_fd,
577  vring->call_fd);
578  }
579  if (show_descr)
580  {
581  vlib_cli_output (vm, "\n descriptor table:\n");
582  vlib_cli_output (vm,
583  " id addr len flags next/id user_addr\n");
584  vlib_cli_output (vm,
585  " ===== ================== ===== ====== ======== ==================\n");
586  for (j = 0; j < vring->size; j++)
587  {
588  if (vif->is_packed)
589  {
590  vring_packed_desc_t *desc = &vring->packed_desc[j];
591  vlib_cli_output (vm,
592  " %-5d 0x%016lx %-5d 0x%04x %-8d 0x%016lx\n",
593  j, desc->addr,
594  desc->len,
595  desc->flags, desc->id, desc->addr);
596  }
597  else
598  {
599  vring_desc_t *desc = &vring->desc[j];
600  vlib_cli_output (vm,
601  " %-5d 0x%016lx %-5d 0x%04x %-8d 0x%016lx\n",
602  j, desc->addr,
603  desc->len,
604  desc->flags, desc->next, desc->addr);
605  }
606  }
607  }
608  }
609 
610  }
611 
612 }
613 
614 static clib_error_t *
616 {
617  virtio_main_t *vim = &virtio_main;
618  clib_error_t *error = 0;
619 
620  vim->log_default = vlib_log_register_class ("virtio", 0);
621  vlib_log_debug (vim->log_default, "initialized");
622 
623  return error;
624 }
625 
627 
628 /*
629  * fd.io coding-style-patch-verification: ON
630  *
631  * Local Variables:
632  * eval: (c-set-style "gnu")
633  * End:
634  */
vlib_log_class_t vlib_log_register_class(char *class, char *subclass)
Definition: log.c:339
gro_flow_table_t * flow_table
Definition: virtio.h:110
vlib_node_registration_t virtio_input_node
(constructor) VLIB_REGISTER_NODE (virtio_input_node)
Definition: node.c:498
#define UNIX_FILE_EVENT_EDGE_TRIGGERED
Definition: file.h:58
#define vec_foreach_index(var, v)
Iterate over vector indices.
vring_desc_event_t * device_event
Definition: virtio.h:79
format_function_t format_vnet_hw_if_index_name
void virtio_set_net_hdr_size(virtio_if_t *vif)
Definition: virtio.c:288
virtio_if_t * interfaces
Definition: virtio.h:220
#define CLIB_UNUSED(x)
Definition: clib.h:90
void virtio_show(vlib_main_t *vm, u32 *hw_if_indices, u8 show_descr, u32 type)
Definition: virtio.c:298
static_always_inline void virtio_refill_vring_split(vlib_main_t *vm, virtio_if_t *vif, virtio_if_type_t type, virtio_vring_t *vring, const int hdr_sz, u32 node_index)
Definition: virtio_inline.h:31
static void vlib_buffer_free(vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Free buffers Frees the entire buffer chain for each buffer.
Definition: buffer_funcs.h:982
u8 host_carrier_up
Definition: virtio.h:190
static_always_inline u8 * gro_flow_table_format(u8 *s, va_list *args)
Definition: gro.h:255
unsigned long u64
Definition: types.h:89
int gso_enabled
Definition: virtio.h:138
u32 host_mtu_size
Definition: virtio.h:184
u32 dev_instance
Definition: virtio.h:158
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
int kick_fd
Definition: virtio.h:94
u64 private_data
Definition: file.h:64
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
u32 file_descriptor
Definition: file.h:54
static heap_elt_t * last(heap_header_t *h)
Definition: heap.c:53
static_always_inline void vnet_hw_if_rx_queue_set_int_pending(vnet_main_t *vnm, u32 queue_index)
#define vec_validate_aligned(V, I, A)
Make sure vector is long enough for given index (no header, specified alignment)
Definition: vec.h:535
int call_fd
Definition: virtio.h:95
unsigned char u8
Definition: types.h:56
vlib_buffer_t ** b
clib_error_t * virtio_vring_free_tx(vlib_main_t *vm, virtio_if_t *vif, u32 idx)
Definition: virtio.c:165
#define VIRTIO_FEATURE(X)
Definition: virtio_std.h:69
vring_desc_t * desc
Definition: virtio.h:71
static void clib_spinlock_free(clib_spinlock_t *p)
Definition: lock.h:72
uword vlib_pci_get_msix_file_index(vlib_main_t *vm, vlib_pci_dev_handle_t h, u16 index)
Definition: pci.c:917
unsigned int u32
Definition: types.h:88
vlib_frame_t * f
u32 msix_enabled
Definition: virtio.h:146
#define VRING_AVAIL_F_NO_INTERRUPT
Definition: virtio_std.h:93
u64 features
Definition: virtio.h:131
uword flags
Definition: clib_error.h:29
u32 hw_if_index
Definition: virtio.h:152
u8 * format_ethernet_address(u8 *s, va_list *args)
Definition: format.c:44
static clib_error_t * virtio_init(vlib_main_t *vm)
Definition: virtio.c:615
#define TX_QUEUE_ACCESS(X)
Definition: virtio.h:39
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:172
u8 support_int_mode
Definition: virtio.h:206
void device_status(vlib_main_t *vm, virtio_if_t *vif)
Definition: pci.c:172
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.
clib_spinlock_t lockp
Definition: virtio.h:66
#define clib_error_return(e, args...)
Definition: error.h:99
vnet_main_t * vnet_get_main(void)
clib_file_main_t file_main
Definition: main.c:63
static_always_inline u8 vnet_hw_if_get_rx_queue_numa_node(vnet_main_t *vnm, u32 queue_index)
u16 queue_id
Definition: virtio.h:84
static void clib_spinlock_init(clib_spinlock_t *p)
Definition: lock.h:65
u16 num_txqs
Definition: virtio.h:135
vl_api_fib_path_type_t type
Definition: fib_types.api:123
Definition: cJSON.c:88
u32 pci_dev_handle
Definition: virtio.h:145
void virtio_vring_set_rx_queues(vlib_main_t *vm, virtio_if_t *vif)
Definition: virtio.c:238
#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
int * vhost_fds
Definition: virtio.h:178
vring_avail_t * avail
Definition: virtio.h:73
vring_desc_event_t * driver_event
Definition: virtio.h:78
unsigned short u16
Definition: types.h:57
vnet_hw_if_rx_mode mode
Definition: virtio.h:108
u32 size
Definition: vhost_user.h:125
pci_addr_t pci_addr
Definition: virtio.h:196
vnet_main_t vnet_main
Definition: misc.c:43
#define vlib_log_debug(...)
Definition: log.h:137
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
u8 buffer_pool_index
Definition: virtio.h:107
#define virtio_log_debug(vif, f,...)
Definition: virtio.h:272
int packet_coalesce
Definition: virtio.h:156
vring_used_t * used
Definition: virtio.h:72
u16 desc_next
Definition: virtio.h:87
u16 virtio_net_hdr_sz
Definition: virtio.h:149
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
u32 queue_index
Definition: virtio.h:85
u16 num_rxqs
Definition: virtio.h:134
virtio_vring_t * rxq_vrings
Definition: virtio.h:136
format_function_t format_virtio_device_name
Definition: virtio.h:247
u16 last_used_idx
Definition: virtio.h:88
void virtio_free_buffers(vlib_main_t *vm, virtio_vring_t *vring)
Definition: virtio.c:128
sll srl srl sll sra u16x4 i
Definition: vector_sse42.h:261
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:395
vl_api_pnat_mask_t mask
Definition: pnat.api:45
static_always_inline void gro_flow_table_free(gro_flow_table_t *flow_table)
Definition: gro.h:171
static_always_inline u32 gro_flow_table_init(gro_flow_table_t **flow_table, u8 is_l2, u32 node_index)
Definition: gro.h:120
u32 call_file_index
Definition: virtio.h:96
u8 * net_ns
Definition: virtio.h:180
u8 mac_addr[6]
Definition: virtio.h:171
u32 flags
Definition: virtio.h:132
vlib_log_class_t log_default
Definition: virtio.h:218
static uword round_pow2(uword x, uword pow2)
Definition: clib.h:279
virtio_if_type_t type
Definition: virtio.h:150
clib_error_t * virtio_set_packet_buffering(virtio_if_t *vif, u16 buffering_size)
Definition: virtio.c:203
vring_packed_desc_t * packed_desc
Definition: virtio.h:77
#define ASSERT(truth)
u16 avail_wrap_counter
Definition: virtio.h:100
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:716
static_always_inline void virtio_refill_vring_packed(vlib_main_t *vm, virtio_if_t *vif, virtio_if_type_t type, virtio_vring_t *vring, const int hdr_sz, u32 node_index)
Definition: virtio_inline.h:96
u64 remote_features
Definition: virtio.h:160
static uword clib_file_add(clib_file_main_t *um, clib_file_t *template)
Definition: file.h:96
static void clib_file_del_by_index(clib_file_main_t *um, uword index)
Definition: file.h:119
clib_error_t * virtio_vring_init(vlib_main_t *vm, virtio_if_t *vif, u16 idx, u16 sz)
Definition: virtio.c:60
u8 host_mac_addr[6]
Definition: virtio.h:182
static void clib_mem_free(void *p)
Definition: mem.h:311
void virtio_set_packet_coalesce(virtio_if_t *vif)
Definition: virtio.c:188
virtio_main_t virtio_main
Definition: virtio.c:37
vl_api_ip4_address_t hi
Definition: arp.api:37
static uword is_pow2(uword x)
Definition: clib.h:267
virtio_vring_buffering_t * buffering
Definition: virtio.h:109
void vnet_hw_if_set_input_node(vnet_main_t *vnm, u32 hw_if_index, u32 node_index)
Definition: rx_queue.c:157
u16 used_wrap_counter
Definition: virtio.h:101
#define RX_QUEUE_ACCESS(X)
Definition: virtio.h:40
int csum_offload_enabled
Definition: virtio.h:139
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
int packet_buffering
Definition: virtio.h:157
u32 * buffers
Definition: virtio.h:82
static_always_inline clib_error_t * virtio_vring_buffering_init(virtio_vring_buffering_t **buffering, u32 node_index, u16 size)
static void * clib_mem_alloc_aligned(uword size, uword align)
Definition: mem.h:261
virtio_vring_t * cxq_vring
Definition: virtio.h:195
clib_error_t * virtio_vring_free_rx(vlib_main_t *vm, virtio_if_t *vif, u32 idx)
Definition: virtio.c:143
static vlib_thread_main_t * vlib_get_thread_main()
Definition: global_funcs.h:56
static_always_inline u8 * virtio_vring_buffering_format(u8 *s, va_list *args)
int is_packed
Definition: virtio.h:211
#define vec_foreach(var, vec)
Vector iterator.
Definition: file.h:51
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:59
static u8 vlib_buffer_pool_get_default_for_numa(vlib_main_t *vm, u32 numa_node)
Definition: buffer_funcs.h:189
#define VNET_HW_IF_RXQ_THREAD_ANY
Definition: interface.h:598
int * tap_fds
Definition: virtio.h:142
static void virtio_vring_fill(vlib_main_t *vm, virtio_if_t *vif, virtio_vring_t *vring)
Definition: virtio.c:225
void vnet_hw_if_set_rx_queue_file_index(vnet_main_t *vnm, u32 queue_index, u32 file_index)
Definition: rx_queue.c:144
format_function_t format_vlib_pci_addr
Definition: pci.h:326
u16 desc_in_use
Definition: virtio.h:86
virtio_vring_t * txq_vrings
Definition: virtio.h:137
static clib_error_t * call_read_ready(clib_file_t *uf)
Definition: virtio.c:47
static_always_inline void virtio_vring_buffering_free(vlib_main_t *vm, virtio_vring_buffering_t *buffering)
u8 * host_if_name
Definition: virtio.h:179
static_always_inline void clib_memset_u32(void *p, u32 val, uword count)
Definition: string.h:349