]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/Network/PxeBcDxe/Dhcp.h
sync comments, fix function header, rename variable name to follow coding style.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / PxeBcDxe / Dhcp.h
1 /** @file
2
3 Copyright (c) 2004, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12
13 **/
14
15 #ifndef _DHCP_H
16 #define _DHCP_H
17
18 //
19 // Definitions for DHCP version 4 UDP packet.
20 // The field names in this structure are defined and described in RFC 2131.
21 //
22 #pragma pack(1)
23
24 typedef struct {
25 UINT8 op;
26 #define BOOTP_REQUEST 1
27 #define BOOTP_REPLY 2
28
29 UINT8 htype;
30 UINT8 hlen;
31 UINT8 hops;
32 UINT32 xid;
33 UINT16 secs;
34 UINT16 flags;
35 #define DHCP_BROADCAST_FLAG 0x8000
36
37 UINT32 ciaddr;
38 UINT32 yiaddr;
39 UINT32 siaddr;
40 UINT32 giaddr;
41 UINT8 chaddr[16];
42 UINT8 sname[64];
43 UINT8 file[128];
44 UINT8 options[312];
45 #define OP_PAD 0
46 #define OP_END 255
47 #define OP_SUBNET_MASK 1
48 #define OP_TIME_OFFSET 2
49 #define OP_ROUTER_LIST 3
50 #define OP_TIME_SERVERS 4
51 #define OP_NAME_SERVERS 5
52 #define OP_DNS_SERVERS 6
53 #define OP_LOG_SERVERS 7
54 #define OP_COOKIE_SERVERS 8
55 #define OP_LPR_SREVERS 9
56 #define OP_IMPRESS_SERVERS 10
57 #define OP_RES_LOC_SERVERS 11
58 #define OP_HOST_NAME 12
59 #define OP_BOOT_FILE_SZ 13
60 #define OP_DUMP_FILE 14
61 #define OP_DOMAIN_NAME 15
62 #define OP_SWAP_SERVER 16
63 #define OP_ROOT_PATH 17
64 #define OP_EXTENSION_PATH 18
65 #define OP_IP_FORWARDING 19
66 #define OP_NON_LOCAL_SRC_RTE 20
67 #define OP_POLICY_FILTER 21
68 #define OP_MAX_DATAGRAM_SZ 22
69 #define OP_DEFAULT_TTL 23
70 #define OP_MTU_AGING_TIMEOUT 24
71 #define OP_MTU_SIZES 25
72 #define OP_MTU_TO_USE 26
73 #define OP_ALL_SUBNETS_LOCAL 27
74 #define OP_BROADCAST_ADD 28
75 #define OP_PERFORM_MASK_DISCOVERY 29
76 #define OP_RESPOND_TO_MASK_REQ 30
77 #define OP_PERFORM_ROUTER_DISCOVERY 31
78 #define OP_ROUTER_SOLICIT_ADDRESS 32
79 #define OP_STATIC_ROUTER_LIST 33
80 #define OP_USE_ARP_TRAILERS 34
81 #define OP_ARP_CACHE_TIMEOUT 35
82 #define OP_ETHERNET_ENCAPSULATION 36
83 #define OP_TCP_DEFAULT_TTL 37
84 #define OP_TCP_KEEP_ALIVE_INT 38
85 #define OP_KEEP_ALIVE_GARBAGE 39
86 #define OP_NIS_DOMAIN_NAME 40
87 #define OP_NIS_SERVERS 41
88 #define OP_NTP_SERVERS 42
89 #define OP_VENDOR_SPECIFIC 43
90 #define VEND_PXE_MTFTP_IP 1
91 #define VEND_PXE_MTFTP_CPORT 2
92 #define VEND_PXE_MTFTP_SPORT 3
93 #define VEND_PXE_MTFTP_TMOUT 4
94 #define VEND_PXE_MTFTP_DELAY 5
95 #define VEND_PXE_DISCOVERY_CONTROL 6
96 #define PXE_DISABLE_BROADCAST_DISCOVERY (1 << 0)
97 #define PXE_DISABLE_MULTICAST_DISCOVERY (1 << 1)
98 #define PXE_ACCEPT_ONLY_PXE_BOOT_SERVERS (1 << 2)
99 #define PXE_DO_NOT_PROMPT (1 << 3)
100 #define VEND_PXE_DISCOVERY_MCAST_ADDR 7
101 #define VEND_PXE_BOOT_SERVERS 8
102 #define VEND_PXE_BOOT_MENU 9
103 #define VEND_PXE_BOOT_PROMPT 10
104 #define VEND_PXE_MCAST_ADDRS_ALLOC 11
105 #define VEND_PXE_CREDENTIAL_TYPES 12
106 #define VEND_PXE_BOOT_ITEM 71
107 #define OP_NBNS_SERVERS 44
108 #define OP_NBDD_SERVERS 45
109 #define OP_NETBIOS_NODE_TYPE 46
110 #define OP_NETBIOS_SCOPE 47
111 #define OP_XWINDOW_SYSTEM_FONT_SERVERS 48
112 #define OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS 49
113 #define OP_DHCP_REQ_IP_ADD 50
114 #define OP_DHCP_LEASE_TIME 51
115 #define OP_DHCP_OPTION_OVERLOAD 52
116 #define OVLD_FILE 1
117 #define OVLD_SRVR_NAME 2
118 #define OP_DHCP_MESSAGE_TYPE 53
119 #define DHCPDISCOVER 1
120 #define DHCPOFFER 2
121 #define DHCPREQUEST 3
122 #define DHCPDECLINE 4
123 #define DHCPACK 5
124 #define DHCPNAK 6
125 #define DHCPRELEASE 7
126 #define DHCPINFORM 8
127 #define OP_DHCP_SERVER_IP 54
128 #define OP_DHCP_PARM_REQ_LIST 55
129 #define OP_DHCP_ERROR_MESSAGE 56
130 #define OP_DHCP_MAX_MESSAGE_SZ 57
131 #define OP_DHCP_RENEWAL_TIME 58
132 #define OP_DHCP_REBINDING_TIME 59
133 #define OP_DHCP_CLASS_IDENTIFIER 60
134 #define OP_DHCP_CLIENT_IDENTIFIER 61
135 #define OP_NISPLUS_DOMAIN_NAME 64
136 #define OP_NISPLUS_SERVERS 65
137 #define OP_DHCP_TFTP_SERVER_NAME 66
138 #define OP_DHCP_BOOTFILE 67
139 #define OP_MOBILE_IP_HOME_AGENTS 68
140 #define OP_SMPT_SERVERS 69
141 #define OP_POP3_SERVERS 70
142 #define OP_NNTP_SERVERS 71
143 #define OP_WWW_SERVERS 72
144 #define OP_FINGER_SERVERS 73
145 #define OP_IRC_SERVERS 74
146 #define OP_STREET_TALK_SERVERS 75
147 #define OP_STREET_TALK_DIR_ASSIST_SERVERS 76
148 #define OP_NDS_SERVERS 85
149 #define OP_NDS_TREE_NAME 86
150 #define OP_NDS_CONTEXT 87
151 #define OP_DHCP_SYSTEM_ARCH 93
152 #define OP_DHCP_NETWORK_ARCH 94
153 #define OP_DHCP_PLATFORM_ID 97
154 } DHCPV4_STRUCT;
155
156 //
157 // DHCPv4 option header
158 //
159 typedef struct {
160 UINT8 OpCode;
161 UINT8 Length;
162 //
163 // followed by Data[]
164 //
165 } DHCPV4_OP_HEADER;
166
167 //
168 // Generic DHCPv4 option (header followed by data)
169 //
170 typedef struct {
171 DHCPV4_OP_HEADER Header;
172 UINT8 Data[1];
173 } DHCPV4_OP_STRUCT;
174
175 //
176 // Maximum DHCP packet size on ethernet
177 //
178 #define MAX_DHCP_MSG_SZ (MAX_ENET_DATA_SIZE - sizeof (IPV4_HEADER) - sizeof (UDPV4_HEADER))
179
180 //
181 // Macros used in pxe_bc_dhcp.c and pxe_loadfile.c
182 //
183 #define DHCPV4_TRANSMIT_BUFFER (*(DHCPV4_STRUCT *) (Private->TransmitBuffer))
184 #define DHCPV4_OPTIONS_BUFFER (*(struct optionsstr *) DHCPV4_TRANSMIT_BUFFER.options)
185
186 #define DHCPV4_ACK_INDEX 0
187 #define PXE_BINL_INDEX 1
188 #define PXE_OFFER_INDEX 1
189 #define PXE_ACK_INDEX 2
190 #define PXE_BIS_INDEX 3
191
192 #define DHCPV4_ACK_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[DHCPV4_ACK_INDEX]
193 #define PXE_BINL_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BINL_INDEX]
194 #define PXE_OFFER_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_OFFER_INDEX]
195 #define PXE_ACK_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_ACK_INDEX]
196 #define PXE_BIS_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BIS_INDEX]
197
198 #define DHCPV4_ACK_PACKET DHCPV4_ACK_BUFFER.u.Dhcpv4
199 #define PXE_BINL_PACKET PXE_BINL_BUFFER.u.Dhcpv4
200 #define PXE_OFFER_PACKET PXE_OFFER_BUFFER.u.Dhcpv4
201 #define PXE_ACK_PACKET PXE_ACK_BUFFER.u.Dhcpv4
202 #define PXE_BIS_PACKET PXE_BIS_BUFFER.u.Dhcpv4
203
204 //
205 // network structure definitions
206 //
207 //
208 // some option definitions
209 //
210 #define DHCPV4_OPTION_LENGTH(type) (sizeof (type) - sizeof (DHCPV4_OP_HEADER))
211
212 typedef struct {
213 DHCPV4_OP_HEADER Header;
214 UINT8 Type;
215 } DHCPV4_OP_MESSAGE_TYPE;
216
217 typedef struct {
218 DHCPV4_OP_HEADER Header;
219 UINT8 Overload;
220 } DHCPV4_OP_OVERLOAD;
221
222 //
223 // boot server list structure
224 // one or more contained in a pxe boot servers structure
225 //
226 typedef struct {
227 UINT8 IpCount;
228 EFI_IPv4_ADDRESS IpList[1]; // IP count of IPs
229 } PXEV4_SERVER_LIST;
230
231 typedef struct {
232 UINT8 IpCount;
233 EFI_IPv6_ADDRESS IpList[1]; // IP count of IPs
234 } PXEV6_SERVER_LIST;
235
236 typedef union {
237 PXEV4_SERVER_LIST Ipv4List;
238 PXEV6_SERVER_LIST Ipv6List;
239 } PXE_SERVER_LISTS;
240
241 typedef struct {
242 UINT16 Type;
243 PXE_SERVER_LISTS u;
244 } PXE_SERVER_LIST;
245
246 //
247 // pxe boot servers structure
248 //
249 typedef struct {
250 DHCPV4_OP_HEADER Header;
251 PXE_SERVER_LIST ServerList[1]; // one or more
252 } PXE_OP_SERVER_LIST;
253
254 //
255 // pxe boot item structure
256 //
257 typedef struct {
258 DHCPV4_OP_HEADER Header;
259 UINT16 Type;
260 UINT16 Layer;
261 } PXE_OP_BOOT_ITEM;
262
263 //
264 // pxe boot menu item structure
265 //
266 typedef struct {
267 UINT16 Type;
268 UINT8 DataLen;
269 UINT8 Data[1];
270 } PXE_BOOT_MENU_ENTRY;
271
272 //
273 // pxe boot menu structure
274 //
275 typedef struct {
276 DHCPV4_OP_HEADER Header;
277 PXE_BOOT_MENU_ENTRY MenuItem[1];
278 } PXE_OP_BOOT_MENU;
279
280 //
281 // pxe boot prompt structure
282 //
283 typedef struct {
284 DHCPV4_OP_HEADER Header;
285 UINT8 Timeout;
286 UINT8 Prompt[1];
287 } PXE_OP_BOOT_PROMPT;
288
289 #define PXE_BOOT_PROMPT_AUTO_SELECT 0
290 #define PXE_BOOT_PROMPT_NO_TIMEOUT 255
291
292 typedef struct {
293 DHCPV4_OP_HEADER Header;
294 UINT8 Class[1];
295 } DHCPV4_OP_CLASS;
296
297 typedef struct {
298 DHCPV4_OP_HEADER Header;
299 UINT8 File[1];
300 } DHCPV4_OP_BOOTFILE;
301
302 typedef struct {
303 DHCPV4_OP_HEADER Header;
304 UINT8 VendorOptions[1];
305 } DHCPV4_OP_VENDOR_OPTIONS;
306
307 typedef struct {
308 DHCPV4_OP_HEADER Header;
309 UINT8 MaxSize[2];
310 } DHCPV4_OP_MAX_MESSAGE_SIZE;
311
312 typedef struct {
313 UINT8 _OP_SUBNET_MASK; /* 1 */
314 UINT8 _OP_TIME_OFFSET; /* 2 */
315 UINT8 _OP_ROUTER_LIST; /* 3 */
316 UINT8 _OP_TIME_SERVERS; /* 4 */
317 UINT8 _OP_NAME_SERVERS; /* 5 */
318 UINT8 _OP_DNS_SERVERS; /* 6 */
319 UINT8 _OP_HOST_NAME; /* 12 */
320 UINT8 _OP_BOOT_FILE_SZ; /* 13 */
321 UINT8 _OP_DOMAIN_NAME; /* 15 */
322 UINT8 _OP_ROOT_PATH; /* 17 */
323 UINT8 _OP_EXTENSION_PATH; /* 18 */
324 UINT8 _OP_MAX_DATAGRAM_SZ; /* 22 */
325 UINT8 _OP_DEFAULT_TTL; /* 23 */
326 UINT8 _OP_BROADCAST_ADD; /* 28 */
327 UINT8 _OP_NIS_DOMAIN_NAME; /* 40 */
328 UINT8 _OP_NIS_SERVERS; /* 41 */
329 UINT8 _OP_NTP_SERVERS; /* 42 */
330 UINT8 _OP_VENDOR_SPECIFIC; /* 43 */
331 UINT8 _OP_DHCP_REQ_IP_ADD; /* 50 */
332 UINT8 _OP_DHCP_LEASE_TIME; /* 51 */
333 UINT8 _OP_DHCP_SERVER_IP; /* 54 */
334 UINT8 _OP_DHCP_RENEWAL_TIME; /* 58 */
335 UINT8 _OP_DHCP_REBINDING_TIME; /* 59 */
336 UINT8 _OP_DHCP_CLASS_IDENTIFIER; /* 60 */
337 UINT8 _OP_DHCP_TFTP_SERVER_NAME; /* 66 */
338 UINT8 _OP_DHCP_BOOTFILE; /* 67 */
339 UINT8 _OP_DHCP_PLATFORM_ID; /* 97 */
340 UINT8 VendorOption128; // vendor option 128
341 UINT8 VendorOption129; // vendor option 129
342 UINT8 VendorOption130; // vendor option 130
343 UINT8 VendorOption131; // vendor option 131
344 UINT8 VendorOption132; // vendor option 132
345 UINT8 VendorOption133; // vendor option 133
346 UINT8 VendorOption134; // vendor option 134
347 UINT8 VendorOption135; // vendor option 135
348 } DHCPV4_REQUESTED_OPTIONS_DATA;
349
350 typedef struct {
351 DHCPV4_OP_HEADER Header;
352 DHCPV4_REQUESTED_OPTIONS_DATA Data;
353 } DHCPV4_OP_REQUESTED_OPTIONS;
354
355 typedef struct opipstr {
356 DHCPV4_OP_HEADER Header;
357 EFI_IPv4_ADDRESS Ip;
358 } DHCPV4_OP_IP_ADDRESS;
359
360 //
361 // ip list structure - e.g. router list
362 //
363 typedef struct {
364 DHCPV4_OP_HEADER Header;
365 EFI_IPv4_ADDRESS IpList[1];
366 } DHCPV4_OP_IP_LIST;
367
368 typedef struct {
369 DHCPV4_OP_HEADER Header;
370 UINT8 Type;
371 UINT8 Guid[sizeof (EFI_GUID)];
372 } DHCPV4_OP_CLIENT_ID;
373
374 //
375 // special options start - someday obsolete ???
376 //
377 #define DHCPV4_OP_PLATFORM_ID DHCPV4_OP_CLIENT_ID
378
379 typedef struct {
380 DHCPV4_OP_HEADER Header;
381 UINT8 Type; // SNP = 2
382 UINT8 MajorVersion;
383 UINT8 MinorVersion;
384 } DHCPV4_OP_NETWORK_INTERFACE;
385
386 #define UNDI_TYPE 1
387 #define SNP_TYPE 2
388
389 typedef struct {
390 DHCPV4_OP_HEADER Header;
391 UINT16 Type;
392 } DHCPV4_OP_ARCHITECTURE_TYPE;
393 //
394 // special options end - someday obsolete ???
395 //
396 typedef struct {
397 UINT8 ClassIdentifier[10]; // PXEClient:
398 UINT8 Lit2[5]; // Arch:
399 UINT8 ArchitectureType[5]; // 00000 - 65536
400 UINT8 Lit3[1]; // :
401 UINT8 InterfaceName[4]; // e.g. UNDI
402 UINT8 Lit4[1]; // :
403 UINT8 UndiMajor[3]; // 000 - 255
404 UINT8 UndiMinor[3]; // 000 - 255
405 } DHCPV4_CLASS_ID_DATA;
406
407 typedef struct {
408 DHCPV4_OP_HEADER Header;
409 DHCPV4_CLASS_ID_DATA Data;
410 } DHCPV4_OP_CLASS_ID;
411
412 typedef struct {
413 DHCPV4_OP_HEADER Header;
414 EFI_IPv4_ADDRESS Ip;
415 } DHCPV4_OP_REQUESTED_IP;
416
417 typedef struct {
418 DHCPV4_OP_HEADER Header;
419 EFI_IPv4_ADDRESS Ip;
420 } DHCPV4_OP_SERVER_IP;
421
422 typedef struct {
423 DHCPV4_OP_HEADER Header;
424 EFI_IPv4_ADDRESS Ip;
425 } DHCPV4_OP_SUBNET_MASK;
426
427 typedef struct { // oppxedisctlstr {
428 DHCPV4_OP_HEADER Header;
429 UINT8 ControlBits;
430 } PXE_OP_DISCOVERY_CONTROL;
431
432 #define DISABLE_BCAST (1 << 0)
433 #define DISABLE_MCAST (1 << 1)
434 #define USE_ACCEPT_LIST (1 << 2)
435 #define USE_BOOTFILE (1 << 3)
436
437 #pragma pack()
438 //
439 // definitions of indices to populate option interest array
440 //
441 #define VEND_PXE_MTFTP_IP_IX 1 // multicast IP address of bootfile for MTFTP listen
442 #define VEND_PXE_MTFTP_CPORT_IX 2 // UDP Port to monitor for MTFTP responses - Intel order
443 #define VEND_PXE_MTFTP_SPORT_IX 3 // Server UDP Port for MTFTP open - Intel order
444 #define VEND_PXE_MTFTP_TMOUT_IX 4 // Listen timeout - secs
445 #define VEND_PXE_MTFTP_DELAY_IX 5 // Transmission timeout - secs
446 #define VEND_PXE_DISCOVERY_CONTROL_IX 6 // bit field
447 #define VEND_PXE_DISCOVERY_MCAST_ADDR_IX 7 // boot server discovery multicast address
448 #define VEND_PXE_BOOT_SERVERS_IX 8 // list of boot servers of form tp(2) cnt(1) ips[cnt]
449 #define VEND_PXE_BOOT_MENU_IX 9
450 #define VEND_PXE_BOOT_PROMPT_IX 10
451 #define VEND_PXE_MCAST_ADDRS_ALLOC_IX 0 // not used by PXE client
452 #define VEND_PXE_CREDENTIAL_TYPES_IX 11
453 #define VEND_13_IX 0 // not used by PXE client
454 #define VEND_14_IX 0 // not used by PXE client
455 #define VEND_15_IX 0 // not used by PXE client
456 #define VEND_16_IX 0 // not used by PXE client
457 #define VEND_17_IX 0 // not used by PXE client
458 #define VEND_18_IX 0 // not used by PXE client
459 #define VEND_19_IX 0 // not used by PXE client
460 #define VEND_20_IX 0 // not used by PXE client
461 #define VEND_21_IX 0 // not used by PXE client
462 #define VEND_22_IX 0 // not used by PXE client
463 #define VEND_23_IX 0 // not used by PXE client
464 #define VEND_24_IX 0 // not used by PXE client
465 #define VEND_25_IX 0 // not used by PXE client
466 #define VEND_26_IX 0 // not used by PXE client
467 #define VEND_27_IX 0 // not used by PXE client
468 #define VEND_28_IX 0 // not used by PXE client
469 #define VEND_29_IX 0 // not used by PXE client
470 #define VEND_30_IX 0 // not used by PXE client
471 #define VEND_31_IX 0 // not used by PXE client
472 #define VEND_32_IX 0 // not used by PXE client
473 #define VEND_33_IX 0 // not used by PXE client
474 #define VEND_34_IX 0 // not used by PXE client
475 #define VEND_35_IX 0 // not used by PXE client
476 #define VEND_36_IX 0 // not used by PXE client
477 #define VEND_37_IX 0 // not used by PXE client
478 #define VEND_38_IX 0 // not used by PXE client
479 #define VEND_39_IX 0 // not used by PXE client
480 #define VEND_40_IX 0 // not used by PXE client
481 #define VEND_41_IX 0 // not used by PXE client
482 #define VEND_42_IX 0 // not used by PXE client
483 #define VEND_43_IX 0 // not used by PXE client
484 #define VEND_44_IX 0 // not used by PXE client
485 #define VEND_45_IX 0 // not used by PXE client
486 #define VEND_46_IX 0 // not used by PXE client
487 #define VEND_47_IX 0 // not used by PXE client
488 #define VEND_48_IX 0 // not used by PXE client
489 #define VEND_49_IX 0 // not used by PXE client
490 #define VEND_50_IX 0 // not used by PXE client
491 #define VEND_51_IX 0 // not used by PXE client
492 #define VEND_52_IX 0 // not used by PXE client
493 #define VEND_53_IX 0 // not used by PXE client
494 #define VEND_54_IX 0 // not used by PXE client
495 #define VEND_55_IX 0 // not used by PXE client
496 #define VEND_56_IX 0 // not used by PXE client
497 #define VEND_57_IX 0 // not used by PXE client
498 #define VEND_58_IX 0 // not used by PXE client
499 #define VEND_59_IX 0 // not used by PXE client
500 #define VEND_60_IX 0 // not used by PXE client
501 #define VEND_61_IX 0 // not used by PXE client
502 #define VEND_62_IX 0 // not used by PXE client
503 #define VEND_63_IX 0 // not used by PXE client
504 #define VEND_64_IX 0 // not used by PXE client
505 #define VEND_65_IX 0 // not used by PXE client
506 #define VEND_66_IX 0 // not used by PXE client
507 #define VEND_67_IX 0 // not used by PXE client
508 #define VEND_68_IX 0 // not used by PXE client
509 #define VEND_69_IX 0 // not used by PXE client
510 #define VEND_70_IX 0 // not used by PXE client
511 #define VEND_PXE_BOOT_ITEM_IX 12
512
513 #define MAX_OUR_PXE_OPT VEND_PXE_BOOT_ITEM // largest PXE option in which we are interested
514 #define MAX_OUR_PXE_IX VEND_PXE_BOOT_ITEM_IX // largest PXE option index
515 //
516 // define various types by options that are sent
517 //
518 #define WfM11a_OPTS ((1<<VEND_PXE_MTFTP_IP_IX) | \
519 (1<<VEND_PXE_MTFTP_CPORT_IX) | \
520 (1<<VEND_PXE_MTFTP_SPORT_IX) | \
521 (1<<VEND_PXE_MTFTP_TMOUT_IX) | \
522 (1<<VEND_PXE_MTFTP_DELAY_IX))
523
524 #define DISCOVER_OPTS ((1<<VEND_PXE_DISCOVERY_CONTROL_IX) | \
525 (1<<VEND_PXE_DISCOVERY_MCAST_ADDR_IX) | \
526 (1<<VEND_PXE_BOOT_SERVERS_IX) | \
527 (1<<VEND_PXE_BOOT_MENU_IX) | \
528 (1<<VEND_PXE_BOOT_PROMPT_IX) | \
529 (1<<VEND_PXE_BOOT_ITEM_IX))
530
531 #define CREDENTIALS_OPT (1 << VEND_PXE_CREDENTIAL_TYPES_IX)
532
533 //
534 // definitions of indices to populate option interest array
535 //
536 #define OP_SUBNET_MASK_IX 1
537 #define OP_TIME_OFFSET_IX 0 // not used by PXE client
538 #define OP_ROUTER_LIST_IX 2
539 #define OP_TIME_SERVERS_IX 0 // not used by PXE client
540 #define OP_NAME_SERVERS_IX 0 // not used by PXE client
541 #define OP_DNS_SERVERS_IX 0 // not used by PXE client
542 #define OP_LOG_SERVERS_IX 0 // not used by PXE client
543 #define OP_COOKIE_SERVERS_IX 0 // not used by PXE client
544 #define OP_LPR_SREVERS_IX 0 // not used by PXE client
545 #define OP_IMPRESS_SERVERS_IX 0 // not used by PXE client
546 #define OP_RES_LOC_SERVERS_IX 0 // not used by PXE client
547 #define OP_HOST_NAME_IX 0 // not used by PXE client
548 #define OP_BOOT_FILE_SZ_IX 9
549 #define OP_DUMP_FILE_IX 0 // not used by PXE client
550 #define OP_DOMAIN_NAME_IX 0 // not used by PXE client
551 #define OP_SWAP_SERVER_IX 0 // not used by PXE client
552 #define OP_ROOT_PATH_IX 0 // not used by PXE client
553 #define OP_EXTENSION_PATH_IX 0 // not used by PXE client
554 #define OP_IP_FORWARDING_IX 0 // not used by PXE client
555 #define OP_NON_LOCAL_SRC_RTE_IX 0 // not used by PXE client
556 #define OP_POLICY_FILTER_IX 0 // not used by PXE client
557 #define OP_MAX_DATAGRAM_SZ_IX 0 // not used by PXE client
558 #define OP_DEFAULT_TTL_IX 0 // not used by PXE client
559 #define OP_MTU_AGING_TIMEOUT_IX 0 // not used by PXE client
560 #define OP_MTU_SIZES_IX 0 // not used by PXE client
561 #define OP_MTU_TO_USE_IX 0 // not used by PXE client
562 #define OP_ALL_SUBNETS_LOCAL_IX 0 // not used by PXE client
563 #define OP_BROADCAST_ADD_IX 0 // not used by PXE client
564 #define OP_PERFORM_MASK_DISCOVERY_IX 0 // not used by PXE client
565 #define OP_RESPOND_TO_MASK_REQ_IX 0 // not used by PXE client
566 #define OP_PERFORM_ROUTER_DISCOVERY_IX 0 // not used by PXE client
567 #define OP_ROUTER_SOLICIT_ADDRESS_IX 0 // not used by PXE client
568 #define OP_STATIC_ROUTER_LIST_IX 0 // not used by PXE client
569 #define OP_USE_ARP_TRAILERS_IX 0 // not used by PXE client
570 #define OP_ARP_CACHE_TIMEOUT_IX 0 // not used by PXE client
571 #define OP_ETHERNET_ENCAPSULATION_IX 0 // not used by PXE client
572 #define OP_TCP_DEFAULT_TTL_IX 0 // not used by PXE client
573 #define OP_TCP_KEEP_ALIVE_INT_IX 0 // not used by PXE client
574 #define OP_KEEP_ALIVE_GARBAGE_IX 0 // not used by PXE client
575 #define OP_NIS_DOMAIN_NAME_IX 0 // not used by PXE client
576 #define OP_NIS_SERVERS_IX 0 // not used by PXE client
577 #define OP_NTP_SERVERS_IX 0 // not used by PXE client
578 #define OP_VENDOR_SPECIFIC_IX 3
579 #define OP_NBNS_SERVERS_IX 0 // not used by PXE client
580 #define OP_NBDD_SERVERS_IX 0 // not used by PXE client
581 #define OP_NETBIOS_NODE_TYPE_IX 0 // not used by PXE client
582 #define OP_NETBIOS_SCOPE_IX 0 // not used by PXE client
583 #define OP_XWINDOW_SYSTEM_FONT_SERVERS_IX 0 // not used by PXE client
584 #define OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS_IX 0 // not used by PXE client
585 // DHCP option indices
586 //
587 #define OP_DHCP_REQ_IP_ADD_IX 0 // not used by PXE client
588 #define OP_DHCP_LEASE_TIME_IX 0 // not used by PXE client
589 #define OP_DHCP_OPTION_OVERLOAD_IX 4
590 #define OP_DHCP_MESSAGE_TYPE_IX 5
591 #define OP_DHCP_SERVER_IP_IX 6
592 #define OP_DHCP_PARM_REQ_LIST_IX 0 // not used by PXE client
593 #define OP_DHCP_ERROR_MESSAGE_IX 0 // not used by PXE client
594 #define OP_DHCP_MAX_MESSAGE_SZ_IX 0 // not used by PXE client
595 #define OP_DHCP_RENEWAL_TIME_IX 0 // not used by PXE client
596 #define OP_DHCP_REBINDING_TIME_IX 0 // not used by PXE client
597 #define OP_DHCP_CLASS_IDENTIFIER_IX 7
598 #define OP_DHCP_CLIENT_IDENTIFIER_IX 0 // not used by PXE client
599 #define OP_RESERVED62_IX 0 // not used by PXE client
600 #define OP_RESERVED63_IX 0 // not used by PXE client
601 #define OP_NISPLUS_DOMAIN_NAME_IX 0 // not used by PXE client
602 #define OP_NISPLUS_SERVERS_IX 0 // not used by PXE client
603 #define OP_DHCP_TFTP_SERVER_NAME_IX 0 // not used by PXE client
604 #define OP_DHCP_BOOTFILE_IX 8
605
606 #define MAX_OUR_OPT OP_DHCP_BOOTFILE // largest option in which we are interested
607 #define MAX_OUR_IX OP_BOOT_FILE_SZ_IX
608
609 typedef struct {
610 DHCPV4_OP_STRUCT *PktOptAdds[MAX_OUR_IX];
611 DHCPV4_OP_STRUCT *PxeOptAdds[MAX_OUR_PXE_IX];
612 UINT8 Status;
613 } OPTION_POINTERS;
614
615 typedef struct DhcpReceiveBufferStruct {
616 union {
617 UINT8 ReceiveBuffer[MAX_DHCP_MSG_SZ];
618 DHCPV4_STRUCT Dhcpv4;
619 } u;
620
621 OPTION_POINTERS OpAdds;
622 } DHCP_RECEIVE_BUFFER;
623
624 #define PXE_TYPE (1 << 0)
625 #define WfM11a_TYPE (1 << 1)
626 #define DISCOVER_TYPE (1 << 2)
627 #define CREDENTIALS_TYPE (1 << 3)
628 #define USE_THREE_BYTE (1 << 4)
629
630 #endif // _DHCP_H
631
632 /* EOF - dhcp.h */