mirror of https://github.com/acidanthera/audk.git
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 <lubo.zhang@intel.com> Reviewed-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18107 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
94dfaa233c
commit
14e84fd888
|
@ -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,6 +647,53 @@ PxeBcCacheDhcpOffer (
|
|||
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.
|
||||
|
|
|
@ -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,6 +380,19 @@ PxeBcDhcpCallBack (
|
|||
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.
|
||||
|
|
|
@ -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 @@ PxeBcDriverBindingStart (
|
|||
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;
|
||||
|
||||
|
|
|
@ -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 @@ EfiPxeBcStart (
|
|||
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;
|
||||
|
|
|
@ -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 @@ typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA;
|
|||
#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 @@ struct _PXEBC_PRIVATE_DATA {
|
|||
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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue