#include <Protocol/Dhcp4.h>\r
#include <Protocol/Mtftp4.h>\r
\r
+\r
#define IS_DEVICE_PATH_NODE(node,type,subtype) (((node)->Type == (type)) && ((node)->SubType == (subtype)))\r
\r
+/* Type and defines to set up the DHCP4 options */\r
+\r
+typedef struct {\r
+ EFI_DHCP4_PACKET_OPTION Head;\r
+ UINT8 Route;\r
+} DHCP4_OPTION;\r
+\r
+#define DHCP_TAG_PARA_LIST 55\r
+#define DHCP_TAG_NETMASK 1\r
+#define DHCP_TAG_ROUTER 3\r
+\r
/*\r
Constant strings and define related to the message indicating the amount of\r
progress in the dowloading of a TFTP file.\r
OUT UINTN *ImageSize\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_HANDLE Dhcp4ChildHandle;\r
- EFI_DHCP4_PROTOCOL *Dhcp4;\r
- BOOLEAN Dhcp4ToStop;\r
- EFI_HANDLE Mtftp4ChildHandle;\r
- EFI_MTFTP4_PROTOCOL *Mtftp4;\r
- EFI_DHCP4_CONFIG_DATA Dhcp4CfgData;\r
- EFI_DHCP4_MODE_DATA Dhcp4Mode;\r
- EFI_MTFTP4_CONFIG_DATA Mtftp4CfgData;\r
- IPv4_DEVICE_PATH *IPv4DevicePathNode;\r
- FILEPATH_DEVICE_PATH *FilePathDevicePathNode;\r
- CHAR8 *AsciiFilePath;\r
- EFI_MTFTP4_TOKEN Mtftp4Token;\r
- UINT64 FileSize;\r
- UINT64 TftpBufferSize;\r
- BDS_TFTP_CONTEXT *TftpContext;\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE Dhcp4ChildHandle;\r
+ EFI_DHCP4_PROTOCOL *Dhcp4;\r
+ BOOLEAN Dhcp4ToStop;\r
+ EFI_HANDLE Mtftp4ChildHandle;\r
+ EFI_MTFTP4_PROTOCOL *Mtftp4;\r
+ DHCP4_OPTION ParaList;\r
+ EFI_DHCP4_PACKET_OPTION *OptionList[2];\r
+ EFI_DHCP4_CONFIG_DATA Dhcp4CfgData;\r
+ EFI_DHCP4_MODE_DATA Dhcp4Mode;\r
+ EFI_MTFTP4_CONFIG_DATA Mtftp4CfgData;\r
+ IPv4_DEVICE_PATH *IPv4DevicePathNode;\r
+ FILEPATH_DEVICE_PATH *FilePathDevicePathNode;\r
+ CHAR8 *AsciiFilePath;\r
+ EFI_MTFTP4_TOKEN Mtftp4Token;\r
+ UINT64 FileSize;\r
+ UINT64 TftpBufferSize;\r
+ BDS_TFTP_CONTEXT *TftpContext;\r
\r
ASSERT(IS_DEVICE_PATH_NODE (RemainingDevicePath, MESSAGING_DEVICE_PATH, MSG_IPv4_DP));\r
IPv4DevicePathNode = (IPv4_DEVICE_PATH*)RemainingDevicePath;\r
// process has been started but is not completed yet.\r
//\r
ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA));\r
+ ParaList.Head.OpCode = DHCP_TAG_PARA_LIST;\r
+ ParaList.Head.Length = 2;\r
+ ParaList.Head.Data[0] = DHCP_TAG_NETMASK;\r
+ ParaList.Route = DHCP_TAG_ROUTER;\r
+ OptionList[0] = &ParaList.Head;\r
+ Dhcp4CfgData.OptionCount = 1;\r
+ Dhcp4CfgData.OptionList = OptionList;\r
+\r
Status = Dhcp4->Configure (Dhcp4, &Dhcp4CfgData);\r
if (EFI_ERROR (Status)) {\r
if (Status != EFI_ACCESS_DENIED) {\r
Status = Mtftp4->ReadFile (Mtftp4, &Mtftp4Token);\r
Print (L"\n");\r
if (EFI_ERROR (Status)) {\r
+ gBS->FreePages (*Image, EFI_SIZE_TO_PAGES (TftpBufferSize));\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
Print (L"Downloading failed, file larger than expected.\n");\r
- gBS->FreePages (*Image, EFI_SIZE_TO_PAGES (TftpBufferSize));\r
continue;\r
} else {\r
goto Error;\r