iPXE
rndis.h
Go to the documentation of this file.
1#ifndef _IPXE_RNDIS_H
2#define _IPXE_RNDIS_H
3
4/** @file
5 *
6 * Remote Network Driver Interface Specification
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_SECBOOT ( PERMITTED );
12
13#include <stdint.h>
14#include <ipxe/netdevice.h>
15#include <ipxe/iobuf.h>
16
17/** Maximum time to wait for a transaction to complete
18 *
19 * This is a policy decision.
20 */
21#define RNDIS_MAX_WAIT_MS 1000
22
23/** RNDIS message header */
25 /** Message type */
27 /** Message length */
29} __attribute__ (( packed ));
30
31/** RNDIS initialise message */
32#define RNDIS_INITIALISE_MSG 0x00000002UL
33
34/** RNDIS initialise message */
36 /** Request ID */
38 /** Major version */
40 /** Minor version */
42 /** Maximum transfer size */
44} __attribute__ (( packed ));
45
46/** Request ID used for initialisation
47 *
48 * This is a policy decision.
49 */
50#define RNDIS_INIT_ID 0xe110e110UL
51
52/** RNDIS major version */
53#define RNDIS_VERSION_MAJOR 1
54
55/** RNDIS minor version */
56#define RNDIS_VERSION_MINOR 0
57
58/** RNDIS maximum transfer size
59 *
60 * This is a policy decision.
61 */
62#define RNDIS_MTU 2048
63
64/** RNDIS initialise completion */
65#define RNDIS_INITIALISE_CMPLT 0x80000002UL
66
67/** RNDIS initialise completion */
69 /** Request ID */
71 /** Status */
73 /** Major version */
75 /** Minor version */
77 /** Device flags */
79 /** Medium */
81 /** Maximum packets per transfer */
83 /** Maximum transfer size */
85 /** Packet alignment factor */
87 /** Reserved */
89} __attribute__ (( packed ));
90
91/** RNDIS halt message */
92#define RNDIS_HALT_MSG 0x00000003UL
93
94/** RNDIS halt message */
96 /** Request ID */
98} __attribute__ (( packed ));
99
100/** RNDIS query OID message */
101#define RNDIS_QUERY_MSG 0x00000004UL
102
103/** RNDIS set OID message */
104#define RNDIS_SET_MSG 0x00000005UL
105
106/** RNDIS query or set OID message */
108 /** Request ID */
110 /** Object ID */
112 /** Information buffer length */
114 /** Information buffer offset */
116 /** Reserved */
118} __attribute__ (( packed ));
119
120/** RNDIS query OID completion */
121#define RNDIS_QUERY_CMPLT 0x80000004UL
122
123/** RNDIS query OID completion */
125 /** Request ID */
127 /** Status */
129 /** Information buffer length */
131 /** Information buffer offset */
133} __attribute__ (( packed ));
134
135/** RNDIS set OID completion */
136#define RNDIS_SET_CMPLT 0x80000005UL
137
138/** RNDIS set OID completion */
140 /** Request ID */
142 /** Status */
144} __attribute__ (( packed ));
145
146/** RNDIS reset message */
147#define RNDIS_RESET_MSG 0x00000006UL
148
149/** RNDIS reset message */
151 /** Reserved */
153} __attribute__ (( packed ));
154
155/** RNDIS reset completion */
156#define RNDIS_RESET_CMPLT 0x80000006UL
157
158/** RNDIS reset completion */
160 /** Status */
162 /** Addressing reset */
164} __attribute__ (( packed ));
165
166/** RNDIS indicate status message */
167#define RNDIS_INDICATE_STATUS_MSG 0x00000007UL
168
169/** RNDIS diagnostic information */
171 /** Status */
173 /** Error offset */
175} __attribute__ (( packed ));
176
177/** RNDIS indicate status message */
179 /** Status */
181 /** Status buffer length */
183 /** Status buffer offset */
185 /** Diagnostic information (optional) */
187} __attribute__ (( packed ));
188
189/** RNDIS status codes */
191 /** Device is connected to a network medium */
193 /** Device is disconnected from the medium */
195 /** Unknown start-of-day status code */
197};
198
199/** RNDIS keepalive message */
200#define RNDIS_KEEPALIVE_MSG 0x00000008UL
201
202/** RNDIS keepalive message */
204 /** Request ID */
206} __attribute__ (( packed ));
207
208/** RNDIS keepalive completion */
209#define RNDIS_KEEPALIVE_CMPLT 0x80000008UL
210
211/** RNDIS keepalive completion */
213 /** Request ID */
215 /** Status */
217} __attribute__ (( packed ));
218
219/** RNDIS packet message */
220#define RNDIS_PACKET_MSG 0x00000001UL
221
222/** RNDIS packet field */
224 /** Offset */
226 /** Length */
228} __attribute__ (( packed ));
229
230/** RNDIS packet message */
232 /** Data */
234 /** Out-of-band data records */
236 /** Number of out-of-band data records */
238 /** Per-packet information record */
240 /** Reserved */
242} __attribute__ (( packed ));
243
244/** RNDIS packet record */
246 /** Length */
248 /** Type */
250 /** Offset */
252} __attribute__ (( packed ));
253
254/** OID for packet filter */
255#define RNDIS_OID_GEN_CURRENT_PACKET_FILTER 0x0001010eUL
256
257/** Packet filter bits */
259 /** Unicast packets */
260 RNDIS_FILTER_UNICAST = 0x00000001UL,
261 /** Multicast packets */
263 /** All multicast packets */
265 /** Broadcast packets */
267 /** All packets */
269};
270
271/** OID for media status */
272#define RNDIS_OID_GEN_MEDIA_CONNECT_STATUS 0x00010114UL
273
274/** OID for permanent MAC address */
275#define RNDIS_OID_802_3_PERMANENT_ADDRESS 0x01010101UL
276
277/** OID for current MAC address */
278#define RNDIS_OID_802_3_CURRENT_ADDRESS 0x01010102UL
279
280struct rndis_device;
281
282/** RNDIS device operations */
284 /**
285 * Open RNDIS device
286 *
287 * @v rndis RNDIS device
288 * @ret rc Return status code
289 */
290 int ( * open ) ( struct rndis_device *rndis );
291 /**
292 * Close RNDIS device
293 *
294 * @v rndis RNDIS device
295 */
296 void ( * close ) ( struct rndis_device *rndis );
297 /**
298 * Transmit packet
299 *
300 * @v rndis RNDIS device
301 * @v iobuf I/O buffer
302 * @ret rc Return status code
303 *
304 * If this method returns success then the RNDIS device must
305 * eventually report completion via rndis_tx_complete().
306 */
307 int ( * transmit ) ( struct rndis_device *rndis,
308 struct io_buffer *iobuf );
309 /**
310 * Poll for completed and received packets
311 *
312 * @v rndis RNDIS device
313 */
314 void ( * poll ) ( struct rndis_device *rndis );
315};
316
317/** An RNDIS device */
319 /** Network device */
321 /** Device name */
322 const char *name;
323 /** RNDIS operations */
325 /** Driver private data */
326 void *priv;
327
328 /** Request ID for current blocking request */
329 unsigned int wait_id;
330 /** Return status code for current blocking request */
332};
333
334/**
335 * Initialise an RNDIS device
336 *
337 * @v rndis RNDIS device
338 * @v op RNDIS device operations
339 */
340static inline void rndis_init ( struct rndis_device *rndis,
341 struct rndis_operations *op ) {
342
343 rndis->op = op;
344}
345
346extern void rndis_tx_complete_err ( struct rndis_device *rndis,
347 struct io_buffer *iobuf, int rc );
348extern int rndis_tx_defer ( struct rndis_device *rndis,
349 struct io_buffer *iobuf );
350extern void rndis_rx ( struct rndis_device *rndis, struct io_buffer *iobuf );
351extern void rndis_rx_err ( struct rndis_device *rndis, struct io_buffer *iobuf,
352 int rc );
353
354extern struct rndis_device * alloc_rndis ( size_t priv_len );
355extern int register_rndis ( struct rndis_device *rndis );
356extern void unregister_rndis ( struct rndis_device *rndis );
357extern void free_rndis ( struct rndis_device *rndis );
358
359/**
360 * Complete message transmission
361 *
362 * @v rndis RNDIS device
363 * @v iobuf I/O buffer
364 */
365static inline void rndis_tx_complete ( struct rndis_device *rndis,
366 struct io_buffer *iobuf ) {
367
368 rndis_tx_complete_err ( rndis, iobuf, 0 );
369}
370
371#endif /* _IPXE_RNDIS_H */
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
unsigned int uint32_t
Definition stdint.h:12
#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
I/O buffers.
Network device management.
static uint16_t struct vmbus_xfer_pages_operations * op
Definition netvsc.h:327
rndis_packet_filter
Packet filter bits.
Definition rndis.h:258
@ RNDIS_FILTER_MULTICAST
Multicast packets.
Definition rndis.h:262
@ RNDIS_FILTER_PROMISCUOUS
All packets.
Definition rndis.h:268
@ RNDIS_FILTER_BROADCAST
Broadcast packets.
Definition rndis.h:266
@ RNDIS_FILTER_ALL_MULTICAST
All multicast packets.
Definition rndis.h:264
@ RNDIS_FILTER_UNICAST
Unicast packets.
Definition rndis.h:260
int rndis_tx_defer(struct rndis_device *rndis, struct io_buffer *iobuf)
Defer transmitted packet.
Definition rndis.c:191
int register_rndis(struct rndis_device *rndis)
Register RNDIS device.
Definition rndis.c:1027
void unregister_rndis(struct rndis_device *rndis)
Unregister RNDIS device.
Definition rndis.c:1055
void rndis_rx(struct rndis_device *rndis, struct io_buffer *iobuf)
Receive packet from underlying transport layer.
Definition rndis.c:830
void rndis_tx_complete_err(struct rndis_device *rndis, struct io_buffer *iobuf, int rc)
Complete message transmission.
Definition rndis.c:128
void free_rndis(struct rndis_device *rndis)
Free RNDIS device.
Definition rndis.c:1067
rndis_status
RNDIS status codes.
Definition rndis.h:190
@ RNDIS_STATUS_WTF_WORLD
Unknown start-of-day status code.
Definition rndis.h:196
@ RNDIS_STATUS_MEDIA_DISCONNECT
Device is disconnected from the medium.
Definition rndis.h:194
@ RNDIS_STATUS_MEDIA_CONNECT
Device is connected to a network medium.
Definition rndis.h:192
void rndis_rx_err(struct rndis_device *rndis, struct io_buffer *iobuf, int rc)
Discard packet from underlying transport layer.
Definition rndis.c:867
static void rndis_tx_complete(struct rndis_device *rndis, struct io_buffer *iobuf)
Complete message transmission.
Definition rndis.h:365
struct rndis_device * alloc_rndis(size_t priv_len)
Allocate RNDIS device.
Definition rndis.c:1001
static void rndis_init(struct rndis_device *rndis, struct rndis_operations *op)
Initialise an RNDIS device.
Definition rndis.h:340
A persistent I/O buffer.
Definition iobuf.h:38
A network device.
Definition netdevice.h:353
An RNDIS device.
Definition rndis.h:318
struct net_device * netdev
Network device.
Definition rndis.h:320
struct rndis_operations * op
RNDIS operations.
Definition rndis.h:324
const char * name
Device name.
Definition rndis.h:322
int wait_rc
Return status code for current blocking request.
Definition rndis.h:331
void * priv
Driver private data.
Definition rndis.h:326
unsigned int wait_id
Request ID for current blocking request.
Definition rndis.h:329
RNDIS diagnostic information.
Definition rndis.h:170
uint32_t offset
Error offset.
Definition rndis.h:174
uint32_t status
Status.
Definition rndis.h:172
RNDIS halt message.
Definition rndis.h:95
uint32_t id
Request ID.
Definition rndis.h:97
RNDIS message header.
Definition rndis.h:24
uint32_t len
Message length.
Definition rndis.h:28
uint32_t type
Message type.
Definition rndis.h:26
RNDIS indicate status message.
Definition rndis.h:178
struct rndis_diagnostic_info diag[0]
Diagnostic information (optional)
Definition rndis.h:186
uint32_t len
Status buffer length.
Definition rndis.h:182
uint32_t status
Status.
Definition rndis.h:180
uint32_t offset
Status buffer offset.
Definition rndis.h:184
RNDIS initialise completion.
Definition rndis.h:68
uint32_t align
Packet alignment factor.
Definition rndis.h:86
uint32_t reserved[2]
Reserved.
Definition rndis.h:88
uint32_t medium
Medium.
Definition rndis.h:80
uint32_t status
Status.
Definition rndis.h:72
uint32_t minor
Minor version.
Definition rndis.h:76
uint32_t id
Request ID.
Definition rndis.h:70
uint32_t mtu
Maximum transfer size.
Definition rndis.h:84
uint32_t flags
Device flags.
Definition rndis.h:78
uint32_t major
Major version.
Definition rndis.h:74
uint32_t max_pkts
Maximum packets per transfer.
Definition rndis.h:82
RNDIS initialise message.
Definition rndis.h:35
uint32_t minor
Minor version.
Definition rndis.h:41
uint32_t mtu
Maximum transfer size.
Definition rndis.h:43
uint32_t major
Major version.
Definition rndis.h:39
uint32_t id
Request ID.
Definition rndis.h:37
RNDIS keepalive completion.
Definition rndis.h:212
uint32_t id
Request ID.
Definition rndis.h:214
uint32_t status
Status.
Definition rndis.h:216
RNDIS keepalive message.
Definition rndis.h:203
uint32_t id
Request ID.
Definition rndis.h:205
RNDIS query or set OID message.
Definition rndis.h:107
uint32_t reserved
Reserved.
Definition rndis.h:117
uint32_t len
Information buffer length.
Definition rndis.h:113
uint32_t oid
Object ID.
Definition rndis.h:111
uint32_t offset
Information buffer offset.
Definition rndis.h:115
uint32_t id
Request ID.
Definition rndis.h:109
RNDIS device operations.
Definition rndis.h:283
int(* open)(struct rndis_device *rndis)
Open RNDIS device.
Definition rndis.h:290
void(* poll)(struct rndis_device *rndis)
Poll for completed and received packets.
Definition rndis.h:314
void(* close)(struct rndis_device *rndis)
Close RNDIS device.
Definition rndis.h:296
int(* transmit)(struct rndis_device *rndis, struct io_buffer *iobuf)
Transmit packet.
Definition rndis.h:307
RNDIS packet field.
Definition rndis.h:223
uint32_t offset
Offset.
Definition rndis.h:225
uint32_t len
Length.
Definition rndis.h:227
RNDIS packet message.
Definition rndis.h:231
uint32_t oob_count
Number of out-of-band data records.
Definition rndis.h:237
struct rndis_packet_field ppi
Per-packet information record.
Definition rndis.h:239
uint32_t reserved[2]
Reserved.
Definition rndis.h:241
struct rndis_packet_field oob
Out-of-band data records.
Definition rndis.h:235
struct rndis_packet_field data
Data.
Definition rndis.h:233
RNDIS packet record.
Definition rndis.h:245
uint32_t len
Length.
Definition rndis.h:247
uint32_t offset
Offset.
Definition rndis.h:251
uint32_t type
Type.
Definition rndis.h:249
RNDIS query OID completion.
Definition rndis.h:124
uint32_t status
Status.
Definition rndis.h:128
uint32_t id
Request ID.
Definition rndis.h:126
uint32_t offset
Information buffer offset.
Definition rndis.h:132
uint32_t len
Information buffer length.
Definition rndis.h:130
RNDIS reset completion.
Definition rndis.h:159
uint32_t addr
Addressing reset.
Definition rndis.h:163
uint32_t status
Status.
Definition rndis.h:161
RNDIS reset message.
Definition rndis.h:150
uint32_t reserved
Reserved.
Definition rndis.h:152
RNDIS set OID completion.
Definition rndis.h:139
uint32_t status
Status.
Definition rndis.h:143
uint32_t id
Request ID.
Definition rndis.h:141