]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Library/BdsLib/BdsFilePath.c
ArmPkg/BdsLib: Fix DHCP4 configuration
[mirror_edk2.git] / ArmPkg / Library / BdsLib / BdsFilePath.c
index 0057d941263bb54e4887e8da1f52be0be8146a31..5fc8d5309290fae6fb9f693180d3da81bdcff940 100644 (file)
 #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
@@ -998,22 +1010,24 @@ BdsTftpLoadImage (
   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
@@ -1086,6 +1100,14 @@ BdsTftpLoadImage (
     // 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
@@ -1207,9 +1229,9 @@ BdsTftpLoadImage (
     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