iPXE
virtio-net.h
Go to the documentation of this file.
1#ifndef _VIRTIO_NET_H
2#define _VIRTIO_NET_H
3
4/** @file
5 *
6 * Virtual I/O network device
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_SECBOOT ( PERMITTED );
12
13#include <ipxe/virtio.h>
14
15/** Device has a reported MTU */
16#define VIRTIO_FEAT0_NET_MTU 0x00000008
17
18/** Device has a MAC address */
19#define VIRTIO_FEAT0_NET_MAC 0x00000020
20
21/** MAC address register offset */
22#define VIRTIO_NET_MAC 0x00
23
24/** MTU register offset */
25#define VIRTIO_NET_MTU 0x0a
26
27/** A virtio network packet header */
29 /** Legacy interface */
31 /** Modern (version 1.0) interface */
33} __attribute__ (( packed ));
34
35/** Receive queue index */
36#define VIRTIO_NET_RX_INDEX 0
37
38/** Receive queue requested queue size */
39#define VIRTIO_NET_RX_COUNT 128
40
41/** Receive queue maximum fill level */
42#define VIRTIO_NET_RX_MAX 16
43
44/** Transmit queue index */
45#define VIRTIO_NET_TX_INDEX 1
46
47/** Transmit queue requested queue size */
48#define VIRTIO_NET_TX_COUNT 128
49
50/** Transmit queue maximum fill level */
51#define VIRTIO_NET_TX_MAX 128
52
53/** Number of descriptors per packet */
54#define VIRTIO_NET_DESCS 2
55
56/** A virtio network queue */
58 /** Underlying virtio queue */
60 /** I/O buffer list */
61 struct io_buffer **iobufs;
62 /** Descriptor slot ring */
64 /** Effective fill level */
65 unsigned int fill;
66 /** Descriptor index ring mask */
67 unsigned int mask;
68
69 /** Shared packet header */
71 /** DMA mapping for packet header */
73
74 /** DMA direction for packet header */
76 /** Buffer writability flag for packet header */
78 /** Requested queue size */
80 /** Maximum fill level */
82};
83
84/**
85 * Initialise virtio network queue
86 *
87 * @v queue Virtio network queue
88 * @v index Queue index
89 * @v iobufs I/O buffer list
90 * @v slots Descriptor slot ring
91 * @v dma DMA direction for packet header
92 * @v write Writability flag for packet header
93 * @v count Requested queue size
94 * @v max Maximum fill level
95 */
96static inline __attribute__ (( always_inline )) void
98 struct io_buffer **iobufs, uint8_t *slots,
99 unsigned int index, unsigned int count,
100 unsigned int max, unsigned int dma,
101 unsigned int write ) {
102
103 queue->queue.index = index;
104 queue->iobufs = iobufs;
105 queue->slots = slots;
106 queue->dma = dma;
107 queue->write = write;
108 queue->count = count;
109 queue->max = max;
110}
111
112/** A virtio network device */
114 /** Underlying virtio device */
116 /** Receive queue */
118 /** Transmit queue */
120
121 /** Virtio network header length */
122 size_t hlen;
123 /** Maximum frame size */
124 size_t mfs;
125
126 /** Receive descriptor slot ring */
128 /** Receive I/O buffers */
130
131 /** Transmit descriptor slot ring */
133 /** Transmit I/O buffers */
135};
136
137#endif /* _VIRTIO_NET_H */
unsigned char uint8_t
Definition stdint.h:10
long index
Definition bigint.h:30
#define max(x, y)
Definition ath.h:41
uint16_t queue
Queue ID.
Definition ena.h:11
static unsigned int count
Number of entries.
Definition dwmac.h:220
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:921
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:951
device nvs write
Definition threewire.h:62
#define __attribute__(x)
Definition compiler.h:10
physaddr_t dma(struct dma_mapping *map, void *addr)
Get DMA address from virtual address.
static const char grant_ref_t unsigned int struct io_buffer ** iobufs
Definition netfront.h:94
A DMA mapping.
Definition dma.h:33
A persistent I/O buffer.
Definition iobuf.h:38
A virtio device.
Definition virtio.h:311
A virtio network queue.
Definition virtio-net.h:57
uint8_t max
Maximum fill level.
Definition virtio-net.h:81
unsigned int fill
Effective fill level.
Definition virtio-net.h:65
struct dma_mapping map
DMA mapping for packet header.
Definition virtio-net.h:72
unsigned int mask
Descriptor index ring mask.
Definition virtio-net.h:67
struct virtio_queue queue
Underlying virtio queue.
Definition virtio-net.h:59
uint8_t * slots
Descriptor slot ring.
Definition virtio-net.h:63
uint8_t count
Requested queue size.
Definition virtio-net.h:79
union virtio_net_header hdr
Shared packet header.
Definition virtio-net.h:70
struct io_buffer ** iobufs
I/O buffer list.
Definition virtio-net.h:61
uint8_t write
Buffer writability flag for packet header.
Definition virtio-net.h:77
uint8_t dma
DMA direction for packet header.
Definition virtio-net.h:75
A virtio network device.
Definition virtio-net.h:113
size_t hlen
Virtio network header length.
Definition virtio-net.h:122
size_t mfs
Maximum frame size.
Definition virtio-net.h:124
struct io_buffer * rx_iobufs[VIRTIO_NET_RX_MAX]
Receive I/O buffers.
Definition virtio-net.h:129
uint8_t rx_slots[VIRTIO_NET_RX_MAX]
Receive descriptor slot ring.
Definition virtio-net.h:127
struct virtio_device virtio
Underlying virtio device.
Definition virtio-net.h:115
struct virtio_net_queue tx
Transmit queue.
Definition virtio-net.h:119
struct virtio_net_queue rx
Receive queue.
Definition virtio-net.h:117
uint8_t tx_slots[VIRTIO_NET_TX_MAX]
Transmit descriptor slot ring.
Definition virtio-net.h:132
struct io_buffer * tx_iobufs[VIRTIO_NET_TX_MAX]
Transmit I/O buffers.
Definition virtio-net.h:134
A virtio queue.
Definition virtio.h:207
A virtio network packet header.
Definition virtio-net.h:28
uint8_t legacy[10]
Legacy interface.
Definition virtio-net.h:30
uint8_t modern[12]
Modern (version 1.0) interface.
Definition virtio-net.h:32
#define VIRTIO_NET_RX_MAX
Receive queue maximum fill level.
Definition virtio-net.h:42
static 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)
Initialise virtio network queue.
Definition virtio-net.h:97
#define VIRTIO_NET_TX_MAX
Transmit queue maximum fill level.
Definition virtio-net.h:51
Virtual I/O device.