qemu/include/hw/virtio/virtio-net.h
<<
>>
Prefs
   1/*
   2 * Virtio Network Device
   3 *
   4 * Copyright IBM, Corp. 2007
   5 *
   6 * Authors:
   7 *  Anthony Liguori   <aliguori@us.ibm.com>
   8 *
   9 * This work is licensed under the terms of the GNU GPL, version 2.  See
  10 * the COPYING file in the top-level directory.
  11 *
  12 */
  13
  14#ifndef QEMU_VIRTIO_NET_H
  15#define QEMU_VIRTIO_NET_H
  16
  17#include "qemu/units.h"
  18#include "standard-headers/linux/virtio_net.h"
  19#include "hw/virtio/virtio.h"
  20#include "net/announce.h"
  21
  22#define TYPE_VIRTIO_NET "virtio-net-device"
  23#define VIRTIO_NET(obj) \
  24        OBJECT_CHECK(VirtIONet, (obj), TYPE_VIRTIO_NET)
  25
  26#define TX_TIMER_INTERVAL 150000 /* 150 us */
  27
  28/* Limit the number of packets that can be sent via a single flush
  29 * of the TX queue.  This gives us a guaranteed exit condition and
  30 * ensures fairness in the io path.  256 conveniently matches the
  31 * length of the TX queue and shows a good balance of performance
  32 * and latency. */
  33#define TX_BURST 256
  34
  35typedef struct virtio_net_conf
  36{
  37    uint32_t txtimer;
  38    int32_t txburst;
  39    char *tx;
  40    uint16_t rx_queue_size;
  41    uint16_t tx_queue_size;
  42    uint16_t mtu;
  43    int32_t speed;
  44    char *duplex_str;
  45    uint8_t duplex;
  46} virtio_net_conf;
  47
  48/* Coalesced packets type & status */
  49typedef enum {
  50    RSC_COALESCE,           /* Data been coalesced */
  51    RSC_FINAL,              /* Will terminate current connection */
  52    RSC_NO_MATCH,           /* No matched in the buffer pool */
  53    RSC_BYPASS,             /* Packet to be bypass, not tcp, tcp ctrl, etc */
  54    RSC_CANDIDATE                /* Data want to be coalesced */
  55} CoalesceStatus;
  56
  57typedef struct VirtioNetRscStat {
  58    uint32_t received;
  59    uint32_t coalesced;
  60    uint32_t over_size;
  61    uint32_t cache;
  62    uint32_t empty_cache;
  63    uint32_t no_match_cache;
  64    uint32_t win_update;
  65    uint32_t no_match;
  66    uint32_t tcp_syn;
  67    uint32_t tcp_ctrl_drain;
  68    uint32_t dup_ack;
  69    uint32_t dup_ack1;
  70    uint32_t dup_ack2;
  71    uint32_t pure_ack;
  72    uint32_t ack_out_of_win;
  73    uint32_t data_out_of_win;
  74    uint32_t data_out_of_order;
  75    uint32_t data_after_pure_ack;
  76    uint32_t bypass_not_tcp;
  77    uint32_t tcp_option;
  78    uint32_t tcp_all_opt;
  79    uint32_t ip_frag;
  80    uint32_t ip_ecn;
  81    uint32_t ip_hacked;
  82    uint32_t ip_option;
  83    uint32_t purge_failed;
  84    uint32_t drain_failed;
  85    uint32_t final_failed;
  86    int64_t  timer;
  87} VirtioNetRscStat;
  88
  89/* Rsc unit general info used to checking if can coalescing */
  90typedef struct VirtioNetRscUnit {
  91    void *ip;   /* ip header */
  92    uint16_t *ip_plen;      /* data len pointer in ip header field */
  93    struct tcp_header *tcp; /* tcp header */
  94    uint16_t tcp_hdrlen;    /* tcp header len */
  95    uint16_t payload;       /* pure payload without virtio/eth/ip/tcp */
  96} VirtioNetRscUnit;
  97
  98/* Coalesced segment */
  99typedef struct VirtioNetRscSeg {
 100    QTAILQ_ENTRY(VirtioNetRscSeg) next;
 101    void *buf;
 102    size_t size;
 103    uint16_t packets;
 104    uint16_t dup_ack;
 105    bool is_coalesced;      /* need recal ipv4 header checksum, mark here */
 106    VirtioNetRscUnit unit;
 107    NetClientState *nc;
 108} VirtioNetRscSeg;
 109
 110typedef struct VirtIONet VirtIONet;
 111
 112/* Chain is divided by protocol(ipv4/v6) and NetClientInfo */
 113typedef struct VirtioNetRscChain {
 114    QTAILQ_ENTRY(VirtioNetRscChain) next;
 115    VirtIONet *n;                            /* VirtIONet */
 116    uint16_t proto;
 117    uint8_t  gso_type;
 118    uint16_t max_payload;
 119    QEMUTimer *drain_timer;
 120    QTAILQ_HEAD(, VirtioNetRscSeg) buffers;
 121    VirtioNetRscStat stat;
 122} VirtioNetRscChain;
 123
 124/* Maximum packet size we can receive from tap device: header + 64k */
 125#define VIRTIO_NET_MAX_BUFSIZE (sizeof(struct virtio_net_hdr) + (64 * KiB))
 126
 127typedef struct VirtIONetQueue {
 128    VirtQueue *rx_vq;
 129    VirtQueue *tx_vq;
 130    QEMUTimer *tx_timer;
 131    QEMUBH *tx_bh;
 132    uint32_t tx_waiting;
 133    struct {
 134        VirtQueueElement *elem;
 135    } async_tx;
 136    struct VirtIONet *n;
 137} VirtIONetQueue;
 138
 139struct VirtIONet {
 140    VirtIODevice parent_obj;
 141    uint8_t mac[ETH_ALEN];
 142    uint16_t status;
 143    VirtIONetQueue *vqs;
 144    VirtQueue *ctrl_vq;
 145    NICState *nic;
 146    /* RSC Chains - temporary storage of coalesced data,
 147       all these data are lost in case of migration */
 148    QTAILQ_HEAD(, VirtioNetRscChain) rsc_chains;
 149    uint32_t tx_timeout;
 150    int32_t tx_burst;
 151    uint32_t has_vnet_hdr;
 152    size_t host_hdr_len;
 153    size_t guest_hdr_len;
 154    uint64_t host_features;
 155    uint32_t rsc_timeout;
 156    uint8_t rsc4_enabled;
 157    uint8_t rsc6_enabled;
 158    uint8_t has_ufo;
 159    uint32_t mergeable_rx_bufs;
 160    uint8_t promisc;
 161    uint8_t allmulti;
 162    uint8_t alluni;
 163    uint8_t nomulti;
 164    uint8_t nouni;
 165    uint8_t nobcast;
 166    uint8_t vhost_started;
 167    struct {
 168        uint32_t in_use;
 169        uint32_t first_multi;
 170        uint8_t multi_overflow;
 171        uint8_t uni_overflow;
 172        uint8_t *macs;
 173    } mac_table;
 174    uint32_t *vlans;
 175    virtio_net_conf net_conf;
 176    NICConf nic_conf;
 177    DeviceState *qdev;
 178    int multiqueue;
 179    uint16_t max_queues;
 180    uint16_t curr_queues;
 181    size_t config_size;
 182    char *netclient_name;
 183    char *netclient_type;
 184    uint64_t curr_guest_offloads;
 185    AnnounceTimer announce_timer;
 186    bool needs_vnet_hdr_swap;
 187    bool mtu_bypass_backend;
 188};
 189
 190void virtio_net_set_netclient_name(VirtIONet *n, const char *name,
 191                                   const char *type);
 192
 193#endif
 194