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 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 FILE_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 */
50 struct netfront_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;
59  } sring;
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  */
91 static inline __attribute__ (( always_inline )) void
92 netfront_init_ring ( struct netfront_ring *ring, const char *ref_key,
93  grant_ref_t ref, unsigned int count,
95  uint8_t *ids ) {
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  */
111 static inline __attribute__ (( always_inline )) unsigned int
112 netfront_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  */
126 static inline __attribute__ (( always_inline )) unsigned int
127 netfront_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  */
138 static inline __attribute__ (( always_inline )) int
139 netfront_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  */
150 static inline __attribute__ (( always_inline )) int
151 netfront_ring_is_empty ( struct netfront_ring *ring ) {
152 
153  return ( netfront_ring_fill ( ring ) == 0 );
154 }
155 
156 /** A netfront NIC */
157 struct netfront_nic {
158  /** Xen device */
160  /** Grant references */
162 
163  /** Network device */
165  /** List of netfront NICs */
166  struct list_head list;
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 */
struct net_device * netdev
Network device.
Definition: netfront.h:164
netif_rx_sring_t * rx
Receive shared ring.
Definition: netfront.h:56
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
struct list_head rx_partial
Partial receive I/O buffer list.
Definition: netfront.h:186
grant_ref_t ref
Shared ring grant reference.
Definition: netfront.h:63
static const char * ref_key
Definition: netfront.h:92
FILE_SECBOOT(PERMITTED)
static const char grant_ref_t unsigned int struct io_buffer grant_ref_t uint8_t * ids
Definition: netfront.h:95
struct io_buffer * rx_iobufs[NETFRONT_NUM_RX_DESC]
Receive I/O buffers.
Definition: netfront.h:182
netfront_ref_index
Grant reference indices.
Definition: netfront.h:36
uint32_t grant_ref_t
Definition: grant_table.h:100
Total number of grant references required.
Definition: netfront.h:46
uint8_t rx_ids[NETFRONT_NUM_RX_DESC]
Receive I/O buffer IDs.
Definition: netfront.h:184
A doubly-linked list entry (or list head)
Definition: list.h:19
Xen interface.
#define NETFRONT_NUM_TX_DESC
Number of transmit ring entries.
Definition: netfront.h:17
void * raw
Raw pointer.
Definition: netfront.h:58
struct evtchn_send event
Event channel.
Definition: netfront.h:189
A Xen device.
Definition: xenbus.h:19
grant_ref_t * refs
Grant references, indexed by buffer ID.
Definition: netfront.h:70
#define NETFRONT_NUM_RX_DESC
Number of receive ring entries.
Definition: netfront.h:20
union netfront_ring::@99 sring
Shared ring.
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
Receive ring grant reference index.
Definition: netfront.h:42
Receive descriptor grant reference base index.
Definition: netfront.h:44
uint8_t * ids
Buffer ID ring.
Definition: netfront.h:73
size_t count
Maximum number of used descriptors.
Definition: netfront.h:66
A netfront NIC.
Definition: netfront.h:157
static const char grant_ref_t unsigned int struct io_buffer grant_ref_t * refs
Definition: netfront.h:94
netif_tx_sring_t * tx
Transmit shared ring.
Definition: netfront.h:54
struct io_buffer * tx_iobufs[NETFRONT_NUM_TX_DESC]
Transmit I/O buffers.
Definition: netfront.h:173
A network device.
Definition: netdevice.h:353
static const char grant_ref_t unsigned int struct io_buffer ** iobufs
Definition: netfront.h:94
unsigned char uint8_t
Definition: stdint.h:10
Transmit descriptor grant reference base index.
Definition: netfront.h:40
grant_ref_t refs[NETFRONT_REF_COUNT]
Grant references.
Definition: netfront.h:161
static const char grant_ref_t unsigned int count
Definition: netfront.h:92
static __attribute__((always_inline)) void netfront_init_ring(struct netfront_ring *ring
Initialise descriptor ring.
Definition: netfront.h:111
uint8_t tx_ids[NETFRONT_NUM_TX_DESC]
Transmit I/O buffer IDs.
Definition: netfront.h:175
A netfront descriptor ring.
Definition: netfront.h:50
struct io_buffer ** iobufs
I/O buffers, indexed by buffer ID.
Definition: netfront.h:68
struct netfront_ring rx
Receive ring.
Definition: netfront.h:178
netif_tx_front_ring_t tx_fring
Transmit front ring.
Definition: netfront.h:171
unsigned int id_prod
Buffer ID ring producer counter.
Definition: netfront.h:75
struct list_head list
List of netfront NICs.
Definition: netfront.h:166
netif_rx_front_ring_t rx_fring
Receive front ring.
Definition: netfront.h:180
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
static const char grant_ref_t ref
Definition: netfront.h:92
struct xen_device * xendev
Xen device.
Definition: netfront.h:159
struct netfront_ring tx
Transmit ring.
Definition: netfront.h:169
Transmit ring grant reference index.
Definition: netfront.h:38
A persistent I/O buffer.
Definition: iobuf.h:38