/** @file\r
+ This code implements the IP4Config and NicIp4Config protocols.\r
\r
-Copyright (c) 2006 - 2007, Intel Corporation\r
+Copyright (c) 2006 - 2008, Intel Corporation.<BR> \r
All rights reserved. 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\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
-Module Name:\r
-\r
- Ip4Config.c\r
-\r
-Abstract:\r
-\r
- This code implements the IP4Config and NicIp4Config protocols.\r
-\r
-\r
**/\r
\r
#include "Ip4Config.h"\r
\r
IP4_CONFIG_INSTANCE *mIp4ConfigNicList[MAX_IP4_CONFIG_IN_VARIABLE];\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
@retval EFI_SUCCESS The name or address of the NIC are returned.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
EfiNicIp4ConfigGetName (\r
Instance = IP4_CONFIG_INSTANCE_FROM_NIC_IP4CONFIG (This);\r
\r
if (Name != NULL) {\r
- NetCopyMem (Name, Instance->NicName, IP4_NIC_NAME_LENGTH);\r
+ CopyMem (Name, Instance->NicName, IP4_NIC_NAME_LENGTH);\r
}\r
\r
if (NicAddr != NULL) {\r
- *NicAddr = Instance->NicAddr;\r
+ CopyMem (NicAddr, &Instance->NicAddr, sizeof (*NicAddr));\r
}\r
\r
return EFI_SUCCESS;\r
Config = Ip4ConfigFindNicVariable (Variable, NicAddr);\r
\r
if (Config == NULL) {\r
- NetFreePool (Variable);\r
+ gBS->FreePool (Variable);\r
return NULL;\r
}\r
\r
Ip4ConfigWriteVariable (NewVariable);\r
\r
if (NewVariable != NULL) {\r
- NetFreePool (NewVariable);\r
+ gBS->FreePool (NewVariable);\r
};\r
\r
- NetFreePool (Config);\r
+ gBS->FreePool (Config);\r
Config = NULL;\r
}\r
\r
- NetFreePool (Variable);\r
+ gBS->FreePool (Variable);\r
return Config;\r
}\r
\r
Status = EFI_BUFFER_TOO_SMALL;\r
} else {\r
Status = EFI_SUCCESS;\r
- NetCopyMem (NicConfig, Config, Len);\r
+ CopyMem (NicConfig, Config, Len);\r
+ Ip4ConfigFixRouteTablePointer (&NicConfig->Ip4Info);\r
}\r
\r
*ConfigLen = Len;\r
\r
- NetFreePool (Config);\r
+ gBS->FreePool (Config);\r
return Status;\r
}\r
\r
Status = Ip4ConfigWriteVariable (NewVariable);\r
\r
if (NewVariable != NULL) {\r
- NetFreePool (NewVariable);\r
+ gBS->FreePool (NewVariable);\r
}\r
\r
//\r
// Variable is NULL when saving the first configure parameter\r
//\r
if (Variable != NULL) {\r
- NetFreePool (Variable);\r
+ gBS->FreePool (Variable);\r
}\r
\r
if (EFI_ERROR (Status)) {\r
//\r
if (Reconfig && (Instance->ReconfigEvent != NULL)) {\r
Status = gBS->SignalEvent (Instance->ReconfigEvent);\r
+ NetLibDispatchDpc ();\r
}\r
\r
return Status;\r
\r
\r
/**\r
- Start the auto configuration process.\r
-\r
- @param This The IP4 configure protocol\r
- @param DoneEvent The event to signal when auto configure is done\r
- @param ReconfigEvent The event to signal when reconfigure is necessary.\r
-\r
- @retval EFI_INVALID_PARAMETER One of the function parameters is NULL.\r
- @retval EFI_ALREADY_STARTED The auto configuration has already started.\r
- @retval EFI_SUCCESS The auto configure is successfully started.\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
\r
Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (This);\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
if (Instance->State != IP4_CONFIG_STATE_IDLE) {\r
Status = EFI_ALREADY_STARTED;\r
//\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_SIGNAL,\r
- NET_TPL_EVENT,\r
+ TPL_CALLBACK,\r
Ip4ConfigOnDhcp4Complete,\r
Instance,\r
&Instance->Dhcp4Event\r
}\r
\r
ON_EXIT:\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
+\r
+ NetLibDispatchDpc ();\r
\r
return Status;\r
}\r
\r
\r
/**\r
- Stop the current auto configuration\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 The IP4 CONFIG protocol\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 auto configuration hasn't been started.\r
- @retval EFI_SUCCESS The auto configuration has been stopped.\r
-\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
Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (This);\r
\r
Status = EFI_SUCCESS;\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
if (Instance->State == IP4_CONFIG_STATE_IDLE) {\r
Status = EFI_NOT_STARTED;\r
Ip4ConfigCleanConfig (Instance);\r
\r
ON_EXIT:\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
return Status;\r
}\r
\r
\r
/**\r
- Get the current outcome of the auto configuration process\r
-\r
- @param This The IP4 CONFIG protocol\r
- @param ConfigDataSize The size of the configure data\r
- @param ConfigData The buffer to save the configure data\r
-\r
- @retval EFI_INVALID_PARAMETER This or ConfigDataSize is NULL\r
- @retval EFI_BUFFER_TOO_SMALL The buffer is too small. The needed size is\r
- returned in the ConfigDataSize.\r
- @retval EFI_SUCCESS The configure data is put in the buffer\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
+ @retval EFI_BUFFER_TOO_SMALL *ConfigDataSize is smaller than the configuration \r
+ data buffer or ConfigData is NULL.\r
\r
**/\r
EFI_STATUS\r
Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (This);\r
\r
Status = EFI_SUCCESS;\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
if (Instance->State == IP4_CONFIG_STATE_IDLE) {\r
Status = EFI_NOT_STARTED;\r
if ((*ConfigDataSize < Len) || (ConfigData == NULL)) {\r
Status = EFI_BUFFER_TOO_SMALL;\r
} else {\r
- NetCopyMem (ConfigData, &NicConfig->Ip4Info, Len);\r
+ CopyMem (ConfigData, &NicConfig->Ip4Info, Len);\r
+ Ip4ConfigFixRouteTablePointer (ConfigData);\r
}\r
\r
*ConfigDataSize = Len;\r
}\r
\r
ON_EXIT:\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
return Status;\r
}\r
EFI_STATUS Status;\r
BOOLEAN Perment;\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
if (Instance->NicConfig != NULL) {\r
ASSERT (Instance->NicConfig->Source == IP4_CONFIG_SOURCE_DHCP);\r
Perment = Instance->NicConfig->Perment;\r
- NetFreePool (Instance->NicConfig);\r
+ gBS->FreePool (Instance->NicConfig);\r
}\r
\r
- Instance->NicConfig = NetAllocatePool (sizeof (NIC_IP4_CONFIG_INFO) +\r
- sizeof (EFI_IP4_ROUTE_TABLE));\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->NicAddr = Instance->NicAddr;\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->Perment = Perment;\r
\r
//\r
Ip4Config->RouteTableSize = 1;\r
\r
- Subnet = EFI_NTOHL (Dhcp4Mode.ClientAddress) & EFI_NTOHL (Dhcp4Mode.SubnetMask);\r
+ CopyMem (&Ip1, &Dhcp4Mode.ClientAddress, sizeof (IP4_ADDR));\r
+ CopyMem (&Ip2, &Dhcp4Mode.SubnetMask, sizeof (IP4_ADDR));\r
+\r
+ Subnet = Ip1 & Ip2;\r
\r
- EFI_IP4 (Ip4Config->RouteTable[0].SubnetAddress) = HTONL (Subnet);\r
- Ip4Config->RouteTable[0].SubnetMask = Dhcp4Mode.SubnetMask;\r
- EFI_IP4 (Ip4Config->RouteTable[0].GatewayAddress) = 0;\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 (Dhcp4Mode.RouterAddress) != 0) {\r
- Ip4Config->RouteTableSize = 2;\r
- EFI_IP4 (Ip4Config->RouteTable[1].SubnetAddress) = 0;\r
- EFI_IP4 (Ip4Config->RouteTable[1].SubnetMask) = 0;\r
- Ip4Config->RouteTable[1].GatewayAddress = Dhcp4Mode.RouterAddress;\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
ON_EXIT:\r
gBS->SignalEvent (Instance->DoneEvent);\r
Ip4ConfigCleanDhcp4 (Instance);\r
+\r
+ NetLibDispatchDpc ();\r
+\r
return ;\r
}\r
\r
\r
\r
/**\r
- Clean up all the configuration parameters\r
+ Clean up all the configuration parameters.\r
\r
@param Instance The IP4 configure instance\r
\r
)\r
{\r
if (Instance->NicConfig != NULL) {\r
- NetFreePool (Instance->NicConfig);\r
+ gBS->FreePool (Instance->NicConfig);\r
Instance->NicConfig = NULL;\r
}\r
\r