|
|
1.1 root 1: /*
2: * Virtio Network Device
3: *
4: * Copyright IBM, Corp. 2007
5: *
6: * Authors:
7: * Anthony Liguori <[email protected]>
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 "virtio.h"
18: #include "net.h"
19: #include "pci.h"
20:
21: #define ETH_ALEN 6
22:
23: /* from Linux's virtio_net.h */
24:
25: /* The ID for virtio_net */
26: #define VIRTIO_ID_NET 1
27:
28: /* The feature bitmap for virtio net */
29: #define VIRTIO_NET_F_CSUM 0 /* Host handles pkts w/ partial csum */
30: #define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */
31: #define VIRTIO_NET_F_MAC 5 /* Host has given MAC address. */
32: #define VIRTIO_NET_F_GSO 6 /* Host handles pkts w/ any GSO type */
33: #define VIRTIO_NET_F_GUEST_TSO4 7 /* Guest can handle TSOv4 in. */
34: #define VIRTIO_NET_F_GUEST_TSO6 8 /* Guest can handle TSOv6 in. */
35: #define VIRTIO_NET_F_GUEST_ECN 9 /* Guest can handle TSO[6] w/ ECN in. */
36: #define VIRTIO_NET_F_GUEST_UFO 10 /* Guest can handle UFO in. */
37: #define VIRTIO_NET_F_HOST_TSO4 11 /* Host can handle TSOv4 in. */
38: #define VIRTIO_NET_F_HOST_TSO6 12 /* Host can handle TSOv6 in. */
39: #define VIRTIO_NET_F_HOST_ECN 13 /* Host can handle TSO[6] w/ ECN in. */
40: #define VIRTIO_NET_F_HOST_UFO 14 /* Host can handle UFO in. */
41: #define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can merge receive buffers. */
42: #define VIRTIO_NET_F_STATUS 16 /* virtio_net_config.status available */
43: #define VIRTIO_NET_F_CTRL_VQ 17 /* Control channel available */
44: #define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */
45: #define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */
1.1.1.2 root 46: #define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */
1.1 root 47:
48: #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
49:
50: #define TX_TIMER_INTERVAL 150000 /* 150 us */
51:
1.1.1.4 root 52: /* Limit the number of packets that can be sent via a single flush
53: * of the TX queue. This gives us a guaranteed exit condition and
54: * ensures fairness in the io path. 256 conveniently matches the
55: * length of the TX queue and shows a good balance of performance
56: * and latency. */
57: #define TX_BURST 256
58:
59: typedef struct virtio_net_conf
60: {
61: uint32_t txtimer;
62: int32_t txburst;
63: char *tx;
64: } virtio_net_conf;
65:
1.1 root 66: /* Maximum packet size we can receive from tap device: header + 64k */
67: #define VIRTIO_NET_MAX_BUFSIZE (sizeof(struct virtio_net_hdr) + (64 << 10))
68:
69: struct virtio_net_config
70: {
1.1.1.3 root 71: /* The config defining mac address ($ETH_ALEN bytes) */
72: uint8_t mac[ETH_ALEN];
1.1 root 73: /* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */
74: uint16_t status;
1.1.1.5 root 75: } QEMU_PACKED;
1.1 root 76:
77: /* This is the first element of the scatter-gather list. If you don't
78: * specify GSO or CSUM features, you can simply ignore the header. */
79: struct virtio_net_hdr
80: {
81: #define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 // Use csum_start, csum_offset
1.1.1.6 ! root 82: #define VIRTIO_NET_HDR_F_DATA_VALID 2 // Csum is valid
1.1 root 83: uint8_t flags;
84: #define VIRTIO_NET_HDR_GSO_NONE 0 // Not a GSO frame
85: #define VIRTIO_NET_HDR_GSO_TCPV4 1 // GSO frame, IPv4 TCP (TSO)
86: #define VIRTIO_NET_HDR_GSO_UDP 3 // GSO frame, IPv4 UDP (UFO)
87: #define VIRTIO_NET_HDR_GSO_TCPV6 4 // GSO frame, IPv6 TCP
88: #define VIRTIO_NET_HDR_GSO_ECN 0x80 // TCP has ECN set
89: uint8_t gso_type;
90: uint16_t hdr_len;
91: uint16_t gso_size;
92: uint16_t csum_start;
93: uint16_t csum_offset;
94: };
95:
96: /* This is the version of the header to use when the MRG_RXBUF
97: * feature has been negotiated. */
98: struct virtio_net_hdr_mrg_rxbuf
99: {
100: struct virtio_net_hdr hdr;
101: uint16_t num_buffers; /* Number of merged rx buffers */
102: };
103:
104: /*
105: * Control virtqueue data structures
106: *
107: * The control virtqueue expects a header in the first sg entry
108: * and an ack/status response in the last entry. Data for the
109: * command goes in between.
110: */
111: struct virtio_net_ctrl_hdr {
112: uint8_t class;
113: uint8_t cmd;
114: };
115:
116: typedef uint8_t virtio_net_ctrl_ack;
117:
118: #define VIRTIO_NET_OK 0
119: #define VIRTIO_NET_ERR 1
120:
121: /*
1.1.1.2 root 122: * Control the RX mode, ie. promisucous, allmulti, etc...
123: * All commands require an "out" sg entry containing a 1 byte
124: * state value, zero = disable, non-zero = enable. Commands
125: * 0 and 1 are supported with the VIRTIO_NET_F_CTRL_RX feature.
126: * Commands 2-5 are added with VIRTIO_NET_F_CTRL_RX_EXTRA.
1.1 root 127: */
128: #define VIRTIO_NET_CTRL_RX_MODE 0
129: #define VIRTIO_NET_CTRL_RX_MODE_PROMISC 0
130: #define VIRTIO_NET_CTRL_RX_MODE_ALLMULTI 1
1.1.1.2 root 131: #define VIRTIO_NET_CTRL_RX_MODE_ALLUNI 2
132: #define VIRTIO_NET_CTRL_RX_MODE_NOMULTI 3
133: #define VIRTIO_NET_CTRL_RX_MODE_NOUNI 4
134: #define VIRTIO_NET_CTRL_RX_MODE_NOBCAST 5
1.1 root 135:
136: /*
137: * Control the MAC filter table.
138: *
139: * The MAC filter table is managed by the hypervisor, the guest should
140: * assume the size is infinite. Filtering should be considered
141: * non-perfect, ie. based on hypervisor resources, the guest may
142: * received packets from sources not specified in the filter list.
143: *
144: * In addition to the class/cmd header, the TABLE_SET command requires
145: * two out scatterlists. Each contains a 4 byte count of entries followed
146: * by a concatenated byte stream of the ETH_ALEN MAC addresses. The
147: * first sg list contains unicast addresses, the second is for multicast.
148: * This functionality is present if the VIRTIO_NET_F_CTRL_RX feature
149: * is available.
150: */
151: struct virtio_net_ctrl_mac {
152: uint32_t entries;
153: uint8_t macs[][ETH_ALEN];
154: };
155: #define VIRTIO_NET_CTRL_MAC 1
156: #define VIRTIO_NET_CTRL_MAC_TABLE_SET 0
157:
158: /*
159: * Control VLAN filtering
160: *
161: * The VLAN filter table is controlled via a simple ADD/DEL interface.
162: * VLAN IDs not added may be filterd by the hypervisor. Del is the
163: * opposite of add. Both commands expect an out entry containing a 2
164: * byte VLAN ID. VLAN filterting is available with the
165: * VIRTIO_NET_F_CTRL_VLAN feature bit.
166: */
167: #define VIRTIO_NET_CTRL_VLAN 2
168: #define VIRTIO_NET_CTRL_VLAN_ADD 0
169: #define VIRTIO_NET_CTRL_VLAN_DEL 1
170:
1.1.1.3 root 171: #define DEFINE_VIRTIO_NET_FEATURES(_state, _field) \
172: DEFINE_VIRTIO_COMMON_FEATURES(_state, _field), \
173: DEFINE_PROP_BIT("csum", _state, _field, VIRTIO_NET_F_CSUM, true), \
174: DEFINE_PROP_BIT("guest_csum", _state, _field, VIRTIO_NET_F_GUEST_CSUM, true), \
175: DEFINE_PROP_BIT("gso", _state, _field, VIRTIO_NET_F_GSO, true), \
176: DEFINE_PROP_BIT("guest_tso4", _state, _field, VIRTIO_NET_F_GUEST_TSO4, true), \
177: DEFINE_PROP_BIT("guest_tso6", _state, _field, VIRTIO_NET_F_GUEST_TSO6, true), \
178: DEFINE_PROP_BIT("guest_ecn", _state, _field, VIRTIO_NET_F_GUEST_ECN, true), \
179: DEFINE_PROP_BIT("guest_ufo", _state, _field, VIRTIO_NET_F_GUEST_UFO, true), \
180: DEFINE_PROP_BIT("host_tso4", _state, _field, VIRTIO_NET_F_HOST_TSO4, true), \
181: DEFINE_PROP_BIT("host_tso6", _state, _field, VIRTIO_NET_F_HOST_TSO6, true), \
182: DEFINE_PROP_BIT("host_ecn", _state, _field, VIRTIO_NET_F_HOST_ECN, true), \
183: DEFINE_PROP_BIT("host_ufo", _state, _field, VIRTIO_NET_F_HOST_UFO, true), \
184: DEFINE_PROP_BIT("mrg_rxbuf", _state, _field, VIRTIO_NET_F_MRG_RXBUF, true), \
185: DEFINE_PROP_BIT("status", _state, _field, VIRTIO_NET_F_STATUS, true), \
186: DEFINE_PROP_BIT("ctrl_vq", _state, _field, VIRTIO_NET_F_CTRL_VQ, true), \
187: DEFINE_PROP_BIT("ctrl_rx", _state, _field, VIRTIO_NET_F_CTRL_RX, true), \
188: DEFINE_PROP_BIT("ctrl_vlan", _state, _field, VIRTIO_NET_F_CTRL_VLAN, true), \
189: DEFINE_PROP_BIT("ctrl_rx_extra", _state, _field, VIRTIO_NET_F_CTRL_RX_EXTRA, true)
1.1 root 190: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.