Revision: 18107
          http://sourceforge.net/p/edk2/code/18107
Author:   luobozhang
Date:     2015-07-29 06:37:48 +0000 (Wed, 29 Jul 2015)
Log Message:
-----------
MdeModulePkg: Fix the issue cannot boot to UEFI Network after reset

DHCP4 service allows only one of its children to be configured
in the active state,If the DHCP4 D.O.R.A started by IP4 auto
configuration and has not been completed, the Dhcp4 state machine
will not be in the right state for the PXE to start a new round
D.O.R.A., so we need to switch it's policy to static.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo <[email protected]>
Reviewed-by: Fu Siyuan <[email protected]>
Reviewed-by: Wu Jiaxin <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
    trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h
    trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
    trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
    trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h
    trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf

Modified: trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c  
2015-07-29 05:59:50 UTC (rev 18106)
+++ trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c  
2015-07-29 06:37:48 UTC (rev 18107)
@@ -2,7 +2,7 @@
   Support for PxeBc dhcp functions.
 
 Copyright (c) 2013, Red Hat, Inc.
-Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD 
License
 which accompanies this distribution.  The full text of the license may be 
found at
@@ -647,7 +647,54 @@
   Private->NumOffers++;
 }
 
+/**
+  Switch the Ip4 policy to static.
 
+  @param[in]  Private             The pointer to PXEBC_PRIVATE_DATA.
+
+  @retval     EFI_SUCCESS         The policy is already configured to static.
+  @retval     Others              Other error as indicated..
+
+**/
+EFI_STATUS
+PxeBcSetIp4Policy (   
+  IN PXEBC_PRIVATE_DATA            *Private
+  )
+{
+  EFI_STATUS                   Status;
+  EFI_IP4_CONFIG2_PROTOCOL     *Ip4Config2;
+  EFI_IP4_CONFIG2_POLICY       Policy;
+  UINTN                        DataSize;
+
+  Ip4Config2 = Private->Ip4Config2;
+  DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
+  Status = Ip4Config2->GetData (
+                       Ip4Config2,
+                       Ip4Config2DataTypePolicy,
+                       &DataSize,
+                       &Policy
+                       );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  
+  if (Policy != Ip4Config2PolicyStatic) {
+    Policy = Ip4Config2PolicyStatic;
+    Status= Ip4Config2->SetData (
+                          Ip4Config2,
+                          Ip4Config2DataTypePolicy,
+                          sizeof (EFI_IP4_CONFIG2_POLICY),
+                          &Policy
+                          );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    } 
+  }
+
+  return  EFI_SUCCESS;
+}
+
+
 /**
   Select the specified proxy offer, such as BINL, DHCP_ONLY and so on.
   If the proxy does not exist, try offers with bootfile.

Modified: trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h  
2015-07-29 05:59:50 UTC (rev 18106)
+++ trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h  
2015-07-29 06:37:48 UTC (rev 18107)
@@ -2,7 +2,7 @@
   Dhcp and Discover routines for PxeBc.
 
 Copyright (c) 2013, Red Hat, Inc.
-Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD 
License
 which accompanies this distribution.  The full text of the license may be 
found at
@@ -380,7 +380,20 @@
   OUT EFI_DHCP4_PACKET                 **NewPacket OPTIONAL
   );
 
+/**
+  Switch the Ip4 policy to static.
 
+  @param[in]  Private             The pointer to PXEBC_PRIVATE_DATA.
+
+  @retval     EFI_SUCCESS         The policy is already configured to static.
+  @retval     Others              Other error as indicated..
+
+**/
+EFI_STATUS
+PxeBcSetIp4Policy (   
+  IN PXEBC_PRIVATE_DATA            *Private
+  );
+
 /**
   Discover the boot of service and initialize the vendor option if exists.
 

Modified: trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c        
2015-07-29 05:59:50 UTC (rev 18106)
+++ trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c        
2015-07-29 06:37:48 UTC (rev 18107)
@@ -1,7 +1,7 @@
 /** @file
   The driver binding for UEFI PXEBC protocol.
 
-Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD 
License
 which accompanies this distribution.  The full text of the license may be 
found at
@@ -375,6 +375,17 @@
   if (EFI_ERROR (Status)) {
     goto ON_ERROR;
   }
+  //
+  // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy.
+  //
+  Status = gBS->HandleProtocol (
+                  ControllerHandle,
+                  &gEfiIp4Config2ProtocolGuid,
+                  (VOID **) &Private->Ip4Config2
+                  );
+  if (EFI_ERROR (Status)) {
+    goto ON_ERROR;
+  }
 
   return EFI_SUCCESS;
 

Modified: trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c  
2015-07-29 05:59:50 UTC (rev 18106)
+++ trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c  
2015-07-29 06:37:48 UTC (rev 18107)
@@ -1,7 +1,7 @@
 /** @file
   Interface routines for PxeBc.
 
-Copyright (c) 2007 - 2013, 2015, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD 
License
 which accompanies this distribution.  The full text of the license may be 
found at
@@ -410,6 +410,18 @@
     goto ON_EXIT;
   }
 
+  //
+  //DHCP4 service allows only one of its children to be configured in  
+  //the active state, If the DHCP4 D.O.R.A started by IP4 auto  
+  //configuration and has not been completed, the Dhcp4 state machine 
+  //will not be in the right state for the PXE to start a new round D.O.R.A. 
+  //so we need to switch it's policy to static.
+  //
+  Status = PxeBcSetIp4Policy (Private);
+  if (EFI_ERROR (Status)) {
+    goto ON_EXIT;
+  }
+    
   Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData);
   if (EFI_ERROR (Status)) {
     goto ON_EXIT;

Modified: trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h  
2015-07-29 05:59:50 UTC (rev 18106)
+++ trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h  
2015-07-29 06:37:48 UTC (rev 18107)
@@ -1,6 +1,6 @@
 /** @file
 
-Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD 
License
 which accompanies this distribution.  The full text of the license may be 
found at
@@ -30,6 +30,7 @@
 #include <Protocol/PxeBaseCodeCallBack.h>
 #include <Protocol/Arp.h>
 #include <Protocol/Ip4.h>
+#include <Protocol/Ip4Config2.h>
 
 #include <Library/DebugLib.h>
 #include <Library/BaseMemoryLib.h>
@@ -75,6 +76,7 @@
   EFI_ARP_PROTOCOL                          *Arp;
   EFI_DHCP4_PROTOCOL                        *Dhcp4;
   EFI_IP4_PROTOCOL                          *Ip4;
+  EFI_IP4_CONFIG2_PROTOCOL                  *Ip4Config2;
   EFI_IP4_CONFIG_DATA                       Ip4ConfigData;
   EFI_MTFTP4_PROTOCOL                       *Mtftp4;
   EFI_UDP4_PROTOCOL                         *Udp4Read;

Modified: 
trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf     
2015-07-29 05:59:50 UTC (rev 18106)
+++ trunk/edk2/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf     
2015-07-29 06:37:48 UTC (rev 18107)
@@ -6,7 +6,7 @@
 #  Protocol to provide one clean way to otain control from the boot manager if 
the
 #  boot patch is from the remote device.
 #
-#  Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD 
License
 #  which accompanies this distribution. The full text of the license may be 
found at
@@ -84,6 +84,7 @@
   gEfiDhcp4ProtocolGuid                            ## TO_START
   gEfiIp4ServiceBindingProtocolGuid                ## TO_START
   gEfiIp4ProtocolGuid                              ## TO_START
+  gEfiIp4Config2ProtocolGuid                       ## TO_START
 
 [Pcd]  
   gEfiMdeModulePkgTokenSpaceGuid.PcdTftpBlockSize  ## SOMETIMES_CONSUMES  


------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to