18 #include <sys/types.h> 22 #include <linux/if_tun.h> 23 #include <sys/ioctl.h> 24 #include <linux/virtio_net.h> 25 #include <linux/vhost.h> 26 #include <sys/eventfd.h> 39 #define _IOCTL(fd,a,...) \ 40 if (ioctl (fd, a, __VA_ARGS__) < 0) \ 42 err = clib_error_return_unix (0, "ioctl(" #a ")"); \ 95 i =
sizeof (
struct vring_desc) * sz;
100 i =
sizeof (
struct vring_avail) + sz *
sizeof (vring->
avail->ring[0]);
107 i =
sizeof (
struct vring_used) + sz *
sizeof (
struct vring_used_elem);
122 vring->
call_fd = eventfd (0, EFD_NONBLOCK | EFD_CLOEXEC);
123 vring->
kick_fd = eventfd (0, EFD_NONBLOCK | EFD_CLOEXEC);
188 struct vring_used_elem *e = &vring->
used->ring[last & mask];
236 [thread_index]->numa_node);
252 u32 i, j, hw_if_index;
262 struct feat_struct *feat_entry;
264 static struct feat_struct feat_array[] = {
265 #define _(s,b) { .str = #s, .bit = b, }, 271 struct feat_struct *flag_entry;
272 static struct feat_struct flags_array[] = {
273 #define _(b,e,s) { .bit = b, .str = s, }, 282 for (hw_if_index = 0; hw_if_index <
vec_len (hw_if_indices); hw_if_index++)
287 if (vif->
type != type)
292 if (type == VIRTIO_IF_TYPE_PCI)
297 if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_TUN))
307 if (type == VIRTIO_IF_TYPE_TAP)
322 if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_PCI))
327 flag_entry = (
struct feat_struct *) &flags_array;
328 while (flag_entry->str)
330 if (vif->
flags & (1ULL << flag_entry->bit))
335 if (type == VIRTIO_IF_TYPE_PCI)
340 feat_entry = (
struct feat_struct *) &feat_array;
341 while (feat_entry->str)
343 if (vif->
features & (1ULL << feat_entry->bit))
349 feat_entry = (
struct feat_struct *) &feat_array;
350 while (feat_entry->str)
367 " qsz %d, last_used_idx %d, desc_next %d, desc_in_use %d",
371 " avail.flags 0x%x avail.idx %d used.flags 0x%x used.idx %d",
373 vring->
used->flags, vring->
used->idx);
374 if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_TUN))
383 " id addr len flags next user_addr\n");
385 " ===== ================== ===== ====== ===== ==================\n");
386 for (j = 0; j < vring->
size; j++)
388 struct vring_desc *desc = &vring->
desc[j];
390 " %-5d 0x%016lx %-5d 0x%04x %-5d 0x%016lx\n",
393 desc->flags, desc->next, desc->addr);
402 " qsz %d, last_used_idx %d, desc_next %d, desc_in_use %d",
406 " avail.flags 0x%x avail.idx %d used.flags 0x%x used.idx %d",
408 vring->
used->flags, vring->
used->idx);
409 if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_TUN))
418 " id addr len flags next user_addr\n");
420 " ===== ================== ===== ====== ===== ==================\n");
421 for (j = 0; j < vring->
size; j++)
423 struct vring_desc *desc = &vring->
desc[j];
425 " %-5d 0x%016lx %-5d 0x%04x %-5d 0x%016lx\n",
428 desc->flags, desc->next, desc->addr);
438 " qsz %d, last_used_idx %d, desc_next %d, desc_in_use %d",
442 " avail.flags 0x%x avail.idx %d used.flags 0x%x used.idx %d",
444 vring->
used->flags, vring->
used->idx);
445 if (type & (VIRTIO_IF_TYPE_TAP | VIRTIO_IF_TYPE_TUN))
454 " id addr len flags next user_addr\n");
456 " ===== ================== ===== ====== ===== ==================\n");
457 for (j = 0; j < vring->
size; j++)
459 struct vring_desc *desc = &vring->
desc[j];
461 " %-5d 0x%016lx %-5d 0x%04x %-5d 0x%016lx\n",
464 desc->flags, desc->next, desc->addr);
vlib_log_class_t vlib_log_register_class(char *class, char *subclass)
#define vec_foreach_index(var, v)
Iterate over vector indices.
format_function_t format_vnet_hw_if_index_name
void virtio_set_net_hdr_size(virtio_if_t *vif)
void virtio_show(vlib_main_t *vm, u32 *hw_if_indices, u8 show_descr, u32 type)
static void vlib_buffer_free(vlib_main_t *vm, u32 *buffers, u32 n_buffers)
Free buffers Frees the entire buffer chain for each buffer.
vnet_main_t * vnet_get_main(void)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
#define foreach_virtio_net_features
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
static heap_elt_t * last(heap_header_t *h)
void virtio_vring_set_numa_node(vlib_main_t *vm, virtio_if_t *vif, u32 idx)
#define vec_validate_aligned(V, I, A)
Make sure vector is long enough for given index (no header, specified alignment)
vlib_main_t ** vlib_mains
clib_error_t * virtio_vring_free_tx(vlib_main_t *vm, virtio_if_t *vif, u32 idx)
clib_file_function_t * read_function
static void clib_spinlock_free(clib_spinlock_t *p)
struct vring_avail * avail
u8 * format_ethernet_address(u8 *s, va_list *args)
static clib_error_t * virtio_init(vlib_main_t *vm)
#define TX_QUEUE_ACCESS(X)
#define VLIB_INIT_FUNCTION(x)
void device_status(vlib_main_t *vm, virtio_if_t *vif)
static_always_inline void vnet_device_input_set_interrupt_pending(vnet_main_t *vnm, u32 hw_if_index, u16 queue_id)
void virtio_free_rx_buffers(vlib_main_t *vm, virtio_vring_t *vring)
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
#define clib_error_return(e, args...)
clib_file_main_t file_main
#define vlib_log_debug(...)
static void clib_spinlock_init(clib_spinlock_t *p)
vl_api_fib_path_type_t type
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
static_always_inline uword vnet_get_device_input_thread_index(vnet_main_t *vnm, u32 hw_if_index, u16 queue_id)
#define virtio_log_debug(vif, f,...)
virtio_vring_t * rxq_vrings
format_function_t format_virtio_device_name
#define VIRTIO_RING_FLAG_MASK_INT
sll srl srl sll sra u16x4 i
#define vec_free(V)
Free vector's memory (no header).
vlib_log_class_t log_default
static uword round_pow2(uword x, uword pow2)
void virtio_free_used_desc(vlib_main_t *vm, virtio_vring_t *vring)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static uword clib_file_add(clib_file_main_t *um, clib_file_t *template)
static void clib_file_del_by_index(clib_file_main_t *um, uword index)
#define VIRTIO_FEATURE(X)
clib_error_t * virtio_vring_init(vlib_main_t *vm, virtio_if_t *vif, u16 idx, u16 sz)
static void clib_mem_free(void *p)
virtio_main_t virtio_main
static uword is_pow2(uword x)
#define RX_QUEUE_ACCESS(X)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static void * clib_mem_alloc_aligned(uword size, uword align)
virtio_vring_t * cxq_vring
clib_error_t * virtio_vring_free_rx(vlib_main_t *vm, virtio_if_t *vif, u32 idx)
static vlib_thread_main_t * vlib_get_thread_main()
#define CLIB_CACHE_LINE_BYTES
static u8 vlib_buffer_pool_get_default_for_numa(vlib_main_t *vm, u32 numa_node)
format_function_t format_vlib_pci_addr
virtio_vring_t * txq_vrings
static clib_error_t * call_read_ready(clib_file_t *uf)
static_always_inline void clib_memset_u32(void *p, u32 val, uword count)