]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.c
MdeModulePkg: Remove Ip4ConfigDxe and related guid definition
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4ConfigDxe / Ip4Config.c
diff --git a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.c b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.c
deleted file mode 100644 (file)
index 3d2f0a4..0000000
+++ /dev/null
@@ -1,745 +0,0 @@
-/** @file\r
-  This code implements the IP4Config and NicIp4Config protocols.\r
-\r
-Copyright (c) 2014, Hewlett-Packard Development Company, L.P.<BR>\r
-Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at<BR>\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "Ip4Config.h"\r
-#include "NicIp4Variable.h"\r
-\r
-//\r
-// Ip4 Config Protocol\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_IP4_CONFIG_PROTOCOL     mIp4ConfigProtocolTemplate = {\r
-  EfiIp4ConfigStart,\r
-  EfiIp4ConfigStop,\r
-  EfiIp4ConfigGetData\r
-};\r
-\r
-/**\r
-  Get the NIC's configure information from the IP4 configure variable.\r
-  It will remove the invalid variable.\r
-\r
-  @param  Instance               The IP4 CONFIG instance.\r
-\r
-  @return NULL if no configure for the NIC in the variable, or it is invalid.\r
-          Otherwise the pointer to the NIC's IP configure parameter will be returned.\r
-\r
-**/\r
-NIC_IP4_CONFIG_INFO *\r
-EfiNicIp4ConfigGetInfo (\r
-  IN  IP4_CONFIG_INSTANCE   *Instance\r
-  )\r
-{\r
-  NIC_IP4_CONFIG_INFO *NicConfig;\r
-\r
-  //\r
-  // Read the configuration parameter for this NIC from\r
-  // the EFI variable\r
-  //\r
-  NicConfig = Ip4ConfigReadVariable (Instance);\r
-  if (NicConfig == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  //\r
-  // Validate the configuration, if the configuration is invalid,\r
-  // remove it from the variable.\r
-  //\r
-  if (!Ip4ConfigIsValid (NicConfig)) {\r
-    Ip4ConfigWriteVariable (Instance, NULL);\r
-\r
-    FreePool (NicConfig);\r
-    NicConfig = NULL;\r
-  }\r
-\r
-  return NicConfig;\r
-}\r
-\r
-/**\r
-  Set the IP configure parameters for this NIC.\r
-\r
-  If Reconfig is TRUE, the IP driver will be informed to discard current\r
-  auto configure parameter and restart the auto configuration process.\r
-  If current there is a pending auto configuration, EFI_ALREADY_STARTED is\r
-  returned. You can only change the configure setting when either\r
-  the configure has finished or not started yet. If NicConfig, the\r
-  NIC's configure parameter is removed from the variable.\r
-\r
-  @param  Instance               The IP4 CONFIG instance.\r
-  @param  NicConfig              The new NIC IP4 configure parameter.\r
-  @param  Reconfig               Inform the IP4 driver to restart the auto\r
-                                 configuration.\r
-\r
-  @retval EFI_SUCCESS            The configure parameter for this NIC was\r
-                                 set successfully.\r
-  @retval EFI_INVALID_PARAMETER  This is NULL or the configure parameter is\r
-                                 invalid.\r
-  @retval EFI_ALREADY_STARTED    There is a pending auto configuration.\r
-  @retval EFI_NOT_FOUND          No auto configure parameter is found.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-EfiNicIp4ConfigSetInfo (\r
-  IN IP4_CONFIG_INSTANCE          *Instance,\r
-  IN NIC_IP4_CONFIG_INFO          *NicConfig     OPTIONAL,\r
-  IN BOOLEAN                      Reconfig\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-\r
-  //\r
-  // Validate the parameters\r
-  //\r
-  if (Instance == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if ((NicConfig != NULL) && (!Ip4ConfigIsValid (NicConfig) ||\r
-      !NIC_ADDR_EQUAL (&NicConfig->NicAddr, &Instance->NicAddr))) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Instance->State == IP4_CONFIG_STATE_STARTED) {\r
-    return EFI_ALREADY_STARTED;\r
-  }\r
-\r
-  //\r
-  // Update the parameter in the configure variable\r
-  //\r
-  Status = Ip4ConfigWriteVariable (Instance, NicConfig);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Signal the IP4 to run the auto configuration again\r
-  //\r
-  if (Reconfig && (Instance->ReconfigEvent != NULL)) {\r
-    //\r
-    // When NicConfig is NULL, NIC IP4 configuration parameter is removed,\r
-    // the auto configuration process should stop running the configuration\r
-    // policy for the EFI IPv4 Protocol driver.\r
-    //\r
-    if (NicConfig == NULL) {\r
-      Instance->DoNotStart = TRUE;\r
-    }\r
-\r
-    Status = gBS->SignalEvent (Instance->ReconfigEvent);\r
-    DispatchDpc ();\r
-  }\r
-\r
-  if (NicConfig == NULL) {\r
-    return Status;\r
-  }\r
-  //\r
-  // A dedicated timer is used to poll underlying media status.In case of\r
-  // cable swap, a new round auto configuration will be initiated. The timer\r
-  // starts in DHCP policy only. STATIC policy stops the timer.\r
-  // \r
-  if (NicConfig->Source == IP4_CONFIG_SOURCE_DHCP) {\r
-    gBS->SetTimer (Instance->Timer, TimerPeriodic, TICKS_PER_SECOND);\r
-  } else if (NicConfig->Source == IP4_CONFIG_SOURCE_STATIC) {\r
-    gBS->SetTimer (Instance->Timer, TimerCancel, 0);\r
-  }\r
-  \r
-  return Status;\r
-}\r
-\r
-/**\r
-  Callback function when DHCP process finished. It will save the\r
-  retrieved IP configure parameter from DHCP to the NVRam.\r
-\r
-  @param  Event                  The callback event\r
-  @param  Context                Opaque context to the callback\r
-\r
-  @return None\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-Ip4ConfigOnDhcp4Complete (\r
-  IN EFI_EVENT              Event,\r
-  IN VOID                   *Context\r
-  )\r
-{\r
-  IP4_CONFIG_INSTANCE       *Instance;\r
-  EFI_DHCP4_MODE_DATA       Dhcp4Mode;\r
-  EFI_IP4_IPCONFIG_DATA     *Ip4Config;\r
-  EFI_STATUS                Status;\r
-  BOOLEAN                   Permanent;\r
-  IP4_ADDR                  Subnet;\r
-  IP4_ADDR                  Ip1;\r
-  IP4_ADDR                  Ip2;\r
-\r
-  Instance = (IP4_CONFIG_INSTANCE *) Context;\r
-  ASSERT (Instance->Dhcp4 != NULL);\r
-\r
-  Instance->State   = IP4_CONFIG_STATE_CONFIGURED;\r
-  Instance->Result  = EFI_TIMEOUT;\r
-\r
-  //\r
-  // Get the DHCP retrieved parameters\r
-  //\r
-  Status = Instance->Dhcp4->GetModeData (Instance->Dhcp4, &Dhcp4Mode);\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_EXIT;\r
-  }\r
-\r
-  if (Dhcp4Mode.State == Dhcp4Bound) {\r
-    //\r
-    // Save the new configuration retrieved by DHCP both in\r
-    // the instance and to NVRam. So, both the IP4 driver and\r
-    // other user can get that address.\r
-    //\r
-    Permanent = FALSE;\r
-\r
-    if (Instance->NicConfig != NULL) {\r
-      ASSERT (Instance->NicConfig->Source == IP4_CONFIG_SOURCE_DHCP);\r
-      Permanent = Instance->NicConfig->Permanent;\r
-      FreePool (Instance->NicConfig);\r
-    }\r
-\r
-    Instance->NicConfig = AllocatePool (sizeof (NIC_IP4_CONFIG_INFO) + 2* sizeof (EFI_IP4_ROUTE_TABLE));\r
-\r
-    if (Instance->NicConfig == NULL) {\r
-      Instance->Result = EFI_OUT_OF_RESOURCES;\r
-      goto ON_EXIT;\r
-    }\r
-\r
-    Instance->NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Instance->NicConfig + 1);\r
-\r
-    CopyMem (&Instance->NicConfig->NicAddr, &Instance->NicAddr, sizeof (Instance->NicConfig->NicAddr));\r
-    Instance->NicConfig->Source  = IP4_CONFIG_SOURCE_DHCP;\r
-    Instance->NicConfig->Permanent = Permanent;\r
-\r
-    Ip4Config                    = &Instance->NicConfig->Ip4Info;\r
-    Ip4Config->StationAddress    = Dhcp4Mode.ClientAddress;\r
-    Ip4Config->SubnetMask        = Dhcp4Mode.SubnetMask;\r
-\r
-    //\r
-    // Create a route for the connected network\r
-    //\r
-    Ip4Config->RouteTableSize    = 1;\r
-\r
-    CopyMem (&Ip1, &Dhcp4Mode.ClientAddress, sizeof (IP4_ADDR));\r
-    CopyMem (&Ip2, &Dhcp4Mode.SubnetMask, sizeof (IP4_ADDR));\r
-\r
-    Subnet = Ip1 & Ip2;\r
-\r
-    CopyMem (&Ip4Config->RouteTable[0].SubnetAddress, &Subnet, sizeof (EFI_IPv4_ADDRESS));\r
-    CopyMem (&Ip4Config->RouteTable[0].SubnetMask, &Dhcp4Mode.SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
-    ZeroMem (&Ip4Config->RouteTable[0].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
-\r
-    //\r
-    // Create a route if there is a default router.\r
-    //\r
-    if (!EFI_IP4_EQUAL (&Dhcp4Mode.RouterAddress, &mZeroIp4Addr)) {\r
-      Ip4Config->RouteTableSize = 2;\r
-\r
-      ZeroMem (&Ip4Config->RouteTable[1].SubnetAddress, sizeof (EFI_IPv4_ADDRESS));\r
-      ZeroMem (&Ip4Config->RouteTable[1].SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
-      CopyMem (&Ip4Config->RouteTable[1].GatewayAddress, &Dhcp4Mode.RouterAddress, sizeof (EFI_IPv4_ADDRESS));\r
-    }\r
-\r
-    Instance->Result = EFI_SUCCESS;\r
-\r
-    //\r
-    // ignore the return status of EfiNicIp4ConfigSetInfo. Network\r
-    // stack can operate even that failed.\r
-    //\r
-    EfiNicIp4ConfigSetInfo (Instance, Instance->NicConfig, FALSE);\r
-  }\r
-\r
-ON_EXIT:\r
-  gBS->SignalEvent (Instance->DoneEvent);\r
-  Ip4ConfigCleanDhcp4 (Instance);\r
-\r
-  DispatchDpc ();\r
-\r
-  return ;\r
-}\r
-\r
-/**\r
-  Starts running the configuration policy for the EFI IPv4 Protocol driver.\r
-\r
-  The Start() function is called to determine and to begin the platform\r
-  configuration policy by the EFI IPv4 Protocol driver. This determination may\r
-  be as simple as returning EFI_UNSUPPORTED if there is no EFI IPv4 Protocol\r
-  driver configuration policy. It may be as involved as loading some defaults\r
-  from nonvolatile storage, downloading dynamic data from a DHCP server, and\r
-  checking permissions with a site policy server.\r
-  Starting the configuration policy is just the beginning. It may finish almost\r
-  instantly or it may take several minutes before it fails to retrieve configuration\r
-  information from one or more servers. Once the policy is started, drivers\r
-  should use the DoneEvent parameter to determine when the configuration policy\r
-  has completed. EFI_IP4_CONFIG_PROTOCOL.GetData() must then be called to\r
-  determine if the configuration succeeded or failed.\r
-  Until the configuration completes successfully, EFI IPv4 Protocol driver instances\r
-  that are attempting to use default configurations must return EFI_NO_MAPPING.\r
-  Once the configuration is complete, the EFI IPv4 Configuration Protocol driver\r
-  signals DoneEvent. The configuration may need to be updated in the future,\r
-  however; in this case, the EFI IPv4 Configuration Protocol driver must signal\r
-  ReconfigEvent, and all EFI IPv4 Protocol driver instances that are using default\r
-  configurations must return EFI_NO_MAPPING until the configuration policy has\r
-  been rerun.\r
-\r
-  @param  This                   Pointer to the EFI_IP4_CONFIG_PROTOCOL instance.\r
-  @param  DoneEvent              Event that will be signaled when the EFI IPv4\r
-                                 Protocol driver configuration policy completes\r
-                                 execution. This event must be of type EVT_NOTIFY_SIGNAL.\r
-  @param  ReconfigEvent          Event that will be signaled when the EFI IPv4\r
-                                 Protocol driver configuration needs to be updated.\r
-                                 This event must be of type EVT_NOTIFY_SIGNAL.\r
-\r
-  @retval EFI_SUCCESS            The configuration policy for the EFI IPv4 Protocol\r
-                                 driver is now running.\r
-  @retval EFI_INVALID_PARAMETER  One or more of the following parameters is NULL:\r
-                                  This\r
-                                  DoneEvent\r
-                                  ReconfigEvent\r
-  @retval EFI_OUT_OF_RESOURCES   Required system resources could not be allocated.\r
-  @retval EFI_ALREADY_STARTED    The configuration policy for the EFI IPv4 Protocol\r
-                                 driver was already started.\r
-  @retval EFI_DEVICE_ERROR       An unexpected system error or network error occurred.\r
-  @retval EFI_UNSUPPORTED        This interface does not support the EFI IPv4 Protocol\r
-                                 driver configuration.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-EfiIp4ConfigStart (\r
-  IN EFI_IP4_CONFIG_PROTOCOL  *This,\r
-  IN EFI_EVENT                DoneEvent,\r
-  IN EFI_EVENT                ReconfigEvent\r
-  )\r
-{\r
-  IP4_CONFIG_INSTANCE       *Instance;\r
-  EFI_DHCP4_PROTOCOL        *Dhcp4;\r
-  EFI_DHCP4_MODE_DATA       Dhcp4Mode;\r
-  EFI_DHCP4_PACKET_OPTION   *OptionList[1];\r
-  IP4_CONFIG_DHCP4_OPTION   ParaList;\r
-  EFI_STATUS                Status;\r
-  UINT32                    Source;\r
-  EFI_TPL                   OldTpl;\r
-\r
-  if ((This == NULL) || (DoneEvent == NULL) || (ReconfigEvent == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (This);\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
-\r
-  if (Instance->State != IP4_CONFIG_STATE_IDLE) {\r
-    Status = EFI_ALREADY_STARTED;\r
-\r
-    goto ON_EXIT;\r
-  }\r
-\r
-  Instance->DoneEvent     = DoneEvent;\r
-  Instance->ReconfigEvent = ReconfigEvent;\r
-\r
-  Instance->NicConfig     = EfiNicIp4ConfigGetInfo (Instance);\r
-\r
-  if (Instance->NicConfig == NULL) {\r
-    if (Instance->DoNotStart) {\r
-      Instance->DoNotStart = FALSE;\r
-      Status = EFI_SUCCESS;\r
-      goto ON_EXIT;\r
-    }\r
-\r
-    Source = IP4_CONFIG_SOURCE_DHCP;\r
-  } else {\r
-    Source = Instance->NicConfig->Source;\r
-  }\r
-\r
-  //\r
-  // If the source is static, the auto configuration is done.\r
-  // return now.\r
-  //\r
-  if (Source == IP4_CONFIG_SOURCE_STATIC) {\r
-    Instance->State  = IP4_CONFIG_STATE_CONFIGURED;\r
-    Instance->Result = EFI_SUCCESS;\r
-\r
-    gBS->SignalEvent (Instance->DoneEvent);\r
-    Status = EFI_SUCCESS;\r
-    goto ON_EXIT;\r
-  }\r
-\r
-  //\r
-  // Start the dhcp process\r
-  //\r
-  ASSERT ((Source == IP4_CONFIG_SOURCE_DHCP) && (Instance->Dhcp4 == NULL));\r
-\r
-  Status = NetLibCreateServiceChild (\r
-             Instance->Controller,\r
-             Instance->Image,\r
-             &gEfiDhcp4ServiceBindingProtocolGuid,\r
-             &Instance->Dhcp4Handle\r
-             );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
-\r
-  Status = gBS->OpenProtocol (\r
-                  Instance->Dhcp4Handle,\r
-                  &gEfiDhcp4ProtocolGuid,\r
-                  (VOID **) &Instance->Dhcp4,\r
-                  Instance->Image,\r
-                  Instance->Controller,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
-\r
-  //\r
-  // Check the current DHCP status, if the DHCP process has\r
-  // already finished, return now.\r
-  //\r
-  Dhcp4  = Instance->Dhcp4;\r
-  Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4Mode);\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
-\r
-  if (Dhcp4Mode.State == Dhcp4Bound) {\r
-    Ip4ConfigOnDhcp4Complete (NULL, Instance);\r
-\r
-    goto ON_EXIT;\r
-  }\r
-\r
-  //\r
-  // Try to start the DHCP process. Use most of the current\r
-  // DHCP configuration to avoid problems if some DHCP client\r
-  // yields the control of this DHCP service to us.\r
-  //\r
-  ParaList.Head.OpCode             = DHCP_TAG_PARA_LIST;\r
-  ParaList.Head.Length             = 2;\r
-  ParaList.Head.Data[0]            = DHCP_TAG_NETMASK;\r
-  ParaList.Route                   = DHCP_TAG_ROUTER;\r
-  OptionList[0]                    = &ParaList.Head;\r
-  Dhcp4Mode.ConfigData.OptionCount = 1;\r
-  Dhcp4Mode.ConfigData.OptionList  = OptionList;\r
-\r
-  Status = Dhcp4->Configure (Dhcp4, &Dhcp4Mode.ConfigData);\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
-\r
-  //\r
-  // Start the DHCP process\r
-  //\r
-  Status = gBS->CreateEvent (\r
-                  EVT_NOTIFY_SIGNAL,\r
-                  TPL_CALLBACK,\r
-                  Ip4ConfigOnDhcp4Complete,\r
-                  Instance,\r
-                  &Instance->Dhcp4Event\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
-\r
-  Status = Dhcp4->Start (Dhcp4, Instance->Dhcp4Event);\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
-\r
-  Instance->State  = IP4_CONFIG_STATE_STARTED;\r
-  Instance->Result = EFI_NOT_READY;\r
-\r
-ON_ERROR:\r
-  if (EFI_ERROR (Status)) {\r
-    Ip4ConfigCleanConfig (Instance);\r
-  }\r
-\r
-ON_EXIT:\r
-  gBS->RestoreTPL (OldTpl);\r
-\r
-  DispatchDpc ();\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Stops running the configuration policy for the EFI IPv4 Protocol driver.\r
-\r
-  The Stop() function stops the configuration policy for the EFI IPv4 Protocol driver.\r
-  All configuration data will be lost after calling Stop().\r
-\r
-  @param  This                   Pointer to the EFI_IP4_CONFIG_PROTOCOL instance.\r
-\r
-  @retval EFI_SUCCESS            The configuration policy for the EFI IPv4 Protocol\r
-                                 driver has been stopped.\r
-  @retval EFI_INVALID_PARAMETER  This is NULL.\r
-  @retval EFI_NOT_STARTED        The configuration policy for the EFI IPv4 Protocol\r
-                                 driver was not started.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-EfiIp4ConfigStop (\r
-  IN EFI_IP4_CONFIG_PROTOCOL  *This\r
-  )\r
-{\r
-  IP4_CONFIG_INSTANCE  *Instance;\r
-  EFI_STATUS           Status;\r
-  EFI_TPL              OldTpl;\r
-\r
-  if (This == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (This);\r
-\r
-  Status = EFI_SUCCESS;\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
-\r
-  if (Instance->State == IP4_CONFIG_STATE_IDLE) {\r
-    Status = EFI_NOT_STARTED;\r
-    goto ON_EXIT;\r
-  }\r
-\r
-  //\r
-  // Release all the configure parameters. Don't signal the user\r
-  // event. The user wants to abort the configuration, this isn't\r
-  // the configuration done or reconfiguration.\r
-  //\r
-  Ip4ConfigCleanConfig (Instance);\r
-\r
-ON_EXIT:\r
-  gBS->RestoreTPL (OldTpl);\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Returns the default configuration data (if any) for the EFI IPv4 Protocol driver.\r
-\r
-  The GetData() function returns the current configuration data for the EFI IPv4\r
-  Protocol driver after the configuration policy has completed.\r
-\r
-  @param  This                   Pointer to the EFI_IP4_CONFIG_PROTOCOL instance.\r
-  @param  ConfigDataSize         On input, the size of the ConfigData buffer.\r
-                                 On output, the count of bytes that were written\r
-                                 into the ConfigData buffer.\r
-  @param  ConfigData             Pointer to the EFI IPv4 Configuration Protocol\r
-                                 driver configuration data structure.\r
-                                 Type EFI_IP4_IPCONFIG_DATA is defined in\r
-                                 "Related Definitions" below.\r
-\r
-  @retval EFI_SUCCESS            The EFI IPv4 Protocol driver configuration has been returned.\r
-  @retval EFI_INVALID_PARAMETER  This is NULL.\r
-  @retval EFI_NOT_STARTED        The configuration policy for the EFI IPv4 Protocol\r
-                                 driver is not running.\r
-  @retval EFI_NOT_READY          EFI IPv4 Protocol driver configuration is still running.\r
-  @retval EFI_ABORTED            EFI IPv4 Protocol driver configuration could not complete.\r
-                                 Currently not implemented.\r
-  @retval EFI_BUFFER_TOO_SMALL   *ConfigDataSize is smaller than the configuration\r
-                                 data buffer or ConfigData is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-EfiIp4ConfigGetData (\r
-  IN  EFI_IP4_CONFIG_PROTOCOL *This,\r
-  IN  OUT  UINTN              *ConfigDataSize,\r
-  OUT EFI_IP4_IPCONFIG_DATA   *ConfigData           OPTIONAL\r
-  )\r
-{\r
-  IP4_CONFIG_INSTANCE       *Instance;\r
-  NIC_IP4_CONFIG_INFO       *NicConfig;\r
-  EFI_STATUS                Status;\r
-  EFI_TPL                   OldTpl;\r
-  UINTN                     Len;\r
-\r
-  if ((This == NULL) || (ConfigDataSize == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Instance  = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (This);\r
-\r
-  Status = EFI_SUCCESS;\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
-\r
-  if (Instance->State == IP4_CONFIG_STATE_IDLE) {\r
-    Status = EFI_NOT_STARTED;\r
-  } else if (Instance->State == IP4_CONFIG_STATE_STARTED) {\r
-    Status = EFI_NOT_READY;\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_EXIT;\r
-  }\r
-\r
-  //\r
-  // Copy the configure data if auto configuration succeeds.\r
-  //\r
-  Status = Instance->Result;\r
-\r
-  if (Status == EFI_SUCCESS) {\r
-    ASSERT (Instance->NicConfig != NULL);\r
-\r
-    NicConfig = Instance->NicConfig;\r
-    Len       = SIZEOF_IP4_CONFIG_INFO (&NicConfig->Ip4Info);\r
-\r
-    if ((*ConfigDataSize < Len) || (ConfigData == NULL)) {\r
-      Status = EFI_BUFFER_TOO_SMALL;\r
-    } else {\r
-      CopyMem (ConfigData, &NicConfig->Ip4Info, Len);\r
-      Ip4ConfigFixRouteTablePointer (ConfigData);\r
-    }\r
-\r
-    *ConfigDataSize = Len;\r
-  }\r
-\r
-ON_EXIT:\r
-  gBS->RestoreTPL (OldTpl);\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Release all the DHCP related resources.\r
-\r
-  @param  This                   The IP4 configure instance\r
-\r
-  @return None\r
-\r
-**/\r
-VOID\r
-Ip4ConfigCleanDhcp4 (\r
-  IN IP4_CONFIG_INSTANCE    *This\r
-  )\r
-{\r
-  if (This->Dhcp4 != NULL) {\r
-    This->Dhcp4->Stop (This->Dhcp4);\r
-\r
-    gBS->CloseProtocol (\r
-          This->Dhcp4Handle,\r
-          &gEfiDhcp4ProtocolGuid,\r
-          This->Image,\r
-          This->Controller\r
-          );\r
-\r
-    This->Dhcp4 = NULL;\r
-  }\r
-\r
-  if (This->Dhcp4Handle != NULL) {\r
-    NetLibDestroyServiceChild (\r
-      This->Controller,\r
-      This->Image,\r
-      &gEfiDhcp4ServiceBindingProtocolGuid,\r
-      This->Dhcp4Handle\r
-      );\r
-\r
-    This->Dhcp4Handle = NULL;\r
-  }\r
-\r
-  if (This->Dhcp4Event != NULL) {\r
-    gBS->CloseEvent (This->Dhcp4Event);\r
-    This->Dhcp4Event = NULL;\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Clean up all the configuration parameters.\r
-\r
-  @param  Instance               The IP4 configure instance\r
-\r
-  @return None\r
-\r
-**/\r
-VOID\r
-Ip4ConfigCleanConfig (\r
-  IN IP4_CONFIG_INSTANCE        *Instance\r
-  )\r
-{\r
-  if (Instance->NicConfig != NULL) {\r
-    FreePool (Instance->NicConfig);\r
-    Instance->NicConfig = NULL;\r
-  }\r
-\r
-  Instance->State         = IP4_CONFIG_STATE_IDLE;\r
-  Instance->DoneEvent     = NULL;\r
-  Instance->ReconfigEvent = NULL;\r
-\r
-  Ip4ConfigCleanDhcp4 (Instance);\r
-}\r
-\r
-\r
-/**\r
-  A dedicated timer is used to poll underlying media status. In case of\r
-  cable swap, a new round auto configuration will be initiated. The timer \r
-  will signal the IP4 to run the auto configuration again. IP4 driver will free\r
-  old IP address related resource, such as route table and Interface, then\r
-  initiate a DHCP process by IP4Config->Start to acquire new IP, eventually\r
-  create route table for new IP address.\r
-\r
-  @param[in]  Event                  The IP4 service instance's heart beat timer.\r
-  @param[in]  Context                The IP4 service instance.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-MediaChangeDetect (\r
-  IN EFI_EVENT              Event,\r
-  IN VOID                   *Context\r
-  )\r
-{\r
-  BOOLEAN                      OldMediaPresent;\r
-  EFI_STATUS                   Status;\r
-  EFI_SIMPLE_NETWORK_MODE      SnpModeData;\r
-  IP4_CONFIG_INSTANCE         *Instance;  \r
-\r
-  Instance = (IP4_CONFIG_INSTANCE *) Context;\r
-\r
-  OldMediaPresent = Instance->MediaPresent;\r
-  \r
-  //\r
-  // Get fresh mode data from MNP, since underlying media status may change\r
-  //\r
-  Status = Instance->Mnp->GetModeData (Instance->Mnp, NULL, &SnpModeData);\r
-  if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {\r
-    return;\r
-  }\r
-\r
-  Instance->MediaPresent = SnpModeData.MediaPresent;\r
-  //\r
-  // Media transimit Unpresent to Present means new link movement is detected.\r
-  //\r
-  if (!OldMediaPresent && Instance->MediaPresent) {\r
-    //\r
-    // Signal the IP4 to run the auto configuration again. IP4 driver will free\r
-    // old IP address related resource, such as route table and Interface, then \r
-    // initiate a DHCP round by IP4Config->Start to acquire new IP, eventually \r
-    // create route table for new IP address.\r
-    //\r
-    if (Instance->ReconfigEvent != NULL) {\r
-      Status = gBS->SignalEvent (Instance->ReconfigEvent);\r
-      DispatchDpc ();\r
-    }\r
-  }\r
-}\r