Revision: 16582
          http://sourceforge.net/p/edk2/code/16582
Author:   oliviermartin
Date:     2015-01-06 15:46:36 +0000 (Tue, 06 Jan 2015)
Log Message:
-----------
ArmPkg/BdsLib: Fix DHCP4 configuration

Fix DHCP4 configuration as part of TFTP boot process to get the IP address of
the gateway and the subnet mask from the DHCP server.
Fix a memory leak when the download from the TFTP server fails as well.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ronald Cron <[email protected]>
Reviewed-by: Olivier Martin <[email protected]>

Modified Paths:
--------------
    trunk/edk2/ArmPkg/Library/BdsLib/BdsFilePath.c

Modified: trunk/edk2/ArmPkg/Library/BdsLib/BdsFilePath.c
===================================================================
--- trunk/edk2/ArmPkg/Library/BdsLib/BdsFilePath.c      2015-01-06 15:41:59 UTC 
(rev 16581)
+++ trunk/edk2/ArmPkg/Library/BdsLib/BdsFilePath.c      2015-01-06 15:46:36 UTC 
(rev 16582)
@@ -24,8 +24,20 @@
 #include <Protocol/Dhcp4.h>
 #include <Protocol/Mtftp4.h>
 
+
 #define IS_DEVICE_PATH_NODE(node,type,subtype) (((node)->Type == (type)) && 
((node)->SubType == (subtype)))
 
+/* Type and defines to set up the DHCP4 options */
+
+typedef struct {
+  EFI_DHCP4_PACKET_OPTION Head;
+  UINT8                   Route;
+} DHCP4_OPTION;
+
+#define DHCP_TAG_PARA_LIST  55
+#define DHCP_TAG_NETMASK     1
+#define DHCP_TAG_ROUTER      3
+
 /*
    Constant strings and define related to the message indicating the amount of
    progress in the dowloading of a TFTP file.
@@ -998,22 +1010,24 @@
   OUT    UINTN                  *ImageSize
   )
 {
-  EFI_STATUS              Status;
-  EFI_HANDLE              Dhcp4ChildHandle;
-  EFI_DHCP4_PROTOCOL      *Dhcp4;
-  BOOLEAN                 Dhcp4ToStop;
-  EFI_HANDLE              Mtftp4ChildHandle;
-  EFI_MTFTP4_PROTOCOL     *Mtftp4;
-  EFI_DHCP4_CONFIG_DATA   Dhcp4CfgData;
-  EFI_DHCP4_MODE_DATA     Dhcp4Mode;
-  EFI_MTFTP4_CONFIG_DATA  Mtftp4CfgData;
-  IPv4_DEVICE_PATH        *IPv4DevicePathNode;
-  FILEPATH_DEVICE_PATH    *FilePathDevicePathNode;
-  CHAR8                   *AsciiFilePath;
-  EFI_MTFTP4_TOKEN        Mtftp4Token;
-  UINT64                  FileSize;
-  UINT64                  TftpBufferSize;
-  BDS_TFTP_CONTEXT        *TftpContext;
+  EFI_STATUS               Status;
+  EFI_HANDLE               Dhcp4ChildHandle;
+  EFI_DHCP4_PROTOCOL       *Dhcp4;
+  BOOLEAN                  Dhcp4ToStop;
+  EFI_HANDLE               Mtftp4ChildHandle;
+  EFI_MTFTP4_PROTOCOL      *Mtftp4;
+  DHCP4_OPTION             ParaList;
+  EFI_DHCP4_PACKET_OPTION  *OptionList[2];
+  EFI_DHCP4_CONFIG_DATA    Dhcp4CfgData;
+  EFI_DHCP4_MODE_DATA      Dhcp4Mode;
+  EFI_MTFTP4_CONFIG_DATA   Mtftp4CfgData;
+  IPv4_DEVICE_PATH         *IPv4DevicePathNode;
+  FILEPATH_DEVICE_PATH     *FilePathDevicePathNode;
+  CHAR8                    *AsciiFilePath;
+  EFI_MTFTP4_TOKEN         Mtftp4Token;
+  UINT64                   FileSize;
+  UINT64                   TftpBufferSize;
+  BDS_TFTP_CONTEXT         *TftpContext;
 
   ASSERT(IS_DEVICE_PATH_NODE (RemainingDevicePath, MESSAGING_DEVICE_PATH, 
MSG_IPv4_DP));
   IPv4DevicePathNode = (IPv4_DEVICE_PATH*)RemainingDevicePath;
@@ -1086,6 +1100,14 @@
     // process has been started but is not completed yet.
     //
     ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA));
+    ParaList.Head.OpCode     = DHCP_TAG_PARA_LIST;
+    ParaList.Head.Length     = 2;
+    ParaList.Head.Data[0]    = DHCP_TAG_NETMASK;
+    ParaList.Route           = DHCP_TAG_ROUTER;
+    OptionList[0]            = &ParaList.Head;
+    Dhcp4CfgData.OptionCount = 1;
+    Dhcp4CfgData.OptionList  = OptionList;
+
     Status = Dhcp4->Configure (Dhcp4, &Dhcp4CfgData);
     if (EFI_ERROR (Status)) {
       if (Status != EFI_ACCESS_DENIED) {
@@ -1207,9 +1229,9 @@
     Status = Mtftp4->ReadFile (Mtftp4, &Mtftp4Token);
     Print (L"\n");
     if (EFI_ERROR (Status)) {
+      gBS->FreePages (*Image, EFI_SIZE_TO_PAGES (TftpBufferSize));
       if (Status == EFI_BUFFER_TOO_SMALL) {
         Print (L"Downloading failed, file larger than expected.\n");
-        gBS->FreePages (*Image, EFI_SIZE_TO_PAGES (TftpBufferSize));
         continue;
       } else {
         goto Error;


------------------------------------------------------------------------------
Dive into the World of Parallel Programming! The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to