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 | |
35 | typedef 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 */ |
49 | typedef 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 | |
57 | typedef 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 */ |
90 | typedef struct VirtioNetRscUnit { |
91 | void *ip; /* ip header */ |
92 | uint16_t *ip_plen; /* data len pointer in ip header field */ |
93 | struct *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 */ |
99 | typedef 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 | |
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 | 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 | AnnounceTimer announce_timer; |
186 | bool needs_vnet_hdr_swap; |
187 | bool mtu_bypass_backend; |
188 | }; |
189 | |
190 | void virtio_net_set_netclient_name(VirtIONet *n, const char *name, |
191 | const char *type); |
192 | |
193 | #endif |
194 | |