/** @file\r
Functions implementation related with DHCPv4 for UefiPxeBc Driver.\r
\r
- Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
}\r
\r
//\r
- // The offer with "yiaddr" is a proxy offer.\r
+ // The offer with zero "yiaddr" is a proxy offer.\r
//\r
if (Offer->Dhcp4.Header.YourAddr.Addr[0] == 0) {\r
IsProxyOffer = TRUE;\r
return Status;\r
}\r
\r
+/**\r
+ Switch the Ip4 policy to static.\r
+\r
+ @param[in] Private The pointer to PXEBC_PRIVATE_DATA.\r
+\r
+ @retval EFI_SUCCESS The policy is already configured to static.\r
+ @retval Others Other error as indicated..\r
+\r
+**/\r
+EFI_STATUS\r
+PxeBcSetIp4Policy ( \r
+ IN PXEBC_PRIVATE_DATA *Private\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;\r
+ EFI_IP4_CONFIG2_POLICY Policy;\r
+ UINTN DataSize;\r
+\r
+ Ip4Config2 = Private->Ip4Config2;\r
+ DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);\r
+ Status = Ip4Config2->GetData (\r
+ Ip4Config2,\r
+ Ip4Config2DataTypePolicy,\r
+ &DataSize,\r
+ &Policy\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ \r
+ if (Policy != Ip4Config2PolicyStatic) {\r
+ Policy = Ip4Config2PolicyStatic;\r
+ Status= Ip4Config2->SetData (\r
+ Ip4Config2,\r
+ Ip4Config2DataTypePolicy,\r
+ sizeof (EFI_IP4_CONFIG2_POLICY),\r
+ &Policy\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ } \r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
\r
/**\r
Start the D.O.R.A DHCPv4 process to acquire the IPv4 address and other PXE boot information.\r
ZeroMem (Private->OfferIndex, sizeof (Private->OfferIndex));\r
\r
//\r
- // Start DHCPv4 D.O.R.A. process to acquire IPv4 address.\r
+ // Start DHCPv4 D.O.R.A. process to acquire IPv4 address. This may \r
+ // have already been done, thus do not leave in error if the return\r
+ // code is EFI_ALREADY_STARTED.\r
//\r
Status = Dhcp4->Start (Dhcp4, NULL);\r
- if (EFI_ERROR (Status)) {\r
+ if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {\r
if (Status == EFI_ICMP_ERROR) {\r
PxeMode->IcmpErrorReceived = TRUE;\r
}\r