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 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 FILE_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 */
24 struct rndis_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 */
196  RNDIS_STATUS_WTF_WORLD = 0x40020006UL,
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 */
262  RNDIS_FILTER_MULTICAST = 0x00000002UL,
263  /** All multicast packets */
265  /** Broadcast packets */
266  RNDIS_FILTER_BROADCAST = 0x00000008UL,
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 
280 struct 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 */
318 struct 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 */
331  int wait_rc;
332 };
333 
334 /**
335  * Initialise an RNDIS device
336  *
337  * @v rndis RNDIS device
338  * @v op RNDIS device operations
339  */
340 static inline void rndis_init ( struct rndis_device *rndis,
341  struct rndis_operations *op ) {
342 
343  rndis->op = op;
344 }
345 
346 extern void rndis_tx_complete_err ( struct rndis_device *rndis,
347  struct io_buffer *iobuf, int rc );
348 extern int rndis_tx_defer ( struct rndis_device *rndis,
349  struct io_buffer *iobuf );
350 extern void rndis_rx ( struct rndis_device *rndis, struct io_buffer *iobuf );
351 extern void rndis_rx_err ( struct rndis_device *rndis, struct io_buffer *iobuf,
352  int rc );
353 
354 extern struct rndis_device * alloc_rndis ( size_t priv_len );
355 extern int register_rndis ( struct rndis_device *rndis );
356 extern void unregister_rndis ( struct rndis_device *rndis );
357 extern 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  */
365 static 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 */
#define __attribute__(x)
Definition: compiler.h:10
Unknown start-of-day status code.
Definition: rndis.h:196
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
rndis_packet_filter
Packet filter bits.
Definition: rndis.h:258
int(* open)(struct rndis_device *rndis)
Open RNDIS device.
Definition: rndis.h:290
const char * name
Device name.
Definition: rndis.h:322
void rndis_rx_err(struct rndis_device *rndis, struct io_buffer *iobuf, int rc)
Discard packet from underlying transport layer.
Definition: rndis.c:867
uint32_t oid
Object ID.
Definition: rndis.h:111
uint32_t flags
Device flags.
Definition: rndis.h:78
uint32_t status
Status.
Definition: rndis.h:216
uint32_t reserved[2]
Reserved.
Definition: rndis.h:88
Multicast packets.
Definition: rndis.h:262
void free_rndis(struct rndis_device *rndis)
Free RNDIS device.
Definition: rndis.c:1067
static void rndis_tx_complete(struct rndis_device *rndis, struct io_buffer *iobuf)
Complete message transmission.
Definition: rndis.h:365
I/O buffers.
RNDIS query OID completion.
Definition: rndis.h:124
uint32_t len
Message length.
Definition: rndis.h:28
uint32_t minor
Minor version.
Definition: rndis.h:41
uint32_t status
Status.
Definition: rndis.h:172
uint32_t major
Major version.
Definition: rndis.h:39
Unicast packets.
Definition: rndis.h:260
RNDIS query or set OID message.
Definition: rndis.h:107
RNDIS initialise message.
Definition: rndis.h:35
void(* close)(struct rndis_device *rndis)
Close RNDIS device.
Definition: rndis.h:296
uint32_t addr
Addressing reset.
Definition: rndis.h:163
RNDIS initialise completion.
Definition: rndis.h:68
struct rndis_diagnostic_info diag[0]
Diagnostic information (optional)
Definition: rndis.h:186
void unregister_rndis(struct rndis_device *rndis)
Unregister RNDIS device.
Definition: rndis.c:1055
uint32_t id
Request ID.
Definition: rndis.h:70
Device is connected to a network medium.
Definition: rndis.h:192
uint32_t max_pkts
Maximum packets per transfer.
Definition: rndis.h:82
uint32_t offset
Error offset.
Definition: rndis.h:174
RNDIS diagnostic information.
Definition: rndis.h:170
RNDIS keepalive completion.
Definition: rndis.h:212
uint32_t len
Length.
Definition: rndis.h:247
int(* transmit)(struct rndis_device *rndis, struct io_buffer *iobuf)
Transmit packet.
Definition: rndis.h:307
uint32_t status
Status.
Definition: rndis.h:180
uint32_t offset
Offset.
Definition: rndis.h:251
RNDIS packet field.
Definition: rndis.h:223
uint32_t offset
Status buffer offset.
Definition: rndis.h:184
uint32_t type
Message type.
Definition: rndis.h:26
uint32_t id
Request ID.
Definition: rndis.h:126
uint32_t status
Status.
Definition: rndis.h:128
struct rndis_packet_field oob
Out-of-band data records.
Definition: rndis.h:235
struct net_device * netdev
Network device.
Definition: rndis.h:320
unsigned int wait_id
Request ID for current blocking request.
Definition: rndis.h:329
struct rndis_operations * op
RNDIS operations.
Definition: rndis.h:324
uint32_t type
Type.
Definition: rndis.h:249
An RNDIS device.
Definition: rndis.h:318
RNDIS reset message.
Definition: rndis.h:150
uint32_t mtu
Maximum transfer size.
Definition: rndis.h:84
struct rndis_packet_field ppi
Per-packet information record.
Definition: rndis.h:239
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
rndis_status
RNDIS status codes.
Definition: rndis.h:190
uint32_t offset
Offset.
Definition: rndis.h:225
void rndis_rx(struct rndis_device *rndis, struct io_buffer *iobuf)
Receive packet from underlying transport layer.
Definition: rndis.c:830
RNDIS keepalive message.
Definition: rndis.h:203
uint32_t id
Request ID.
Definition: rndis.h:205
int register_rndis(struct rndis_device *rndis)
Register RNDIS device.
Definition: rndis.c:1027
uint32_t len
Information buffer length.
Definition: rndis.h:113
RNDIS packet message.
Definition: rndis.h:231
All multicast packets.
Definition: rndis.h:264
uint32_t len
Length.
Definition: rndis.h:227
uint32_t len
Status buffer length.
Definition: rndis.h:182
uint32_t reserved
Reserved.
Definition: rndis.h:117
A network device.
Definition: netdevice.h:353
uint32_t id
Request ID.
Definition: rndis.h:141
uint32_t reserved[2]
Reserved.
Definition: rndis.h:241
void(* poll)(struct rndis_device *rndis)
Poll for completed and received packets.
Definition: rndis.h:314
uint32_t medium
Medium.
Definition: rndis.h:80
uint32_t len
Information buffer length.
Definition: rndis.h:130
RNDIS device operations.
Definition: rndis.h:283
uint32_t id
Request ID.
Definition: rndis.h:37
unsigned int uint32_t
Definition: stdint.h:12
static void rndis_init(struct rndis_device *rndis, struct rndis_operations *op)
Initialise an RNDIS device.
Definition: rndis.h:340
FILE_SECBOOT(PERMITTED)
uint32_t id
Request ID.
Definition: rndis.h:97
uint32_t offset
Information buffer offset.
Definition: rndis.h:132
Network device management.
RNDIS halt message.
Definition: rndis.h:95
RNDIS message header.
Definition: rndis.h:24
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
All packets.
Definition: rndis.h:268
int rndis_tx_defer(struct rndis_device *rndis, struct io_buffer *iobuf)
Defer transmitted packet.
Definition: rndis.c:191
uint32_t align
Packet alignment factor.
Definition: rndis.h:86
void * priv
Driver private data.
Definition: rndis.h:326
uint32_t status
Status.
Definition: rndis.h:72
int wait_rc
Return status code for current blocking request.
Definition: rndis.h:331
struct rndis_packet_field data
Data.
Definition: rndis.h:233
uint32_t status
Status.
Definition: rndis.h:161
RNDIS packet record.
Definition: rndis.h:245
Broadcast packets.
Definition: rndis.h:266
void rndis_tx_complete_err(struct rndis_device *rndis, struct io_buffer *iobuf, int rc)
Complete message transmission.
Definition: rndis.c:128
uint32_t reserved
Reserved.
Definition: rndis.h:152
RNDIS reset completion.
Definition: rndis.h:159
uint32_t mtu
Maximum transfer size.
Definition: rndis.h:43
uint32_t minor
Minor version.
Definition: rndis.h:76
uint32_t id
Request ID.
Definition: rndis.h:109
RNDIS set OID completion.
Definition: rndis.h:139
uint32_t id
Request ID.
Definition: rndis.h:214
Device is disconnected from the medium.
Definition: rndis.h:194
struct rndis_device * alloc_rndis(size_t priv_len)
Allocate RNDIS device.
Definition: rndis.c:1001
uint32_t offset
Information buffer offset.
Definition: rndis.h:115
RNDIS indicate status message.
Definition: rndis.h:178
uint32_t major
Major version.
Definition: rndis.h:74
uint32_t oob_count
Number of out-of-band data records.
Definition: rndis.h:237
uint32_t status
Status.
Definition: rndis.h:143
A persistent I/O buffer.
Definition: iobuf.h:38