blob: 2a3423fb631773cb1c2abb9a07c30b441a629834 [file]
#ifndef _VIRTIO_NET_H
#define _VIRTIO_NET_H
/** @file
*
* Virtual I/O network device
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
FILE_SECBOOT ( PERMITTED );
#include <ipxe/virtio.h>
/** Device has a reported MTU */
#define VIRTIO_FEAT0_NET_MTU 0x00000008
/** Device has a MAC address */
#define VIRTIO_FEAT0_NET_MAC 0x00000020
/** MAC address register offset */
#define VIRTIO_NET_MAC 0x00
/** MTU register offset */
#define VIRTIO_NET_MTU 0x0a
/** A virtio network packet header */
union virtio_net_header {
/** Legacy interface */
uint8_t legacy[10];
/** Modern (version 1.0) interface */
uint8_t modern[12];
} __attribute__ (( packed ));
/** Receive queue index */
#define VIRTIO_NET_RX_INDEX 0
/** Receive queue requested queue size */
#define VIRTIO_NET_RX_COUNT 128
/** Receive queue maximum fill level */
#define VIRTIO_NET_RX_MAX 16
/** Transmit queue index */
#define VIRTIO_NET_TX_INDEX 1
/** Transmit queue requested queue size */
#define VIRTIO_NET_TX_COUNT 128
/** Transmit queue maximum fill level */
#define VIRTIO_NET_TX_MAX 32
/** Number of descriptors per packet */
#define VIRTIO_NET_DESCS 2
/** A virtio network queue */
struct virtio_net_queue {
/** Underlying virtio queue */
struct virtio_queue queue;
/** I/O buffer list */
struct io_buffer **iobufs;
/** Descriptor slot ring */
uint8_t *slots;
/** Effective fill level */
unsigned int fill;
/** Descriptor index ring mask */
unsigned int mask;
/** Shared packet header */
union virtio_net_header hdr;
/** DMA mapping for packet header */
struct dma_mapping map;
/** DMA direction for packet header */
uint8_t dma;
/** Buffer writability flag for packet header */
uint8_t write;
/** Requested queue size */
uint8_t count;
/** Maximum fill level */
uint8_t max;
};
/**
* Initialise virtio network queue
*
* @v queue Virtio network queue
* @v index Queue index
* @v iobufs I/O buffer list
* @v slots Descriptor slot ring
* @v dma DMA direction for packet header
* @v write Writability flag for packet header
* @v count Requested queue size
* @v max Maximum fill level
*/
static inline __attribute__ (( always_inline )) void
virtio_net_queue_init ( struct virtio_net_queue *queue,
struct io_buffer **iobufs, uint8_t *slots,
unsigned int index, unsigned int count,
unsigned int max, unsigned int dma,
unsigned int write ) {
queue->queue.index = index;
queue->iobufs = iobufs;
queue->slots = slots;
queue->dma = dma;
queue->write = write;
queue->count = count;
queue->max = max;
}
/** A virtio network device */
struct virtio_net {
/** Underlying virtio device */
struct virtio_device virtio;
/** Receive queue */
struct virtio_net_queue rx;
/** Transmit queue */
struct virtio_net_queue tx;
/** Virtio network header length */
size_t hlen;
/** Maximum frame size */
size_t mfs;
/** Receive descriptor slot ring */
uint8_t rx_slots[VIRTIO_NET_RX_MAX];
/** Receive I/O buffers */
struct io_buffer *rx_iobufs[VIRTIO_NET_RX_MAX];
/** Transmit descriptor slot ring */
uint8_t tx_slots[VIRTIO_NET_TX_MAX];
/** Transmit I/O buffers */
struct io_buffer *tx_iobufs[VIRTIO_NET_TX_MAX];
};
#endif /* _VIRTIO_NET_H */