/** @file This EFI_PXE_BASE_CODE_PROTOCOL and EFI_LOAD_FILE_PROTOCOL. interfaces declaration. Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef __EFI_PXEBC_IMPL_H__ #define __EFI_PXEBC_IMPL_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA; typedef struct _PXEBC_PRIVATE_PROTOCOL PXEBC_PRIVATE_PROTOCOL; typedef struct _PXEBC_VIRTUAL_NIC PXEBC_VIRTUAL_NIC; #include "PxeBcDriver.h" #include "PxeBcDhcp4.h" #include "PxeBcDhcp6.h" #include "PxeBcMtftp.h" #include "PxeBcBoot.h" #include "PxeBcSupport.h" #define PXEBC_DEFAULT_HOPLIMIT 64 #define PXEBC_DEFAULT_LIFETIME 50000 // 50 ms, unit is microsecond #define PXEBC_UDP_TIMEOUT 30000000 // 3 seconds, unit is 100nanosecond #define PXEBC_DAD_ADDITIONAL_DELAY 30000000 // 3 seconds #define PXEBC_MTFTP_TIMEOUT 4 #define PXEBC_MTFTP_RETRIES 6 #define PXEBC_DHCP_RETRIES 4 // refers to mPxeDhcpTimeout, also by PXE2.1 spec. #define PXEBC_MENU_MAX_NUM 24 #define PXEBC_OFFER_MAX_NUM 16 #define PXEBC_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20) #define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P') #define PXEBC_VIRTUAL_NIC_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'V') #define PXEBC_PRIVATE_DATA_FROM_PXEBC(a) CR (a, PXEBC_PRIVATE_DATA, PxeBc, PXEBC_PRIVATE_DATA_SIGNATURE) #define PXEBC_PRIVATE_DATA_FROM_ID(a) CR (a, PXEBC_PRIVATE_DATA, Id, PXEBC_PRIVATE_DATA_SIGNATURE) #define PXEBC_VIRTUAL_NIC_FROM_LOADFILE(a) CR (a, PXEBC_VIRTUAL_NIC, LoadFile, PXEBC_VIRTUAL_NIC_SIGNATURE) #define PXE_ENABLED 0x01 #define PXE_DISABLED 0x00 typedef union { PXEBC_DHCP4_PACKET_CACHE Dhcp4; PXEBC_DHCP6_PACKET_CACHE Dhcp6; } PXEBC_DHCP_PACKET_CACHE; struct _PXEBC_PRIVATE_PROTOCOL { UINT64 Reserved; }; struct _PXEBC_VIRTUAL_NIC { UINT32 Signature; EFI_HANDLE Controller; EFI_LOAD_FILE_PROTOCOL LoadFile; EFI_DEVICE_PATH_PROTOCOL *DevicePath; PXEBC_PRIVATE_DATA *Private; }; struct _PXEBC_PRIVATE_DATA { UINT32 Signature; EFI_HANDLE Controller; EFI_HANDLE Image; PXEBC_PRIVATE_PROTOCOL Id; EFI_SIMPLE_NETWORK_PROTOCOL *Snp; PXEBC_VIRTUAL_NIC *Ip4Nic; PXEBC_VIRTUAL_NIC *Ip6Nic; EFI_HANDLE ArpChild; EFI_HANDLE Ip4Child; EFI_HANDLE Dhcp4Child; EFI_HANDLE Mtftp4Child; EFI_HANDLE Udp4ReadChild; EFI_HANDLE Udp4WriteChild; EFI_ARP_PROTOCOL *Arp; EFI_IP4_PROTOCOL *Ip4; EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2; EFI_DHCP4_PROTOCOL *Dhcp4; EFI_MTFTP4_PROTOCOL *Mtftp4; EFI_UDP4_PROTOCOL *Udp4Read; EFI_UDP4_PROTOCOL *Udp4Write; EFI_HANDLE Ip6Child; EFI_HANDLE Dhcp6Child; EFI_HANDLE Mtftp6Child; EFI_HANDLE Udp6ReadChild; EFI_HANDLE Udp6WriteChild; EFI_IP6_PROTOCOL *Ip6; EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg; EFI_DHCP6_PROTOCOL *Dhcp6; EFI_MTFTP6_PROTOCOL *Mtftp6; EFI_UDP6_PROTOCOL *Udp6Read; EFI_UDP6_PROTOCOL *Udp6Write; EFI_DNS6_PROTOCOL *Dns6; EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii; EFI_PXE_BASE_CODE_PROTOCOL PxeBc; EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL LoadFileCallback; EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *PxeBcCallback; EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_PXE_BASE_CODE_MODE Mode; EFI_PXE_BASE_CODE_FUNCTION Function; UINT32 Ip6Policy; UINT32 SolicitTimes; UINT64 ElapsedTime; EFI_UDP4_CONFIG_DATA Udp4CfgData; EFI_UDP6_CONFIG_DATA Udp6CfgData; EFI_IP4_CONFIG_DATA Ip4CfgData; EFI_IP6_CONFIG_DATA Ip6CfgData; EFI_EVENT UdpTimeOutEvent; EFI_EVENT ArpUpdateEvent; EFI_IP4_COMPLETION_TOKEN IcmpToken; EFI_IP6_COMPLETION_TOKEN Icmp6Token; BOOLEAN IsAddressOk; BOOLEAN IsOfferSorted; BOOLEAN IsProxyRecved; BOOLEAN IsDoDiscover; EFI_IP_ADDRESS TmpStationIp; EFI_IP_ADDRESS StationIp; EFI_IP_ADDRESS SubnetMask; EFI_IP_ADDRESS GatewayIp; EFI_IP_ADDRESS ServerIp; EFI_IPv6_ADDRESS *DnsServer; UINT16 CurSrcPort; UINT32 IaId; UINT32 Ip4MaxPacketSize; UINT32 Ip6MaxPacketSize; UINT8 *BootFileName; UINTN BootFileSize; UINTN BlockSize; PXEBC_DHCP_PACKET_CACHE ProxyOffer; PXEBC_DHCP_PACKET_CACHE DhcpAck; PXEBC_DHCP_PACKET_CACHE PxeReply; EFI_DHCP6_PACKET *Dhcp6Request; EFI_DHCP4_PACKET SeedPacket; // // OfferIndex records the index of DhcpOffer[] buffer, and OfferCount records the num of each type of offer. // // It supposed that // // OfferNum: 8 // OfferBuffer: [ProxyBinl, ProxyBinl, DhcpOnly, ProxyPxe10, DhcpOnly, DhcpPxe10, DhcpBinl, ProxyBinl] // (OfferBuffer is 0-based.) // // And assume that (DhcpPxe10 is the first priority actually.) // // SelectIndex: 2 // SelectProxyType: PXEBC_OFFER_TYPE_PROXY_BINL // (SelectIndex is 1-based, and 0 means no one is selected.) // // So it should be // // DhcpOnly DhcpPxe10 DhcpWfm11a DhcpBinl ProxyPxe10 ProxyWfm11a ProxyBinl Bootp // OfferCount: [ 2(n), 1(n), 0(n), 1(n), 1(1), 0(1), 3(n), 1(1)] // // OfferIndex: {[ 2, 5, 0, 6, 3, 0, *0, 0] // [ 4, 0, 0, 0, 0, 0, 1, 0] // [ 0, 0, 0, 0, 0, 0, 7, 0] // ... ]} // (OfferIndex is 0-based.) // // UINT32 SelectIndex; UINT32 SelectProxyType; PXEBC_DHCP_PACKET_CACHE OfferBuffer[PXEBC_OFFER_MAX_NUM]; UINT32 OfferNum; UINT32 OfferCount[PxeOfferTypeMax]; UINT32 OfferIndex[PxeOfferTypeMax][PXEBC_OFFER_MAX_NUM]; }; extern EFI_PXE_BASE_CODE_PROTOCOL gPxeBcProtocolTemplate; extern EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL gPxeBcCallBackTemplate; extern EFI_LOAD_FILE_PROTOCOL gLoadFileProtocolTemplate; #endif