-/** @file
-
-Copyright (c) 2004, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
-**/
-
-#ifndef _DHCP_H
-#define _DHCP_H
-
-//
-// Definitions for DHCP version 4 UDP packet.
-// The field names in this structure are defined and described in RFC 2131.
-//
-#pragma pack(1)
-
-typedef struct {
- UINT8 op;
-#define BOOTP_REQUEST 1
-#define BOOTP_REPLY 2
-
- UINT8 htype;
- UINT8 hlen;
- UINT8 hops;
- UINT32 xid;
- UINT16 secs;
- UINT16 flags;
-#define DHCP_BROADCAST_FLAG 0x8000
-
- UINT32 ciaddr;
- UINT32 yiaddr;
- UINT32 siaddr;
- UINT32 giaddr;
- UINT8 chaddr[16];
- UINT8 sname[64];
- UINT8 file[128];
- UINT8 options[312];
-#define OP_PAD 0
-#define OP_END 255
-#define OP_SUBNET_MASK 1
-#define OP_TIME_OFFSET 2
-#define OP_ROUTER_LIST 3
-#define OP_TIME_SERVERS 4
-#define OP_NAME_SERVERS 5
-#define OP_DNS_SERVERS 6
-#define OP_LOG_SERVERS 7
-#define OP_COOKIE_SERVERS 8
-#define OP_LPR_SREVERS 9
-#define OP_IMPRESS_SERVERS 10
-#define OP_RES_LOC_SERVERS 11
-#define OP_HOST_NAME 12
-#define OP_BOOT_FILE_SZ 13
-#define OP_DUMP_FILE 14
-#define OP_DOMAIN_NAME 15
-#define OP_SWAP_SERVER 16
-#define OP_ROOT_PATH 17
-#define OP_EXTENSION_PATH 18
-#define OP_IP_FORWARDING 19
-#define OP_NON_LOCAL_SRC_RTE 20
-#define OP_POLICY_FILTER 21
-#define OP_MAX_DATAGRAM_SZ 22
-#define OP_DEFAULT_TTL 23
-#define OP_MTU_AGING_TIMEOUT 24
-#define OP_MTU_SIZES 25
-#define OP_MTU_TO_USE 26
-#define OP_ALL_SUBNETS_LOCAL 27
-#define OP_BROADCAST_ADD 28
-#define OP_PERFORM_MASK_DISCOVERY 29
-#define OP_RESPOND_TO_MASK_REQ 30
-#define OP_PERFORM_ROUTER_DISCOVERY 31
-#define OP_ROUTER_SOLICIT_ADDRESS 32
-#define OP_STATIC_ROUTER_LIST 33
-#define OP_USE_ARP_TRAILERS 34
-#define OP_ARP_CACHE_TIMEOUT 35
-#define OP_ETHERNET_ENCAPSULATION 36
-#define OP_TCP_DEFAULT_TTL 37
-#define OP_TCP_KEEP_ALIVE_INT 38
-#define OP_KEEP_ALIVE_GARBAGE 39
-#define OP_NIS_DOMAIN_NAME 40
-#define OP_NIS_SERVERS 41
-#define OP_NTP_SERVERS 42
-#define OP_VENDOR_SPECIFIC 43
-#define VEND_PXE_MTFTP_IP 1
-#define VEND_PXE_MTFTP_CPORT 2
-#define VEND_PXE_MTFTP_SPORT 3
-#define VEND_PXE_MTFTP_TMOUT 4
-#define VEND_PXE_MTFTP_DELAY 5
-#define VEND_PXE_DISCOVERY_CONTROL 6
-#define PXE_DISABLE_BROADCAST_DISCOVERY (1 << 0)
-#define PXE_DISABLE_MULTICAST_DISCOVERY (1 << 1)
-#define PXE_ACCEPT_ONLY_PXE_BOOT_SERVERS (1 << 2)
-#define PXE_DO_NOT_PROMPT (1 << 3)
-#define VEND_PXE_DISCOVERY_MCAST_ADDR 7
-#define VEND_PXE_BOOT_SERVERS 8
-#define VEND_PXE_BOOT_MENU 9
-#define VEND_PXE_BOOT_PROMPT 10
-#define VEND_PXE_MCAST_ADDRS_ALLOC 11
-#define VEND_PXE_CREDENTIAL_TYPES 12
-#define VEND_PXE_BOOT_ITEM 71
-#define OP_NBNS_SERVERS 44
-#define OP_NBDD_SERVERS 45
-#define OP_NETBIOS_NODE_TYPE 46
-#define OP_NETBIOS_SCOPE 47
-#define OP_XWINDOW_SYSTEM_FONT_SERVERS 48
-#define OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS 49
-#define OP_DHCP_REQ_IP_ADD 50
-#define OP_DHCP_LEASE_TIME 51
-#define OP_DHCP_OPTION_OVERLOAD 52
-#define OVLD_FILE 1
-#define OVLD_SRVR_NAME 2
-#define OP_DHCP_MESSAGE_TYPE 53
-#define DHCPDISCOVER 1
-#define DHCPOFFER 2
-#define DHCPREQUEST 3
-#define DHCPDECLINE 4
-#define DHCPACK 5
-#define DHCPNAK 6
-#define DHCPRELEASE 7
-#define DHCPINFORM 8
-#define OP_DHCP_SERVER_IP 54
-#define OP_DHCP_PARM_REQ_LIST 55
-#define OP_DHCP_ERROR_MESSAGE 56
-#define OP_DHCP_MAX_MESSAGE_SZ 57
-#define OP_DHCP_RENEWAL_TIME 58
-#define OP_DHCP_REBINDING_TIME 59
-#define OP_DHCP_CLASS_IDENTIFIER 60
-#define OP_DHCP_CLIENT_IDENTIFIER 61
-#define OP_NISPLUS_DOMAIN_NAME 64
-#define OP_NISPLUS_SERVERS 65
-#define OP_DHCP_TFTP_SERVER_NAME 66
-#define OP_DHCP_BOOTFILE 67
-#define OP_MOBILE_IP_HOME_AGENTS 68
-#define OP_SMPT_SERVERS 69
-#define OP_POP3_SERVERS 70
-#define OP_NNTP_SERVERS 71
-#define OP_WWW_SERVERS 72
-#define OP_FINGER_SERVERS 73
-#define OP_IRC_SERVERS 74
-#define OP_STREET_TALK_SERVERS 75
-#define OP_STREET_TALK_DIR_ASSIST_SERVERS 76
-#define OP_NDS_SERVERS 85
-#define OP_NDS_TREE_NAME 86
-#define OP_NDS_CONTEXT 87
-#define OP_DHCP_SYSTEM_ARCH 93
-#define OP_DHCP_NETWORK_ARCH 94
-#define OP_DHCP_PLATFORM_ID 97
-} DHCPV4_STRUCT;
-
-//
-// DHCPv4 option header
-//
-typedef struct {
- UINT8 OpCode;
- UINT8 Length;
- //
- // followed by Data[]
- //
-} DHCPV4_OP_HEADER;
-
-//
-// Generic DHCPv4 option (header followed by data)
-//
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT8 Data[1];
-} DHCPV4_OP_STRUCT;
-
-//
-// Maximum DHCP packet size on ethernet
-//
-#define MAX_DHCP_MSG_SZ (MAX_ENET_DATA_SIZE - sizeof (IPV4_HEADER) - sizeof (UDPV4_HEADER))
-
-//
-// Macros used in pxe_bc_dhcp.c and pxe_loadfile.c
-//
-#define DHCPV4_TRANSMIT_BUFFER (*(DHCPV4_STRUCT *) (Private->TransmitBuffer))
-#define DHCPV4_OPTIONS_BUFFER (*(struct optionsstr *) DHCPV4_TRANSMIT_BUFFER.options)
-
-#define DHCPV4_ACK_INDEX 0
-#define PXE_BINL_INDEX 1
-#define PXE_OFFER_INDEX 1
-#define PXE_ACK_INDEX 2
-#define PXE_BIS_INDEX 3
-
-#define DHCPV4_ACK_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[DHCPV4_ACK_INDEX]
-#define PXE_BINL_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BINL_INDEX]
-#define PXE_OFFER_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_OFFER_INDEX]
-#define PXE_ACK_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_ACK_INDEX]
-#define PXE_BIS_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BIS_INDEX]
-
-#define DHCPV4_ACK_PACKET DHCPV4_ACK_BUFFER.u.Dhcpv4
-#define PXE_BINL_PACKET PXE_BINL_BUFFER.u.Dhcpv4
-#define PXE_OFFER_PACKET PXE_OFFER_BUFFER.u.Dhcpv4
-#define PXE_ACK_PACKET PXE_ACK_BUFFER.u.Dhcpv4
-#define PXE_BIS_PACKET PXE_BIS_BUFFER.u.Dhcpv4
-
-//
-// network structure definitions
-//
-//
-// some option definitions
-//
-#define DHCPV4_OPTION_LENGTH(type) (sizeof (type) - sizeof (DHCPV4_OP_HEADER))
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT8 Type;
-} DHCPV4_OP_MESSAGE_TYPE;
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT8 Overload;
-} DHCPV4_OP_OVERLOAD;
-
-//
-// boot server list structure
-// one or more contained in a pxe boot servers structure
-//
-typedef struct {
- UINT8 IpCount;
- EFI_IPv4_ADDRESS IpList[1]; // IP count of IPs
-} PXEV4_SERVER_LIST;
-
-typedef struct {
- UINT8 IpCount;
- EFI_IPv6_ADDRESS IpList[1]; // IP count of IPs
-} PXEV6_SERVER_LIST;
-
-typedef union {
- PXEV4_SERVER_LIST Ipv4List;
- PXEV6_SERVER_LIST Ipv6List;
-} PXE_SERVER_LISTS;
-
-typedef struct {
- UINT16 Type;
- PXE_SERVER_LISTS u;
-} PXE_SERVER_LIST;
-
-//
-// pxe boot servers structure
-//
-typedef struct {
- DHCPV4_OP_HEADER Header;
- PXE_SERVER_LIST ServerList[1]; // one or more
-} PXE_OP_SERVER_LIST;
-
-//
-// pxe boot item structure
-//
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT16 Type;
- UINT16 Layer;
-} PXE_OP_BOOT_ITEM;
-
-//
-// pxe boot menu item structure
-//
-typedef struct {
- UINT16 Type;
- UINT8 DataLen;
- UINT8 Data[1];
-} PXE_BOOT_MENU_ENTRY;
-
-//
-// pxe boot menu structure
-//
-typedef struct {
- DHCPV4_OP_HEADER Header;
- PXE_BOOT_MENU_ENTRY MenuItem[1];
-} PXE_OP_BOOT_MENU;
-
-//
-// pxe boot prompt structure
-//
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT8 Timeout;
- UINT8 Prompt[1];
-} PXE_OP_BOOT_PROMPT;
-
-#define PXE_BOOT_PROMPT_AUTO_SELECT 0
-#define PXE_BOOT_PROMPT_NO_TIMEOUT 255
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT8 Class[1];
-} DHCPV4_OP_CLASS;
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT8 File[1];
-} DHCPV4_OP_BOOTFILE;
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT8 VendorOptions[1];
-} DHCPV4_OP_VENDOR_OPTIONS;
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT8 MaxSize[2];
-} DHCPV4_OP_MAX_MESSAGE_SIZE;
-
-typedef struct {
- UINT8 _OP_SUBNET_MASK; /* 1 */
- UINT8 _OP_TIME_OFFSET; /* 2 */
- UINT8 _OP_ROUTER_LIST; /* 3 */
- UINT8 _OP_TIME_SERVERS; /* 4 */
- UINT8 _OP_NAME_SERVERS; /* 5 */
- UINT8 _OP_DNS_SERVERS; /* 6 */
- UINT8 _OP_HOST_NAME; /* 12 */
- UINT8 _OP_BOOT_FILE_SZ; /* 13 */
- UINT8 _OP_DOMAIN_NAME; /* 15 */
- UINT8 _OP_ROOT_PATH; /* 17 */
- UINT8 _OP_EXTENSION_PATH; /* 18 */
- UINT8 _OP_MAX_DATAGRAM_SZ; /* 22 */
- UINT8 _OP_DEFAULT_TTL; /* 23 */
- UINT8 _OP_BROADCAST_ADD; /* 28 */
- UINT8 _OP_NIS_DOMAIN_NAME; /* 40 */
- UINT8 _OP_NIS_SERVERS; /* 41 */
- UINT8 _OP_NTP_SERVERS; /* 42 */
- UINT8 _OP_VENDOR_SPECIFIC; /* 43 */
- UINT8 _OP_DHCP_REQ_IP_ADD; /* 50 */
- UINT8 _OP_DHCP_LEASE_TIME; /* 51 */
- UINT8 _OP_DHCP_SERVER_IP; /* 54 */
- UINT8 _OP_DHCP_RENEWAL_TIME; /* 58 */
- UINT8 _OP_DHCP_REBINDING_TIME; /* 59 */
- UINT8 _OP_DHCP_CLASS_IDENTIFIER; /* 60 */
- UINT8 _OP_DHCP_TFTP_SERVER_NAME; /* 66 */
- UINT8 _OP_DHCP_BOOTFILE; /* 67 */
- UINT8 _OP_DHCP_PLATFORM_ID; /* 97 */
- UINT8 VendorOption128; // vendor option 128
- UINT8 VendorOption129; // vendor option 129
- UINT8 VendorOption130; // vendor option 130
- UINT8 VendorOption131; // vendor option 131
- UINT8 VendorOption132; // vendor option 132
- UINT8 VendorOption133; // vendor option 133
- UINT8 VendorOption134; // vendor option 134
- UINT8 VendorOption135; // vendor option 135
-} DHCPV4_REQUESTED_OPTIONS_DATA;
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- DHCPV4_REQUESTED_OPTIONS_DATA Data;
-} DHCPV4_OP_REQUESTED_OPTIONS;
-
-typedef struct opipstr {
- DHCPV4_OP_HEADER Header;
- EFI_IPv4_ADDRESS Ip;
-} DHCPV4_OP_IP_ADDRESS;
-
-//
-// ip list structure - e.g. router list
-//
-typedef struct {
- DHCPV4_OP_HEADER Header;
- EFI_IPv4_ADDRESS IpList[1];
-} DHCPV4_OP_IP_LIST;
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT8 Type;
- UINT8 Guid[sizeof (EFI_GUID)];
-} DHCPV4_OP_CLIENT_ID;
-
-//
-// special options start - someday obsolete ???
-//
-#define DHCPV4_OP_PLATFORM_ID DHCPV4_OP_CLIENT_ID
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT8 Type; // SNP = 2
- UINT8 MajorVersion;
- UINT8 MinorVersion;
-} DHCPV4_OP_NETWORK_INTERFACE;
-
-#define UNDI_TYPE 1
-#define SNP_TYPE 2
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- UINT16 Type;
-} DHCPV4_OP_ARCHITECTURE_TYPE;
-//
-// special options end - someday obsolete ???
-//
-typedef struct {
- UINT8 ClassIdentifier[10]; // PXEClient:
- UINT8 Lit2[5]; // Arch:
- UINT8 ArchitectureType[5]; // 00000 - 65536
- UINT8 Lit3[1]; // :
- UINT8 InterfaceName[4]; // e.g. UNDI
- UINT8 Lit4[1]; // :
- UINT8 UndiMajor[3]; // 000 - 255
- UINT8 UndiMinor[3]; // 000 - 255
-} DHCPV4_CLASS_ID_DATA;
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- DHCPV4_CLASS_ID_DATA Data;
-} DHCPV4_OP_CLASS_ID;
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- EFI_IPv4_ADDRESS Ip;
-} DHCPV4_OP_REQUESTED_IP;
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- EFI_IPv4_ADDRESS Ip;
-} DHCPV4_OP_SERVER_IP;
-
-typedef struct {
- DHCPV4_OP_HEADER Header;
- EFI_IPv4_ADDRESS Ip;
-} DHCPV4_OP_SUBNET_MASK;
-
-typedef struct { // oppxedisctlstr {
- DHCPV4_OP_HEADER Header;
- UINT8 ControlBits;
-} PXE_OP_DISCOVERY_CONTROL;
-
-#define DISABLE_BCAST (1 << 0)
-#define DISABLE_MCAST (1 << 1)
-#define USE_ACCEPT_LIST (1 << 2)
-#define USE_BOOTFILE (1 << 3)
-
-#pragma pack()
-//
-// definitions of indices to populate option interest array
-//
-#define VEND_PXE_MTFTP_IP_IX 1 // multicast IP address of bootfile for MTFTP listen
-#define VEND_PXE_MTFTP_CPORT_IX 2 // UDP Port to monitor for MTFTP responses - Intel order
-#define VEND_PXE_MTFTP_SPORT_IX 3 // Server UDP Port for MTFTP open - Intel order
-#define VEND_PXE_MTFTP_TMOUT_IX 4 // Listen timeout - secs
-#define VEND_PXE_MTFTP_DELAY_IX 5 // Transmission timeout - secs
-#define VEND_PXE_DISCOVERY_CONTROL_IX 6 // bit field
-#define VEND_PXE_DISCOVERY_MCAST_ADDR_IX 7 // boot server discovery multicast address
-#define VEND_PXE_BOOT_SERVERS_IX 8 // list of boot servers of form tp(2) cnt(1) ips[cnt]
-#define VEND_PXE_BOOT_MENU_IX 9
-#define VEND_PXE_BOOT_PROMPT_IX 10
-#define VEND_PXE_MCAST_ADDRS_ALLOC_IX 0 // not used by PXE client
-#define VEND_PXE_CREDENTIAL_TYPES_IX 11
-#define VEND_13_IX 0 // not used by PXE client
-#define VEND_14_IX 0 // not used by PXE client
-#define VEND_15_IX 0 // not used by PXE client
-#define VEND_16_IX 0 // not used by PXE client
-#define VEND_17_IX 0 // not used by PXE client
-#define VEND_18_IX 0 // not used by PXE client
-#define VEND_19_IX 0 // not used by PXE client
-#define VEND_20_IX 0 // not used by PXE client
-#define VEND_21_IX 0 // not used by PXE client
-#define VEND_22_IX 0 // not used by PXE client
-#define VEND_23_IX 0 // not used by PXE client
-#define VEND_24_IX 0 // not used by PXE client
-#define VEND_25_IX 0 // not used by PXE client
-#define VEND_26_IX 0 // not used by PXE client
-#define VEND_27_IX 0 // not used by PXE client
-#define VEND_28_IX 0 // not used by PXE client
-#define VEND_29_IX 0 // not used by PXE client
-#define VEND_30_IX 0 // not used by PXE client
-#define VEND_31_IX 0 // not used by PXE client
-#define VEND_32_IX 0 // not used by PXE client
-#define VEND_33_IX 0 // not used by PXE client
-#define VEND_34_IX 0 // not used by PXE client
-#define VEND_35_IX 0 // not used by PXE client
-#define VEND_36_IX 0 // not used by PXE client
-#define VEND_37_IX 0 // not used by PXE client
-#define VEND_38_IX 0 // not used by PXE client
-#define VEND_39_IX 0 // not used by PXE client
-#define VEND_40_IX 0 // not used by PXE client
-#define VEND_41_IX 0 // not used by PXE client
-#define VEND_42_IX 0 // not used by PXE client
-#define VEND_43_IX 0 // not used by PXE client
-#define VEND_44_IX 0 // not used by PXE client
-#define VEND_45_IX 0 // not used by PXE client
-#define VEND_46_IX 0 // not used by PXE client
-#define VEND_47_IX 0 // not used by PXE client
-#define VEND_48_IX 0 // not used by PXE client
-#define VEND_49_IX 0 // not used by PXE client
-#define VEND_50_IX 0 // not used by PXE client
-#define VEND_51_IX 0 // not used by PXE client
-#define VEND_52_IX 0 // not used by PXE client
-#define VEND_53_IX 0 // not used by PXE client
-#define VEND_54_IX 0 // not used by PXE client
-#define VEND_55_IX 0 // not used by PXE client
-#define VEND_56_IX 0 // not used by PXE client
-#define VEND_57_IX 0 // not used by PXE client
-#define VEND_58_IX 0 // not used by PXE client
-#define VEND_59_IX 0 // not used by PXE client
-#define VEND_60_IX 0 // not used by PXE client
-#define VEND_61_IX 0 // not used by PXE client
-#define VEND_62_IX 0 // not used by PXE client
-#define VEND_63_IX 0 // not used by PXE client
-#define VEND_64_IX 0 // not used by PXE client
-#define VEND_65_IX 0 // not used by PXE client
-#define VEND_66_IX 0 // not used by PXE client
-#define VEND_67_IX 0 // not used by PXE client
-#define VEND_68_IX 0 // not used by PXE client
-#define VEND_69_IX 0 // not used by PXE client
-#define VEND_70_IX 0 // not used by PXE client
-#define VEND_PXE_BOOT_ITEM_IX 12
-
-#define MAX_OUR_PXE_OPT VEND_PXE_BOOT_ITEM // largest PXE option in which we are interested
-#define MAX_OUR_PXE_IX VEND_PXE_BOOT_ITEM_IX // largest PXE option index
-//
-// define various types by options that are sent
-//
-#define WfM11a_OPTS ((1<<VEND_PXE_MTFTP_IP_IX) | \
- (1<<VEND_PXE_MTFTP_CPORT_IX) | \
- (1<<VEND_PXE_MTFTP_SPORT_IX) | \
- (1<<VEND_PXE_MTFTP_TMOUT_IX) | \
- (1<<VEND_PXE_MTFTP_DELAY_IX))
-
-#define DISCOVER_OPTS ((1<<VEND_PXE_DISCOVERY_CONTROL_IX) | \
- (1<<VEND_PXE_DISCOVERY_MCAST_ADDR_IX) | \
- (1<<VEND_PXE_BOOT_SERVERS_IX) | \
- (1<<VEND_PXE_BOOT_MENU_IX) | \
- (1<<VEND_PXE_BOOT_PROMPT_IX) | \
- (1<<VEND_PXE_BOOT_ITEM_IX))
-
-#define CREDENTIALS_OPT (1 << VEND_PXE_CREDENTIAL_TYPES_IX)
-
-//
-// definitions of indices to populate option interest array
-//
-#define OP_SUBNET_MASK_IX 1
-#define OP_TIME_OFFSET_IX 0 // not used by PXE client
-#define OP_ROUTER_LIST_IX 2
-#define OP_TIME_SERVERS_IX 0 // not used by PXE client
-#define OP_NAME_SERVERS_IX 0 // not used by PXE client
-#define OP_DNS_SERVERS_IX 0 // not used by PXE client
-#define OP_LOG_SERVERS_IX 0 // not used by PXE client
-#define OP_COOKIE_SERVERS_IX 0 // not used by PXE client
-#define OP_LPR_SREVERS_IX 0 // not used by PXE client
-#define OP_IMPRESS_SERVERS_IX 0 // not used by PXE client
-#define OP_RES_LOC_SERVERS_IX 0 // not used by PXE client
-#define OP_HOST_NAME_IX 0 // not used by PXE client
-#define OP_BOOT_FILE_SZ_IX 9
-#define OP_DUMP_FILE_IX 0 // not used by PXE client
-#define OP_DOMAIN_NAME_IX 0 // not used by PXE client
-#define OP_SWAP_SERVER_IX 0 // not used by PXE client
-#define OP_ROOT_PATH_IX 0 // not used by PXE client
-#define OP_EXTENSION_PATH_IX 0 // not used by PXE client
-#define OP_IP_FORWARDING_IX 0 // not used by PXE client
-#define OP_NON_LOCAL_SRC_RTE_IX 0 // not used by PXE client
-#define OP_POLICY_FILTER_IX 0 // not used by PXE client
-#define OP_MAX_DATAGRAM_SZ_IX 0 // not used by PXE client
-#define OP_DEFAULT_TTL_IX 0 // not used by PXE client
-#define OP_MTU_AGING_TIMEOUT_IX 0 // not used by PXE client
-#define OP_MTU_SIZES_IX 0 // not used by PXE client
-#define OP_MTU_TO_USE_IX 0 // not used by PXE client
-#define OP_ALL_SUBNETS_LOCAL_IX 0 // not used by PXE client
-#define OP_BROADCAST_ADD_IX 0 // not used by PXE client
-#define OP_PERFORM_MASK_DISCOVERY_IX 0 // not used by PXE client
-#define OP_RESPOND_TO_MASK_REQ_IX 0 // not used by PXE client
-#define OP_PERFORM_ROUTER_DISCOVERY_IX 0 // not used by PXE client
-#define OP_ROUTER_SOLICIT_ADDRESS_IX 0 // not used by PXE client
-#define OP_STATIC_ROUTER_LIST_IX 0 // not used by PXE client
-#define OP_USE_ARP_TRAILERS_IX 0 // not used by PXE client
-#define OP_ARP_CACHE_TIMEOUT_IX 0 // not used by PXE client
-#define OP_ETHERNET_ENCAPSULATION_IX 0 // not used by PXE client
-#define OP_TCP_DEFAULT_TTL_IX 0 // not used by PXE client
-#define OP_TCP_KEEP_ALIVE_INT_IX 0 // not used by PXE client
-#define OP_KEEP_ALIVE_GARBAGE_IX 0 // not used by PXE client
-#define OP_NIS_DOMAIN_NAME_IX 0 // not used by PXE client
-#define OP_NIS_SERVERS_IX 0 // not used by PXE client
-#define OP_NTP_SERVERS_IX 0 // not used by PXE client
-#define OP_VENDOR_SPECIFIC_IX 3
-#define OP_NBNS_SERVERS_IX 0 // not used by PXE client
-#define OP_NBDD_SERVERS_IX 0 // not used by PXE client
-#define OP_NETBIOS_NODE_TYPE_IX 0 // not used by PXE client
-#define OP_NETBIOS_SCOPE_IX 0 // not used by PXE client
-#define OP_XWINDOW_SYSTEM_FONT_SERVERS_IX 0 // not used by PXE client
-#define OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS_IX 0 // not used by PXE client
-// DHCP option indices
-//
-#define OP_DHCP_REQ_IP_ADD_IX 0 // not used by PXE client
-#define OP_DHCP_LEASE_TIME_IX 0 // not used by PXE client
-#define OP_DHCP_OPTION_OVERLOAD_IX 4
-#define OP_DHCP_MESSAGE_TYPE_IX 5
-#define OP_DHCP_SERVER_IP_IX 6
-#define OP_DHCP_PARM_REQ_LIST_IX 0 // not used by PXE client
-#define OP_DHCP_ERROR_MESSAGE_IX 0 // not used by PXE client
-#define OP_DHCP_MAX_MESSAGE_SZ_IX 0 // not used by PXE client
-#define OP_DHCP_RENEWAL_TIME_IX 0 // not used by PXE client
-#define OP_DHCP_REBINDING_TIME_IX 0 // not used by PXE client
-#define OP_DHCP_CLASS_IDENTIFIER_IX 7
-#define OP_DHCP_CLIENT_IDENTIFIER_IX 0 // not used by PXE client
-#define OP_RESERVED62_IX 0 // not used by PXE client
-#define OP_RESERVED63_IX 0 // not used by PXE client
-#define OP_NISPLUS_DOMAIN_NAME_IX 0 // not used by PXE client
-#define OP_NISPLUS_SERVERS_IX 0 // not used by PXE client
-#define OP_DHCP_TFTP_SERVER_NAME_IX 0 // not used by PXE client
-#define OP_DHCP_BOOTFILE_IX 8
-
-#define MAX_OUR_OPT OP_DHCP_BOOTFILE // largest option in which we are interested
-#define MAX_OUR_IX OP_BOOT_FILE_SZ_IX
-
-typedef struct {
- DHCPV4_OP_STRUCT *PktOptAdds[MAX_OUR_IX];
- DHCPV4_OP_STRUCT *PxeOptAdds[MAX_OUR_PXE_IX];
- UINT8 Status;
-} OPTION_POINTERS;
-
-typedef struct DhcpReceiveBufferStruct {
- union {
- UINT8 ReceiveBuffer[MAX_DHCP_MSG_SZ];
- DHCPV4_STRUCT Dhcpv4;
- } u;
-
- OPTION_POINTERS OpAdds;
-} DHCP_RECEIVE_BUFFER;
-
-#define PXE_TYPE (1 << 0)
-#define WfM11a_TYPE (1 << 1)
-#define DISCOVER_TYPE (1 << 2)
-#define CREDENTIALS_TYPE (1 << 3)
-#define USE_THREE_BYTE (1 << 4)
-
-#endif // _DHCP_H
-
-/* EOF - dhcp.h */
+/** @file\r
+\r
+Copyright (c) 2004, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+\r
+**/\r
+\r
+#ifndef _DHCP_H\r
+#define _DHCP_H\r
+\r
+//\r
+// Definitions for DHCP version 4 UDP packet.\r
+// The field names in this structure are defined and described in RFC 2131.\r
+//\r
+#pragma pack(1)\r
+\r
+typedef struct {\r
+ UINT8 op;\r
+#define BOOTP_REQUEST 1\r
+#define BOOTP_REPLY 2\r
+\r
+ UINT8 htype;\r
+ UINT8 hlen;\r
+ UINT8 hops;\r
+ UINT32 xid;\r
+ UINT16 secs;\r
+ UINT16 flags;\r
+#define DHCP_BROADCAST_FLAG 0x8000\r
+\r
+ UINT32 ciaddr;\r
+ UINT32 yiaddr;\r
+ UINT32 siaddr;\r
+ UINT32 giaddr;\r
+ UINT8 chaddr[16];\r
+ UINT8 sname[64];\r
+ UINT8 file[128];\r
+ UINT8 options[312];\r
+#define OP_PAD 0\r
+#define OP_END 255\r
+#define OP_SUBNET_MASK 1\r
+#define OP_TIME_OFFSET 2\r
+#define OP_ROUTER_LIST 3\r
+#define OP_TIME_SERVERS 4\r
+#define OP_NAME_SERVERS 5\r
+#define OP_DNS_SERVERS 6\r
+#define OP_LOG_SERVERS 7\r
+#define OP_COOKIE_SERVERS 8\r
+#define OP_LPR_SREVERS 9\r
+#define OP_IMPRESS_SERVERS 10\r
+#define OP_RES_LOC_SERVERS 11\r
+#define OP_HOST_NAME 12\r
+#define OP_BOOT_FILE_SZ 13\r
+#define OP_DUMP_FILE 14\r
+#define OP_DOMAIN_NAME 15\r
+#define OP_SWAP_SERVER 16\r
+#define OP_ROOT_PATH 17\r
+#define OP_EXTENSION_PATH 18\r
+#define OP_IP_FORWARDING 19\r
+#define OP_NON_LOCAL_SRC_RTE 20\r
+#define OP_POLICY_FILTER 21\r
+#define OP_MAX_DATAGRAM_SZ 22\r
+#define OP_DEFAULT_TTL 23\r
+#define OP_MTU_AGING_TIMEOUT 24\r
+#define OP_MTU_SIZES 25\r
+#define OP_MTU_TO_USE 26\r
+#define OP_ALL_SUBNETS_LOCAL 27\r
+#define OP_BROADCAST_ADD 28\r
+#define OP_PERFORM_MASK_DISCOVERY 29\r
+#define OP_RESPOND_TO_MASK_REQ 30\r
+#define OP_PERFORM_ROUTER_DISCOVERY 31\r
+#define OP_ROUTER_SOLICIT_ADDRESS 32\r
+#define OP_STATIC_ROUTER_LIST 33\r
+#define OP_USE_ARP_TRAILERS 34\r
+#define OP_ARP_CACHE_TIMEOUT 35\r
+#define OP_ETHERNET_ENCAPSULATION 36\r
+#define OP_TCP_DEFAULT_TTL 37\r
+#define OP_TCP_KEEP_ALIVE_INT 38\r
+#define OP_KEEP_ALIVE_GARBAGE 39\r
+#define OP_NIS_DOMAIN_NAME 40\r
+#define OP_NIS_SERVERS 41\r
+#define OP_NTP_SERVERS 42\r
+#define OP_VENDOR_SPECIFIC 43\r
+#define VEND_PXE_MTFTP_IP 1\r
+#define VEND_PXE_MTFTP_CPORT 2\r
+#define VEND_PXE_MTFTP_SPORT 3\r
+#define VEND_PXE_MTFTP_TMOUT 4\r
+#define VEND_PXE_MTFTP_DELAY 5\r
+#define VEND_PXE_DISCOVERY_CONTROL 6\r
+#define PXE_DISABLE_BROADCAST_DISCOVERY (1 << 0)\r
+#define PXE_DISABLE_MULTICAST_DISCOVERY (1 << 1)\r
+#define PXE_ACCEPT_ONLY_PXE_BOOT_SERVERS (1 << 2)\r
+#define PXE_DO_NOT_PROMPT (1 << 3)\r
+#define VEND_PXE_DISCOVERY_MCAST_ADDR 7\r
+#define VEND_PXE_BOOT_SERVERS 8\r
+#define VEND_PXE_BOOT_MENU 9\r
+#define VEND_PXE_BOOT_PROMPT 10\r
+#define VEND_PXE_MCAST_ADDRS_ALLOC 11\r
+#define VEND_PXE_CREDENTIAL_TYPES 12\r
+#define VEND_PXE_BOOT_ITEM 71\r
+#define OP_NBNS_SERVERS 44\r
+#define OP_NBDD_SERVERS 45\r
+#define OP_NETBIOS_NODE_TYPE 46\r
+#define OP_NETBIOS_SCOPE 47\r
+#define OP_XWINDOW_SYSTEM_FONT_SERVERS 48\r
+#define OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS 49\r
+#define OP_DHCP_REQ_IP_ADD 50\r
+#define OP_DHCP_LEASE_TIME 51\r
+#define OP_DHCP_OPTION_OVERLOAD 52\r
+#define OVLD_FILE 1\r
+#define OVLD_SRVR_NAME 2\r
+#define OP_DHCP_MESSAGE_TYPE 53\r
+#define DHCPDISCOVER 1\r
+#define DHCPOFFER 2\r
+#define DHCPREQUEST 3\r
+#define DHCPDECLINE 4\r
+#define DHCPACK 5\r
+#define DHCPNAK 6\r
+#define DHCPRELEASE 7\r
+#define DHCPINFORM 8\r
+#define OP_DHCP_SERVER_IP 54\r
+#define OP_DHCP_PARM_REQ_LIST 55\r
+#define OP_DHCP_ERROR_MESSAGE 56\r
+#define OP_DHCP_MAX_MESSAGE_SZ 57\r
+#define OP_DHCP_RENEWAL_TIME 58\r
+#define OP_DHCP_REBINDING_TIME 59\r
+#define OP_DHCP_CLASS_IDENTIFIER 60\r
+#define OP_DHCP_CLIENT_IDENTIFIER 61\r
+#define OP_NISPLUS_DOMAIN_NAME 64\r
+#define OP_NISPLUS_SERVERS 65\r
+#define OP_DHCP_TFTP_SERVER_NAME 66\r
+#define OP_DHCP_BOOTFILE 67\r
+#define OP_MOBILE_IP_HOME_AGENTS 68\r
+#define OP_SMPT_SERVERS 69\r
+#define OP_POP3_SERVERS 70\r
+#define OP_NNTP_SERVERS 71\r
+#define OP_WWW_SERVERS 72\r
+#define OP_FINGER_SERVERS 73\r
+#define OP_IRC_SERVERS 74\r
+#define OP_STREET_TALK_SERVERS 75\r
+#define OP_STREET_TALK_DIR_ASSIST_SERVERS 76\r
+#define OP_NDS_SERVERS 85\r
+#define OP_NDS_TREE_NAME 86\r
+#define OP_NDS_CONTEXT 87\r
+#define OP_DHCP_SYSTEM_ARCH 93\r
+#define OP_DHCP_NETWORK_ARCH 94\r
+#define OP_DHCP_PLATFORM_ID 97\r
+} DHCPV4_STRUCT;\r
+\r
+//\r
+// DHCPv4 option header\r
+//\r
+typedef struct {\r
+ UINT8 OpCode;\r
+ UINT8 Length;\r
+ //\r
+ // followed by Data[]\r
+ //\r
+} DHCPV4_OP_HEADER;\r
+\r
+//\r
+// Generic DHCPv4 option (header followed by data)\r
+//\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 Data[1];\r
+} DHCPV4_OP_STRUCT;\r
+\r
+//\r
+// Maximum DHCP packet size on ethernet\r
+//\r
+#define MAX_DHCP_MSG_SZ (MAX_ENET_DATA_SIZE - sizeof (IPV4_HEADER) - sizeof (UDPV4_HEADER))\r
+\r
+//\r
+// Macros used in pxe_bc_dhcp.c and pxe_loadfile.c\r
+//\r
+#define DHCPV4_TRANSMIT_BUFFER (*(DHCPV4_STRUCT *) (Private->TransmitBuffer))\r
+#define DHCPV4_OPTIONS_BUFFER (*(struct optionsstr *) DHCPV4_TRANSMIT_BUFFER.options)\r
+\r
+#define DHCPV4_ACK_INDEX 0\r
+#define PXE_BINL_INDEX 1\r
+#define PXE_OFFER_INDEX 1\r
+#define PXE_ACK_INDEX 2\r
+#define PXE_BIS_INDEX 3\r
+\r
+#define DHCPV4_ACK_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[DHCPV4_ACK_INDEX]\r
+#define PXE_BINL_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BINL_INDEX]\r
+#define PXE_OFFER_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_OFFER_INDEX]\r
+#define PXE_ACK_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_ACK_INDEX]\r
+#define PXE_BIS_BUFFER ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BIS_INDEX]\r
+\r
+#define DHCPV4_ACK_PACKET DHCPV4_ACK_BUFFER.u.Dhcpv4\r
+#define PXE_BINL_PACKET PXE_BINL_BUFFER.u.Dhcpv4\r
+#define PXE_OFFER_PACKET PXE_OFFER_BUFFER.u.Dhcpv4\r
+#define PXE_ACK_PACKET PXE_ACK_BUFFER.u.Dhcpv4\r
+#define PXE_BIS_PACKET PXE_BIS_BUFFER.u.Dhcpv4\r
+\r
+//\r
+// network structure definitions\r
+//\r
+//\r
+// some option definitions\r
+//\r
+#define DHCPV4_OPTION_LENGTH(type) (sizeof (type) - sizeof (DHCPV4_OP_HEADER))\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 Type;\r
+} DHCPV4_OP_MESSAGE_TYPE;\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 Overload;\r
+} DHCPV4_OP_OVERLOAD;\r
+\r
+//\r
+// boot server list structure\r
+// one or more contained in a pxe boot servers structure\r
+//\r
+typedef struct {\r
+ UINT8 IpCount;\r
+ EFI_IPv4_ADDRESS IpList[1]; // IP count of IPs\r
+} PXEV4_SERVER_LIST;\r
+\r
+typedef struct {\r
+ UINT8 IpCount;\r
+ EFI_IPv6_ADDRESS IpList[1]; // IP count of IPs\r
+} PXEV6_SERVER_LIST;\r
+\r
+typedef union {\r
+ PXEV4_SERVER_LIST Ipv4List;\r
+ PXEV6_SERVER_LIST Ipv6List;\r
+} PXE_SERVER_LISTS;\r
+\r
+typedef struct {\r
+ UINT16 Type;\r
+ PXE_SERVER_LISTS u;\r
+} PXE_SERVER_LIST;\r
+\r
+//\r
+// pxe boot servers structure\r
+//\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ PXE_SERVER_LIST ServerList[1]; // one or more\r
+} PXE_OP_SERVER_LIST;\r
+\r
+//\r
+// pxe boot item structure\r
+//\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT16 Type;\r
+ UINT16 Layer;\r
+} PXE_OP_BOOT_ITEM;\r
+\r
+//\r
+// pxe boot menu item structure\r
+//\r
+typedef struct {\r
+ UINT16 Type;\r
+ UINT8 DataLen;\r
+ UINT8 Data[1];\r
+} PXE_BOOT_MENU_ENTRY;\r
+\r
+//\r
+// pxe boot menu structure\r
+//\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ PXE_BOOT_MENU_ENTRY MenuItem[1];\r
+} PXE_OP_BOOT_MENU;\r
+\r
+//\r
+// pxe boot prompt structure\r
+//\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 Timeout;\r
+ UINT8 Prompt[1];\r
+} PXE_OP_BOOT_PROMPT;\r
+\r
+#define PXE_BOOT_PROMPT_AUTO_SELECT 0\r
+#define PXE_BOOT_PROMPT_NO_TIMEOUT 255\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 Class[1];\r
+} DHCPV4_OP_CLASS;\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 File[1];\r
+} DHCPV4_OP_BOOTFILE;\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 VendorOptions[1];\r
+} DHCPV4_OP_VENDOR_OPTIONS;\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 MaxSize[2];\r
+} DHCPV4_OP_MAX_MESSAGE_SIZE;\r
+\r
+typedef struct {\r
+ UINT8 _OP_SUBNET_MASK; /* 1 */\r
+ UINT8 _OP_TIME_OFFSET; /* 2 */\r
+ UINT8 _OP_ROUTER_LIST; /* 3 */\r
+ UINT8 _OP_TIME_SERVERS; /* 4 */\r
+ UINT8 _OP_NAME_SERVERS; /* 5 */\r
+ UINT8 _OP_DNS_SERVERS; /* 6 */\r
+ UINT8 _OP_HOST_NAME; /* 12 */\r
+ UINT8 _OP_BOOT_FILE_SZ; /* 13 */\r
+ UINT8 _OP_DOMAIN_NAME; /* 15 */\r
+ UINT8 _OP_ROOT_PATH; /* 17 */\r
+ UINT8 _OP_EXTENSION_PATH; /* 18 */\r
+ UINT8 _OP_MAX_DATAGRAM_SZ; /* 22 */\r
+ UINT8 _OP_DEFAULT_TTL; /* 23 */\r
+ UINT8 _OP_BROADCAST_ADD; /* 28 */\r
+ UINT8 _OP_NIS_DOMAIN_NAME; /* 40 */\r
+ UINT8 _OP_NIS_SERVERS; /* 41 */\r
+ UINT8 _OP_NTP_SERVERS; /* 42 */\r
+ UINT8 _OP_VENDOR_SPECIFIC; /* 43 */\r
+ UINT8 _OP_DHCP_REQ_IP_ADD; /* 50 */\r
+ UINT8 _OP_DHCP_LEASE_TIME; /* 51 */\r
+ UINT8 _OP_DHCP_SERVER_IP; /* 54 */\r
+ UINT8 _OP_DHCP_RENEWAL_TIME; /* 58 */\r
+ UINT8 _OP_DHCP_REBINDING_TIME; /* 59 */\r
+ UINT8 _OP_DHCP_CLASS_IDENTIFIER; /* 60 */\r
+ UINT8 _OP_DHCP_TFTP_SERVER_NAME; /* 66 */\r
+ UINT8 _OP_DHCP_BOOTFILE; /* 67 */\r
+ UINT8 _OP_DHCP_PLATFORM_ID; /* 97 */\r
+ UINT8 VendorOption128; // vendor option 128\r
+ UINT8 VendorOption129; // vendor option 129\r
+ UINT8 VendorOption130; // vendor option 130\r
+ UINT8 VendorOption131; // vendor option 131\r
+ UINT8 VendorOption132; // vendor option 132\r
+ UINT8 VendorOption133; // vendor option 133\r
+ UINT8 VendorOption134; // vendor option 134\r
+ UINT8 VendorOption135; // vendor option 135\r
+} DHCPV4_REQUESTED_OPTIONS_DATA;\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ DHCPV4_REQUESTED_OPTIONS_DATA Data;\r
+} DHCPV4_OP_REQUESTED_OPTIONS;\r
+\r
+typedef struct opipstr {\r
+ DHCPV4_OP_HEADER Header;\r
+ EFI_IPv4_ADDRESS Ip;\r
+} DHCPV4_OP_IP_ADDRESS;\r
+\r
+//\r
+// ip list structure - e.g. router list\r
+//\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ EFI_IPv4_ADDRESS IpList[1];\r
+} DHCPV4_OP_IP_LIST;\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 Type;\r
+ UINT8 Guid[sizeof (EFI_GUID)];\r
+} DHCPV4_OP_CLIENT_ID;\r
+\r
+//\r
+// special options start - someday obsolete ???\r
+//\r
+#define DHCPV4_OP_PLATFORM_ID DHCPV4_OP_CLIENT_ID\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 Type; // SNP = 2\r
+ UINT8 MajorVersion;\r
+ UINT8 MinorVersion;\r
+} DHCPV4_OP_NETWORK_INTERFACE;\r
+\r
+#define UNDI_TYPE 1\r
+#define SNP_TYPE 2\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT16 Type;\r
+} DHCPV4_OP_ARCHITECTURE_TYPE;\r
+//\r
+// special options end - someday obsolete ???\r
+//\r
+typedef struct {\r
+ UINT8 ClassIdentifier[10]; // PXEClient:\r
+ UINT8 Lit2[5]; // Arch:\r
+ UINT8 ArchitectureType[5]; // 00000 - 65536\r
+ UINT8 Lit3[1]; // :\r
+ UINT8 InterfaceName[4]; // e.g. UNDI\r
+ UINT8 Lit4[1]; // :\r
+ UINT8 UndiMajor[3]; // 000 - 255\r
+ UINT8 UndiMinor[3]; // 000 - 255\r
+} DHCPV4_CLASS_ID_DATA;\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ DHCPV4_CLASS_ID_DATA Data;\r
+} DHCPV4_OP_CLASS_ID;\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ EFI_IPv4_ADDRESS Ip;\r
+} DHCPV4_OP_REQUESTED_IP;\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ EFI_IPv4_ADDRESS Ip;\r
+} DHCPV4_OP_SERVER_IP;\r
+\r
+typedef struct {\r
+ DHCPV4_OP_HEADER Header;\r
+ EFI_IPv4_ADDRESS Ip;\r
+} DHCPV4_OP_SUBNET_MASK;\r
+\r
+typedef struct { // oppxedisctlstr {\r
+ DHCPV4_OP_HEADER Header;\r
+ UINT8 ControlBits;\r
+} PXE_OP_DISCOVERY_CONTROL;\r
+\r
+#define DISABLE_BCAST (1 << 0)\r
+#define DISABLE_MCAST (1 << 1)\r
+#define USE_ACCEPT_LIST (1 << 2)\r
+#define USE_BOOTFILE (1 << 3)\r
+\r
+#pragma pack()\r
+//\r
+// definitions of indices to populate option interest array\r
+//\r
+#define VEND_PXE_MTFTP_IP_IX 1 // multicast IP address of bootfile for MTFTP listen\r
+#define VEND_PXE_MTFTP_CPORT_IX 2 // UDP Port to monitor for MTFTP responses - Intel order\r
+#define VEND_PXE_MTFTP_SPORT_IX 3 // Server UDP Port for MTFTP open - Intel order\r
+#define VEND_PXE_MTFTP_TMOUT_IX 4 // Listen timeout - secs\r
+#define VEND_PXE_MTFTP_DELAY_IX 5 // Transmission timeout - secs\r
+#define VEND_PXE_DISCOVERY_CONTROL_IX 6 // bit field\r
+#define VEND_PXE_DISCOVERY_MCAST_ADDR_IX 7 // boot server discovery multicast address\r
+#define VEND_PXE_BOOT_SERVERS_IX 8 // list of boot servers of form tp(2) cnt(1) ips[cnt]\r
+#define VEND_PXE_BOOT_MENU_IX 9\r
+#define VEND_PXE_BOOT_PROMPT_IX 10\r
+#define VEND_PXE_MCAST_ADDRS_ALLOC_IX 0 // not used by PXE client\r
+#define VEND_PXE_CREDENTIAL_TYPES_IX 11\r
+#define VEND_13_IX 0 // not used by PXE client\r
+#define VEND_14_IX 0 // not used by PXE client\r
+#define VEND_15_IX 0 // not used by PXE client\r
+#define VEND_16_IX 0 // not used by PXE client\r
+#define VEND_17_IX 0 // not used by PXE client\r
+#define VEND_18_IX 0 // not used by PXE client\r
+#define VEND_19_IX 0 // not used by PXE client\r
+#define VEND_20_IX 0 // not used by PXE client\r
+#define VEND_21_IX 0 // not used by PXE client\r
+#define VEND_22_IX 0 // not used by PXE client\r
+#define VEND_23_IX 0 // not used by PXE client\r
+#define VEND_24_IX 0 // not used by PXE client\r
+#define VEND_25_IX 0 // not used by PXE client\r
+#define VEND_26_IX 0 // not used by PXE client\r
+#define VEND_27_IX 0 // not used by PXE client\r
+#define VEND_28_IX 0 // not used by PXE client\r
+#define VEND_29_IX 0 // not used by PXE client\r
+#define VEND_30_IX 0 // not used by PXE client\r
+#define VEND_31_IX 0 // not used by PXE client\r
+#define VEND_32_IX 0 // not used by PXE client\r
+#define VEND_33_IX 0 // not used by PXE client\r
+#define VEND_34_IX 0 // not used by PXE client\r
+#define VEND_35_IX 0 // not used by PXE client\r
+#define VEND_36_IX 0 // not used by PXE client\r
+#define VEND_37_IX 0 // not used by PXE client\r
+#define VEND_38_IX 0 // not used by PXE client\r
+#define VEND_39_IX 0 // not used by PXE client\r
+#define VEND_40_IX 0 // not used by PXE client\r
+#define VEND_41_IX 0 // not used by PXE client\r
+#define VEND_42_IX 0 // not used by PXE client\r
+#define VEND_43_IX 0 // not used by PXE client\r
+#define VEND_44_IX 0 // not used by PXE client\r
+#define VEND_45_IX 0 // not used by PXE client\r
+#define VEND_46_IX 0 // not used by PXE client\r
+#define VEND_47_IX 0 // not used by PXE client\r
+#define VEND_48_IX 0 // not used by PXE client\r
+#define VEND_49_IX 0 // not used by PXE client\r
+#define VEND_50_IX 0 // not used by PXE client\r
+#define VEND_51_IX 0 // not used by PXE client\r
+#define VEND_52_IX 0 // not used by PXE client\r
+#define VEND_53_IX 0 // not used by PXE client\r
+#define VEND_54_IX 0 // not used by PXE client\r
+#define VEND_55_IX 0 // not used by PXE client\r
+#define VEND_56_IX 0 // not used by PXE client\r
+#define VEND_57_IX 0 // not used by PXE client\r
+#define VEND_58_IX 0 // not used by PXE client\r
+#define VEND_59_IX 0 // not used by PXE client\r
+#define VEND_60_IX 0 // not used by PXE client\r
+#define VEND_61_IX 0 // not used by PXE client\r
+#define VEND_62_IX 0 // not used by PXE client\r
+#define VEND_63_IX 0 // not used by PXE client\r
+#define VEND_64_IX 0 // not used by PXE client\r
+#define VEND_65_IX 0 // not used by PXE client\r
+#define VEND_66_IX 0 // not used by PXE client\r
+#define VEND_67_IX 0 // not used by PXE client\r
+#define VEND_68_IX 0 // not used by PXE client\r
+#define VEND_69_IX 0 // not used by PXE client\r
+#define VEND_70_IX 0 // not used by PXE client\r
+#define VEND_PXE_BOOT_ITEM_IX 12\r
+\r
+#define MAX_OUR_PXE_OPT VEND_PXE_BOOT_ITEM // largest PXE option in which we are interested\r
+#define MAX_OUR_PXE_IX VEND_PXE_BOOT_ITEM_IX // largest PXE option index\r
+//\r
+// define various types by options that are sent\r
+//\r
+#define WfM11a_OPTS ((1<<VEND_PXE_MTFTP_IP_IX) | \\r
+ (1<<VEND_PXE_MTFTP_CPORT_IX) | \\r
+ (1<<VEND_PXE_MTFTP_SPORT_IX) | \\r
+ (1<<VEND_PXE_MTFTP_TMOUT_IX) | \\r
+ (1<<VEND_PXE_MTFTP_DELAY_IX))\r
+\r
+#define DISCOVER_OPTS ((1<<VEND_PXE_DISCOVERY_CONTROL_IX) | \\r
+ (1<<VEND_PXE_DISCOVERY_MCAST_ADDR_IX) | \\r
+ (1<<VEND_PXE_BOOT_SERVERS_IX) | \\r
+ (1<<VEND_PXE_BOOT_MENU_IX) | \\r
+ (1<<VEND_PXE_BOOT_PROMPT_IX) | \\r
+ (1<<VEND_PXE_BOOT_ITEM_IX))\r
+\r
+#define CREDENTIALS_OPT (1 << VEND_PXE_CREDENTIAL_TYPES_IX)\r
+\r
+//\r
+// definitions of indices to populate option interest array\r
+//\r
+#define OP_SUBNET_MASK_IX 1\r
+#define OP_TIME_OFFSET_IX 0 // not used by PXE client\r
+#define OP_ROUTER_LIST_IX 2\r
+#define OP_TIME_SERVERS_IX 0 // not used by PXE client\r
+#define OP_NAME_SERVERS_IX 0 // not used by PXE client\r
+#define OP_DNS_SERVERS_IX 0 // not used by PXE client\r
+#define OP_LOG_SERVERS_IX 0 // not used by PXE client\r
+#define OP_COOKIE_SERVERS_IX 0 // not used by PXE client\r
+#define OP_LPR_SREVERS_IX 0 // not used by PXE client\r
+#define OP_IMPRESS_SERVERS_IX 0 // not used by PXE client\r
+#define OP_RES_LOC_SERVERS_IX 0 // not used by PXE client\r
+#define OP_HOST_NAME_IX 0 // not used by PXE client\r
+#define OP_BOOT_FILE_SZ_IX 9\r
+#define OP_DUMP_FILE_IX 0 // not used by PXE client\r
+#define OP_DOMAIN_NAME_IX 0 // not used by PXE client\r
+#define OP_SWAP_SERVER_IX 0 // not used by PXE client\r
+#define OP_ROOT_PATH_IX 0 // not used by PXE client\r
+#define OP_EXTENSION_PATH_IX 0 // not used by PXE client\r
+#define OP_IP_FORWARDING_IX 0 // not used by PXE client\r
+#define OP_NON_LOCAL_SRC_RTE_IX 0 // not used by PXE client\r
+#define OP_POLICY_FILTER_IX 0 // not used by PXE client\r
+#define OP_MAX_DATAGRAM_SZ_IX 0 // not used by PXE client\r
+#define OP_DEFAULT_TTL_IX 0 // not used by PXE client\r
+#define OP_MTU_AGING_TIMEOUT_IX 0 // not used by PXE client\r
+#define OP_MTU_SIZES_IX 0 // not used by PXE client\r
+#define OP_MTU_TO_USE_IX 0 // not used by PXE client\r
+#define OP_ALL_SUBNETS_LOCAL_IX 0 // not used by PXE client\r
+#define OP_BROADCAST_ADD_IX 0 // not used by PXE client\r
+#define OP_PERFORM_MASK_DISCOVERY_IX 0 // not used by PXE client\r
+#define OP_RESPOND_TO_MASK_REQ_IX 0 // not used by PXE client\r
+#define OP_PERFORM_ROUTER_DISCOVERY_IX 0 // not used by PXE client\r
+#define OP_ROUTER_SOLICIT_ADDRESS_IX 0 // not used by PXE client\r
+#define OP_STATIC_ROUTER_LIST_IX 0 // not used by PXE client\r
+#define OP_USE_ARP_TRAILERS_IX 0 // not used by PXE client\r
+#define OP_ARP_CACHE_TIMEOUT_IX 0 // not used by PXE client\r
+#define OP_ETHERNET_ENCAPSULATION_IX 0 // not used by PXE client\r
+#define OP_TCP_DEFAULT_TTL_IX 0 // not used by PXE client\r
+#define OP_TCP_KEEP_ALIVE_INT_IX 0 // not used by PXE client\r
+#define OP_KEEP_ALIVE_GARBAGE_IX 0 // not used by PXE client\r
+#define OP_NIS_DOMAIN_NAME_IX 0 // not used by PXE client\r
+#define OP_NIS_SERVERS_IX 0 // not used by PXE client\r
+#define OP_NTP_SERVERS_IX 0 // not used by PXE client\r
+#define OP_VENDOR_SPECIFIC_IX 3\r
+#define OP_NBNS_SERVERS_IX 0 // not used by PXE client\r
+#define OP_NBDD_SERVERS_IX 0 // not used by PXE client\r
+#define OP_NETBIOS_NODE_TYPE_IX 0 // not used by PXE client\r
+#define OP_NETBIOS_SCOPE_IX 0 // not used by PXE client\r
+#define OP_XWINDOW_SYSTEM_FONT_SERVERS_IX 0 // not used by PXE client\r
+#define OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS_IX 0 // not used by PXE client\r
+// DHCP option indices\r
+//\r
+#define OP_DHCP_REQ_IP_ADD_IX 0 // not used by PXE client\r
+#define OP_DHCP_LEASE_TIME_IX 0 // not used by PXE client\r
+#define OP_DHCP_OPTION_OVERLOAD_IX 4\r
+#define OP_DHCP_MESSAGE_TYPE_IX 5\r
+#define OP_DHCP_SERVER_IP_IX 6\r
+#define OP_DHCP_PARM_REQ_LIST_IX 0 // not used by PXE client\r
+#define OP_DHCP_ERROR_MESSAGE_IX 0 // not used by PXE client\r
+#define OP_DHCP_MAX_MESSAGE_SZ_IX 0 // not used by PXE client\r
+#define OP_DHCP_RENEWAL_TIME_IX 0 // not used by PXE client\r
+#define OP_DHCP_REBINDING_TIME_IX 0 // not used by PXE client\r
+#define OP_DHCP_CLASS_IDENTIFIER_IX 7\r
+#define OP_DHCP_CLIENT_IDENTIFIER_IX 0 // not used by PXE client\r
+#define OP_RESERVED62_IX 0 // not used by PXE client\r
+#define OP_RESERVED63_IX 0 // not used by PXE client\r
+#define OP_NISPLUS_DOMAIN_NAME_IX 0 // not used by PXE client\r
+#define OP_NISPLUS_SERVERS_IX 0 // not used by PXE client\r
+#define OP_DHCP_TFTP_SERVER_NAME_IX 0 // not used by PXE client\r
+#define OP_DHCP_BOOTFILE_IX 8\r
+\r
+#define MAX_OUR_OPT OP_DHCP_BOOTFILE // largest option in which we are interested\r
+#define MAX_OUR_IX OP_BOOT_FILE_SZ_IX\r
+\r
+typedef struct {\r
+ DHCPV4_OP_STRUCT *PktOptAdds[MAX_OUR_IX];\r
+ DHCPV4_OP_STRUCT *PxeOptAdds[MAX_OUR_PXE_IX];\r
+ UINT8 Status;\r
+} OPTION_POINTERS;\r
+\r
+typedef struct DhcpReceiveBufferStruct {\r
+ union {\r
+ UINT8 ReceiveBuffer[MAX_DHCP_MSG_SZ];\r
+ DHCPV4_STRUCT Dhcpv4;\r
+ } u;\r
+\r
+ OPTION_POINTERS OpAdds;\r
+} DHCP_RECEIVE_BUFFER;\r
+\r
+#define PXE_TYPE (1 << 0)\r
+#define WfM11a_TYPE (1 << 1)\r
+#define DISCOVER_TYPE (1 << 2)\r
+#define CREDENTIALS_TYPE (1 << 3)\r
+#define USE_THREE_BYTE (1 << 4)\r
+\r
+#endif // _DHCP_H\r
+\r
+/* EOF - dhcp.h */\r