iPXE
netfront.h
Go to the documentation of this file.
1#ifndef _NETFRONT_H
2#define _NETFRONT_H
3
4/** @file
5 *
6 * Xen netfront driver
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_SECBOOT ( PERMITTED );
12
13#include <ipxe/xen.h>
14#include <xen/io/netif.h>
15
16/** Number of transmit ring entries */
17#define NETFRONT_NUM_TX_DESC 16
18
19/** Number of receive ring entries */
20#define NETFRONT_NUM_RX_DESC 32
21
22/** Receive ring fill level
23 *
24 * The xen-netback driver from kernels 3.18 to 4.2 inclusive have a
25 * bug (CA-163395) which prevents packet reception if fewer than 18
26 * receive descriptors are available. This was fixed in upstream
27 * kernel commit d5d4852 ("xen-netback: require fewer guest Rx slots
28 * when not using GSO").
29 *
30 * We provide 18 receive descriptors to avoid unpleasant silent
31 * failures on these kernel versions.
32 */
33#define NETFRONT_RX_FILL 18
34
35/** Grant reference indices */
37 /** Transmit ring grant reference index */
39 /** Transmit descriptor grant reference base index */
41 /** Receive ring grant reference index */
43 /** Receive descriptor grant reference base index */
45 /** Total number of grant references required */
47};
48
49/** A netfront descriptor ring */
51 /** Shared ring */
52 union {
53 /** Transmit shared ring */
54 netif_tx_sring_t *tx;
55 /** Receive shared ring */
56 netif_rx_sring_t *rx;
57 /** Raw pointer */
58 void *raw;
60 /** Shared ring grant reference key */
61 const char *ref_key;
62 /** Shared ring grant reference */
64
65 /** Maximum number of used descriptors */
66 size_t count;
67 /** I/O buffers, indexed by buffer ID */
68 struct io_buffer **iobufs;
69 /** Grant references, indexed by buffer ID */
71
72 /** Buffer ID ring */
74 /** Buffer ID ring producer counter */
75 unsigned int id_prod;
76 /** Buffer ID ring consumer counter */
77 unsigned int id_cons;
78};
79
80/**
81 * Initialise descriptor ring
82 *
83 * @v ring Descriptor ring
84 * @v ref_key Shared ring grant reference key
85 * @v ref Shared ring grant reference
86 * @v count Maxium number of used descriptors
87 * @v iobufs I/O buffers
88 * @v refs I/O buffer grant references
89 * @v ids Buffer IDs
90 */
91static inline __attribute__ (( always_inline )) void
92netfront_init_ring ( struct netfront_ring *ring, const char *ref_key,
93 grant_ref_t ref, unsigned int count,
96
97 ring->ref_key = ref_key;
98 ring->ref = ref;
99 ring->count = count;
100 ring->iobufs = iobufs;
101 ring->refs = refs;
102 ring->ids = ids;
103}
104
105/**
106 * Calculate descriptor ring fill level
107 *
108 * @v ring Descriptor ring
109 * @v fill Fill level
110 */
111static inline __attribute__ (( always_inline )) unsigned int
112netfront_ring_fill ( struct netfront_ring *ring ) {
113 unsigned int fill_level;
114
115 fill_level = ( ring->id_prod - ring->id_cons );
116 assert ( fill_level <= ring->count );
117 return fill_level;
118}
119
120/**
121 * Calculate descriptor ring remaining space
122 *
123 * @v ring Descriptor ring
124 * @v space Number of unused entries
125 */
126static inline __attribute__ (( always_inline )) unsigned int
127netfront_ring_space ( struct netfront_ring *ring ) {
128
129 return ( ring->count - netfront_ring_fill ( ring ) );
130}
131
132/**
133 * Check whether or not descriptor ring is full
134 *
135 * @v ring Descriptor ring
136 * @v is_full Ring is full
137 */
138static inline __attribute__ (( always_inline )) int
139netfront_ring_is_full ( struct netfront_ring *ring ) {
140
141 return ( netfront_ring_fill ( ring ) >= ring->count );
142}
143
144/**
145 * Check whether or not descriptor ring is empty
146 *
147 * @v ring Descriptor ring
148 * @v is_empty Ring is empty
149 */
150static inline __attribute__ (( always_inline )) int
151netfront_ring_is_empty ( struct netfront_ring *ring ) {
152
153 return ( netfront_ring_fill ( ring ) == 0 );
154}
155
156/** A netfront NIC */
158 /** Xen device */
160 /** Grant references */
162
163 /** Network device */
165 /** List of netfront NICs */
167
168 /** Transmit ring */
170 /** Transmit front ring */
171 netif_tx_front_ring_t tx_fring;
172 /** Transmit I/O buffers */
174 /** Transmit I/O buffer IDs */
176
177 /** Receive ring */
179 /** Receive front ring */
180 netif_rx_front_ring_t rx_fring;
181 /** Receive I/O buffers */
183 /** Receive I/O buffer IDs */
185 /** Partial receive I/O buffer list */
187
188 /** Event channel */
190};
191
192/** Transmit shared ring field */
193#define tx_sring tx.sring.tx
194
195/** Receive shared ring field */
196#define rx_sring rx.sring.rx
197
198#endif /* _NETFRONT_H */
unsigned char uint8_t
Definition stdint.h:10
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
static unsigned int unsigned int size_t uint8_t * ids
Definition ena.h:770
uint32_t grant_ref_t
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:896
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
#define __attribute__(x)
Definition compiler.h:10
Xen interface.
static const char grant_ref_t ref
Definition netfront.h:93
static const char * ref_key
Definition netfront.h:92
#define NETFRONT_NUM_RX_DESC
Number of receive ring entries.
Definition netfront.h:20
netfront_ref_index
Grant reference indices.
Definition netfront.h:36
@ NETFRONT_REF_TX_RING
Transmit ring grant reference index.
Definition netfront.h:38
@ NETFRONT_REF_COUNT
Total number of grant references required.
Definition netfront.h:46
@ NETFRONT_REF_TX_BASE
Transmit descriptor grant reference base index.
Definition netfront.h:40
@ NETFRONT_REF_RX_RING
Receive ring grant reference index.
Definition netfront.h:42
@ NETFRONT_REF_RX_BASE
Receive descriptor grant reference base index.
Definition netfront.h:44
#define NETFRONT_NUM_TX_DESC
Number of transmit ring entries.
Definition netfront.h:17
static const char grant_ref_t unsigned int struct io_buffer grant_ref_t * refs
Definition netfront.h:94
static const char grant_ref_t unsigned int struct io_buffer ** iobufs
Definition netfront.h:94
A persistent I/O buffer.
Definition iobuf.h:38
A doubly-linked list entry (or list head)
Definition list.h:19
A network device.
Definition netdevice.h:353
A netfront NIC.
Definition netfront.h:157
grant_ref_t refs[NETFRONT_REF_COUNT]
Grant references.
Definition netfront.h:161
uint8_t rx_ids[NETFRONT_NUM_RX_DESC]
Receive I/O buffer IDs.
Definition netfront.h:184
struct io_buffer * tx_iobufs[NETFRONT_NUM_TX_DESC]
Transmit I/O buffers.
Definition netfront.h:173
netif_tx_front_ring_t tx_fring
Transmit front ring.
Definition netfront.h:171
struct xen_device * xendev
Xen device.
Definition netfront.h:159
struct list_head rx_partial
Partial receive I/O buffer list.
Definition netfront.h:186
struct net_device * netdev
Network device.
Definition netfront.h:164
struct io_buffer * rx_iobufs[NETFRONT_NUM_RX_DESC]
Receive I/O buffers.
Definition netfront.h:182
struct evtchn_send event
Event channel.
Definition netfront.h:189
struct netfront_ring rx
Receive ring.
Definition netfront.h:178
netif_rx_front_ring_t rx_fring
Receive front ring.
Definition netfront.h:180
uint8_t tx_ids[NETFRONT_NUM_TX_DESC]
Transmit I/O buffer IDs.
Definition netfront.h:175
struct list_head list
List of netfront NICs.
Definition netfront.h:166
struct netfront_ring tx
Transmit ring.
Definition netfront.h:169
A netfront descriptor ring.
Definition netfront.h:50
netif_rx_sring_t * rx
Receive shared ring.
Definition netfront.h:56
grant_ref_t * refs
Grant references, indexed by buffer ID.
Definition netfront.h:70
size_t count
Maximum number of used descriptors.
Definition netfront.h:66
uint8_t * ids
Buffer ID ring.
Definition netfront.h:73
netif_tx_sring_t * tx
Transmit shared ring.
Definition netfront.h:54
struct io_buffer ** iobufs
I/O buffers, indexed by buffer ID.
Definition netfront.h:68
unsigned int id_prod
Buffer ID ring producer counter.
Definition netfront.h:75
void * raw
Raw pointer.
Definition netfront.h:58
const char * ref_key
Shared ring grant reference key.
Definition netfront.h:61
unsigned int id_cons
Buffer ID ring consumer counter.
Definition netfront.h:77
grant_ref_t ref
Shared ring grant reference.
Definition netfront.h:63
union netfront_ring::@235351263275146342264217234007371176021305365026 sring
Shared ring.
A Xen device.
Definition xenbus.h:19