60657a324f43a3bb89c04abc6d9d86834ab6b63b
[people/xl0/gpxe.git] / src / include / pxe_api.h
1 #ifndef PXE_API_H
2 #define PXE_API_H
3
4 /** @file
5  *
6  * Preboot eXecution Environment (PXE) API
7  *
8  */
9
10 #include "pxe_types.h"
11
12 /** @addtogroup pxe Preboot eXecution Environment (PXE) API
13  *  @{
14  */
15
16 /** @defgroup pxe_preboot_api PXE Preboot API
17  *
18  * General high-level functions: #PXENV_UNLOAD_STACK, #PXENV_START_UNDI etc.
19  *
20  * @{
21  */
22
23 /** @defgroup pxenv_unload_stack PXENV_UNLOAD_STACK
24  *
25  *  UNLOAD BASE CODE STACK
26  *
27  *  @{
28  */
29
30 /** PXE API function code for pxenv_unload_stack() */
31 #define PXENV_UNLOAD_STACK              0x0070
32
33 /** Parameter block for pxenv_unload_stack() */
34 struct s_PXENV_UNLOAD_STACK {
35         PXENV_STATUS_t Status;                  /**< PXE status code */
36         UINT8_t reserved[10];                   /**< Must be zero */
37 } PACKED;
38
39 typedef struct s_PXENV_UNLOAD_STACK PXENV_UNLOAD_STACK_t;
40
41 extern PXENV_EXIT_t pxenv_unload_stack ( struct s_PXENV_UNLOAD_STACK
42                                          *unload_stack );
43
44 /** @} */ /* pxenv_unload_stack */
45
46 /** @defgroup pxenv_get_cached_info PXENV_GET_CACHED_INFO
47  *
48  *  GET CACHED INFO
49  *
50  *  @{
51  */
52
53 /** PXE API function code for pxenv_get_cached_info() */
54 #define PXENV_GET_CACHED_INFO           0x0071
55
56 /** The client's DHCPDISCOVER packet */
57 #define PXENV_PACKET_TYPE_DHCP_DISCOVER 1
58
59 /** The DHCP server's DHCPACK packet */
60 #define PXENV_PACKET_TYPE_DHCP_ACK      2
61
62 /** The Boot Server's Discover Reply packet
63  *
64  * This packet contains DHCP option 60 set to "PXEClient", a valid
65  * boot file name, and may or may not contain MTFTP options.
66  */
67 #define PXENV_PACKET_TYPE_CACHED_REPLY  3
68
69 /** Parameter block for pxenv_get_cached_info() */
70 struct s_PXENV_GET_CACHED_INFO {
71         PXENV_STATUS_t Status;                  /**< PXE status code */
72         /** Packet type.
73          *
74          * Valid values are #PXENV_PACKET_TYPE_DHCP_DISCOVER,
75          * #PXENV_PACKET_TYPE_DHCP_ACK or #PXENV_PACKET_TYPE_CACHED_REPLY
76          */
77         UINT16_t PacketType;
78         UINT16_t BufferSize;                    /**< Buffer size */
79         SEGOFF16_t Buffer;                      /**< Buffer address */
80         UINT16_t BufferLimit;                   /**< Maximum buffer size */
81 } PACKED;
82
83 typedef struct s_PXENV_GET_CACHED_INFO PXENV_GET_CACHED_INFO_t;
84
85 #define BOOTP_REQ       1       /**< A BOOTP request packet */
86 #define BOOTP_REP       2       /**< A BOOTP reply packet */
87
88 /** DHCP broadcast flag
89  *
90  * Request a broadcast response (DHCPOFFER or DHCPACK) from the DHCP
91  * server.
92  */
93 #define BOOTP_BCAST     0x8000
94
95 #define VM_RFC1048      0x63825363L     /**< DHCP magic cookie */
96
97 /** Format of buffer filled in by pxenv_get_cached_info()
98  *
99  * This somewhat convoluted data structure simply describes the layout
100  * of a DHCP packet.  Refer to RFC2131 section 2 for a full
101  * description.
102  */
103 struct bootph {
104         /** Message opcode.
105          *
106          * Valid values are #BOOTP_REQ and #BOOTP_REP.
107          */
108         UINT8_t opcode;
109         /** NIC hardware type.
110          *
111          * Valid values are as for s_PXENV_UNDI_GET_INFORMATION::HwType.
112          */
113         UINT8_t Hardware;
114         UINT8_t Hardlen;                /**< MAC address length */
115         /** Gateway hops
116          *
117          * Zero in packets sent by the client.  May be non-zero in
118          * replies from the DHCP server, if the reply comes via a DHCP
119          * relay agent.
120          */
121         UINT8_t Gatehops;
122         UINT32_t ident;                 /**< DHCP transaction id (xid) */
123         /** Elapsed time
124          *
125          * Number of seconds since the client began the DHCP
126          * transaction.
127          */
128         UINT16_t seconds;
129         /** Flags
130          *
131          * This is the bitwise-OR of any of the following values:
132          * #BOOTP_BCAST.
133          */
134         UINT16_t Flags;
135         /** Client IP address
136          *
137          * Set only if the client already has an IP address.
138          */
139         IP4_t cip;
140         /** Your IP address
141          *
142          * This is the IP address that the server assigns to the
143          * client.
144          */
145         IP4_t yip;
146         /** Server IP address
147          *
148          * This is the IP address of the BOOTP/DHCP server.
149          */
150         IP4_t sip;
151         /** Gateway IP address
152          *
153          * This is the IP address of the BOOTP/DHCP relay agent, if
154          * any.  It is @b not (necessarily) the address of the default
155          * gateway for routing purposes.
156          */
157         IP4_t gip;
158         MAC_ADDR_t CAddr;               /**< Client MAC address */
159         UINT8_t Sname[64];              /**< Server host name */
160         UINT8_t bootfile[128];          /**< Boot file name */
161         /** DHCP options
162          *
163          * Don't ask.  Just laugh.  Then burn a copy of the PXE
164          * specification and send Intel an e-mail asking them if
165          * they've figured out what a "union" does in C yet.
166          */
167         union bootph_vendor {
168                 UINT8_t d[BOOTP_DHCPVEND]; /**< DHCP options */
169                 /** DHCP options */
170                 struct bootph_vendor_v {
171                         /** DHCP magic cookie
172                          *
173                          * Should have the value #VM_RFC1048.
174                          */
175                         UINT8_t magic[4];
176                         UINT32_t flags; /**< BOOTP flags/opcodes */
177                         /** "End of BOOTP vendor extensions"
178                          *
179                          * Abandon hope, all ye who consider the
180                          * purpose of this field.
181                          */
182                         UINT8_t pad[56];
183                 } v;
184         } vendor;
185 } PACKED;
186
187 typedef struct bootph BOOTPLAYER_t;
188
189 extern PXENV_EXIT_t pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO
190                                             *get_cached_info );
191
192 /** @} */ /* pxenv_get_cached_info */
193
194 /** @defgroup pxenv_restart_tftp PXENV_RESTART_TFTP
195  *
196  *  RESTART TFTP
197  *
198  *  @{
199  */
200
201 /** PXE API function code for pxenv_restart_tftp() */
202 #define PXENV_RESTART_TFTP              0x0073
203
204 /** Parameter block for pxenv_restart_tftp() */
205 struct s_PXENV_TFTP_READ_FILE;
206
207 typedef struct s_PXENV_RESTART_TFTP PXENV_RESTART_TFTP_t;
208
209 extern PXENV_EXIT_t pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE
210                                          *restart_tftp );
211
212 /** @} */ /* pxenv_restart_tftp */
213
214 /** @defgroup pxenv_start_undi PXENV_START_UNDI
215  *
216  *  START UNDI
217  *
218  *  @{
219  */
220
221 /** PXE API function code for pxenv_start_undi() */
222 #define PXENV_START_UNDI                0x0000
223
224 /** Parameter block for pxenv_start_undi() */
225 struct s_PXENV_START_UNDI {
226         PXENV_STATUS_t Status;                  /**< PXE status code */
227         /** %ax register as passed to the Option ROM initialisation routine.
228          *
229          * For a PCI device, this should contain the bus:dev:fn value
230          * that uniquely identifies the PCI device in the system.  For
231          * a non-PCI device, this field is not defined.
232          */
233         UINT16_t AX;
234         /** %bx register as passed to the Option ROM initialisation routine.
235          *
236          * For an ISAPnP device, this should contain the Card Select
237          * Number assigned to the ISAPnP card.  For non-ISAPnP
238          * devices, this should contain 0xffff.
239          */
240         UINT16_t BX;
241         /** %dx register as passed to the Option ROM initialisation routine.
242          *
243          * For an ISAPnP device, this should contain the ISAPnP Read
244          * Port address as currently set in all ISAPnP cards.  If
245          * there are no ISAPnP cards, this should contain 0xffff.  (If
246          * this is a non-ISAPnP device, but there are ISAPnP cards in
247          * the system, this value is not well defined.)
248          */
249         UINT16_t DX;
250         /** %di register as passed to the Option ROM initialisation routine.
251          *
252          * This contains the #OFF16_t portion of a struct #s_SEGOFF16
253          * that points to the System BIOS Plug and Play Installation
254          * Check Structure.  (Refer to section 4.4 of the Plug and
255          * Play BIOS specification for a description of this
256          * structure.)
257          *
258          * @note The PXE specification defines the type of this field
259          * as #UINT16_t.  For x86, #OFF16_t and #UINT16_t are
260          * equivalent anyway; for other architectures #OFF16_t makes
261          * more sense.
262          */
263         OFF16_t DI;
264         /** %es register as passed to the Option ROM initialisation routine.
265          *
266          * This contains the #SEGSEL_t portion of a struct #s_SEGOFF16
267          * that points to the System BIOS Plug and Play Installation
268          * Check Structure.  (Refer to section 4.4 of the Plug and
269          * Play BIOS specification for a description of this
270          * structure.)
271          *
272          * @note The PXE specification defines the type of this field
273          * as #UINT16_t.  For x86, #SEGSEL_t and #UINT16_t are
274          * equivalent anyway; for other architectures #SEGSEL_t makes
275          * more sense.
276          */
277         SEGSEL_t ES;
278 } PACKED;
279
280 typedef struct s_PXENV_START_UNDI PXENV_START_UNDI_t;
281
282 extern PXENV_EXIT_t pxenv_start_undi ( struct s_PXENV_START_UNDI *start_undi );
283
284 /** @} */ /* pxenv_start_undi */
285
286 /** @defgroup pxenv_stop_undi PXENV_STOP_UNDI
287  *
288  *  STOP UNDI
289  *
290  *  @{
291  */
292
293 /** PXE API function code for pxenv_stop_undi() */
294 #define PXENV_STOP_UNDI                 0x0015
295
296 /** Parameter block for pxenv_stop_undi() */
297 struct s_PXENV_STOP_UNDI {
298         PXENV_STATUS_t Status;                  /**< PXE status code */
299 } PACKED;
300
301 typedef struct s_PXENV_STOP_UNDI PXENV_STOP_UNDI_t;
302
303 extern PXENV_EXIT_t pxenv_stop_undi ( struct s_PXENV_STOP_UNDI *stop_undi );
304
305 /** @} */ /* pxenv_stop_undi */
306
307 /** @defgroup pxenv_start_base PXENV_START_BASE
308  *
309  *  START BASE
310  *
311  *  @{
312  */
313
314 /** PXE API function code for pxenv_start_base() */
315 #define PXENV_START_BASE                0x0075
316
317 /** Parameter block for pxenv_start_base() */
318 struct s_PXENV_START_BASE {
319         PXENV_STATUS_t Status;                  /**< PXE status code */
320 } PACKED;
321
322 typedef struct s_PXENV_START_BASE PXENV_START_BASE_t;
323
324 extern PXENV_EXIT_t pxenv_start_base ( struct s_PXENV_START_BASE *start_base );
325
326 /** @} */ /* pxenv_start_base */
327
328 /** @defgroup pxenv_stop_base PXENV_STOP_BASE
329  *
330  *  STOP BASE
331  *
332  *  @{
333  */
334
335 /** PXE API function code for pxenv_stop_base() */
336 #define PXENV_STOP_BASE                 0x0076
337
338 /** Parameter block for pxenv_stop_base() */
339 struct s_PXENV_STOP_BASE {
340         PXENV_STATUS_t Status;                  /**< PXE status code */
341 } PACKED;
342
343 typedef struct s_PXENV_STOP_BASE PXENV_STOP_BASE_t;
344
345 extern PXENV_EXIT_t pxenv_stop_base ( struct s_PXENV_STOP_BASE *stop_base );
346
347 /** @} */ /* pxenv_stop_base */
348
349 /** @} */ /* pxe_preboot_api */
350
351 /** @defgroup pxe_tftp_api PXE TFTP API
352  *
353  * Download files via TFTP or MTFTP
354  *
355  * @{
356  */
357
358 /** @defgroup pxenv_tftp_open PXENV_TFTP_OPEN
359  *
360  *  TFTP OPEN
361  *
362  *  @{
363  */
364
365 /** PXE API function code for pxenv_tftp_open() */
366 #define PXENV_TFTP_OPEN                 0x0020
367
368 /** Parameter block for pxenv_tftp_open() */
369 struct s_PXENV_TFTP_OPEN {
370         PXENV_STATUS_t Status;                  /**< PXE status code */
371         IP4_t ServerIPAddress;                  /**< TFTP server IP address */
372         IP4_t GatewayIPAddress;                 /**< Relay agent IP address */
373         UINT8_t FileName[128];                  /**< File name */
374         UDP_PORT_t TFTPPort;                    /**< TFTP server UDP port */
375         /** Requested size of TFTP packets
376          *
377          * This is the TFTP "blksize" option.  This must be at least
378          * 512, according to the PXE specification, though no reason
379          * is offered.
380          */
381         UINT16_t PacketSize;
382 } PACKED;
383
384 typedef struct s_PXENV_TFTP_OPEN PXENV_TFTP_OPEN_t;
385
386 extern PXENV_EXIT_t pxenv_tftp_open ( struct s_PXENV_TFTP_OPEN *tftp_open );
387
388 /** @} */ /* pxenv_tftp_open */
389
390 /** @defgroup pxenv_tftp_close PXENV_TFTP_CLOSE
391  *
392  *  TFTP CLOSE
393  *
394  *  @{
395  */
396
397 /** PXE API function code for pxenv_tftp_close() */
398 #define PXENV_TFTP_CLOSE                0x0021
399
400 /** Parameter block for pxenv_tftp_close() */
401 struct s_PXENV_TFTP_CLOSE {
402         PXENV_STATUS_t Status;                  /**< PXE status code */
403 } PACKED;
404
405 typedef struct s_PXENV_TFTP_CLOSE PXENV_TFTP_CLOSE_t;
406
407 extern PXENV_EXIT_t pxenv_tftp_close ( struct s_PXENV_TFTP_CLOSE *tftp_close );
408
409 /** @} */ /* pxenv_tftp_close */
410
411 /** @defgroup pxenv_tftp_read PXENV_TFTP_READ
412  *
413  *  TFTP READ
414  *
415  *  @{
416  */
417
418 /** PXE API function code for pxenv_tftp_read() */
419 #define PXENV_TFTP_READ                 0x0022
420
421 /** Parameter block for pxenv_tftp_read() */
422 struct s_PXENV_TFTP_READ {
423         PXENV_STATUS_t Status;                  /**< PXE status code */
424         UINT16_t PacketNumber;                  /**< TFTP packet number */
425         UINT16_t BufferSize;                    /**< Size of data buffer */
426         SEGOFF16_t Buffer;                      /**< Address of data buffer */
427 } PACKED;
428
429 typedef struct s_PXENV_TFTP_READ PXENV_TFTP_READ_t;
430
431 extern PXENV_EXIT_t pxenv_tftp_read ( struct s_PXENV_TFTP_READ *tftp_read );
432
433 /** @} */ /* pxenv_tftp_read */
434
435 /** @defgroup pxenv_tftp_read_file PXENV_TFTP_READ_FILE
436  *
437  *  TFTP/MTFTP READ FILE
438  *
439  *  @{
440  */
441
442 /** PXE API function code for pxenv_tftp_read_file() */
443 #define PXENV_TFTP_READ_FILE            0x0023
444
445 /** Parameter block for pxenv_tftp_read_file() */
446 struct s_PXENV_TFTP_READ_FILE {
447         PXENV_STATUS_t Status;                  /**< PXE status code */
448         UINT8_t FileName[128];                  /**< File name */
449         UINT32_t BufferSize;                    /**< Size of data buffer */
450         ADDR32_t Buffer;                        /**< Address of data buffer */
451         IP4_t ServerIPAddress;                  /**< TFTP server IP address */
452         IP4_t GatewayIPAddress;                 /**< Relay agent IP address */
453         /** File multicast IP address */
454         IP4_t McastIPAddress;
455         /** Client multicast listening port */
456         UDP_PORT_t TFTPClntPort;
457         /** Server multicast listening port */
458         UDP_PORT_t TFTPSrvPort;
459         /** Timeout for receiving data or ACK packets */
460         UINT16_t TFTPOpenTimeOut;
461         /** Timeout before issuing MTFTP open */
462         UINT16_t TFTPReopenDelay;
463 } PACKED;
464
465 typedef struct s_PXENV_TFTP_READ_FILE PXENV_TFTP_READ_FILE_t;
466
467 extern PXENV_EXIT_t pxenv_tftp_read_file ( struct s_PXENV_TFTP_READ_FILE
468                                            *tftp_read_file );
469
470 /** @} */ /* pxenv_tftp_read_file */
471
472 /** @defgroup pxenv_tftp_get_fsize PXENV_TFTP_GET_FSIZE
473  *
474  *  TFTP GET FILE SIZE
475  *
476  *  @{
477  */
478
479 /** PXE API function code for pxenv_tftp_get_fsize() */
480 #define PXENV_TFTP_GET_FSIZE            0x0025
481
482 /** Parameter block for pxenv_tftp_get_fsize() */
483 struct s_PXENV_TFTP_GET_FSIZE {
484         PXENV_STATUS_t Status;                  /**< PXE status code */
485         IP4_t ServerIPAddress;                  /**< TFTP server IP address */
486         IP4_t GatewayIPAddress;                 /**< Relay agent IP address */
487         UINT8_t FileName[128];                  /**< File name */
488         UINT32_t FileSize;                      /**< Size of the file */
489 } PACKED;
490
491 typedef struct s_PXENV_TFTP_GET_FSIZE PXENV_TFTP_GET_FSIZE_t;
492
493 extern PXENV_EXIT_t pxenv_tftp_get_fsize ( struct s_PXENV_TFTP_GET_FSIZE
494                                            *get_fsize );
495
496 /** @} */ /* pxenv_tftp_get_fsize */
497
498 /** @} */ /* pxe_tftp_api */
499
500 /** @defgroup pxe_udp_api PXE UDP API
501  *
502  * Transmit and receive UDP packets
503  *
504  * @{
505  */
506
507 /** @defgroup pxenv_udp_open PXENV_UDP_OPEN
508  *
509  *  UDP OPEN
510  *
511  *  @{
512  */
513
514 /** PXE API function code for pxenv_udp_open() */
515 #define PXENV_UDP_OPEN                  0x0030
516
517 /** Parameter block for pxenv_udp_open() */
518 struct s_PXENV_UDP_OPEN {
519         PXENV_STATUS_t  Status;         /**< PXE status code */
520         IP4_t           src_ip;         /**< IP address of this station */
521 } PACKED;
522
523 typedef struct s_PXENV_UDP_OPEN PXENV_UDP_OPEN_t;
524
525 extern PXENV_EXIT_t pxenv_udp_open ( struct s_PXENV_UDP_OPEN *udp_open );
526
527 /** @} */ /* pxenv_udp_open */
528
529 /** @defgroup pxenv_udp_close PXENV_UDP_CLOSE
530  *
531  *  UDP CLOSE
532  *
533  *  @{
534  */
535
536 /** PXE API function code for pxenv_udp_close() */
537 #define PXENV_UDP_CLOSE                 0x0031
538
539 /** Parameter block for pxenv_udp_close() */
540 struct s_PXENV_UDP_CLOSE {
541         PXENV_STATUS_t  Status;         /**< PXE status code */
542 } PACKED;
543
544 typedef struct s_PXENV_UDP_CLOSE PXENV_UDP_CLOSE_t;
545
546 extern PXENV_EXIT_t pxenv_udp_close ( struct s_PXENV_UDP_CLOSE *udp_close );
547
548 /** @} */ /* pxenv_udp_close */
549
550 /** @defgroup pxenv_udp_write PXENV_UDP_WRITE
551  *
552  *  UDP WRITE
553  *
554  *  @{
555  */
556
557 /** PXE API function code for pxenv_udp_write() */
558 #define PXENV_UDP_WRITE                 0x0033
559
560 /** Parameter block for pxenv_udp_write() */
561 struct s_PXENV_UDP_WRITE {
562         PXENV_STATUS_t  Status;         /**< PXE status code */
563         IP4_t           ip;             /**< Destination IP address */
564         IP4_t           gw;             /**< Relay agent IP address */
565         UDP_PORT_t      src_port;       /**< Source UDP port */
566         UDP_PORT_t      dst_port;       /**< Destination UDP port */
567         UINT16_t        buffer_size;    /**< UDP payload buffer size */
568         SEGOFF16_t      buffer;         /**< UDP payload buffer address */
569 } PACKED;
570
571 typedef struct s_PXENV_UDP_WRITE PXENV_UDP_WRITE_t;
572
573 extern PXENV_EXIT_t pxenv_udp_write ( struct s_PXENV_UDP_WRITE *udp_write );
574
575 /** @} */ /* pxenv_udp_write */
576
577 /** @defgroup pxenv_udp_read PXENV_UDP_READ
578  *
579  *  UDP READ
580  *
581  *  @{
582  */
583
584 /** PXE API function code for pxenv_udp_read() */
585 #define PXENV_UDP_READ                  0x0032
586
587 /** Parameter block for pxenv_udp_read() */
588 struct s_PXENV_UDP_READ {
589         PXENV_STATUS_t  Status;         /**< PXE status code */
590         IP4_t           src_ip;         /**< Source IP address */
591         IP4_t           dest_ip;        /**< Destination IP address */
592         UDP_PORT_t      s_port;         /**< Source UDP port */
593         UDP_PORT_t      d_port;         /**< Destination UDP port */
594         UINT16_t        buffer_size;    /**< UDP payload buffer size */
595         SEGOFF16_t      buffer;         /**< UDP payload buffer address */
596 } PACKED;
597
598 typedef struct s_PXENV_UDP_READ PXENV_UDP_READ_t;
599
600 extern PXENV_EXIT_t pxenv_udp_read ( struct s_PXENV_UDP_READ *udp_read );
601
602 /** @} */ /* pxenv_udp_read */
603
604 /** @} */ /* pxe_udp_api */
605
606 /** @defgroup pxe_undi_api PXE UNDI API
607  *
608  * Direct control of the network interface card
609  *
610  * @{
611  */
612
613 /** @defgroup pxenv_undi_startup PXENV_UNDI_STARTUP
614  *
615  *  UNDI STARTUP
616  *
617  *  @{
618  */
619
620 /** PXE API function code for pxenv_undi_startup() */
621 #define PXENV_UNDI_STARTUP              0x0001
622
623 /** Parameter block for pxenv_undi_startup() */
624 struct s_PXENV_UNDI_STARTUP {
625         PXENV_STATUS_t  Status;         /**< PXE status code */
626 } PACKED;
627
628 typedef struct s_PXENV_UNDI_STARTUP PXENV_UNDI_STARTUP_t;
629
630 extern PXENV_EXIT_t pxenv_undi_startup ( struct s_PXENV_UNDI_STARTUP
631                                          *undi_startup );
632
633 /** @} */ /* pxenv_undi_startup */
634
635 /** @defgroup pxenv_undi_cleanup PXENV_UNDI_CLEANUP
636  *
637  *  UNDI CLEANUP
638  *
639  *  @{
640  */
641
642 /** PXE API function code for pxenv_undi_cleanup() */
643 #define PXENV_UNDI_CLEANUP              0x0002
644
645 /** Parameter block for pxenv_undi_cleanup() */
646 struct s_PXENV_UNDI_CLEANUP {
647         PXENV_STATUS_t  Status;         /**< PXE status code */
648 } PACKED;
649
650 typedef struct s_PXENV_UNDI_CLEANUP PXENV_UNDI_CLEANUP_t;
651
652 extern PXENV_EXIT_t pxenv_undi_cleanup ( struct s_PXENV_UNDI_CLEANUP
653                                          *undi_cleanup );
654
655 /** @} */ /* pxenv_undi_cleanup */
656
657 /** @defgroup pxenv_undi_initialize PXENV_UNDI_INITIALIZE
658  *
659  *  UNDI INITIALIZE
660  *
661  *  @{
662  */
663
664 /** PXE API function code for pxenv_undi_initialize() */
665 #define PXENV_UNDI_INITIALIZE           0x0003
666
667 /** Parameter block for pxenv_undi_initialize() */
668 struct s_PXENV_UNDI_INITIALIZE {
669         PXENV_STATUS_t  Status;         /**< PXE status code */
670         /** NDIS 2.0 configuration information, or NULL
671          *
672          * This is a pointer to the data structure returned by the
673          * NDIS 2.0 GetProtocolManagerInfo() API call.  The data
674          * structure is documented, in a rather haphazard way, in
675          * section 4-17 of the NDIS 2.0 specification.
676          */
677         ADDR32_t ProtocolIni;
678         UINT8_t reserved[8];            /**< Must be zero */
679 } PACKED;
680
681 typedef struct s_PXENV_UNDI_INITIALIZE PXENV_UNDI_INITIALIZE_t;
682
683 extern PXENV_EXIT_t pxenv_undi_initialize ( struct s_PXENV_UNDI_INITIALIZE
684                                             *undi_initialize );
685
686 /** @} */ /* pxenv_undi_initialize */
687
688 /** @defgroup pxenv_undi_reset_adapter PXENV_UNDI_RESET_ADAPTER
689  *
690  *  UNDI RESET ADAPTER
691  *
692  *  @{
693  */
694
695 /** PXE API function code for pxenv_undi_reset_adapter() */
696 #define PXENV_UNDI_RESET_ADAPTER        0x0004
697
698 /** Maximum number of multicast MAC addresses */
699 #define MAXNUM_MCADDR   8
700
701 /** List of multicast MAC addresses */
702 struct s_PXENV_UNDI_MCAST_ADDRESS {
703         /** Number of multicast MAC addresses */
704         UINT16_t MCastAddrCount;
705         /** List of up to #MAXNUM_MCADDR multicast MAC addresses */
706         MAC_ADDR_t McastAddr[MAXNUM_MCADDR];
707 } PACKED;
708
709 typedef struct s_PXENV_UNDI_MCAST_ADDRESS PXENV_UNDI_MCAST_ADDRESS_t;
710
711 /** Parameter block for pxenv_undi_reset_adapter() */
712 struct s_PXENV_UNDI_RESET_ADAPTER {
713         PXENV_STATUS_t  Status;         /**< PXE status code */
714         /** Multicast MAC addresses */
715         struct s_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
716 } PACKED;
717
718 typedef struct s_PXENV_UNDI_RESET_ADAPTER PXENV_UNDI_RESET_ADAPTER_t;
719
720 extern PXENV_EXIT_t pxenv_undi_reset_adapter ( struct s_PXENV_UNDI_RESET
721                                                *undi_reset_adapter );
722
723 /** @} */ /* pxenv_undi_reset_adapter */
724
725 /** @defgroup pxenv_undi_shutdown PXENV_UNDI_SHUTDOWN
726  *
727  *  UNDI SHUTDOWN
728  *
729  *  @{
730  */
731
732 /** PXE API function code for pxenv_undi_shutdown() */
733 #define PXENV_UNDI_SHUTDOWN             0x0005
734
735 /** Parameter block for pxenv_undi_shutdown() */
736 struct s_PXENV_UNDI_SHUTDOWN {
737         PXENV_STATUS_t  Status;         /**< PXE status code */
738 } PACKED;
739
740 typedef struct s_PXENV_UNDI_SHUTDOWN PXENV_UNDI_SHUTDOWN_t;
741
742 extern PXENV_EXIT_t pxenv_undi_shutdown ( struct s_PXENV_UNDI_SHUTDOWN
743                                           *undi_shutdown );
744
745 /** @} */ /* pxenv_undi_shutdown */
746
747 /** @defgroup pxenv_undi_open PXENV_UNDI_OPEN
748  *
749  *  UNDI OPEN
750  *
751  *  @{
752  */
753
754 /** PXE API function code for pxenv_undi_open() */
755 #define PXENV_UNDI_OPEN                 0x0006
756
757 /** Accept "directed" packets
758  *
759  * These are packets addresses to either this adapter's MAC address or
760  * to any of the configured multicast MAC addresses (see
761  * #s_PXENV_UNDI_MCAST_ADDRESS).
762  */
763 #define FLTR_DIRECTED   0x0001
764 /** Accept broadcast packets */
765 #define FLTR_BRDCST     0x0002
766 /** Accept all packets; listen in promiscuous mode */
767 #define FLTR_PRMSCS     0x0004
768 /** Accept source-routed packets */
769 #define FLTR_SRC_RTG    0x0008
770
771 /** Parameter block for pxenv_undi_open() */
772 struct s_PXENV_UNDI_OPEN {
773         PXENV_STATUS_t  Status;         /**< PXE status code */
774         /** Open flags as defined in NDIS 2.0
775          *
776          * This is the OpenOptions field as passed to the NDIS 2.0
777          * OpenAdapter() API call.  It is defined to be "adapter
778          * specific", though 0 is guaranteed to be a valid value.
779          */
780         UINT16_t OpenFlag;
781         /** Receive packet filter
782          *
783          * This is the bitwise-OR of any of the following flags:
784          * #FLTR_DIRECTED, #FLTR_BRDCST, #FLTR_PRMSCS and
785          * #FLTR_SRC_RTG.
786          */
787         UINT16_t PktFilter;
788         /** Multicast MAC addresses */
789         struct s_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
790 } PACKED;
791
792 typedef struct s_PXENV_UNDI_OPEN PXENV_UNDI_OPEN_t;
793
794 extern PXENV_EXIT_t pxenv_undi_open ( struct s_PXENV_UNDI_OPEN *undi_open );
795
796 /** @} */ /* pxenv_undi_open */
797
798 /** @defgroup pxenv_undi_close PXENV_UNDI_CLOSE
799  *
800  *  UNDI CLOSE
801  *
802  *  @{
803  */
804
805 /** PXE API function code for pxenv_undi_close() */
806 #define PXENV_UNDI_CLOSE                0x0007
807
808 /** Parameter block for pxenv_undi_close() */
809 struct s_PXENV_UNDI_CLOSE {
810         PXENV_STATUS_t  Status;         /**< PXE status code */
811 } PACKED;
812
813 typedef struct s_PXENV_UNDI_CLOSE PXENV_UNDI_CLOSE_t;
814
815 extern PXENV_EXIT_t pxenv_undi_close ( struct s_PXENV_UNDI_CLOSE *undi_close );
816
817 /** @} */ /* pxenv_undi_close */
818
819 /** @defgroup pxenv_undi_transmit PXENV_UNDI_TRANSMIT
820  *
821  *  UNDI TRANSMIT PACKET
822  *
823  *  @{
824  */
825
826 /** PXE API function code for pxenv_undi_transmit() */
827 #define PXENV_UNDI_TRANSMIT             0x0008
828
829 #define P_UNKNOWN       0               /**< Media header already filled in */
830 #define P_IP            1               /**< IP protocol */
831 #define P_ARP           2               /**< ARP protocol */
832 #define P_RARP          3               /**< RARP protocol */
833 #define P_OTHER         4               /**< Other protocol */
834
835 #define XMT_DESTADDR    0x0000          /**< Unicast packet */
836 #define XMT_BROADCAST   0x0001          /**< Broadcast packet */
837
838 /** Maximum number of data blocks in a transmit buffer descriptor */
839 #define MAX_DATA_BLKS   8
840
841 /** A transmit buffer descriptor, as pointed to by s_PXENV_UNDI_TRANSMIT::TBD
842  */
843 struct s_PXENV_UNDI_TBD {
844         UINT16_t ImmedLength;           /**< Length of the transmit buffer */
845         SEGOFF16_t Xmit;                /**< Address of the transmit buffer */
846         UINT16_t DataBlkCount;
847         /** Array of up to #MAX_DATA_BLKS additional transmit buffers */
848         struct DataBlk {
849                 /** Always 1
850                  *
851                  * A value of 0 would indicate that #TDDataPtr were an
852                  * #ADDR32_t rather than a #SEGOFF16_t.  The PXE
853                  * specification version 2.1 explicitly states that
854                  * this is not supported; #TDDataPtr will always be a
855                  * #SEGOFF16_t.
856                  */
857                 UINT8_t TDPtrType;
858                 UINT8_t TDRsvdByte;     /**< Must be zero */
859                 UINT16_t TDDataLen;     /**< Length of this transmit buffer */
860                 SEGOFF16_t TDDataPtr;   /**< Address of this transmit buffer */
861         } DataBlock[MAX_DATA_BLKS];
862 } PACKED;
863
864 typedef struct s_PXENV_UNDI_TBD PXENV_UNDI_TBD_t;
865
866 /** Parameter block for pxenv_undi_transmit() */
867 struct s_PXENV_UNDI_TRANSMIT {
868         PXENV_STATUS_t  Status;         /**< PXE status code */
869         /** Protocol
870          *
871          * Valid values are #P_UNKNOWN, #P_IP, #P_ARP or #P_RARP.  If
872          * the caller has already filled in the media header, this
873          * field must be set to #P_UNKNOWN.
874          */
875         UINT8_t Protocol;
876         /** Unicast/broadcast flag
877          *
878          * Valid values are #XMT_DESTADDR or #XMT_BROADCAST.
879          */
880         UINT8_t XmitFlag;
881         SEGOFF16_t DestAddr;            /**< Destination MAC address */
882         /** Address of the Transmit Buffer Descriptor
883          *
884          * This is a pointer to a struct s_PXENV_UNDI_TBD.
885          */
886         SEGOFF16_t TBD;
887         UINT32_t Reserved[2];           /**< Must be zero */
888 } PACKED;
889
890 typedef struct s_PXENV_UNDI_TRANSMIT PXENV_UNDI_TRANSMIT_t;
891
892 extern PXENV_EXIT_t pxenv_undi_transmit ( struct s_PXENV_UNDI_TRANSMIT
893                                           *undi_transmit );
894
895 /** @} */ /* pxenv_undi_transmit */
896
897 /** @defgroup pxenv_undi_set_mcast_address PXENV_UNDI_SET_MCAST_ADDRESS
898  *
899  *  UNDI SET MULTICAST ADDRESS
900  *
901  *  @{
902  */
903
904 /** PXE API function code for pxenv_undi_set_mcast_address() */
905 #define PXENV_UNDI_SET_MCAST_ADDRESS    0x0009
906
907 /** Parameter block for pxenv_undi_set_mcast_address() */
908 struct s_PXENV_UNDI_SET_MCAST_ADDRESS {
909         PXENV_STATUS_t  Status;         /**< PXE status code */
910         /** List of multicast addresses */
911         struct s_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
912 } PACKED;
913
914 typedef struct s_PXENV_UNDI_SET_MCAST_ADDRESS PXENV_UNDI_SET_MCAST_ADDRESS_t;
915
916 extern PXENV_EXIT_t pxenv_undi_set_mcast_address (
917                struct s_PXENV_UNDI_SET_MCAST_ADDRESS *undi_set_mcast_address );
918
919 /** @} */ /* pxenv_undi_set_mcast_address */
920
921 /** @defgroup pxenv_undi_set_station_address PXENV_UNDI_SET_STATION_ADDRESS
922  *
923  *  UNDI SET STATION ADDRESS
924  *
925  *  @{
926  */
927
928 /** PXE API function code for pxenv_undi_set_station_address() */
929 #define PXENV_UNDI_SET_STATION_ADDRESS  0x000a
930
931 /** Parameter block for pxenv_undi_set_station_address() */
932 struct s_PXENV_UNDI_SET_STATION_ADDRESS {
933         PXENV_STATUS_t  Status;         /**< PXE status code */
934         MAC_ADDR_t StationAddress;      /**< Station MAC address */
935 } PACKED;
936
937 typedef struct s_PXENV_UNDI_SET_STATION_ADDRESS PXENV_UNDI_SET_STATION_ADDRESS_t;
938
939 extern PXENV_EXIT_t pxenv_undi_set_station_address (
940            struct s_PXENV_UNDI_SET_STATION_ADDRESS *undi_set_station_address );
941
942 /** @} */ /* pxenv_undi_set_station_address */
943
944 /** @defgroup pxenv_undi_set_packet_filter PXENV_UNDI_SET_PACKET_FILTER
945  *
946  *  UNDI SET PACKET FILTER
947  *
948  *  @{
949  */
950
951 /** PXE API function code for pxenv_undi_set_packet_filter() */
952 #define PXENV_UNDI_SET_PACKET_FILTER    0x000b
953
954 /** Parameter block for pxenv_undi_set_packet_filter() */
955 struct s_PXENV_UNDI_SET_PACKET_FILTER {
956         PXENV_STATUS_t  Status;         /**< PXE status code */
957         /** Receive packet filter
958          *
959          * This field takes the same values as
960          * s_PXENV_UNDI_OPEN::PktFilter.
961          *
962          * @note Yes, this field is a different size to
963          * s_PXENV_UNDI_OPEN::PktFilter.  Blame "the managers at Intel
964          * who apparently let a consultant come up with the spec
965          * without any kind of adult supervision" (quote from hpa).
966          */
967         UINT8_t filter;
968 } PACKED;
969
970 typedef struct s_PXENV_UNDI_SET_PACKET_FILTER PXENV_UNDI_SET_PACKET_FILTER_t;
971
972 extern PXENV_EXIT_t pxenv_undi_set_packet_filter (
973                struct s_PXENV_UNDI_SET_PACKET_FILTER *undi_set_packet_filter );
974
975 /** @} */ /* pxenv_undi_set_packet_filter */
976
977 /** @defgroup pxenv_undi_get_information PXENV_UNDI_GET_INFORMATION
978  *
979  *  UNDI GET INFORMATION
980  *
981  *  @{
982  */
983
984 /** PXE API function code for pxenv_undi_get_information() */
985 #define PXENV_UNDI_GET_INFORMATION      0x000c
986
987 #define ETHER_TYPE              1       /**< Ethernet (10Mb) */
988 #define EXP_ETHER_TYPE          2       /**< Experimental Ethernet (3Mb) */
989 #define AX25_TYPE               3       /**< Amateur Radio AX.25 */
990 #define TOKEN_RING_TYPE         4       /**< Proteon ProNET Token Ring */
991 #define CHAOS_TYPE              5       /**< Chaos */
992 #define IEEE_TYPE               6       /**< IEEE 802 Networks */
993 #define ARCNET_TYPE             7       /**< ARCNET */
994
995 /** Parameter block for pxenv_undi_get_information() */
996 struct s_PXENV_UNDI_GET_INFORMATION {
997         PXENV_STATUS_t  Status;         /**< PXE status code */
998         UINT16_t BaseIo;                /**< I/O base address */
999         UINT16_t IntNumber;             /**< IRQ number */
1000         UINT16_t MaxTranUnit;           /**< Adapter MTU */
1001         /** Hardware type
1002          *
1003          * Valid values are defined in RFC1010 ("Assigned numbers"),
1004          * and are #ETHER_TYPE, #EXP_ETHER_TYPE, #AX25_TYPE,
1005          * #TOKEN_RING_TYPE, #CHAOS_TYPE, #IEEE_TYPE or #ARCNET_TYPE.
1006          */
1007         UINT16_t HwType;
1008         UINT16_t HwAddrLen;             /**< MAC address length */
1009         MAC_ADDR_t CurrentNodeAddress;  /**< Current MAC address */
1010         MAC_ADDR_t PermNodeAddress;     /**< Permanent (EEPROM) MAC address */
1011         SEGSEL_t ROMAddress;            /**< Real-mode ROM segment address */
1012         UINT16_t RxBufCt;               /**< Receive queue length */
1013         UINT16_t TxBufCt;               /**< Transmit queue length */
1014 } PACKED;
1015
1016 typedef struct s_PXENV_UNDI_GET_INFORMATION PXENV_UNDI_GET_INFORMATION_t;
1017
1018 extern PXENV_EXIT_t pxenv_undi_get_information (
1019                    struct s_PXENV_UNDI_GET_INFORMATION *undi_get_information );
1020
1021 /** @} */ /* pxenv_undi_get_information */
1022
1023 /** @defgroup pxenv_undi_get_statistics PXENV_UNDI_GET_STATISTICS
1024  *
1025  *  UNDI GET STATISTICS
1026  *
1027  *  @{
1028  */
1029
1030 /** PXE API function code for pxenv_undi_get_statistics() */
1031 #define PXENV_UNDI_GET_STATISTICS       0x000d
1032
1033 /** Parameter block for pxenv_undi_get_statistics() */
1034 struct s_PXENV_UNDI_GET_STATISTICS {
1035         PXENV_STATUS_t  Status;         /**< PXE status code */
1036         UINT32_t XmtGoodFrames;         /**< Successful transmission count */
1037         UINT32_t RcvGoodFrames;         /**< Successful reception count */
1038         UINT32_t RcvCRCErrors;          /**< Receive CRC error count */
1039         UINT32_t RcvResourceErrors;     /**< Receive queue overflow count */
1040 } PACKED;
1041
1042 typedef struct s_PXENV_UNDI_GET_STATISTICS PXENV_UNDI_GET_STATISTICS_t;
1043
1044 extern PXENV_EXIT_t pxenv_undi_get_statistics (
1045                      struct s_PXENV_UNDI_GET_STATISTICS *undi_get_statistics );
1046
1047 /** @} */ /* pxenv_undi_get_statistics */
1048
1049 /** @defgroup pxenv_undi_clear_statistics PXENV_UNDI_CLEAR_STATISTICS
1050  *
1051  *  UNDI CLEAR STATISTICS
1052  *
1053  *  @{
1054  */
1055
1056 /** PXE API function code for pxenv_undi_clear_statistics() */
1057 #define PXENV_UNDI_CLEAR_STATISTICS     0x000e
1058
1059 /** Parameter block for pxenv_undi_clear_statistics() */
1060 struct s_PXENV_UNDI_CLEAR_STATISTICS {
1061         PXENV_STATUS_t  Status;         /**< PXE status code */
1062 } PACKED;
1063
1064 typedef struct s_PXENV_UNDI_CLEAR_STATISTICS PXENV_UNDI_CLEAR_STATISTICS_t;
1065
1066 extern PXENV_EXIT_t pxenv_undi_clear_statistics (
1067                  struct s_PXENV_UNDI_CLEAR_STATISTICS *undi_clear_statistics );
1068
1069 /** @} */ /* pxenv_undi_clear_statistics */
1070
1071 /** @defgroup pxenv_undi_initiate_diags PXENV_UNDI_INITIATE_DIAGS
1072  *
1073  *  UNDI INITIATE DIAGS
1074  *
1075  *  @{
1076  */
1077
1078 /** PXE API function code for pxenv_undi_initiate_diags() */
1079 #define PXENV_UNDI_INITIATE_DIAGS       0x000f
1080
1081 /** Parameter block for pxenv_undi_initiate_diags() */
1082 struct s_PXENV_UNDI_INITIATE_DIAGS {
1083         PXENV_STATUS_t  Status;         /**< PXE status code */
1084 } PACKED;
1085
1086 typedef struct s_PXENV_UNDI_INITIATE_DIAGS PXENV_UNDI_INITIATE_DIAGS_t;
1087
1088 extern PXENV_EXIT_t pxenv_undi_initiate_diags (
1089                      struct s_PXENV_UNDI_INITIATE_DIAGS *undi_initiate_diags );
1090
1091 /** @} */ /* pxenv_undi_initiate_diags */
1092
1093 /** @defgroup pxenv_undi_force_interrupt PXENV_UNDI_FORCE_INTERRUPT
1094  *
1095  *  UNDI FORCE INTERRUPT
1096  *
1097  *  @{
1098  */
1099
1100 /** PXE API function code for pxenv_undi_force_interrupt() */
1101 #define PXENV_UNDI_FORCE_INTERRUPT      0x0010
1102
1103 /** Parameter block for pxenv_undi_force_interrupt() */
1104 struct s_PXENV_UNDI_FORCE_INTERRUPT {
1105         PXENV_STATUS_t  Status;         /**< PXE status code */
1106 } PACKED;
1107
1108 typedef struct s_PXENV_UNDI_FORCE_INTERRUPT PXENV_UNDI_FORCE_INTERRUPT_t;
1109
1110 extern PXENV_EXIT_t pxenv_undi_force_interrupt (
1111                    struct s_PXENV_UNDI_FORCE_INTERRUPT *undi_force_interrupt );
1112
1113 /** @} */ /* pxenv_undi_force_interrupt */
1114
1115 /** @defgroup pxenv_undi_get_mcast_address PXENV_UNDI_GET_MCAST_ADDRESS
1116  *
1117  *  UNDI GET MULTICAST ADDRESS
1118  *
1119  *  @{
1120  */
1121
1122 /** PXE API function code for pxenv_undi_get_mcast_address() */
1123 #define PXENV_UNDI_GET_MCAST_ADDRESS    0x0011
1124
1125 /** Parameter block for pxenv_undi_get_mcast_address() */
1126 struct s_PXENV_UNDI_GET_MCAST_ADDRESS {
1127         PXENV_STATUS_t  Status;         /**< PXE status code */
1128         IP4_t InetAddr;                 /**< Multicast IP address */
1129         MAC_ADDR_t MediaAddr;           /**< Multicast MAC address */
1130 } PACKED;
1131
1132 typedef struct s_PXENV_UNDI_GET_MCAST_ADDRESS PXENV_UNDI_GET_MCAST_ADDRESS_t;
1133
1134 extern PXENV_EXIT_t pxenv_undi_get_mcast_address (
1135                struct s_PXENV_UNDI_GET_MCAST_ADDRESS *undi_get_mcast_address );
1136
1137 /** @} */ /* pxenv_undi_get_mcast_address */
1138
1139 /** @defgroup pxenv_undi_get_nic_type PXENV_UNDI_GET_NIC_TYPE
1140  *
1141  *  UNDI GET NIC TYPE
1142  *
1143  *  @{
1144  */
1145
1146 /** PXE API function code for pxenv_undi_get_nic_type() */
1147 #define PXENV_UNDI_GET_NIC_TYPE         0x0012
1148
1149 #define PCI_NIC         2               /**< PCI network card */
1150 #define PnP_NIC         3               /**< ISAPnP network card */
1151 #define CardBus_NIC     4               /**< CardBus network card */
1152
1153 /** Information for a PCI or equivalent NIC */
1154 struct pci_nic_info {
1155         UINT16_t Vendor_ID;             /**< PCI vendor ID */
1156         UINT16_t Dev_ID;                /**< PCI device ID */
1157         UINT8_t Base_Class;             /**< PCI base class */
1158         UINT8_t Sub_Class;              /**< PCI sub class */
1159         UINT8_t Prog_Intf;              /**< PCI programming interface */
1160         UINT8_t Rev;                    /**< PCI revision */
1161         UINT16_t BusDevFunc;            /**< PCI bus:dev:fn address */
1162         UINT16_t SubVendor_ID;          /**< PCI subvendor ID */
1163         UINT16_t SubDevice_ID;          /**< PCI subdevice ID */
1164 } PACKED;
1165  
1166 /** Information for an ISAPnP or equivalent NIC */
1167 struct pnp_nic_info {
1168         UINT32_t EISA_Dev_ID;           /**< EISA device ID */
1169         UINT8_t Base_Class;             /**< Base class */
1170         UINT8_t Sub_Class;              /**< Sub class */
1171         UINT8_t Prog_Intf;              /**< Programming interface */
1172         /** Card Select Number assigned to card */
1173         UINT16_t CardSelNum;
1174 } PACKED;
1175
1176 /** Parameter block for pxenv_undi_get_nic_type() */
1177 struct s_PXENV_UNDI_GET_NIC_TYPE {
1178         PXENV_STATUS_t  Status;         /**< PXE status code */
1179         /** NIC type
1180          *
1181          * Valid values are #PCI_NIC, #PnP_NIC or #CardBus_NIC.
1182          */
1183         UINT8_t NicType;
1184         /** NIC information */
1185         union nic_type_info {
1186                 /** NIC information (if #NicType==#PCI_NIC) */
1187                 struct pci_nic_info pci;
1188                 /** NIC information (if #NicType==#CardBus_NIC) */
1189                 struct pci_nic_info cardbus;
1190                 /** NIC information (if #NicType==#PnP_NIC) */
1191                 struct pnp_nic_info pnp;
1192         } info;
1193 } PACKED;
1194
1195 typedef struct s_PXENV_UNDI_GET_NIC_TYPE PXENV_UNDI_GET_NIC_TYPE_t;
1196
1197 extern PXENV_EXIT_t pxenv_undi_get_nic_type ( 
1198                          struct s_PXENV_UNDI_GET_NIC_TYPE *undi_get_nic_type );
1199
1200 /** @} */ /* pxenv_undi_get_nic_type */
1201
1202 /** @defgroup pxenv_undi_get_iface_info PXENV_UNDI_GET_IFACE_INFO
1203  *
1204  *  UNDI GET IFACE INFO
1205  *
1206  *  @{
1207  */
1208
1209 /** PXE API function code for pxenv_undi_get_iface_info() */
1210 #define PXENV_UNDI_GET_IFACE_INFO       0x0013
1211
1212 /** Parameter block for pxenv_undi_get_iface_info() */
1213 struct s_PXENV_UNDI_GET_IFACE_INFO {
1214         PXENV_STATUS_t  Status;         /**< PXE status code */
1215         /** Interface type
1216          *
1217          * This is defined in the NDIS 2.0 specification to be one of
1218          * the strings "802.3", "802.4", "802.5", "802.6", "DIX",
1219          * "DIX+802.3", "APPLETALK", "ARCNET", "FDDI", "SDLC", "BSC",
1220          * "HDLC", or "ISDN".
1221          *
1222          * "Normal" Ethernet, for various historical reasons, is
1223          * "DIX+802.3".
1224          */
1225         UINT8_t IfaceType[16];
1226         UINT32_t LinkSpeed;             /**< Link speed, in bits per second */
1227         /** Service flags
1228          *
1229          * These are the "service flags" defined in the "MAC
1230          * Service-Specific Characteristics" table in the NDIS 2.0
1231          * specification.  Almost all of them are irrelevant to PXE.
1232          */
1233         UINT32_t ServiceFlags;
1234         UINT32_t Reserved[4];           /**< Must be zero */
1235 } PACKED;
1236
1237 typedef struct s_PXENV_UNDI_GET_IFACE_INFO PXENV_UNDI_GET_IFACE_INFO_t;
1238
1239 extern PXENV_EXIT_t pxenv_undi_get_iface_info (
1240                      struct s_PXENV_UNDI_GET_IFACE_INFO *undi_get_iface_info );
1241
1242 /** @} */ /* pxenv_undi_get_iface_info */
1243
1244 /** @defgroup pxenv_undi_get_state PXENV_UNDI_GET_STATE
1245  *
1246  *  UNDI GET STATE
1247  *
1248  *  @{
1249  */
1250
1251 /** PXE API function code for pxenv_undi_get_state() */
1252 #define PXENV_UNDI_GET_STATE            0x0015
1253
1254 /** pxenv_start_undi() has been called */
1255 #define PXE_UNDI_GET_STATE_STARTED      1
1256 /** pxenv_undi_initialize() has been called */
1257 #define PXE_UNDI_GET_STATE_INITIALIZED  2
1258 /** pxenv_undi_open() has been called */
1259 #define PXE_UNDI_GET_STATE_OPENED       3
1260
1261 /** Parameter block for pxenv_undi_get_state() */
1262 struct s_PXENV_UNDI_GET_STATE {
1263         PXENV_STATUS_t  Status;         /**< PXE status code */
1264         /** Current state of the UNDI driver
1265          *
1266          * Valid values are #PXE_UNDI_GET_STATE_STARTED,
1267          * #PXE_UNDI_GET_STATE_INITIALIZED or
1268          * #PXE_UNDI_GET_STATE_OPENED.
1269          */
1270         UINT8_t UNDIstate;
1271 } PACKED;
1272
1273 typedef struct s_PXENV_UNDI_GET_STATE PXENV_UNDI_GET_STATE_t;
1274
1275 extern PXENV_EXIT_t pxenv_undi_get_state ( struct s_PXENV_UNDI_GET_STATE
1276                                            *undi_get_state );
1277
1278 /** @} */ /* pxenv_undi_get_state */
1279
1280 /** @defgroup pxenv_undi_isr PXENV_UNDI_ISR
1281  *
1282  *  UNDI ISR
1283  *
1284  *  @{
1285  */
1286
1287 /** PXE API function code for pxenv_undi_isr() */
1288 #define PXENV_UNDI_ISR                  0x0014
1289
1290 /** Determine whether or not this is our interrupt */
1291 #define PXENV_UNDI_ISR_IN_START         1
1292 /** Start processing interrupt */
1293 #define PXENV_UNDI_ISR_IN_PROCESS       2
1294 /** Continue processing interrupt */
1295 #define PXENV_UNDI_ISR_IN_GET_NEXT      3
1296 /** This interrupt was ours */
1297 #define PXENV_UNDI_ISR_OUT_OURS         0
1298 /** This interrupt was not ours */
1299 #define PXENV_UNDI_ISR_OUT_NOT_OURS     1
1300 /** Finished processing interrupt */
1301 #define PXENV_UNDI_ISR_OUT_DONE         0
1302 /** A packet transmission has completed */
1303 #define PXENV_UNDI_ISR_OUT_TRANSMIT     2
1304 /** A packet has been received */
1305 #define PXENV_UNDI_ISR_OUT_RECEIVE      3
1306 /** We are already in the middle of processing an interrupt */
1307 #define PXENV_UNDI_ISR_OUT_BUSY         4
1308
1309 /** Unicast packet (or packet captured in promiscuous mode) */
1310 #define P_DIRECTED      0
1311 /** Broadcast packet */
1312 #define P_BROADCAST     1
1313 /** Multicast packet */
1314 #define P_MULTICAST     2
1315
1316 /** Parameter block for pxenv_undi_isr() */
1317 struct s_PXENV_UNDI_ISR {
1318         PXENV_STATUS_t  Status;         /**< PXE status code */
1319         /** Function flag
1320          *
1321          * Valid values are #PXENV_UNDI_ISR_IN_START,
1322          * #PXENV_UNDI_ISR_IN_PROCESS, #PXENV_UNDI_ISR_IN_GET_NEXT,
1323          * #PXENV_UNDI_ISR_OUT_OURS, #PXENV_UNDI_ISR_OUT_NOT_OURS,
1324          * #PXENV_UNDI_ISR_OUT_DONE, #PXENV_UNDI_ISR_OUT_TRANSMIT,
1325          * #PXENV_UNDI_ISR_OUT_RECEIVE or #PXENV_UNDI_ISR_OUT_BUSY.
1326          */
1327         UINT16_t FuncFlag;
1328         UINT16_t BufferLength;          /**< Data buffer length */
1329         UINT16_t FrameLength;           /**< Total frame length */
1330         UINT16_t FrameHeaderLength;     /**< Frame header length */
1331         SEGOFF16_t Frame;               /**< Data buffer address */
1332         /** Protocol type
1333          *
1334          * Valid values are #P_IP, #P_ARP, #P_RARP or #P_OTHER.
1335          */
1336         UINT8_t ProtType;
1337         /** Packet type
1338          *
1339          * Valid values are #P_DIRECTED, #P_BROADCAST or #P_MULTICAST.
1340          */
1341         UINT8_t PktType;
1342 } PACKED;
1343
1344 typedef struct s_PXENV_UNDI_ISR PXENV_UNDI_ISR_t;
1345
1346 extern PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr );
1347
1348 /** @} */ /* pxenv_undi_isr */
1349
1350 /** @} */ /* pxe_undi_api */
1351
1352 /** @} */ /* pxe */
1353
1354 #endif /* PXE_API_H */