/** @file\r
The implementation of EFI IPv4 Configuration II Protocol.\r
\r
- Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
- (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>\r
+ Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
+ (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<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
if (NewPolicy == Instance->Policy) {\r
- return EFI_ABORTED;\r
+ if (NewPolicy != Ip4Config2PolicyDhcp || Instance->DhcpSuccess) {\r
+ return EFI_ABORTED;\r
+ }\r
} else {\r
if (NewPolicy == Ip4Config2PolicyDhcp) {\r
//\r
//\r
if (Instance->Dhcp4Event != NULL) {\r
gBS->CloseEvent (Instance->Dhcp4Event);\r
+ Instance->Dhcp4Event = NULL;\r
}\r
}\r
}\r
DataItem->SetData = Ip4Config2SetPolicy;\r
DataItem->Data.Ptr = &Instance->Policy;\r
DataItem->DataSize = sizeof (Instance->Policy);\r
- Instance->Policy = Ip4Config2PolicyDhcp;\r
+ Instance->Policy = Ip4Config2PolicyStatic;\r
SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED);\r
\r
DataItem = &Instance->DataItem[Ip4Config2DataTypeManualAddress];\r
\r
//\r
// Try to read the config data from NV variable.\r
+ // If not found, write initialized config data into NV variable \r
+ // as a default config data.\r
//\r
Status = Ip4Config2ReadConfigData (IpSb->MacString, Instance);\r
if (Status == EFI_NOT_FOUND) {\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
-\r
- //\r
- // Try to set the configured parameter.\r
- //\r
- for (Index = Ip4Config2DataTypePolicy; Index < Ip4Config2DataTypeMaximum; Index++) {\r
- DataItem = &IpSb->Ip4Config2Instance.DataItem[Index];\r
- if (DataItem->Data.Ptr != NULL) {\r
- DataItem->SetData (\r
- &IpSb->Ip4Config2Instance,\r
- DataItem->DataSize,\r
- DataItem->Data.Ptr\r
- );\r
- }\r
- }\r
-\r
+ \r
Instance->Ip4Config2.SetData = EfiIp4Config2SetData;\r
Instance->Ip4Config2.GetData = EfiIp4Config2GetData;\r
Instance->Ip4Config2.RegisterDataNotify = EfiIp4Config2RegisterDataNotify;\r
//\r
if (Instance->Dhcp4Event != NULL) {\r
gBS->CloseEvent (Instance->Dhcp4Event);\r
+ Instance->Dhcp4Event = NULL;\r
}\r
\r
for (Index = 0; Index < Ip4Config2DataTypeMaximum; Index++) {\r
RemoveEntryList (&Instance->Link);\r
}\r
\r
+/**\r
+ The event handle for IP4 auto reconfiguration. The original default\r
+ interface and route table will be removed as the default.\r
+\r
+ @param[in] Context The IP4 service binding instance.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+Ip4AutoReconfigCallBackDpc (\r
+ IN VOID *Context\r
+ )\r
+{\r
+ IP4_SERVICE *IpSb;\r
+\r
+ IpSb = (IP4_SERVICE *) Context;\r
+ NET_CHECK_SIGNATURE (IpSb, IP4_SERVICE_SIGNATURE);\r
+\r
+ if (IpSb->State > IP4_SERVICE_UNSTARTED) {\r
+ IpSb->State = IP4_SERVICE_UNSTARTED;\r
+ }\r
+ \r
+ IpSb->Reconfig = TRUE;\r
+\r
+ Ip4StartAutoConfig (&IpSb->Ip4Config2Instance);\r
+\r
+ return ;\r
+}\r
+\r
+\r
+/**\r
+ Request Ip4AutoReconfigCallBackDpc as a DPC at TPL_CALLBACK.\r
+\r
+ @param Event The event that is signalled.\r
+ @param Context The IP4 service binding instance.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+Ip4AutoReconfigCallBack (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ //\r
+ // Request Ip4AutoReconfigCallBackDpc as a DPC at TPL_CALLBACK\r
+ //\r
+ QueueDpc (TPL_CALLBACK, Ip4AutoReconfigCallBackDpc, Context);\r
+}\r
+\r