00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef _QEMU_VIRTIO_NET_H
00015 #define _QEMU_VIRTIO_NET_H
00016
00017 #include "virtio.h"
00018 #include "net.h"
00019 #include "pci.h"
00020
00021 #define ETH_ALEN 6
00022
00023
00024
00025
00026 #define VIRTIO_ID_NET 1
00027
00028
00029 #define VIRTIO_NET_F_CSUM 0
00030 #define VIRTIO_NET_F_GUEST_CSUM 1
00031 #define VIRTIO_NET_F_MAC 5
00032 #define VIRTIO_NET_F_GSO 6
00033 #define VIRTIO_NET_F_GUEST_TSO4 7
00034 #define VIRTIO_NET_F_GUEST_TSO6 8
00035 #define VIRTIO_NET_F_GUEST_ECN 9
00036 #define VIRTIO_NET_F_GUEST_UFO 10
00037 #define VIRTIO_NET_F_HOST_TSO4 11
00038 #define VIRTIO_NET_F_HOST_TSO6 12
00039 #define VIRTIO_NET_F_HOST_ECN 13
00040 #define VIRTIO_NET_F_HOST_UFO 14
00041 #define VIRTIO_NET_F_MRG_RXBUF 15
00042 #define VIRTIO_NET_F_STATUS 16
00043 #define VIRTIO_NET_F_CTRL_VQ 17
00044 #define VIRTIO_NET_F_CTRL_RX 18
00045 #define VIRTIO_NET_F_CTRL_VLAN 19
00046
00047 #define VIRTIO_NET_S_LINK_UP 1
00048
00049 #define TX_TIMER_INTERVAL 150000
00050
00051
00052 #define VIRTIO_NET_MAX_BUFSIZE (sizeof(struct virtio_net_hdr) + (64 << 10))
00053
00054 struct virtio_net_config
00055 {
00056
00057 uint8_t mac[6];
00058
00059 uint16_t status;
00060 } __attribute__((packed));
00061
00062
00063
00064 struct virtio_net_hdr
00065 {
00066 #define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 // Use csum_start, csum_offset
00067 uint8_t flags;
00068 #define VIRTIO_NET_HDR_GSO_NONE 0 // Not a GSO frame
00069 #define VIRTIO_NET_HDR_GSO_TCPV4 1 // GSO frame, IPv4 TCP (TSO)
00070 #define VIRTIO_NET_HDR_GSO_UDP 3 // GSO frame, IPv4 UDP (UFO)
00071 #define VIRTIO_NET_HDR_GSO_TCPV6 4 // GSO frame, IPv6 TCP
00072 #define VIRTIO_NET_HDR_GSO_ECN 0x80 // TCP has ECN set
00073 uint8_t gso_type;
00074 uint16_t hdr_len;
00075 uint16_t gso_size;
00076 uint16_t csum_start;
00077 uint16_t csum_offset;
00078 };
00079
00080
00081
00082 struct virtio_net_hdr_mrg_rxbuf
00083 {
00084 struct virtio_net_hdr hdr;
00085 uint16_t num_buffers;
00086 };
00087
00088 PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn);
00089
00090
00091
00092
00093
00094
00095
00096
00097 struct virtio_net_ctrl_hdr {
00098 uint8_t class;
00099 uint8_t cmd;
00100 };
00101
00102 typedef uint8_t virtio_net_ctrl_ack;
00103
00104 #define VIRTIO_NET_OK 0
00105 #define VIRTIO_NET_ERR 1
00106
00107
00108
00109
00110
00111
00112
00113 #define VIRTIO_NET_CTRL_RX_MODE 0
00114 #define VIRTIO_NET_CTRL_RX_MODE_PROMISC 0
00115 #define VIRTIO_NET_CTRL_RX_MODE_ALLMULTI 1
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 struct virtio_net_ctrl_mac {
00133 uint32_t entries;
00134 uint8_t macs[][ETH_ALEN];
00135 };
00136 #define VIRTIO_NET_CTRL_MAC 1
00137 #define VIRTIO_NET_CTRL_MAC_TABLE_SET 0
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 #define VIRTIO_NET_CTRL_VLAN 2
00149 #define VIRTIO_NET_CTRL_VLAN_ADD 0
00150 #define VIRTIO_NET_CTRL_VLAN_DEL 1
00151
00152 #endif