struct virtnet_info {
   struct virtio_device *vdev;
   struct virtqueue *cvq;
   struct net_device *dev;
   struct send_queue *sq;
   struct receive_queue *rq;
   unsigned int status;

   /* Max # of queue pairs supported by the device */
   u16 max_queue_pairs;

   /* # of queue pairs currently used by the driver */
   u16 curr_queue_pairs;

   /* # of XDP queue pairs currently used by the driver */
   u16 xdp_queue_pairs;

   /* I like... big packets and I cannot lie! */
   bool big_packets;

   /* Host will merge rx buffers for big packets (shake it! shake it!) */
   bool mergeable_rx_bufs;

   /* Has control virtqueue */
   bool has_cvq;

   /* Host can handle any s/g split between our header and packet data */
   bool any_header_sg;

   /* Packet virtio header size */
   u8 hdr_len;

   /* Work struct for refilling if we run low on memory. */
   struct delayed_work refill;

   /* Work struct for config space updates */
   struct work_struct config_work;

   /* Does the affinity hint is set for virtqueues? */
   bool affinity_hint_set;

   /* CPU hotplug instances for online & dead */
   struct hlist_node node;
   struct hlist_node node_dead;

   struct control_buf *ctrl;

   /* Ethtool settings */
   u8 duplex;
   u32 speed;

   unsigned long guest_offloads;
   unsigned long guest_offloads_capable;

   /* failover when STANDBY feature enabled */
   struct failover *failover;
};


/* From drivers/net/vritio_net.c */
/* https://github.com/torvalds/linux/blob/master/drivers/net/virtio_net.c */