#define VIRTIO_RING_FLAG_MASK_INT 1
+#define VIRTIO_EVENT_START_TIMER 1
+#define VIRTIO_EVENT_STOP_TIMER 2
+
typedef struct
{
CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
vring_avail_t *avail;
u16 desc_in_use;
u16 desc_next;
- int kick_fd;
- int call_fd;
+ union
+ {
+ struct
+ {
+ int kick_fd;
+ int call_fd;
+ };
+ u16 queue_notify_offset;
+ };
u8 buffer_pool_index;
u16 size;
u16 queue_id;
u16 last_used_idx;
u16 last_kick_avail_idx;
u32 call_file_index;
+ vnet_hw_if_rx_mode mode;
virtio_vring_buffering_t *buffering;
gro_flow_table_t *flow_table;
} virtio_vring_t;
typedef struct
{
+ u32 interrupt_queues_count;
/* logging */
vlib_log_class_t log_default;
extern virtio_main_t virtio_main;
extern vnet_device_class_t virtio_device_class;
extern vlib_node_registration_t virtio_input_node;
+extern vlib_node_registration_t virtio_send_interrupt_node;
clib_error_t *virtio_vring_init (vlib_main_t * vm, virtio_if_t * vif, u16 idx,
u16 sz);
extern void virtio_set_packet_coalesce (virtio_if_t * vif);
clib_error_t *virtio_set_packet_buffering (virtio_if_t * vif, u16 size);
extern void virtio_pci_legacy_notify_queue (vlib_main_t * vm,
- virtio_if_t * vif, u16 queue_id);
+ virtio_if_t * vif, u16 queue_id,
+ u16 queue_notify_offset);
extern void virtio_pci_modern_notify_queue (vlib_main_t * vm,
- virtio_if_t * vif, u16 queue_id);
+ virtio_if_t * vif, u16 queue_id,
+ u16 queue_notify_offset);
format_function_t format_virtio_device_name;
format_function_t format_virtio_log_name;
if (vif->type == VIRTIO_IF_TYPE_PCI)
{
if (vif->is_modern)
- virtio_pci_modern_notify_queue (vm, vif, vring->queue_id);
+ virtio_pci_modern_notify_queue (vm, vif, vring->queue_id,
+ vring->queue_notify_offset);
else
- virtio_pci_legacy_notify_queue (vm, vif, vring->queue_id);
+ virtio_pci_legacy_notify_queue (vm, vif, vring->queue_id,
+ vring->queue_notify_offset);
}
else
{