]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.c
Scrubbed some code for Ip4ConfigDxe.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4ConfigDxe / Ip4Config.c
index c0cc15f3de7ff48bff2b7b82d550f00eee00d7ee..4c72a540451adbf2e32d5bde0e3da0b4bc45707a 100644 (file)
@@ -1,29 +1,31 @@
 /** @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
@@ -44,7 +46,6 @@ Ip4ConfigOnDhcp4Complete (
   @retval EFI_SUCCESS            The name or address of the NIC are returned.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 EfiNicIp4ConfigGetName (\r
@@ -62,11 +63,11 @@ EfiNicIp4ConfigGetName (
   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
@@ -105,7 +106,7 @@ Ip4ConfigGetNicInfo (
   Config = Ip4ConfigFindNicVariable (Variable, NicAddr);\r
 \r
   if (Config == NULL) {\r
-    NetFreePool (Variable);\r
+    gBS->FreePool (Variable);\r
     return NULL;\r
   }\r
 \r
@@ -118,14 +119,14 @@ Ip4ConfigGetNicInfo (
     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
@@ -179,12 +180,13 @@ EfiNicIp4ConfigGetInfo (
     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
@@ -253,14 +255,14 @@ EfiNicIp4ConfigSetInfo (
   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
@@ -272,6 +274,7 @@ EfiNicIp4ConfigSetInfo (
   //\r
   if (Reconfig && (Instance->ReconfigEvent != NULL)) {\r
     Status = gBS->SignalEvent (Instance->ReconfigEvent);\r
+    NetLibDispatchDpc ();\r
   }\r
 \r
   return Status;\r
@@ -279,15 +282,49 @@ EfiNicIp4ConfigSetInfo (
 \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
@@ -313,7 +350,7 @@ EfiIp4ConfigStart (
 \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
@@ -415,7 +452,7 @@ EfiIp4ConfigStart (
   //\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_SIGNAL,\r
-                  NET_TPL_EVENT,\r
+                  TPL_CALLBACK,\r
                   Ip4ConfigOnDhcp4Complete,\r
                   Instance,\r
                   &Instance->Dhcp4Event\r
@@ -440,21 +477,28 @@ ON_ERROR:
   }\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
@@ -473,7 +517,7 @@ EfiIp4ConfigStop (
   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
@@ -488,23 +532,35 @@ EfiIp4ConfigStop (
   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
@@ -528,7 +584,7 @@ EfiIp4ConfigGetData (
   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
@@ -554,14 +610,15 @@ EfiIp4ConfigGetData (
     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
@@ -590,6 +647,8 @@ Ip4ConfigOnDhcp4Complete (
   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
@@ -617,18 +676,19 @@ Ip4ConfigOnDhcp4Complete (
     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
@@ -641,20 +701,24 @@ Ip4ConfigOnDhcp4Complete (
     //\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
@@ -669,6 +733,9 @@ Ip4ConfigOnDhcp4Complete (
 ON_EXIT:\r
   gBS->SignalEvent (Instance->DoneEvent);\r
   Ip4ConfigCleanDhcp4 (Instance);\r
+\r
+  NetLibDispatchDpc ();\r
+\r
   return ;\r
 }\r
 \r
@@ -718,7 +785,7 @@ Ip4ConfigCleanDhcp4 (
 \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
@@ -731,7 +798,7 @@ Ip4ConfigCleanConfig (
   )\r
 {\r
   if (Instance->NicConfig != NULL) {\r
-    NetFreePool (Instance->NicConfig);\r
+    gBS->FreePool (Instance->NicConfig);\r
     Instance->NicConfig = NULL;\r
   }\r
 \r