4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp and Discover routines for PxeBc.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_MAGIC 0x63538263 // network byte order
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Dhcp Options
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_TIME_OFFSET 2 // Time Offset from UTC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_TIME_SERVER 4 // Time Server
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_NAME_SERVER 5 // Name Server
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_DNS_SERVER 6 // Domain Name Server
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_BOOTFILE_LEN 13 // Boot File Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_DOMAINNAME 15 // Domain Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_EXTEND_PATH 18 // Extensions Path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_EMTU 22 // Maximum Datagram Reassembly Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_TTL 23 // Default IP Time-to-live
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_BROADCAST 28 // Broadcast Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_NIS_DOMAIN 40 // Network Information Service Domain
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_NIS_SERVER 41 // Network Information Servers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_NTP_SERVER 42 // Network Time Protocol Servers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_VENDOR 43 // Vendor Specific Information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_REQUEST_IP 50 // Requested IP Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_LEASE 51 // IP Address Lease Time
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_OVERLOAD 52 // Option Overload
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_MSG_TYPE 53 // DHCP Message Type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_SERVER_ID 54 // Server Identifier
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_PARA_LIST 55 // Parameter Request List
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_MAXMSG 57 // Maximum DHCP Message Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_T1 58 // Renewal (T1) Time Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_T2 59 // Rebinding (T2) Time Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_CLASS_ID 60 // Vendor class identifier
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_CLIENT_ID 61 // Client-identifier
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_DHCP4_TAG_BOOTFILE 67 // Bootfile name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Sub-Options in Dhcp Vendor Option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// The array index of the DHCP4 option tag interested
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// The type of DHCP OFFER, arranged by priority, PXE10 has the highest priority.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// WfM11a options
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define MTFTP_VENDOR_OPTION_BIT_MAP (BIT (PXEBC_VENDOR_TAG_MTFTP_IP) | \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Discoverty options
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DISCOVER_VENDOR_OPTION_BIT_MAP (BIT (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) == BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) == BIT (PXEBC_VENDOR_TAG_BOOT_MENU))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) == MTFTP_VENDOR_OPTION_BIT_MAP)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IS_VALID_DISCOVER_VENDOR_OPTION(x) (((UINT32) ((x)[0]) & DISCOVER_VENDOR_OPTION_BIT_MAP) != 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) == BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IS_DISABLE_BCAST_DISCOVER(x) (((x) & BIT (0)) == BIT (0))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IS_DISABLE_MCAST_DISCOVER(x) (((x) & BIT (1)) == BIT (1))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IS_ENABLE_USE_SERVER_LIST(x) (((x) & BIT (2)) == BIT (2))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IS_ENABLE_BOOT_FILE_NAME(x) (((x) & BIT (3)) == BIT (3))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define SET_VENDOR_OPTION_BIT_MAP(x, y) (((x)[(y) / 32]) = (UINT32) ((x)[(y) / 32]) | BIT ((y) % 32))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:xxxxx:UNDI:003000"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef union {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_MAX_PACKET_SIZE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef union {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP4_PACKET_OPTION *Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_MAX];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define GET_OPTION_BUFFER_LEN(Pkt) ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IS_PROXY_DHCP_OFFER(Offer) EFI_IP4_EQUAL (&((Offer)->Dhcp4.Header.YourAddr), &mZeroIp4Addr)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + ((Ent)->IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function initialize the DHCP4 message instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will pad each item of dhcp4 message packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Seed Pointer to the message instance of the DHCP4 packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Parse the cached dhcp packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CachedPacket Pointer to cached dhcp packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE Succeed to parse and validation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Fail to parse or validation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function is to check the selected proxy offer (include BINL dhcp offer and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe base code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mode structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Private Pointer to PxeBc private data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Operational successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_RESPONSE Offer dhcp service failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Callback routine.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to intercept events that occurred in the configuration process. This structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync provides advanced control of each state transition of the DHCP process. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned status code determines the behavior of the EFI DHCPv4 Protocol driver.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync There are three possible returned values, which are described in the following
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Pointer to the EFI DHCPv4 Protocol instance that is used to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configure this callback function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context Pointer to the context that is initialized by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CurrentState The current operational state of the EFI DHCPv4 Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Dhcp4Event The event that occurs in the current state, which usually means a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync state transition.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Packet The DHCP packet that is going to be sent or already received.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NewPacket The packet that is used to replace the above Packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue the DHCP process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI DHCPv4 Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync driver will continue to wait for more DHCPOFFER packets until the retry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync timeout expires.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort the current process and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return to the Dhcp4Init or Dhcp4InitReboot state.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Discover the boot of service and initialize the vendor option if exists.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Private Pointer to PxeBc private data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Type PxeBc option boot item type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Layer PxeBc option boot item layer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UseBis Use BIS or not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DestIp Ip address for server
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param IpCount The total count of the server ip address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SrvList Server list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param IsDiscv Discover the vendor or not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Reply The dhcp4 packet of Pxe reply
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Operation succeeds.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND There is no vendor option exists.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_TIMEOUT Send Pxe Discover time out.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initialize the DHCP options and build the option list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Private Pointer to PxeBc private data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OptList Pointer to a DHCP option list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param IsDhcpDiscover Discover dhcp option or not.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The index item number of the option list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create the boot options.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OptList Pointer to the list of the options
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Type the type of option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Layer the layer of the boot options
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OptLen length of opotion
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Parse interested dhcp options.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Pointer to the dhcp options packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Length The length of the dhcp options.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OptTag The option OpCode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return NULL if the buffer length is 0 and OpCode is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PXEBC_DHCP4_TAG_EOP, or the pointer to the buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function is to parse and check vendor options.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Dhcp4Option Pointer to dhcp options
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param VendorOption Pointer to vendor options
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return TRUE if valid for vendor options, or FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Choose the boot prompt.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Private Pointer to PxeBc private data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Select boot prompt done.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_TIMEOUT Select boot prompt time out.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The proxy offer is not Pxe10.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED User cancel the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Select the boot menu.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Private Pointer to PxeBc private data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Type The type of the menu.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UseDefaultItem Use default item or not.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED User cancel operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Select the boot menu success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_READY Read the input key from the keybroad has not finish.