mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 12:09:58 +00:00
3d11d36c7f
This will be used for RX mode, MAC table, VLAN table control, etc... The control transaction consists of one or more "out" sg entries and one or more "in" sg entries. The first out entry contains a header defining the class and command. Additional out entries may provide data for the command. A response via the ack entry is required and the guest will typically be waiting for it. Signed-off-by: Alex Williamson <alex.williamson@hp.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6536 c046a42c-6fe2-441c-8c8c-71466251a162
106 lines
3.4 KiB
C
106 lines
3.4 KiB
C
/*
|
|
* Virtio Network Device
|
|
*
|
|
* Copyright IBM, Corp. 2007
|
|
*
|
|
* Authors:
|
|
* Anthony Liguori <aliguori@us.ibm.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2. See
|
|
* the COPYING file in the top-level directory.
|
|
*
|
|
*/
|
|
|
|
#ifndef _QEMU_VIRTIO_NET_H
|
|
#define _QEMU_VIRTIO_NET_H
|
|
|
|
#include "virtio.h"
|
|
#include "net.h"
|
|
#include "pci.h"
|
|
|
|
#define ETH_ALEN 6
|
|
|
|
/* from Linux's virtio_net.h */
|
|
|
|
/* The ID for virtio_net */
|
|
#define VIRTIO_ID_NET 1
|
|
|
|
/* The feature bitmap for virtio net */
|
|
#define VIRTIO_NET_F_CSUM 0 /* Host handles pkts w/ partial csum */
|
|
#define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */
|
|
#define VIRTIO_NET_F_MAC 5 /* Host has given MAC address. */
|
|
#define VIRTIO_NET_F_GSO 6 /* Host handles pkts w/ any GSO type */
|
|
#define VIRTIO_NET_F_GUEST_TSO4 7 /* Guest can handle TSOv4 in. */
|
|
#define VIRTIO_NET_F_GUEST_TSO6 8 /* Guest can handle TSOv6 in. */
|
|
#define VIRTIO_NET_F_GUEST_ECN 9 /* Guest can handle TSO[6] w/ ECN in. */
|
|
#define VIRTIO_NET_F_GUEST_UFO 10 /* Guest can handle UFO in. */
|
|
#define VIRTIO_NET_F_HOST_TSO4 11 /* Host can handle TSOv4 in. */
|
|
#define VIRTIO_NET_F_HOST_TSO6 12 /* Host can handle TSOv6 in. */
|
|
#define VIRTIO_NET_F_HOST_ECN 13 /* Host can handle TSO[6] w/ ECN in. */
|
|
#define VIRTIO_NET_F_HOST_UFO 14 /* Host can handle UFO in. */
|
|
#define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can merge receive buffers. */
|
|
#define VIRTIO_NET_F_STATUS 16 /* virtio_net_config.status available */
|
|
#define VIRTIO_NET_F_CTRL_VQ 17 /* Control channel available */
|
|
|
|
#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
|
|
|
|
#define TX_TIMER_INTERVAL 150000 /* 150 us */
|
|
|
|
/* Maximum packet size we can receive from tap device: header + 64k */
|
|
#define VIRTIO_NET_MAX_BUFSIZE (sizeof(struct virtio_net_hdr) + (64 << 10))
|
|
|
|
struct virtio_net_config
|
|
{
|
|
/* The config defining mac address (6 bytes) */
|
|
uint8_t mac[6];
|
|
/* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */
|
|
uint16_t status;
|
|
} __attribute__((packed));
|
|
|
|
/* This is the first element of the scatter-gather list. If you don't
|
|
* specify GSO or CSUM features, you can simply ignore the header. */
|
|
struct virtio_net_hdr
|
|
{
|
|
#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 // Use csum_start, csum_offset
|
|
uint8_t flags;
|
|
#define VIRTIO_NET_HDR_GSO_NONE 0 // Not a GSO frame
|
|
#define VIRTIO_NET_HDR_GSO_TCPV4 1 // GSO frame, IPv4 TCP (TSO)
|
|
#define VIRTIO_NET_HDR_GSO_UDP 3 // GSO frame, IPv4 UDP (UFO)
|
|
#define VIRTIO_NET_HDR_GSO_TCPV6 4 // GSO frame, IPv6 TCP
|
|
#define VIRTIO_NET_HDR_GSO_ECN 0x80 // TCP has ECN set
|
|
uint8_t gso_type;
|
|
uint16_t hdr_len;
|
|
uint16_t gso_size;
|
|
uint16_t csum_start;
|
|
uint16_t csum_offset;
|
|
};
|
|
|
|
/* This is the version of the header to use when the MRG_RXBUF
|
|
* feature has been negotiated. */
|
|
struct virtio_net_hdr_mrg_rxbuf
|
|
{
|
|
struct virtio_net_hdr hdr;
|
|
uint16_t num_buffers; /* Number of merged rx buffers */
|
|
};
|
|
|
|
void virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn);
|
|
|
|
/*
|
|
* Control virtqueue data structures
|
|
*
|
|
* The control virtqueue expects a header in the first sg entry
|
|
* and an ack/status response in the last entry. Data for the
|
|
* command goes in between.
|
|
*/
|
|
struct virtio_net_ctrl_hdr {
|
|
uint8_t class;
|
|
uint8_t cmd;
|
|
};
|
|
|
|
typedef uint8_t virtio_net_ctrl_ack;
|
|
|
|
#define VIRTIO_NET_OK 0
|
|
#define VIRTIO_NET_ERR 1
|
|
|
|
#endif
|