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