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 21 #define TYPE_VIRTIO_NET "virtio-net-device" 22 #define VIRTIO_NET(obj) \ 23 OBJECT_CHECK(VirtIONet, (obj), TYPE_VIRTIO_NET) 24 25 #define TX_TIMER_INTERVAL 150000 /* 150 us */ 26 27 /* Limit the number of packets that can be sent via a single flush 28 * of the TX queue. This gives us a guaranteed exit condition and 29 * ensures fairness in the io path. 256 conveniently matches the 30 * length of the TX queue and shows a good balance of performance 31 * and latency. */ 32 #define TX_BURST 256 33 34 typedef struct virtio_net_conf 35 { 36 uint32_t txtimer; 37 int32_t txburst; 38 char *tx; 39 uint16_t rx_queue_size; 40 uint16_t tx_queue_size; 41 uint16_t mtu; 42 int32_t speed; 43 char *duplex_str; 44 uint8_t duplex; 45 } virtio_net_conf; 46 47 /* Coalesced packets type & status */ 48 typedef enum { 49 RSC_COALESCE, /* Data been coalesced */ 50 RSC_FINAL, /* Will terminate current connection */ 51 RSC_NO_MATCH, /* No matched in the buffer pool */ 52 RSC_BYPASS, /* Packet to be bypass, not tcp, tcp ctrl, etc */ 53 RSC_CANDIDATE /* Data want to be coalesced */ 54 } CoalesceStatus; 55 56 typedef struct VirtioNetRscStat { 57 uint32_t received; 58 uint32_t coalesced; 59 uint32_t over_size; 60 uint32_t cache; 61 uint32_t empty_cache; 62 uint32_t no_match_cache; 63 uint32_t win_update; 64 uint32_t no_match; 65 uint32_t tcp_syn; 66 uint32_t tcp_ctrl_drain; 67 uint32_t dup_ack; 68 uint32_t dup_ack1; 69 uint32_t dup_ack2; 70 uint32_t pure_ack; 71 uint32_t ack_out_of_win; 72 uint32_t data_out_of_win; 73 uint32_t data_out_of_order; 74 uint32_t data_after_pure_ack; 75 uint32_t bypass_not_tcp; 76 uint32_t tcp_option; 77 uint32_t tcp_all_opt; 78 uint32_t ip_frag; 79 uint32_t ip_ecn; 80 uint32_t ip_hacked; 81 uint32_t ip_option; 82 uint32_t purge_failed; 83 uint32_t drain_failed; 84 uint32_t final_failed; 85 int64_t timer; 86 } VirtioNetRscStat; 87 88 /* Rsc unit general info used to checking if can coalescing */ 89 typedef struct VirtioNetRscUnit { 90 void *ip; /* ip header */ 91 uint16_t *ip_plen; /* data len pointer in ip header field */ 92 struct tcp_header *tcp; /* tcp header */ 93 uint16_t tcp_hdrlen; /* tcp header len */ 94 uint16_t payload; /* pure payload without virtio/eth/ip/tcp */ 95 } VirtioNetRscUnit; 96 97 /* Coalesced segmant */ 98 typedef struct VirtioNetRscSeg { 99 QTAILQ_ENTRY(VirtioNetRscSeg) next; 100 void *buf; 101 size_t size; 102 uint16_t packets; 103 uint16_t dup_ack; 104 bool is_coalesced; /* need recal ipv4 header checksum, mark here */ 105 VirtioNetRscUnit unit; 106 NetClientState *nc; 107 } VirtioNetRscSeg; 108 109 struct VirtIONet; 110 typedef struct VirtIONet VirtIONet; 111 112 /* Chain is divided by protocol(ipv4/v6) and NetClientInfo */ 113 typedef 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 127 typedef 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 139 typedef struct 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 QEMUTimer *announce_timer; 186 int announce_counter; 187 bool needs_vnet_hdr_swap; 188 bool mtu_bypass_backend; 189 } VirtIONet; 190 191 void virtio_net_set_netclient_name(VirtIONet *n, const char *name, 192 const char *type); 193 194 #endif 195