Revision: 18104
          http://sourceforge.net/p/edk2/code/18104
Author:   luobozhang
Date:     2015-07-29 04:10:09 +0000 (Wed, 29 Jul 2015)
Log Message:
-----------
NetworkPkg: 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/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c
    trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.h
    trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c
    trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c
    trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.h
    trunk/edk2/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf

Modified: trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c
===================================================================
--- trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c     2015-07-29 03:07:52 UTC 
(rev 18103)
+++ trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c     2015-07-29 04:10:09 UTC 
(rev 18104)
@@ -1506,7 +1506,53 @@
   return Status;
 }
 
+/**
+  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;
+}
+
 /**
   Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other PXE 
boot information.
 

Modified: trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.h
===================================================================
--- trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.h     2015-07-29 03:07:52 UTC 
(rev 18103)
+++ trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.h     2015-07-29 04:10:09 UTC 
(rev 18104)
@@ -1,7 +1,7 @@
 /** @file
   Functions declaration related with DHCPv4 for UefiPxeBc Driver.
 
-  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2009 - 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
@@ -374,7 +374,21 @@
   IN  EFI_PXE_BASE_CODE_SRVLIST       *SrvList
   );
 
+/**
+  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
+  );
+
+
 /**
   Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other PXE 
boot information.
 

Modified: trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c
===================================================================
--- trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c    2015-07-29 03:07:52 UTC 
(rev 18103)
+++ trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c    2015-07-29 04:10:09 UTC 
(rev 18104)
@@ -742,7 +742,19 @@
   Private->Ip4Nic->Private   = Private;
   Private->Ip4Nic->Signature = PXEBC_VIRTUAL_NIC_SIGNATURE;
 
+   //
+  // 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;
+  }
+
+  //
   // Create a device path node for Ipv4 virtual nic, and append it.
   //
   ZeroMem (&Ip4Node, sizeof (IPv4_DEVICE_PATH));

Modified: trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c
===================================================================
--- trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c      2015-07-29 03:07:52 UTC 
(rev 18103)
+++ trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c      2015-07-29 04:10:09 UTC 
(rev 18104)
@@ -204,6 +204,18 @@
     if (EFI_ERROR (Status)) {
       goto ON_ERROR;
     }
+
+    //
+    //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_ERROR;
+    }
   }
 
   //

Modified: trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.h
===================================================================
--- trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.h      2015-07-29 03:07:52 UTC 
(rev 18103)
+++ trunk/edk2/NetworkPkg/UefiPxeBcDxe/PxeBcImpl.h      2015-07-29 04:10:09 UTC 
(rev 18104)
@@ -24,6 +24,7 @@
 #include <Protocol/NetworkInterfaceIdentifier.h>
 #include <Protocol/Arp.h>
 #include <Protocol/Ip4.h>
+#include <Protocol/Ip4Config2.h>
 #include <Protocol/Ip6.h>
 #include <Protocol/Ip6Config.h>
 #include <Protocol/Udp4.h>
@@ -116,6 +117,7 @@
 
   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;

Modified: trunk/edk2/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
===================================================================
--- trunk/edk2/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf 2015-07-29 03:07:52 UTC 
(rev 18103)
+++ trunk/edk2/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf 2015-07-29 04:10:09 UTC 
(rev 18104)
@@ -79,6 +79,7 @@
   gEfiArpProtocolGuid                                  ## TO_START
   gEfiIp4ServiceBindingProtocolGuid                    ## TO_START
   gEfiIp4ProtocolGuid                                  ## TO_START
+  gEfiIp4Config2ProtocolGuid                           ## TO_START
   gEfiIp6ServiceBindingProtocolGuid                    ## TO_START
   gEfiIp6ProtocolGuid                                  ## TO_START
   gEfiIp6ConfigProtocolGuid                            ## TO_START


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

Reply via email to