-
Notifications
You must be signed in to change notification settings - Fork 640
/
pxe_api.h
1797 lines (1503 loc) · 49.9 KB
/
pxe_api.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#ifndef PXE_API_H
#define PXE_API_H
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* As an alternative, at your option, you may use this file under the
* following terms, known as the "MIT license":
*
* Copyright (c) 2005-2009 Michael Brown <mbrown@fensystems.co.uk>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/** @file
*
* Preboot eXecution Environment (PXE) API
*
*/
FILE_LICENCE ( GPL2_OR_LATER );
#include "pxe_types.h"
/** @addtogroup pxe Preboot eXecution Environment (PXE) API
* @{
*/
/** @defgroup pxe_api_call PXE entry points
*
* PXE entry points and calling conventions
*
* @{
*/
/** The PXENV+ structure */
struct s_PXENV {
/** Signature
*
* Contains the bytes 'P', 'X', 'E', 'N', 'V', '+'.
*/
UINT8_t Signature[6];
/** PXE API version
*
* MSB is major version number, LSB is minor version number.
* If the API version number is 0x0201 or greater, the !PXE
* structure pointed to by #PXEPtr should be used instead of
* this data structure.
*/
UINT16_t Version;
UINT8_t Length; /**< Length of this structure */
/** Checksum
*
* The byte checksum of this structure (using the length in
* #Length) must be zero.
*/
UINT8_t Checksum;
SEGOFF16_t RMEntry; /**< Real-mode PXENV+ entry point */
/** Protected-mode PXENV+ entry point offset
*
* PXE 2.1 deprecates this entry point. For protected-mode
* API calls, use the !PXE structure pointed to by #PXEPtr
* instead.
*/
UINT32_t PMOffset;
/** Protected-mode PXENV+ entry point segment selector
*
* PXE 2.1 deprecates this entry point. For protected-mode
* API calls, use the !PXE structure pointed to by #PXEPtr
* instead.
*/
SEGSEL_t PMSelector;
SEGSEL_t StackSeg; /**< Stack segment selector */
UINT16_t StackSize; /**< Stack segment size */
SEGSEL_t BC_CodeSeg; /**< Base-code code segment selector */
UINT16_t BC_CodeSize; /**< Base-code code segment size */
SEGSEL_t BC_DataSeg; /**< Base-code data segment selector */
UINT16_t BC_DataSize; /**< Base-code data segment size */
SEGSEL_t UNDIDataSeg; /**< UNDI data segment selector */
UINT16_t UNDIDataSize; /**< UNDI data segment size */
SEGSEL_t UNDICodeSeg; /**< UNDI code segment selector */
UINT16_t UNDICodeSize; /**< UNDI code segment size */
/** Address of the !PXE structure
*
* This field is present only if #Version is 0x0201 or
* greater. If present, it points to a struct s_PXE.
*/
SEGOFF16_t PXEPtr;
} __attribute__ (( packed ));
typedef struct s_PXENV PXENV_t;
/** The !PXE structure */
struct s_PXE {
/** Signature
*
* Contains the bytes '!', 'P', 'X', 'E'.
*/
UINT8_t Signature[4];
UINT8_t StructLength; /**< Length of this structure */
/** Checksum
*
* The byte checksum of this structure (using the length in
* #StructLength) must be zero.
*/
UINT8_t StructCksum;
/** Revision of this structure
*
* For PXE version 2.1, this field must be zero.
*/
UINT8_t StructRev;
UINT8_t reserved_1; /**< Must be zero */
/** Address of the UNDI ROM ID structure
*
* This is a pointer to a struct s_UNDI_ROM_ID.
*/
SEGOFF16_t UNDIROMID;
/** Address of the Base Code ROM ID structure
*
* This is a pointer to a struct s_BC_ROM_ID.
*/
SEGOFF16_t BaseROMID;
/** 16-bit !PXE entry point
*
* This is the entry point for either real mode, or protected
* mode with a 16-bit stack segment.
*/
SEGOFF16_t EntryPointSP;
/** 32-bit !PXE entry point
*
* This is the entry point for protected mode with a 32-bit
* stack segment.
*/
SEGOFF16_t EntryPointESP;
/** Status call-out function
*
* @v 0 (if in a time-out loop)
* @v n Number of a received TFTP packet
* @ret 0 Continue operation
* @ret 1 Cancel operation
*
* This function will be called whenever the PXE stack is in
* protected mode, is waiting for an event (e.g. a DHCP reply)
* and wishes to allow the user to cancel the operation.
* Parameters are passed in register %ax; the return value
* must also be placed in register %ax. All other registers
* and flags @b must be preserved.
*
* In real mode, an internal function (that checks for a
* keypress) will be used.
*
* If this field is set to -1, no status call-out function
* will be used and consequently the user will not be allowed
* to interrupt operations.
*
* @note The PXE specification version 2.1 defines the
* StatusCallout field, mentions it 11 times, but nowhere
* defines what it actually does or how it gets called.
* Fortunately, the WfM specification version 1.1a deigns to
* inform us of such petty details.
*/
SEGOFF16_t StatusCallout;
UINT8_t reserved_2; /**< Must be zero */
/** Number of segment descriptors
*
* If this number is greater than 7, the remaining descriptors
* follow immediately after #BC_CodeWrite.
*/
UINT8_t SegDescCnt;
/** First protected-mode selector
*
* This is the segment selector value for the first segment
* assigned to PXE. Protected-mode selectors must be
* consecutive, according to the PXE 2.1 specification, though
* no reason is given. Each #SEGDESC_t includes a field for
* the segment selector, so this information is entirely
* redundant.
*/
SEGSEL_t FirstSelector;
/** Stack segment descriptor */
SEGDESC_t Stack;
/** UNDI data segment descriptor */
SEGDESC_t UNDIData;
/** UNDI code segment descriptor */
SEGDESC_t UNDICode;
/** UNDI writable code segment descriptor */
SEGDESC_t UNDICodeWrite;
/** Base-code data segment descriptor */
SEGDESC_t BC_Data;
/** Base-code code segment descriptor */
SEGDESC_t BC_Code;
/** Base-code writable code segment descriptor */
SEGDESC_t BC_CodeWrite;
} __attribute__ (( packed ));
typedef struct s_PXE PXE_t;
/** @} */ /* pxe_api_call */
/** @defgroup pxe_preboot_api PXE Preboot API
*
* General high-level functions: #PXENV_UNLOAD_STACK, #PXENV_START_UNDI etc.
*
* @{
*/
/** @defgroup pxenv_unload_stack PXENV_UNLOAD_STACK
*
* UNLOAD BASE CODE STACK
*
* @{
*/
/** PXE API function code for pxenv_unload_stack() */
#define PXENV_UNLOAD_STACK 0x0070
/** Parameter block for pxenv_unload_stack() */
struct s_PXENV_UNLOAD_STACK {
PXENV_STATUS_t Status; /**< PXE status code */
UINT8_t reserved[10]; /**< Must be zero */
} __attribute__ (( packed ));
typedef struct s_PXENV_UNLOAD_STACK PXENV_UNLOAD_STACK_t;
/** @} */ /* pxenv_unload_stack */
/** @defgroup pxenv_get_cached_info PXENV_GET_CACHED_INFO
*
* GET CACHED INFO
*
* @{
*/
/** PXE API function code for pxenv_get_cached_info() */
#define PXENV_GET_CACHED_INFO 0x0071
/** The client's DHCPDISCOVER packet */
#define PXENV_PACKET_TYPE_DHCP_DISCOVER 1
/** The DHCP server's DHCPACK packet */
#define PXENV_PACKET_TYPE_DHCP_ACK 2
/** The Boot Server's Discover Reply packet
*
* This packet contains DHCP option 60 set to "PXEClient", a valid
* boot file name, and may or may not contain MTFTP options.
*/
#define PXENV_PACKET_TYPE_CACHED_REPLY 3
/** Parameter block for pxenv_get_cached_info() */
struct s_PXENV_GET_CACHED_INFO {
PXENV_STATUS_t Status; /**< PXE status code */
/** Packet type.
*
* Valid values are #PXENV_PACKET_TYPE_DHCP_DISCOVER,
* #PXENV_PACKET_TYPE_DHCP_ACK or #PXENV_PACKET_TYPE_CACHED_REPLY
*/
UINT16_t PacketType;
UINT16_t BufferSize; /**< Buffer size */
SEGOFF16_t Buffer; /**< Buffer address */
UINT16_t BufferLimit; /**< Maximum buffer size */
} __attribute__ (( packed ));
typedef struct s_PXENV_GET_CACHED_INFO PXENV_GET_CACHED_INFO_t;
#define BOOTP_REQ 1 /**< A BOOTP request packet */
#define BOOTP_REP 2 /**< A BOOTP reply packet */
/** DHCP broadcast flag
*
* Request a broadcast response (DHCPOFFER or DHCPACK) from the DHCP
* server.
*/
#define BOOTP_BCAST 0x8000
#define VM_RFC1048 0x63825363L /**< DHCP magic cookie */
/** Maximum length of DHCP options */
#define BOOTP_DHCPVEND 1024
/** Format of buffer filled in by pxenv_get_cached_info()
*
* This somewhat convoluted data structure simply describes the layout
* of a DHCP packet. Refer to RFC2131 section 2 for a full
* description.
*/
struct bootph {
/** Message opcode.
*
* Valid values are #BOOTP_REQ and #BOOTP_REP.
*/
UINT8_t opcode;
/** NIC hardware type.
*
* Valid values are as for s_PXENV_UNDI_GET_INFORMATION::HwType.
*/
UINT8_t Hardware;
UINT8_t Hardlen; /**< MAC address length */
/** Gateway hops
*
* Zero in packets sent by the client. May be non-zero in
* replies from the DHCP server, if the reply comes via a DHCP
* relay agent.
*/
UINT8_t Gatehops;
UINT32_t ident; /**< DHCP transaction id (xid) */
/** Elapsed time
*
* Number of seconds since the client began the DHCP
* transaction.
*/
UINT16_t seconds;
/** Flags
*
* This is the bitwise-OR of any of the following values:
* #BOOTP_BCAST.
*/
UINT16_t Flags;
/** Client IP address
*
* Set only if the client already has an IP address.
*/
IP4_t cip;
/** Your IP address
*
* This is the IP address that the server assigns to the
* client.
*/
IP4_t yip;
/** Server IP address
*
* This is the IP address of the BOOTP/DHCP server.
*/
IP4_t sip;
/** Gateway IP address
*
* This is the IP address of the BOOTP/DHCP relay agent, if
* any. It is @b not (necessarily) the address of the default
* gateway for routing purposes.
*/
IP4_t gip;
MAC_ADDR_t CAddr; /**< Client MAC address */
UINT8_t Sname[64]; /**< Server host name */
UINT8_t bootfile[128]; /**< Boot file name */
/** DHCP options
*
* Don't ask. Just laugh. Then burn a copy of the PXE
* specification and send Intel an e-mail asking them if
* they've figured out what a "union" does in C yet.
*/
union bootph_vendor {
UINT8_t d[BOOTP_DHCPVEND]; /**< DHCP options */
/** DHCP options */
struct bootph_vendor_v {
/** DHCP magic cookie
*
* Should have the value #VM_RFC1048.
*/
UINT8_t magic[4];
UINT32_t flags; /**< BOOTP flags/opcodes */
/** "End of BOOTP vendor extensions"
*
* Abandon hope, all ye who consider the
* purpose of this field.
*/
UINT8_t pad[56];
} v;
} vendor;
} __attribute__ (( packed ));
typedef struct bootph BOOTPLAYER_t;
/** @} */ /* pxenv_get_cached_info */
/** @defgroup pxenv_restart_tftp PXENV_RESTART_TFTP
*
* RESTART TFTP
*
* @{
*/
/** PXE API function code for pxenv_restart_tftp() */
#define PXENV_RESTART_TFTP 0x0073
/** Parameter block for pxenv_restart_tftp() */
struct s_PXENV_TFTP_READ_FILE;
typedef struct s_PXENV_RESTART_TFTP PXENV_RESTART_TFTP_t;
/** @} */ /* pxenv_restart_tftp */
/** @defgroup pxenv_start_undi PXENV_START_UNDI
*
* START UNDI
*
* @{
*/
/** PXE API function code for pxenv_start_undi() */
#define PXENV_START_UNDI 0x0000
/** Parameter block for pxenv_start_undi() */
struct s_PXENV_START_UNDI {
PXENV_STATUS_t Status; /**< PXE status code */
/** %ax register as passed to the Option ROM initialisation routine.
*
* For a PCI device, this should contain the bus:dev:fn value
* that uniquely identifies the PCI device in the system. For
* a non-PCI device, this field is not defined.
*/
UINT16_t AX;
/** %bx register as passed to the Option ROM initialisation routine.
*
* For an ISAPnP device, this should contain the Card Select
* Number assigned to the ISAPnP card. For non-ISAPnP
* devices, this should contain 0xffff.
*/
UINT16_t BX;
/** %dx register as passed to the Option ROM initialisation routine.
*
* For an ISAPnP device, this should contain the ISAPnP Read
* Port address as currently set in all ISAPnP cards. If
* there are no ISAPnP cards, this should contain 0xffff. (If
* this is a non-ISAPnP device, but there are ISAPnP cards in
* the system, this value is not well defined.)
*/
UINT16_t DX;
/** %di register as passed to the Option ROM initialisation routine.
*
* This contains the #OFF16_t portion of a struct #s_SEGOFF16
* that points to the System BIOS Plug and Play Installation
* Check Structure. (Refer to section 4.4 of the Plug and
* Play BIOS specification for a description of this
* structure.)
*
* @note The PXE specification defines the type of this field
* as #UINT16_t. For x86, #OFF16_t and #UINT16_t are
* equivalent anyway; for other architectures #OFF16_t makes
* more sense.
*/
OFF16_t DI;
/** %es register as passed to the Option ROM initialisation routine.
*
* This contains the #SEGSEL_t portion of a struct #s_SEGOFF16
* that points to the System BIOS Plug and Play Installation
* Check Structure. (Refer to section 4.4 of the Plug and
* Play BIOS specification for a description of this
* structure.)
*
* @note The PXE specification defines the type of this field
* as #UINT16_t. For x86, #SEGSEL_t and #UINT16_t are
* equivalent anyway; for other architectures #SEGSEL_t makes
* more sense.
*/
SEGSEL_t ES;
} __attribute__ (( packed ));
typedef struct s_PXENV_START_UNDI PXENV_START_UNDI_t;
/** @} */ /* pxenv_start_undi */
/** @defgroup pxenv_stop_undi PXENV_STOP_UNDI
*
* STOP UNDI
*
* @{
*/
/** PXE API function code for pxenv_stop_undi() */
#define PXENV_STOP_UNDI 0x0015
/** Parameter block for pxenv_stop_undi() */
struct s_PXENV_STOP_UNDI {
PXENV_STATUS_t Status; /**< PXE status code */
} __attribute__ (( packed ));
typedef struct s_PXENV_STOP_UNDI PXENV_STOP_UNDI_t;
/** @} */ /* pxenv_stop_undi */
/** @defgroup pxenv_start_base PXENV_START_BASE
*
* START BASE
*
* @{
*/
/** PXE API function code for pxenv_start_base() */
#define PXENV_START_BASE 0x0075
/** Parameter block for pxenv_start_base() */
struct s_PXENV_START_BASE {
PXENV_STATUS_t Status; /**< PXE status code */
} __attribute__ (( packed ));
typedef struct s_PXENV_START_BASE PXENV_START_BASE_t;
/** @} */ /* pxenv_start_base */
/** @defgroup pxenv_stop_base PXENV_STOP_BASE
*
* STOP BASE
*
* @{
*/
/** PXE API function code for pxenv_stop_base() */
#define PXENV_STOP_BASE 0x0076
/** Parameter block for pxenv_stop_base() */
struct s_PXENV_STOP_BASE {
PXENV_STATUS_t Status; /**< PXE status code */
} __attribute__ (( packed ));
typedef struct s_PXENV_STOP_BASE PXENV_STOP_BASE_t;
/** @} */ /* pxenv_stop_base */
/** @} */ /* pxe_preboot_api */
/** @defgroup pxe_tftp_api PXE TFTP API
*
* Download files via TFTP or MTFTP
*
* @{
*/
/** @defgroup pxenv_tftp_open PXENV_TFTP_OPEN
*
* TFTP OPEN
*
* @{
*/
/** PXE API function code for pxenv_tftp_open() */
#define PXENV_TFTP_OPEN 0x0020
/** Parameter block for pxenv_tftp_open() */
struct s_PXENV_TFTP_OPEN {
PXENV_STATUS_t Status; /**< PXE status code */
IP4_t ServerIPAddress; /**< TFTP server IP address */
IP4_t GatewayIPAddress; /**< Relay agent IP address */
UINT8_t FileName[128]; /**< File name */
UDP_PORT_t TFTPPort; /**< TFTP server UDP port */
/** Requested size of TFTP packets
*
* This is the TFTP "blksize" option. This must be at least
* 512, since servers that do not support TFTP options cannot
* negotiate blocksizes smaller than this.
*/
UINT16_t PacketSize;
} __attribute__ (( packed ));
typedef struct s_PXENV_TFTP_OPEN PXENV_TFTP_OPEN_t;
/** @} */ /* pxenv_tftp_open */
/** @defgroup pxenv_tftp_close PXENV_TFTP_CLOSE
*
* TFTP CLOSE
*
* @{
*/
/** PXE API function code for pxenv_tftp_close() */
#define PXENV_TFTP_CLOSE 0x0021
/** Parameter block for pxenv_tftp_close() */
struct s_PXENV_TFTP_CLOSE {
PXENV_STATUS_t Status; /**< PXE status code */
} __attribute__ (( packed ));
typedef struct s_PXENV_TFTP_CLOSE PXENV_TFTP_CLOSE_t;
/** @} */ /* pxenv_tftp_close */
/** @defgroup pxenv_tftp_read PXENV_TFTP_READ
*
* TFTP READ
*
* @{
*/
/** PXE API function code for pxenv_tftp_read() */
#define PXENV_TFTP_READ 0x0022
/** Parameter block for pxenv_tftp_read() */
struct s_PXENV_TFTP_READ {
PXENV_STATUS_t Status; /**< PXE status code */
UINT16_t PacketNumber; /**< TFTP packet number */
UINT16_t BufferSize; /**< Size of data buffer */
SEGOFF16_t Buffer; /**< Address of data buffer */
} __attribute__ (( packed ));
typedef struct s_PXENV_TFTP_READ PXENV_TFTP_READ_t;
/** @} */ /* pxenv_tftp_read */
/** @defgroup pxenv_tftp_read_file PXENV_TFTP_READ_FILE
*
* TFTP/MTFTP READ FILE
*
* @{
*/
/** PXE API function code for pxenv_tftp_read_file() */
#define PXENV_TFTP_READ_FILE 0x0023
/** Parameter block for pxenv_tftp_read_file() */
struct s_PXENV_TFTP_READ_FILE {
PXENV_STATUS_t Status; /**< PXE status code */
UINT8_t FileName[128]; /**< File name */
UINT32_t BufferSize; /**< Size of data buffer */
ADDR32_t Buffer; /**< Address of data buffer */
IP4_t ServerIPAddress; /**< TFTP server IP address */
IP4_t GatewayIPAddress; /**< Relay agent IP address */
/** File multicast IP address */
IP4_t McastIPAddress;
/** Client multicast listening port */
UDP_PORT_t TFTPClntPort;
/** Server multicast listening port */
UDP_PORT_t TFTPSrvPort;
/** TFTP open timeout.
*
* This is the timeout for receiving the first DATA or ACK
* packets during the MTFTP Listen phase.
*/
UINT16_t TFTPOpenTimeOut;
/** TFTP reopen timeout.
*
* This is the timeout for receiving an ACK packet while in
* the MTFTP Listen phase (when at least one ACK packet has
* already been seen).
*/
UINT16_t TFTPReopenDelay;
} __attribute__ (( packed ));
typedef struct s_PXENV_TFTP_READ_FILE PXENV_TFTP_READ_FILE_t;
/** @} */ /* pxenv_tftp_read_file */
/** @defgroup pxenv_tftp_get_fsize PXENV_TFTP_GET_FSIZE
*
* TFTP GET FILE SIZE
*
* @{
*/
/** PXE API function code for pxenv_tftp_get_fsize() */
#define PXENV_TFTP_GET_FSIZE 0x0025
/** Parameter block for pxenv_tftp_get_fsize() */
struct s_PXENV_TFTP_GET_FSIZE {
PXENV_STATUS_t Status; /**< PXE status code */
IP4_t ServerIPAddress; /**< TFTP server IP address */
IP4_t GatewayIPAddress; /**< Relay agent IP address */
UINT8_t FileName[128]; /**< File name */
UINT32_t FileSize; /**< Size of the file */
} __attribute__ (( packed ));
typedef struct s_PXENV_TFTP_GET_FSIZE PXENV_TFTP_GET_FSIZE_t;
/** @} */ /* pxenv_tftp_get_fsize */
/** @} */ /* pxe_tftp_api */
/** @defgroup pxe_udp_api PXE UDP API
*
* Transmit and receive UDP packets
*
* @{
*/
/** @defgroup pxenv_udp_open PXENV_UDP_OPEN
*
* UDP OPEN
*
* @{
*/
/** PXE API function code for pxenv_udp_open() */
#define PXENV_UDP_OPEN 0x0030
/** Parameter block for pxenv_udp_open() */
struct s_PXENV_UDP_OPEN {
PXENV_STATUS_t Status; /**< PXE status code */
IP4_t src_ip; /**< IP address of this station */
} __attribute__ (( packed ));
typedef struct s_PXENV_UDP_OPEN PXENV_UDP_OPEN_t;
/** @} */ /* pxenv_udp_open */
/** @defgroup pxenv_udp_close PXENV_UDP_CLOSE
*
* UDP CLOSE
*
* @{
*/
/** PXE API function code for pxenv_udp_close() */
#define PXENV_UDP_CLOSE 0x0031
/** Parameter block for pxenv_udp_close() */
struct s_PXENV_UDP_CLOSE {
PXENV_STATUS_t Status; /**< PXE status code */
} __attribute__ (( packed ));
typedef struct s_PXENV_UDP_CLOSE PXENV_UDP_CLOSE_t;
/** @} */ /* pxenv_udp_close */
/** @defgroup pxenv_udp_write PXENV_UDP_WRITE
*
* UDP WRITE
*
* @{
*/
/** PXE API function code for pxenv_udp_write() */
#define PXENV_UDP_WRITE 0x0033
/** Parameter block for pxenv_udp_write() */
struct s_PXENV_UDP_WRITE {
PXENV_STATUS_t Status; /**< PXE status code */
IP4_t ip; /**< Destination IP address */
IP4_t gw; /**< Relay agent IP address */
UDP_PORT_t src_port; /**< Source UDP port */
UDP_PORT_t dst_port; /**< Destination UDP port */
UINT16_t buffer_size; /**< UDP payload buffer size */
SEGOFF16_t buffer; /**< UDP payload buffer address */
} __attribute__ (( packed ));
typedef struct s_PXENV_UDP_WRITE PXENV_UDP_WRITE_t;
/** @} */ /* pxenv_udp_write */
/** @defgroup pxenv_udp_read PXENV_UDP_READ
*
* UDP READ
*
* @{
*/
/** PXE API function code for pxenv_udp_read() */
#define PXENV_UDP_READ 0x0032
/** Parameter block for pxenv_udp_read() */
struct s_PXENV_UDP_READ {
PXENV_STATUS_t Status; /**< PXE status code */
IP4_t src_ip; /**< Source IP address */
IP4_t dest_ip; /**< Destination IP address */
UDP_PORT_t s_port; /**< Source UDP port */
UDP_PORT_t d_port; /**< Destination UDP port */
UINT16_t buffer_size; /**< UDP payload buffer size */
SEGOFF16_t buffer; /**< UDP payload buffer address */
} __attribute__ (( packed ));
typedef struct s_PXENV_UDP_READ PXENV_UDP_READ_t;
/** @} */ /* pxenv_udp_read */
/** @} */ /* pxe_udp_api */
/** @defgroup pxe_undi_api PXE UNDI API
*
* Direct control of the network interface card
*
* @{
*/
/** @defgroup pxenv_undi_startup PXENV_UNDI_STARTUP
*
* UNDI STARTUP
*
* @{
*/
/** PXE API function code for pxenv_undi_startup() */
#define PXENV_UNDI_STARTUP 0x0001
#define PXENV_BUS_ISA 0 /**< ISA bus type */
#define PXENV_BUS_EISA 1 /**< EISA bus type */
#define PXENV_BUS_MCA 2 /**< MCA bus type */
#define PXENV_BUS_PCI 3 /**< PCI bus type */
#define PXENV_BUS_VESA 4 /**< VESA bus type */
#define PXENV_BUS_PCMCIA 5 /**< PCMCIA bus type */
/** Parameter block for pxenv_undi_startup() */
struct s_PXENV_UNDI_STARTUP {
PXENV_STATUS_t Status; /**< PXE status code */
} __attribute__ (( packed ));
typedef struct s_PXENV_UNDI_STARTUP PXENV_UNDI_STARTUP_t;
/** @} */ /* pxenv_undi_startup */
/** @defgroup pxenv_undi_cleanup PXENV_UNDI_CLEANUP
*
* UNDI CLEANUP
*
* @{
*/
/** PXE API function code for pxenv_undi_cleanup() */
#define PXENV_UNDI_CLEANUP 0x0002
/** Parameter block for pxenv_undi_cleanup() */
struct s_PXENV_UNDI_CLEANUP {
PXENV_STATUS_t Status; /**< PXE status code */
} __attribute__ (( packed ));
typedef struct s_PXENV_UNDI_CLEANUP PXENV_UNDI_CLEANUP_t;
/** @} */ /* pxenv_undi_cleanup */
/** @defgroup pxenv_undi_initialize PXENV_UNDI_INITIALIZE
*
* UNDI INITIALIZE
*
* @{
*/
/** PXE API function code for pxenv_undi_initialize() */
#define PXENV_UNDI_INITIALIZE 0x0003
/** Parameter block for pxenv_undi_initialize() */
struct s_PXENV_UNDI_INITIALIZE {
PXENV_STATUS_t Status; /**< PXE status code */
/** NDIS 2.0 configuration information, or NULL
*
* This is a pointer to the data structure returned by the
* NDIS 2.0 GetProtocolManagerInfo() API call. The data
* structure is documented, in a rather haphazard way, in
* section 4-17 of the NDIS 2.0 specification.
*/
ADDR32_t ProtocolIni;
UINT8_t reserved[8]; /**< Must be zero */
} __attribute__ (( packed ));
typedef struct s_PXENV_UNDI_INITIALIZE PXENV_UNDI_INITIALIZE_t;
/** @} */ /* pxenv_undi_initialize */
/** @defgroup pxenv_undi_reset_adapter PXENV_UNDI_RESET_ADAPTER
*
* UNDI RESET ADAPTER
*
* @{
*/
/** PXE API function code for pxenv_undi_reset_adapter() */
#define PXENV_UNDI_RESET_ADAPTER 0x0004
/** Maximum number of multicast MAC addresses */
#define MAXNUM_MCADDR 8
/** List of multicast MAC addresses */
struct s_PXENV_UNDI_MCAST_ADDRESS {
/** Number of multicast MAC addresses */
UINT16_t MCastAddrCount;
/** List of up to #MAXNUM_MCADDR multicast MAC addresses */
MAC_ADDR_t McastAddr[MAXNUM_MCADDR];
} __attribute__ (( packed ));
typedef struct s_PXENV_UNDI_MCAST_ADDRESS PXENV_UNDI_MCAST_ADDRESS_t;
/** Parameter block for pxenv_undi_reset_adapter() */
struct s_PXENV_UNDI_RESET {
PXENV_STATUS_t Status; /**< PXE status code */
/** Multicast MAC addresses */
struct s_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
} __attribute__ (( packed ));
typedef struct s_PXENV_UNDI_RESET PXENV_UNDI_RESET_t;
/** @} */ /* pxenv_undi_reset_adapter */
/** @defgroup pxenv_undi_shutdown PXENV_UNDI_SHUTDOWN
*
* UNDI SHUTDOWN
*
* @{
*/
/** PXE API function code for pxenv_undi_shutdown() */
#define PXENV_UNDI_SHUTDOWN 0x0005
/** Parameter block for pxenv_undi_shutdown() */
struct s_PXENV_UNDI_SHUTDOWN {
PXENV_STATUS_t Status; /**< PXE status code */
} __attribute__ (( packed ));
typedef struct s_PXENV_UNDI_SHUTDOWN PXENV_UNDI_SHUTDOWN_t;
/** @} */ /* pxenv_undi_shutdown */
/** @defgroup pxenv_undi_open PXENV_UNDI_OPEN
*
* UNDI OPEN
*
* @{
*/
/** PXE API function code for pxenv_undi_open() */
#define PXENV_UNDI_OPEN 0x0006
/** Accept "directed" packets
*
* These are packets addresses to either this adapter's MAC address or
* to any of the configured multicast MAC addresses (see
* #s_PXENV_UNDI_MCAST_ADDRESS).
*/
#define FLTR_DIRECTED 0x0001
/** Accept broadcast packets */
#define FLTR_BRDCST 0x0002
/** Accept all packets; listen in promiscuous mode */
#define FLTR_PRMSCS 0x0004
/** Accept source-routed packets */
#define FLTR_SRC_RTG 0x0008
/** Parameter block for pxenv_undi_open() */
struct s_PXENV_UNDI_OPEN {
PXENV_STATUS_t Status; /**< PXE status code */
/** Open flags as defined in NDIS 2.0
*
* This is the OpenOptions field as passed to the NDIS 2.0
* OpenAdapter() API call. It is defined to be "adapter
* specific", though 0 is guaranteed to be a valid value.
*/
UINT16_t OpenFlag;
/** Receive packet filter
*
* This is the bitwise-OR of any of the following flags:
* #FLTR_DIRECTED, #FLTR_BRDCST, #FLTR_PRMSCS and
* #FLTR_SRC_RTG.
*/
UINT16_t PktFilter;
/** Multicast MAC addresses */
struct s_PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
} __attribute__ (( packed ));
typedef struct s_PXENV_UNDI_OPEN PXENV_UNDI_OPEN_t;
/** @} */ /* pxenv_undi_open */
/** @defgroup pxenv_undi_close PXENV_UNDI_CLOSE
*
* UNDI CLOSE
*
* @{
*/
/** PXE API function code for pxenv_undi_close() */
#define PXENV_UNDI_CLOSE 0x0007
/** Parameter block for pxenv_undi_close() */
struct s_PXENV_UNDI_CLOSE {
PXENV_STATUS_t Status; /**< PXE status code */
} __attribute__ (( packed ));
typedef struct s_PXENV_UNDI_CLOSE PXENV_UNDI_CLOSE_t;
/** @} */ /* pxenv_undi_close */
/** @defgroup pxenv_undi_transmit PXENV_UNDI_TRANSMIT
*
* UNDI TRANSMIT PACKET
*
* @{