+++ /dev/null
-/** @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