]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Ip6Dxe/Ip6Common.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / NetworkPkg / Ip6Dxe / Ip6Common.c
index 459acd239f6999a0c0981b3909d52af9054e4bf4..6622cf838b840fdd1a990724096e5680f39f7dd0 100644 (file)
@@ -1,15 +1,9 @@
 /** @file\r
   The implementation of common functions shared by IP6 driver.\r
 \r
-  Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<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
-  which accompanies this distribution.  The full text of the license may be found at\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
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -107,16 +101,16 @@ Ip6BuildEfiAddressList (
 **/\r
 EFI_STATUS\r
 Ip6SetToAllNodeMulticast (\r
-  IN  BOOLEAN          Router,\r
-  IN  UINT8            Scope,\r
-  OUT EFI_IPv6_ADDRESS *Ip6Addr\r
+  IN  BOOLEAN           Router,\r
+  IN  UINT8             Scope,\r
+  OUT EFI_IPv6_ADDRESS  *Ip6Addr\r
   )\r
 {\r
   if (Ip6Addr == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (!Router && Scope == IP6_SITE_LOCAL_SCOPE) {\r
+  if (!Router && (Scope == IP6_SITE_LOCAL_SCOPE)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -146,13 +140,13 @@ Ip6SetToAllNodeMulticast (
 **/\r
 UINT8 *\r
 Ip6CreateInterfaceID (\r
-  IN OUT IP6_SERVICE         *IpSb\r
+  IN OUT IP6_SERVICE  *IpSb\r
   )\r
 {\r
-  UINT8                      InterfaceId[8];\r
-  UINT8                      Byte;\r
-  EFI_MAC_ADDRESS            *MacAddr;\r
-  UINT32                     AddrLen;\r
+  UINT8            InterfaceId[8];\r
+  UINT8            Byte;\r
+  EFI_MAC_ADDRESS  *MacAddr;\r
+  UINT32           AddrLen;\r
 \r
   NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
 \r
@@ -161,7 +155,7 @@ Ip6CreateInterfaceID (
   //\r
   // Currently only IEEE 802 48-bit MACs are supported to create link local address.\r
   //\r
-  if (AddrLen != IP6_MAC_LEN || IpSb->InterfaceIdLen != IP6_IF_ID_LEN) {\r
+  if ((AddrLen != IP6_MAC_LEN) || (IpSb->InterfaceIdLen != IP6_IF_ID_LEN)) {\r
     return NULL;\r
   }\r
 \r
@@ -177,7 +171,7 @@ Ip6CreateInterfaceID (
   InterfaceId[4] = 0xFE;\r
   CopyMem (&InterfaceId[5], &MacAddr->Addr[3], 3);\r
 \r
-  Byte = (UINT8) (InterfaceId[0] & IP6_U_BIT);\r
+  Byte = (UINT8)(InterfaceId[0] & IP6_U_BIT);\r
   if (Byte == IP6_U_BIT) {\r
     InterfaceId[0] &= ~IP6_U_BIT;\r
   } else {\r
@@ -204,7 +198,7 @@ Ip6CreateInterfaceID (
 **/\r
 EFI_IPv6_ADDRESS *\r
 Ip6CreateLinkLocalAddr (\r
-  IN OUT IP6_SERVICE           *IpSb\r
+  IN OUT IP6_SERVICE  *IpSb\r
   )\r
 {\r
   EFI_IPv6_ADDRESS             *Ip6Addr;\r
@@ -220,7 +214,7 @@ Ip6CreateLinkLocalAddr (
   }\r
 \r
   //\r
-  // Get the interface id if it is manully configured.\r
+  // Get the interface id if it is manually configured.\r
   //\r
   Ip6Config = &IpSb->Ip6ConfigInstance.Ip6Config;\r
   DataSize  = sizeof (EFI_IP6_CONFIG_INTERFACE_ID);\r
@@ -295,8 +289,8 @@ Ip6CreateLinkLocalAddr (
 **/\r
 VOID\r
 Ip6CreateSNMulticastAddr (\r
-  IN EFI_IPv6_ADDRESS  *Ip6Addr,\r
-  OUT EFI_IPv6_ADDRESS *MulticastAddr\r
+  IN EFI_IPv6_ADDRESS   *Ip6Addr,\r
+  OUT EFI_IPv6_ADDRESS  *MulticastAddr\r
   )\r
 {\r
   ASSERT (Ip6Addr != NULL && MulticastAddr != NULL);\r
@@ -320,8 +314,8 @@ Ip6CreateSNMulticastAddr (
 **/\r
 VOID\r
 Ip6AddAddr (\r
-  IN OUT IP6_INTERFACE *IpIf,\r
-  IN IP6_ADDRESS_INFO  *AddrInfo\r
+  IN OUT IP6_INTERFACE  *IpIf,\r
+  IN IP6_ADDRESS_INFO   *AddrInfo\r
   )\r
 {\r
   InsertHeadList (&IpIf->AddressList, &AddrInfo->Link);\r
@@ -330,7 +324,7 @@ Ip6AddAddr (
 \r
 /**\r
   Callback function which provided by user to remove one node in NetDestroyLinkList process.\r
-  \r
+\r
   @param[in]    Entry           The entry to be removed.\r
   @param[in]    Context         Pointer to the callback context corresponds to the Context in NetDestroyLinkList.\r
 \r
@@ -339,23 +333,24 @@ Ip6AddAddr (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 Ip6DestroyChildEntryByAddr (\r
-  IN LIST_ENTRY         *Entry,\r
-  IN VOID               *Context\r
-)\r
+  IN LIST_ENTRY  *Entry,\r
+  IN VOID        *Context\r
+  )\r
 {\r
   IP6_PROTOCOL                  *Instance;\r
   EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;\r
   EFI_IPv6_ADDRESS              *Address;\r
-  \r
-  Instance = NET_LIST_USER_STRUCT_S (Entry, IP6_PROTOCOL, Link, IP6_PROTOCOL_SIGNATURE);\r
-  ServiceBinding = ((IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT*) Context)->ServiceBinding;\r
-  Address = ((IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT*) Context)->Address;\r
+\r
+  Instance       = NET_LIST_USER_STRUCT_S (Entry, IP6_PROTOCOL, Link, IP6_PROTOCOL_SIGNATURE);\r
+  ServiceBinding = ((IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT *)Context)->ServiceBinding;\r
+  Address        = ((IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT *)Context)->Address;\r
 \r
   if ((Instance->State == IP6_STATE_CONFIGED) && EFI_IP6_EQUAL (&Instance->ConfigData.StationAddress, Address)) {\r
     return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);\r
   }\r
-  \r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -373,14 +368,14 @@ Ip6DestroyInstanceByAddress (
   IN EFI_IPv6_ADDRESS  *Address\r
   )\r
 {\r
-  LIST_ENTRY                    *List;\r
+  LIST_ENTRY                                  *List;\r
   IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT  Context;\r
 \r
   NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
 \r
-  List = &IpSb->Children;\r
+  List                   = &IpSb->Children;\r
   Context.ServiceBinding = &IpSb->ServiceBinding;\r
-  Context.Address = Address;\r
+  Context.Address        = Address;\r
   NetDestroyLinkList (\r
     List,\r
     Ip6DestroyChildEntryByAddr,\r
@@ -421,13 +416,13 @@ Ip6RemoveAddr (
   IN UINT8             PrefixLength\r
   )\r
 {\r
-  EFI_STATUS           Status;\r
-  LIST_ENTRY           *Entry;\r
-  LIST_ENTRY           *Next;\r
-  IP6_ADDRESS_INFO     *AddrInfo;\r
-  EFI_IPv6_ADDRESS     SnMCastAddr;\r
+  EFI_STATUS        Status;\r
+  LIST_ENTRY        *Entry;\r
+  LIST_ENTRY        *Next;\r
+  IP6_ADDRESS_INFO  *AddrInfo;\r
+  EFI_IPv6_ADDRESS  SnMCastAddr;\r
 \r
-  if (IsListEmpty (AddressList) || *AddressCount < 1 || PrefixLength > IP6_PREFIX_NUM) {\r
+  if (IsListEmpty (AddressList) || (*AddressCount < 1) || (PrefixLength > IP6_PREFIX_MAX)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -436,10 +431,11 @@ Ip6RemoveAddr (
   NET_LIST_FOR_EACH_SAFE (Entry, Next, AddressList) {\r
     AddrInfo = NET_LIST_USER_STRUCT_S (Entry, IP6_ADDRESS_INFO, Link, IP6_ADDR_INFO_SIGNATURE);\r
 \r
-    if (Prefix == NULL ||\r
-        (PrefixLength == 128 && EFI_IP6_EQUAL (Prefix, &AddrInfo->Address)) ||\r
-        (PrefixLength == AddrInfo->PrefixLength && NetIp6IsNetEqual (Prefix, &AddrInfo->Address, PrefixLength))\r
-        ) {\r
+    if ((Prefix == NULL) ||\r
+        ((PrefixLength == 128) && EFI_IP6_EQUAL (Prefix, &AddrInfo->Address)) ||\r
+        ((PrefixLength == AddrInfo->PrefixLength) && NetIp6IsNetEqual (Prefix, &AddrInfo->Address, PrefixLength))\r
+        )\r
+    {\r
       if (IpSb != NULL) {\r
         NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);\r
         Ip6CreateSNMulticastAddr (&AddrInfo->Address, &SnMCastAddr);\r
@@ -473,11 +469,11 @@ Ip6RemoveAddr (
 **/\r
 BOOLEAN\r
 Ip6IsSNMulticastAddr (\r
-  IN EFI_IPv6_ADDRESS *Ip6\r
+  IN EFI_IPv6_ADDRESS  *Ip6\r
   )\r
 {\r
-  EFI_IPv6_ADDRESS    Sn;\r
-  BOOLEAN             Flag;\r
+  EFI_IPv6_ADDRESS  Sn;\r
+  BOOLEAN           Flag;\r
 \r
   Ip6CreateSNMulticastAddr (Ip6, &Sn);\r
   Flag = FALSE;\r
@@ -506,16 +502,16 @@ Ip6IsSNMulticastAddr (
 **/\r
 BOOLEAN\r
 Ip6IsOneOfSetAddress (\r
-  IN  IP6_SERVICE           *IpSb,\r
-  IN  EFI_IPv6_ADDRESS      *Address,\r
-  OUT IP6_INTERFACE         **Interface   OPTIONAL,\r
-  OUT IP6_ADDRESS_INFO      **AddressInfo OPTIONAL\r
+  IN  IP6_SERVICE       *IpSb,\r
+  IN  EFI_IPv6_ADDRESS  *Address,\r
+  OUT IP6_INTERFACE     **Interface   OPTIONAL,\r
+  OUT IP6_ADDRESS_INFO  **AddressInfo OPTIONAL\r
   )\r
 {\r
-  LIST_ENTRY                *Entry;\r
-  LIST_ENTRY                *Entry2;\r
-  IP6_INTERFACE             *IpIf;\r
-  IP6_ADDRESS_INFO          *TmpAddressInfo;\r
+  LIST_ENTRY        *Entry;\r
+  LIST_ENTRY        *Entry2;\r
+  IP6_INTERFACE     *IpIf;\r
+  IP6_ADDRESS_INFO  *TmpAddressInfo;\r
 \r
   //\r
   // Check link-local address first\r
@@ -571,7 +567,7 @@ Ip6IsValidLinkAddress (
   IN  EFI_MAC_ADDRESS  *LinkAddress\r
   )\r
 {\r
-  UINT32               Index;\r
+  UINT32  Index;\r
 \r
   //\r
   // TODO: might be updated later to be more acceptable.\r
@@ -595,29 +591,29 @@ Ip6IsValidLinkAddress (
 **/\r
 VOID\r
 Ip6CopyAddressByPrefix (\r
-  OUT EFI_IPv6_ADDRESS *Dest,\r
-  IN  EFI_IPv6_ADDRESS *Src,\r
-  IN  UINT8            PrefixLength\r
+  OUT EFI_IPv6_ADDRESS  *Dest,\r
+  IN  EFI_IPv6_ADDRESS  *Src,\r
+  IN  UINT8             PrefixLength\r
   )\r
 {\r
-  UINT8 Byte;\r
-  UINT8 Bit;\r
-  UINT8 Mask;\r
+  UINT8  Byte;\r
+  UINT8  Bit;\r
+  UINT8  Mask;\r
 \r
   ASSERT (Dest != NULL && Src != NULL);\r
-  ASSERT (PrefixLength < IP6_PREFIX_NUM);\r
+  ASSERT (PrefixLength <= IP6_PREFIX_MAX);\r
 \r
-  Byte = (UINT8) (PrefixLength / 8);\r
-  Bit  = (UINT8) (PrefixLength % 8);\r
+  Byte = (UINT8)(PrefixLength / 8);\r
+  Bit  = (UINT8)(PrefixLength % 8);\r
 \r
   ZeroMem (Dest, sizeof (EFI_IPv6_ADDRESS));\r
 \r
   CopyMem (Dest, Src, Byte);\r
 \r
   if (Bit > 0) {\r
-    Mask = (UINT8) (0xFF << (8 - Bit));\r
+    Mask = (UINT8)(0xFF << (8 - Bit));\r
     ASSERT (Byte < 16);\r
-    Dest->Addr[Byte] = (UINT8) (Src->Addr[Byte] & Mask);\r
+    Dest->Addr[Byte] = (UINT8)(Src->Addr[Byte] & Mask);\r
   }\r
 }\r
 \r
@@ -637,158 +633,18 @@ Ip6CopyAddressByPrefix (
 **/\r
 EFI_STATUS\r
 Ip6GetMulticastMac (\r
-  IN  EFI_MANAGED_NETWORK_PROTOCOL *Mnp,\r
-  IN  EFI_IPv6_ADDRESS             *Multicast,\r
-  OUT EFI_MAC_ADDRESS              *Mac\r
+  IN  EFI_MANAGED_NETWORK_PROTOCOL  *Mnp,\r
+  IN  EFI_IPv6_ADDRESS              *Multicast,\r
+  OUT EFI_MAC_ADDRESS               *Mac\r
   )\r
 {\r
-  EFI_IP_ADDRESS        EfiIp;\r
+  EFI_IP_ADDRESS  EfiIp;\r
 \r
   IP6_COPY_ADDRESS (&EfiIp.v6, Multicast);\r
 \r
   return Mnp->McastIpToMac (Mnp, TRUE, &EfiIp, Mac);\r
 }\r
 \r
-/**\r
-  Set the Ip6 variable data.\r
-\r
-  @param[in]  IpSb              Points to an IP6 service binding instance.\r
-\r
-  @retval EFI_OUT_OF_RESOURCES  There are not enough resources to set the variable.\r
-  @retval other                 Set variable failed.\r
-\r
-**/\r
-EFI_STATUS\r
-Ip6SetVariableData (\r
-  IN IP6_SERVICE  *IpSb\r
-  )\r
-{\r
-  UINT32                 NumConfiguredInstance;\r
-  LIST_ENTRY             *Entry;\r
-  UINTN                  VariableDataSize;\r
-  EFI_IP6_VARIABLE_DATA  *Ip6VariableData;\r
-  EFI_IP6_ADDRESS_PAIR   *Ip6AddressPair;\r
-  IP6_PROTOCOL           *IpInstance;\r
-  CHAR16                 *NewMacString;\r
-  EFI_STATUS             Status;\r
-\r
-  NumConfiguredInstance = 0;\r
-\r
-  //\r
-  // Go through the children list to count the configured children.\r
-  //\r
-  NET_LIST_FOR_EACH (Entry, &IpSb->Children) {\r
-    IpInstance = NET_LIST_USER_STRUCT_S (Entry, IP6_PROTOCOL, Link, IP6_PROTOCOL_SIGNATURE);\r
-\r
-    if (IpInstance->State == IP6_STATE_CONFIGED) {\r
-      NumConfiguredInstance++;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Calculate the size of the Ip6VariableData. As there may be no IP child,\r
-  // we should add extra buffer for the address paris only if the number of configured\r
-  // children is more than 1.\r
-  //\r
-  VariableDataSize = sizeof (EFI_IP6_VARIABLE_DATA);\r
-\r
-  if (NumConfiguredInstance > 1) {\r
-    VariableDataSize += sizeof (EFI_IP6_ADDRESS_PAIR) * (NumConfiguredInstance - 1);\r
-  }\r
-\r
-  Ip6VariableData = AllocatePool (VariableDataSize);\r
-  if (Ip6VariableData == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  Ip6VariableData->DriverHandle = IpSb->Image;\r
-  Ip6VariableData->AddressCount = NumConfiguredInstance;\r
-\r
-  Ip6AddressPair                = &Ip6VariableData->AddressPairs[0];\r
-\r
-  //\r
-  // Go through the children list to fill the configured children's address pairs.\r
-  //\r
-  NET_LIST_FOR_EACH (Entry, &IpSb->Children) {\r
-    IpInstance = NET_LIST_USER_STRUCT_S (Entry, IP6_PROTOCOL, Link, IP6_PROTOCOL_SIGNATURE);\r
-\r
-    if (IpInstance->State == IP6_STATE_CONFIGED) {\r
-      Ip6AddressPair->InstanceHandle = IpInstance->Handle;\r
-      Ip6AddressPair->PrefixLength   = IpInstance->PrefixLength;\r
-      IP6_COPY_ADDRESS (&Ip6AddressPair->Ip6Address, &IpInstance->ConfigData.StationAddress);\r
-\r
-      Ip6AddressPair++;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Get the mac string.\r
-  //\r
-  Status = NetLibGetMacString (IpSb->Controller, IpSb->Image, &NewMacString);\r
-  if (EFI_ERROR (Status)) {\r
-    goto Exit;\r
-  }\r
-\r
-  if (IpSb->MacString != NULL) {\r
-    //\r
-    // The variable is set already, we're going to update it.\r
-    //\r
-    if (StrCmp (IpSb->MacString, NewMacString) != 0) {\r
-      //\r
-      // The mac address is changed, delete the previous variable first.\r
-      //\r
-      gRT->SetVariable (\r
-             IpSb->MacString,\r
-             &gEfiIp6ServiceBindingProtocolGuid,\r
-             EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-             0,\r
-             NULL\r
-             );\r
-    }\r
-\r
-    FreePool (IpSb->MacString);\r
-  }\r
-\r
-  IpSb->MacString = NewMacString;\r
-\r
-  Status = gRT->SetVariable (\r
-                  IpSb->MacString,\r
-                  &gEfiIp6ServiceBindingProtocolGuid,\r
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                  VariableDataSize,\r
-                  (VOID *) Ip6VariableData\r
-                  );\r
-\r
-Exit:\r
-  FreePool (Ip6VariableData);\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Clear the variable and free the resource.\r
-\r
-  @param[in]  IpSb                  Ip6 service binding instance.\r
-\r
-**/\r
-VOID\r
-Ip6ClearVariableData (\r
-  IN IP6_SERVICE  *IpSb\r
-  )\r
-{\r
-  ASSERT (IpSb->MacString != NULL);\r
-\r
-  gRT->SetVariable (\r
-         IpSb->MacString,\r
-         &gEfiIp6ServiceBindingProtocolGuid,\r
-         EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-         0,\r
-         NULL\r
-         );\r
-\r
-  FreePool (IpSb->MacString);\r
-  IpSb->MacString = NULL;\r
-}\r
-\r
 /**\r
   Convert the multibyte field in IP header's byter order.\r
   In spite of its name, it can also be used to convert from\r
@@ -801,7 +657,7 @@ Ip6ClearVariableData (
 **/\r
 EFI_IP6_HEADER *\r
 Ip6NtohHead (\r
-  IN OUT EFI_IP6_HEADER *Head\r
+  IN OUT EFI_IP6_HEADER  *Head\r
   )\r
 {\r
   Head->FlowLabelL    = NTOHS (Head->FlowLabelL);\r
@@ -809,4 +665,3 @@ Ip6NtohHead (
 \r
   return Head;\r
 }\r
-\r