|
|
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 */ ! 46: ! 47: #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */ ! 48: ! 49: #define TX_TIMER_INTERVAL 150000 /* 150 us */ ! 50: ! 51: /* Maximum packet size we can receive from tap device: header + 64k */ ! 52: #define VIRTIO_NET_MAX_BUFSIZE (sizeof(struct virtio_net_hdr) + (64 << 10)) ! 53: ! 54: struct virtio_net_config ! 55: { ! 56: /* The config defining mac address (6 bytes) */ ! 57: uint8_t mac[6]; ! 58: /* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */ ! 59: uint16_t status; ! 60: } __attribute__((packed)); ! 61: ! 62: /* This is the first element of the scatter-gather list. If you don't ! 63: * specify GSO or CSUM features, you can simply ignore the header. */ ! 64: struct virtio_net_hdr ! 65: { ! 66: #define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 // Use csum_start, csum_offset ! 67: uint8_t flags; ! 68: #define VIRTIO_NET_HDR_GSO_NONE 0 // Not a GSO frame ! 69: #define VIRTIO_NET_HDR_GSO_TCPV4 1 // GSO frame, IPv4 TCP (TSO) ! 70: #define VIRTIO_NET_HDR_GSO_UDP 3 // GSO frame, IPv4 UDP (UFO) ! 71: #define VIRTIO_NET_HDR_GSO_TCPV6 4 // GSO frame, IPv6 TCP ! 72: #define VIRTIO_NET_HDR_GSO_ECN 0x80 // TCP has ECN set ! 73: uint8_t gso_type; ! 74: uint16_t hdr_len; ! 75: uint16_t gso_size; ! 76: uint16_t csum_start; ! 77: uint16_t csum_offset; ! 78: }; ! 79: ! 80: /* This is the version of the header to use when the MRG_RXBUF ! 81: * feature has been negotiated. */ ! 82: struct virtio_net_hdr_mrg_rxbuf ! 83: { ! 84: struct virtio_net_hdr hdr; ! 85: uint16_t num_buffers; /* Number of merged rx buffers */ ! 86: }; ! 87: ! 88: PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn); ! 89: ! 90: /* ! 91: * Control virtqueue data structures ! 92: * ! 93: * The control virtqueue expects a header in the first sg entry ! 94: * and an ack/status response in the last entry. Data for the ! 95: * command goes in between. ! 96: */ ! 97: struct virtio_net_ctrl_hdr { ! 98: uint8_t class; ! 99: uint8_t cmd; ! 100: }; ! 101: ! 102: typedef uint8_t virtio_net_ctrl_ack; ! 103: ! 104: #define VIRTIO_NET_OK 0 ! 105: #define VIRTIO_NET_ERR 1 ! 106: ! 107: /* ! 108: * Control the RX mode, ie. promisucous and allmulti. PROMISC and ! 109: * ALLMULTI commands require an "out" sg entry containing a 1 byte ! 110: * state value, zero = disable, non-zero = enable. These commands ! 111: * are supported with the VIRTIO_NET_F_CTRL_RX feature. ! 112: */ ! 113: #define VIRTIO_NET_CTRL_RX_MODE 0 ! 114: #define VIRTIO_NET_CTRL_RX_MODE_PROMISC 0 ! 115: #define VIRTIO_NET_CTRL_RX_MODE_ALLMULTI 1 ! 116: ! 117: /* ! 118: * Control the MAC filter table. ! 119: * ! 120: * The MAC filter table is managed by the hypervisor, the guest should ! 121: * assume the size is infinite. Filtering should be considered ! 122: * non-perfect, ie. based on hypervisor resources, the guest may ! 123: * received packets from sources not specified in the filter list. ! 124: * ! 125: * In addition to the class/cmd header, the TABLE_SET command requires ! 126: * two out scatterlists. Each contains a 4 byte count of entries followed ! 127: * by a concatenated byte stream of the ETH_ALEN MAC addresses. The ! 128: * first sg list contains unicast addresses, the second is for multicast. ! 129: * This functionality is present if the VIRTIO_NET_F_CTRL_RX feature ! 130: * is available. ! 131: */ ! 132: struct virtio_net_ctrl_mac { ! 133: uint32_t entries; ! 134: uint8_t macs[][ETH_ALEN]; ! 135: }; ! 136: #define VIRTIO_NET_CTRL_MAC 1 ! 137: #define VIRTIO_NET_CTRL_MAC_TABLE_SET 0 ! 138: ! 139: /* ! 140: * Control VLAN filtering ! 141: * ! 142: * The VLAN filter table is controlled via a simple ADD/DEL interface. ! 143: * VLAN IDs not added may be filterd by the hypervisor. Del is the ! 144: * opposite of add. Both commands expect an out entry containing a 2 ! 145: * byte VLAN ID. VLAN filterting is available with the ! 146: * VIRTIO_NET_F_CTRL_VLAN feature bit. ! 147: */ ! 148: #define VIRTIO_NET_CTRL_VLAN 2 ! 149: #define VIRTIO_NET_CTRL_VLAN_ADD 0 ! 150: #define VIRTIO_NET_CTRL_VLAN_DEL 1 ! 151: ! 152: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.