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