The implementation of EFI IPv6 Configuration Protocol.\r
\r
Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) Microsoft Corporation.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
\r
#include "Ip6Impl.h"\r
\r
-LIST_ENTRY mIp6ConfigInstanceList = {&mIp6ConfigInstanceList, &mIp6ConfigInstanceList};\r
+LIST_ENTRY mIp6ConfigInstanceList = { &mIp6ConfigInstanceList, &mIp6ConfigInstanceList };\r
\r
/**\r
The event process routine when the DHCPv6 service binding protocol is installed\r
IN EFI_IP6_CONFIG_POLICY NewPolicy\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- LIST_ENTRY *Entry2;\r
- LIST_ENTRY *Next;\r
- IP6_INTERFACE *IpIf;\r
- IP6_DAD_ENTRY *DadEntry;\r
- IP6_DELAY_JOIN_LIST *DelayNode;\r
- IP6_ADDRESS_INFO *AddrInfo;\r
- IP6_PROTOCOL *Instance;\r
- BOOLEAN Recovery;\r
+ LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Entry2;\r
+ LIST_ENTRY *Next;\r
+ IP6_INTERFACE *IpIf;\r
+ IP6_DAD_ENTRY *DadEntry;\r
+ IP6_DELAY_JOIN_LIST *DelayNode;\r
+ IP6_ADDRESS_INFO *AddrInfo;\r
+ IP6_PROTOCOL *Instance;\r
+ BOOLEAN Recovery;\r
\r
Recovery = FALSE;\r
\r
Ip6CreatePrefixListEntry (\r
IpSb,\r
TRUE,\r
- (UINT32) IP6_INFINIT_LIFETIME,\r
- (UINT32) IP6_INFINIT_LIFETIME,\r
+ (UINT32)IP6_INFINIT_LIFETIME,\r
+ (UINT32)IP6_INFINIT_LIFETIME,\r
IP6_LINK_LOCAL_PREFIX_LENGTH,\r
&IpSb->LinkLocalAddr\r
);\r
}\r
\r
- if (!IsListEmpty (&IpSb->DefaultInterface->AddressList) && IpSb->DefaultInterface->AddressCount > 0) {\r
+ if (!IsListEmpty (&IpSb->DefaultInterface->AddressList) && (IpSb->DefaultInterface->AddressCount > 0)) {\r
//\r
// If any IPv6 children (Instance) in configured state and use global unicast address, it will be\r
// destroyed in Ip6RemoveAddr() function later. Then, the upper layer driver's Stop() function will be\r
}\r
\r
//\r
- // All IPv6 children that use global unicast address as it's source address\r
+ // All IPv6 children that use global unicast address as its source address\r
// should be destroyed now. The survivers are those use the link-local address\r
// or the unspecified address as the source address.\r
// TODO: Conduct a check here.\r
0\r
);\r
\r
- if (IpSb->Controller != NULL && Recovery) {\r
+ if ((IpSb->Controller != NULL) && Recovery) {\r
//\r
// ConnectController() to recover the upper layer network stacks.\r
//\r
}\r
}\r
\r
-\r
NET_LIST_FOR_EACH (Entry, &IpSb->Interfaces) {\r
//\r
// remove all pending delay node and DAD entries for the global addresses.\r
//\r
// delay 1 second\r
//\r
- IpSb->Ticks = (UINT32) IP6_GET_TICKS (IP6_ONE_SECOND_IN_MS);\r
+ IpSb->Ticks = (UINT32)IP6_GET_TICKS (IP6_ONE_SECOND_IN_MS);\r
}\r
}\r
\r
&gEfiDhcp6ServiceBindingProtocolGuid,\r
TPL_CALLBACK,\r
Ip6ConfigOnDhcp6SbInstalled,\r
- (VOID *) Instance,\r
+ (VOID *)Instance,\r
&Instance->Registration\r
);\r
}\r
Status = gBS->OpenProtocol (\r
Instance->Dhcp6Handle,\r
&gEfiDhcp6ProtocolGuid,\r
- (VOID **) &Instance->Dhcp6,\r
+ (VOID **)&Instance->Dhcp6,\r
IpSb->Image,\r
IpSb->Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
// Set the exta options to send. Here we only want the option request option\r
// with DNS SERVERS.\r
//\r
- Oro = (EFI_DHCP6_PACKET_OPTION *) OptBuf;\r
- Oro->OpCode = HTONS (DHCP6_OPT_ORO);\r
- Oro->OpLen = HTONS (2);\r
- *((UINT16 *) &Oro->Data[0]) = HTONS (DHCP6_OPT_DNS_SERVERS);\r
- OptList[0] = Oro;\r
+ Oro = (EFI_DHCP6_PACKET_OPTION *)OptBuf;\r
+ Oro->OpCode = HTONS (DHCP6_OPT_ORO);\r
+ Oro->OpLen = HTONS (2);\r
+ *((UINT16 *)&Oro->Data[0]) = HTONS (DHCP6_OPT_DNS_SERVERS);\r
+ OptList[0] = Oro;\r
\r
- Status = EFI_SUCCESS;\r
+ Status = EFI_SUCCESS;\r
\r
if (!OtherInfoOnly) {\r
//\r
Status = Dhcp6->Configure (Dhcp6, &Dhcp6CfgData);\r
\r
if (!EFI_ERROR (Status)) {\r
-\r
if (IpSb->LinkLocalOk) {\r
Status = Dhcp6->Start (Dhcp6);\r
} else {\r
IpSb->Dhcp6NeedStart = TRUE;\r
}\r
-\r
}\r
} else {\r
//\r
} else {\r
IpSb->Dhcp6NeedInfoRequest = TRUE;\r
}\r
-\r
}\r
\r
return Status;\r
EFI_STATUS\r
EFIAPI\r
Ip6ConfigSignalEvent (\r
- IN NET_MAP *Map,\r
- IN NET_MAP_ITEM *Item,\r
- IN VOID *Arg\r
+ IN NET_MAP *Map,\r
+ IN NET_MAP_ITEM *Item,\r
+ IN VOID *Arg\r
)\r
{\r
- gBS->SignalEvent ((EFI_EVENT) Item->Key);\r
+ gBS->SignalEvent ((EFI_EVENT)Item->Key);\r
\r
return EFI_SUCCESS;\r
}\r
/**\r
Read the configuration data from variable storage according to the VarName and\r
gEfiIp6ConfigProtocolGuid. It checks the integrity of variable data. If the\r
- data is corrupted, it clears the variable data to ZERO. Othewise, it outputs the\r
+ data is corrupted, it clears the variable data to ZERO. Otherwise, it outputs the\r
configuration data to IP6_CONFIG_INSTANCE.\r
\r
@param[in] VarName The pointer to the variable name\r
&VarSize,\r
Variable\r
);\r
- if (EFI_ERROR (Status) || (UINT16) (~NetblockChecksum ((UINT8 *) Variable, (UINT32) VarSize)) != 0) {\r
+ if (EFI_ERROR (Status) || ((UINT16)(~NetblockChecksum ((UINT8 *)Variable, (UINT32)VarSize)) != 0)) {\r
//\r
- // GetVariable still error or the variable is corrupted.\r
- // Fall back to the default value.\r
+ // GetVariable error or the variable is corrupted.\r
//\r
- FreePool (Variable);\r
-\r
- //\r
- // Remove the problematic variable and return EFI_NOT_FOUND, a new\r
- // variable will be set again.\r
- //\r
- gRT->SetVariable (\r
- VarName,\r
- &gEfiIp6ConfigProtocolGuid,\r
- IP6_CONFIG_VARIABLE_ATTRIBUTE,\r
- 0,\r
- NULL\r
- );\r
-\r
- return EFI_NOT_FOUND;\r
+ goto Error;\r
}\r
\r
//\r
Instance->IaId = Variable->IaId;\r
\r
for (Index = 0; Index < Variable->DataRecordCount; Index++) {\r
-\r
CopyMem (&DataRecord, &Variable->DataRecord[Index], sizeof (DataRecord));\r
\r
DataItem = &Instance->DataItem[DataRecord.DataType];\r
if (DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED) &&\r
(DataItem->DataSize != DataRecord.DataSize)\r
- ) {\r
+ )\r
+ {\r
//\r
// Perhaps a corrupted data record...\r
//\r
if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED)) {\r
//\r
// This data item has variable length data.\r
+ // Check that the length is contained within the variable before allocating.\r
//\r
+ if (DataRecord.DataSize > VarSize - DataRecord.Offset) {\r
+ goto Error;\r
+ }\r
+\r
DataItem->Data.Ptr = AllocatePool (DataRecord.DataSize);\r
if (DataItem->Data.Ptr == NULL) {\r
//\r
}\r
}\r
\r
- Data = (CHAR8 *) Variable + DataRecord.Offset;\r
+ Data = (CHAR8 *)Variable + DataRecord.Offset;\r
CopyMem (DataItem->Data.Ptr, Data, DataRecord.DataSize);\r
\r
DataItem->DataSize = DataRecord.DataSize;\r
}\r
\r
return Status;\r
+\r
+Error:\r
+ //\r
+ // Fall back to the default value.\r
+ //\r
+ if (Variable != NULL) {\r
+ FreePool (Variable);\r
+ }\r
+\r
+ //\r
+ // Remove the problematic variable and return EFI_NOT_FOUND, a new\r
+ // variable will be set again.\r
+ //\r
+ gRT->SetVariable (\r
+ VarName,\r
+ &gEfiIp6ConfigProtocolGuid,\r
+ IP6_CONFIG_VARIABLE_ATTRIBUTE,\r
+ 0,\r
+ NULL\r
+ );\r
+\r
+ return EFI_NOT_FOUND;\r
}\r
\r
/**\r
VarSize = sizeof (IP6_CONFIG_VARIABLE) - sizeof (IP6_CONFIG_DATA_RECORD);\r
\r
for (Index = 0; Index < Ip6ConfigDataTypeMaximum; Index++) {\r
-\r
DataItem = &Instance->DataItem[Index];\r
if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_VOLATILE) && !EFI_ERROR (DataItem->Status)) {\r
-\r
VarSize += sizeof (IP6_CONFIG_DATA_RECORD) + DataItem->DataSize;\r
}\r
}\r
}\r
\r
Variable->IaId = Instance->IaId;\r
- Heap = (CHAR8 *) Variable + VarSize;\r
+ Heap = (CHAR8 *)Variable + VarSize;\r
Variable->DataRecordCount = 0;\r
\r
for (Index = 0; Index < Ip6ConfigDataTypeMaximum; Index++) {\r
-\r
DataItem = &Instance->DataItem[Index];\r
if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_VOLATILE) && !EFI_ERROR (DataItem->Status)) {\r
-\r
Heap -= DataItem->DataSize;\r
CopyMem (Heap, DataItem->Data.Ptr, DataItem->DataSize);\r
\r
DataRecord = &Variable->DataRecord[Variable->DataRecordCount];\r
- DataRecord->DataType = (EFI_IP6_CONFIG_DATA_TYPE) Index;\r
- DataRecord->DataSize = (UINT32) DataItem->DataSize;\r
- DataRecord->Offset = (UINT16) (Heap - (CHAR8 *) Variable);\r
+ DataRecord->DataType = (EFI_IP6_CONFIG_DATA_TYPE)Index;\r
+ DataRecord->DataSize = (UINT32)DataItem->DataSize;\r
+ DataRecord->Offset = (UINT16)(Heap - (CHAR8 *)Variable);\r
\r
Variable->DataRecordCount++;\r
}\r
}\r
\r
Variable->Checksum = 0;\r
- Variable->Checksum = (UINT16) ~NetblockChecksum ((UINT8 *) Variable, (UINT32) VarSize);\r
+ Variable->Checksum = (UINT16) ~NetblockChecksum ((UINT8 *)Variable, (UINT32)VarSize);\r
\r
Status = gRT->SetVariable (\r
VarName,\r
//\r
// Copy the fixed size part of the interface info.\r
//\r
- Item = &Instance->DataItem[Ip6ConfigDataTypeInterfaceInfo];\r
- IfInfo = (EFI_IP6_CONFIG_INTERFACE_INFO *) Data;\r
+ Item = &Instance->DataItem[Ip6ConfigDataTypeInterfaceInfo];\r
+ IfInfo = (EFI_IP6_CONFIG_INTERFACE_INFO *)Data;\r
CopyMem (IfInfo, Item->Data.Ptr, sizeof (EFI_IP6_CONFIG_INTERFACE_INFO));\r
\r
//\r
// AddressInfo\r
//\r
- IfInfo->AddressInfo = (EFI_IP6_ADDRESS_INFO *) (IfInfo + 1);\r
+ IfInfo->AddressInfo = (EFI_IP6_ADDRESS_INFO *)(IfInfo + 1);\r
Ip6BuildEfiAddressList (IpSb, &IfInfo->AddressInfoCount, &IfInfo->AddressInfo);\r
\r
//\r
// RouteTable\r
//\r
- IfInfo->RouteTable = (EFI_IP6_ROUTE_TABLE *) (IfInfo->AddressInfo + IfInfo->AddressInfoCount);\r
+ IfInfo->RouteTable = (EFI_IP6_ROUTE_TABLE *)(IfInfo->AddressInfo + IfInfo->AddressInfoCount);\r
Ip6BuildEfiRouteTable (IpSb->RouteTable, &IfInfo->RouteCount, &IfInfo->RouteTable);\r
\r
if (IfInfo->AddressInfoCount == 0) {\r
}\r
\r
/**\r
- The work function for EfiIp6ConfigSetData() to set the alternative inteface ID\r
+ The work function for EfiIp6ConfigSetData() to set the alternative interface ID\r
for the communication device managed by this IP6Config instance, if the link local\r
IPv6 addresses generated from the interface ID based on the default source the\r
EFI IPv6 Protocol uses is a duplicate address.\r
\r
DataItem = &Instance->DataItem[Ip6ConfigDataTypeAltInterfaceId];\r
OldIfId = DataItem->Data.AltIfId;\r
- NewIfId = (EFI_IP6_CONFIG_INTERFACE_ID *) Data;\r
+ NewIfId = (EFI_IP6_CONFIG_INTERFACE_ID *)Data;\r
\r
CopyMem (OldIfId, NewIfId, DataSize);\r
DataItem->Status = EFI_SUCCESS;\r
return EFI_BAD_BUFFER_SIZE;\r
}\r
\r
- NewPolicy = *((EFI_IP6_CONFIG_POLICY *) Data);\r
+ NewPolicy = *((EFI_IP6_CONFIG_POLICY *)Data);\r
\r
if (NewPolicy > Ip6ConfigPolicyAutomatic) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if (NewPolicy == Instance->Policy) {\r
-\r
return EFI_ABORTED;\r
} else {\r
//\r
// Clean the ManualAddress, Gateway and DnsServers, shrink the variable\r
// data size, and fire up all the related events.\r
//\r
- DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];\r
+ DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];\r
if (DataItem->Data.Ptr != NULL) {\r
FreePool (DataItem->Data.Ptr);\r
}\r
+\r
DataItem->Data.Ptr = NULL;\r
DataItem->DataSize = 0;\r
DataItem->Status = EFI_NOT_FOUND;\r
NetMapIterate (&DataItem->EventMap, Ip6ConfigSignalEvent, NULL);\r
\r
- DataItem = &Instance->DataItem[Ip6ConfigDataTypeGateway];\r
+ DataItem = &Instance->DataItem[Ip6ConfigDataTypeGateway];\r
if (DataItem->Data.Ptr != NULL) {\r
FreePool (DataItem->Data.Ptr);\r
}\r
+\r
DataItem->Data.Ptr = NULL;\r
DataItem->DataSize = 0;\r
DataItem->Status = EFI_NOT_FOUND;\r
\r
OldDadXmits = Instance->DataItem[Ip6ConfigDataTypeDupAddrDetectTransmits].Data.DadXmits;\r
\r
- if ((*(UINT32 *) Data) == OldDadXmits->DupAddrDetectTransmits) {\r
-\r
+ if ((*(UINT32 *)Data) == OldDadXmits->DupAddrDetectTransmits) {\r
return EFI_ABORTED;\r
} else {\r
-\r
- OldDadXmits->DupAddrDetectTransmits = *((UINT32 *) Data);\r
+ OldDadXmits->DupAddrDetectTransmits = *((UINT32 *)Data);\r
return EFI_SUCCESS;\r
}\r
}\r
UINTN DadFailCount;\r
IP6_SERVICE *IpSb;\r
\r
- Instance = (IP6_CONFIG_INSTANCE *) Context;\r
+ Instance = (IP6_CONFIG_INSTANCE *)Context;\r
NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);\r
Item = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];\r
ManualAddr = NULL;\r
// Part of addresses are detected to be duplicates, so update the\r
// data with those passed.\r
//\r
- PassedAddr = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) AllocatePool (Item->DataSize);\r
+ PassedAddr = (EFI_IP6_CONFIG_MANUAL_ADDRESS *)AllocatePool (Item->DataSize);\r
ASSERT (PassedAddr != NULL);\r
\r
Item->Data.Ptr = PassedAddr;\r
Item->Status = EFI_SUCCESS;\r
\r
while (!NetMapIsEmpty (&Instance->DadPassedMap)) {\r
- ManualAddr = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) NetMapRemoveHead (&Instance->DadPassedMap, NULL);\r
+ ManualAddr = (EFI_IP6_CONFIG_MANUAL_ADDRESS *)NetMapRemoveHead (&Instance->DadPassedMap, NULL);\r
CopyMem (PassedAddr, ManualAddr, sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS));\r
\r
PassedAddr++;\r
}\r
\r
- ASSERT ((UINTN) PassedAddr - (UINTN) Item->Data.Ptr == Item->DataSize);\r
+ ASSERT ((UINTN)PassedAddr - (UINTN)Item->Data.Ptr == Item->DataSize);\r
}\r
} else {\r
//\r
under the current policy.\r
@retval EFI_INVALID_PARAMETER One or more fields in Data is invalid.\r
@retval EFI_OUT_OF_RESOURCES Fail to allocate resource to complete the operation.\r
- @retval EFI_NOT_READY An asynchrous process is invoked to set the specified\r
+ @retval EFI_NOT_READY An asynchronous process is invoked to set the specified\r
configuration data, and the process is not finished.\r
@retval EFI_ABORTED The manual addresses to be set equal current\r
configuration.\r
\r
DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];\r
\r
- if (Data != NULL && DataSize != 0) {\r
+ if ((Data != NULL) && (DataSize != 0)) {\r
NewAddressCount = DataSize / sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS);\r
- NewAddress = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) Data;\r
+ NewAddress = (EFI_IP6_CONFIG_MANUAL_ADDRESS *)Data;\r
\r
for (Index1 = 0; Index1 < NewAddressCount; Index1++, NewAddress++) {\r
-\r
if (NetIp6IsLinkLocalAddr (&NewAddress->Address) ||\r
!NetIp6IsValidUnicast (&NewAddress->Address) ||\r
(NewAddress->PrefixLength > 128)\r
- ) {\r
+ )\r
+ {\r
//\r
// make sure the IPv6 address is unicast and not link-local address &&\r
// the prefix length is valid.\r
// Any two addresses in the array can't be equal.\r
//\r
if (EFI_IP6_EQUAL (&TmpAddress->Address, &NewAddress->Address)) {\r
-\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
NET_LIST_FOR_EACH (Entry2, &IpIf->AddressList) {\r
CurrentAddrInfo = NET_LIST_USER_STRUCT_S (Entry2, IP6_ADDRESS_INFO, Link, IP6_ADDR_INFO_SIGNATURE);\r
\r
- Copy = AllocateCopyPool (sizeof (IP6_ADDRESS_INFO), CurrentAddrInfo);\r
+ Copy = AllocateCopyPool (sizeof (IP6_ADDRESS_INFO), CurrentAddrInfo);\r
if (Copy == NULL) {\r
break;\r
}\r
if (DataItem->Data.Ptr != NULL) {\r
FreePool (DataItem->Data.Ptr);\r
}\r
+\r
DataItem->Data.Ptr = NewAddress;\r
DataItem->DataSize = DataSize;\r
DataItem->Status = EFI_NOT_READY;\r
//\r
// Trigger DAD, it's an asynchronous process.\r
//\r
- IsUpdated = FALSE;\r
+ IsUpdated = FALSE;\r
\r
for (Index1 = 0; Index1 < NewAddressCount; Index1++, NewAddress++) {\r
if (Ip6IsOneOfSetAddress (IpSb, &NewAddress->Address, NULL, &CurrentAddrInfo)) {\r
// Save the prefix length.\r
//\r
CurrentAddrInfo->PrefixLength = NewAddress->PrefixLength;\r
- IsUpdated = TRUE;\r
+ IsUpdated = TRUE;\r
}\r
\r
//\r
Ip6CreatePrefixListEntry (\r
IpSb,\r
TRUE,\r
- (UINT32) IP6_INFINIT_LIFETIME,\r
- (UINT32) IP6_INFINIT_LIFETIME,\r
+ (UINT32)IP6_INFINIT_LIFETIME,\r
+ (UINT32)IP6_INFINIT_LIFETIME,\r
NewAddress->PrefixLength,\r
&NewAddress->Address\r
);\r
&NewAddress->Address,\r
NewAddress->IsAnycast,\r
NewAddress->PrefixLength,\r
- (UINT32) IP6_INFINIT_LIFETIME,\r
- (UINT32) IP6_INFINIT_LIFETIME,\r
+ (UINT32)IP6_INFINIT_LIFETIME,\r
+ (UINT32)IP6_INFINIT_LIFETIME,\r
Ip6ManualAddrDadCallback,\r
Instance\r
);\r
if (DataItem->Data.Ptr != NULL) {\r
FreePool (DataItem->Data.Ptr);\r
}\r
+\r
DataItem->Data.Ptr = NULL;\r
DataItem->DataSize = 0;\r
DataItem->Status = EFI_NOT_FOUND;\r
Ip6CreatePrefixListEntry (\r
IpSb,\r
TRUE,\r
- (UINT32) IP6_INFINIT_LIFETIME,\r
- (UINT32) IP6_INFINIT_LIFETIME,\r
+ (UINT32)IP6_INFINIT_LIFETIME,\r
+ (UINT32)IP6_INFINIT_LIFETIME,\r
IP6_LINK_LOCAL_PREFIX_LENGTH,\r
&IpSb->LinkLocalAddr\r
);\r
IP6_DEFAULT_ROUTER *DefaultRouter;\r
VOID *Tmp;\r
\r
- OldGateway = NULL;\r
- NewGateway = NULL;\r
- Item = NULL;\r
- DefaultRouter = NULL;\r
- Tmp = NULL;\r
- OneRemoved = FALSE;\r
- OneAdded = FALSE;\r
+ OldGateway = NULL;\r
+ NewGateway = NULL;\r
+ Item = NULL;\r
+ DefaultRouter = NULL;\r
+ Tmp = NULL;\r
+ OneRemoved = FALSE;\r
+ OneAdded = FALSE;\r
\r
if ((DataSize != 0) && (DataSize % sizeof (EFI_IPv6_ADDRESS) != 0)) {\r
return EFI_BAD_BUFFER_SIZE;\r
}\r
}\r
\r
- if (Data != NULL && DataSize != 0) {\r
- NewGateway = (EFI_IPv6_ADDRESS *) Data;\r
+ if ((Data != NULL) && (DataSize != 0)) {\r
+ NewGateway = (EFI_IPv6_ADDRESS *)Data;\r
NewGatewayCount = DataSize / sizeof (EFI_IPv6_ADDRESS);\r
for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {\r
-\r
if (!NetIp6IsValidUnicast (NewGateway + Index1)) {\r
-\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
}\r
\r
for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {\r
-\r
DefaultRouter = Ip6FindDefaultRouter (IpSb, NewGateway + Index1);\r
if (DefaultRouter == NULL) {\r
Ip6CreateDefaultRouter (IpSb, NewGateway + Index1, IP6_INF_ROUTER_LIFETIME);\r
Item->Status = EFI_SUCCESS;\r
return EFI_ABORTED;\r
} else {\r
-\r
if (Tmp != NULL) {\r
if (Item->Data.Ptr != NULL) {\r
FreePool (Item->Data.Ptr);\r
}\r
+\r
Item->Data.Ptr = Tmp;\r
}\r
\r
if (Item->Data.Ptr != NULL) {\r
FreePool (Item->Data.Ptr);\r
}\r
+\r
Item->Data.Ptr = NULL;\r
Item->DataSize = 0;\r
Item->Status = EFI_NOT_FOUND;\r
\r
Item = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];\r
\r
- if (Data != NULL && DataSize != 0) {\r
- NewDns = (EFI_IPv6_ADDRESS *) Data;\r
+ if ((Data != NULL) && (DataSize != 0)) {\r
+ NewDns = (EFI_IPv6_ADDRESS *)Data;\r
OldDns = Item->Data.DnsServers;\r
NewDnsCount = DataSize / sizeof (EFI_IPv6_ADDRESS);\r
OldDnsCount = Item->DataSize / sizeof (EFI_IPv6_ADDRESS);\r
}\r
\r
for (NewIndex = 0; NewIndex < NewDnsCount; NewIndex++) {\r
-\r
if (!NetIp6IsValidUnicast (NewDns + NewIndex)) {\r
//\r
// The dns server address must be unicast.\r
if (Tmp != NULL) {\r
FreePool (Tmp);\r
}\r
+\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if (Item->Data.Ptr != NULL) {\r
FreePool (Item->Data.Ptr);\r
}\r
+\r
Item->Data.Ptr = Tmp;\r
}\r
\r
Item->DataSize = DataSize;\r
Item->Status = EFI_SUCCESS;\r
}\r
- } else {\r
+ } else {\r
//\r
// DataSize is 0 and Data is NULL, clean up the DnsServer address.\r
//\r
if (Item->Data.Ptr != NULL) {\r
FreePool (Item->Data.Ptr);\r
}\r
+\r
Item->Data.Ptr = NULL;\r
Item->DataSize = 0;\r
Item->Status = EFI_NOT_FOUND;\r
sizeof (IfInfo->Name),\r
L"eth%d",\r
IpSb->Ip6ConfigInstance.IfIndex\r
- );\r
+ );\r
\r
IfInfo->IfType = IpSb->SnpMode.IfType;\r
IfInfo->HwAddressSize = IpSb->SnpMode.HwAddressSize;\r
**/\r
EFI_STATUS\r
Ip6ConfigParseDhcpReply (\r
- IN EFI_DHCP6_PROTOCOL *Dhcp6,\r
- IN OUT IP6_CONFIG_INSTANCE *Instance,\r
- IN EFI_DHCP6_PACKET *Reply\r
+ IN EFI_DHCP6_PROTOCOL *Dhcp6,\r
+ IN OUT IP6_CONFIG_INSTANCE *Instance,\r
+ IN EFI_DHCP6_PACKET *Reply\r
)\r
{\r
EFI_STATUS Status;\r
//\r
// Validate the DnsServers: whether they are unicast addresses.\r
//\r
- DnsServer = (EFI_IPv6_ADDRESS *) OptList[Index]->Data;\r
+ DnsServer = (EFI_IPv6_ADDRESS *)OptList[Index]->Data;\r
for (Index2 = 0; Index2 < Length / sizeof (EFI_IPv6_ADDRESS); Index2++) {\r
if (!NetIp6IsValidUnicast (DnsServer)) {\r
Status = EFI_NOT_READY;\r
{\r
IP6_CONFIG_INSTANCE *Instance;\r
\r
- Instance = (IP6_CONFIG_INSTANCE *) Context;\r
+ Instance = (IP6_CONFIG_INSTANCE *)Context;\r
NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);\r
\r
//\r
if (Instance->DeclineAddress != NULL) {\r
FreePool (Instance->DeclineAddress);\r
}\r
+\r
Instance->DeclineAddress = NULL;\r
Instance->DeclineAddressCount = 0;\r
}\r
IN VOID *Context\r
)\r
{\r
- IP6_CONFIG_INSTANCE *Instance;\r
- EFI_DHCP6_PROTOCOL *Dhcp6;\r
- EFI_STATUS Status;\r
- EFI_DHCP6_MODE_DATA Dhcp6ModeData;\r
- EFI_DHCP6_IA *Ia;\r
- EFI_DHCP6_IA_ADDRESS *IaAddr;\r
- UINT32 Index;\r
- IP6_SERVICE *IpSb;\r
- IP6_ADDRESS_INFO *AddrInfo;\r
- IP6_INTERFACE *IpIf;\r
+ IP6_CONFIG_INSTANCE *Instance;\r
+ EFI_DHCP6_PROTOCOL *Dhcp6;\r
+ EFI_STATUS Status;\r
+ EFI_DHCP6_MODE_DATA Dhcp6ModeData;\r
+ EFI_DHCP6_IA *Ia;\r
+ EFI_DHCP6_IA_ADDRESS *IaAddr;\r
+ UINT32 Index;\r
+ IP6_SERVICE *IpSb;\r
+ IP6_ADDRESS_INFO *AddrInfo;\r
+ IP6_INTERFACE *IpIf;\r
\r
- Instance = (IP6_CONFIG_INSTANCE *) Context;\r
+ Instance = (IP6_CONFIG_INSTANCE *)Context;\r
\r
if ((Instance->Policy != Ip6ConfigPolicyAutomatic) || Instance->OtherInfoOnly) {\r
//\r
// IPv6 is not operating in the automatic policy now or\r
// the DHCPv6 information request message exchange is aborted.\r
//\r
- return ;\r
+ return;\r
}\r
\r
//\r
\r
Status = Dhcp6->GetModeData (Dhcp6, &Dhcp6ModeData, NULL);\r
if (EFI_ERROR (Status)) {\r
- return ;\r
+ return;\r
}\r
\r
IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);\r
FreePool (Instance->DeclineAddress);\r
}\r
\r
- Instance->DeclineAddress = (EFI_IPv6_ADDRESS *) AllocatePool (Ia->IaAddressCount * sizeof (EFI_IPv6_ADDRESS));\r
+ Instance->DeclineAddress = (EFI_IPv6_ADDRESS *)AllocatePool (Ia->IaAddressCount * sizeof (EFI_IPv6_ADDRESS));\r
if (Instance->DeclineAddress == NULL) {\r
goto ON_EXIT;\r
}\r
\r
Instance->FailedIaAddressCount = Ia->IaAddressCount;\r
- Instance->DeclineAddressCount = 0;\r
+ Instance->DeclineAddressCount = 0;\r
\r
for (Index = 0; Index < Ia->IaAddressCount; Index++, IaAddr++) {\r
- if (Ia->IaAddress[Index].ValidLifetime != 0 && Ia->State == Dhcp6Bound) {\r
+ if ((Ia->IaAddress[Index].ValidLifetime != 0) && (Ia->State == Dhcp6Bound)) {\r
//\r
// Set this address, either it's a new address or with updated lifetimes.\r
// An appropriate prefix length will be set.\r
IN EFI_DHCP6_PACKET *Packet\r
)\r
{\r
- return Ip6ConfigParseDhcpReply (This, (IP6_CONFIG_INSTANCE *) Context, Packet);\r
+ return Ip6ConfigParseDhcpReply (This, (IP6_CONFIG_INSTANCE *)Context, Packet);\r
}\r
\r
/**\r
{\r
IP6_CONFIG_INSTANCE *Instance;\r
\r
- Instance = (IP6_CONFIG_INSTANCE *) Context;\r
+ Instance = (IP6_CONFIG_INSTANCE *)Context;\r
\r
if ((Instance->Dhcp6Handle != NULL) || (Instance->Policy != Ip6ConfigPolicyAutomatic)) {\r
//\r
// The DHCP6 child is already created or the policy is no longer AUTOMATIC.\r
//\r
- return ;\r
+ return;\r
}\r
\r
Ip6ConfigStartStatefulAutoConfig (Instance, Instance->OtherInfoOnly);\r
EFI_STATUS\r
EFIAPI\r
EfiIp6ConfigSetData (\r
- IN EFI_IP6_CONFIG_PROTOCOL *This,\r
- IN EFI_IP6_CONFIG_DATA_TYPE DataType,\r
- IN UINTN DataSize,\r
- IN VOID *Data\r
+ IN EFI_IP6_CONFIG_PROTOCOL *This,\r
+ IN EFI_IP6_CONFIG_DATA_TYPE DataType,\r
+ IN UINTN DataSize,\r
+ IN VOID *Data\r
)\r
{\r
EFI_TPL OldTpl;\r
IP6_CONFIG_INSTANCE *Instance;\r
IP6_SERVICE *IpSb;\r
\r
- if ((This == NULL) || (Data == NULL && DataSize != 0) || (Data != NULL && DataSize == 0)) {\r
+ if ((This == NULL) || ((Data == NULL) && (DataSize != 0)) || ((Data != NULL) && (DataSize == 0))) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
\r
Status = Instance->DataItem[DataType].Status;\r
if (Status != EFI_NOT_READY) {\r
-\r
if (Instance->DataItem[DataType].SetData == NULL) {\r
//\r
// This type of data is readonly.\r
//\r
Status = EFI_WRITE_PROTECTED;\r
} else {\r
-\r
Status = Instance->DataItem[DataType].SetData (Instance, DataSize, Data);\r
if (!EFI_ERROR (Status)) {\r
//\r
}\r
} else {\r
//\r
- // Another asynchornous process is on the way.\r
+ // Another asynchronous process is on the way.\r
//\r
Status = EFI_ACCESS_DENIED;\r
}\r
EFI_STATUS\r
EFIAPI\r
EfiIp6ConfigGetData (\r
- IN EFI_IP6_CONFIG_PROTOCOL *This,\r
- IN EFI_IP6_CONFIG_DATA_TYPE DataType,\r
- IN OUT UINTN *DataSize,\r
- IN VOID *Data OPTIONAL\r
+ IN EFI_IP6_CONFIG_PROTOCOL *This,\r
+ IN EFI_IP6_CONFIG_DATA_TYPE DataType,\r
+ IN OUT UINTN *DataSize,\r
+ IN VOID *Data OPTIONAL\r
)\r
{\r
EFI_TPL OldTpl;\r
Instance = IP6_CONFIG_INSTANCE_FROM_PROTOCOL (This);\r
DataItem = &Instance->DataItem[DataType];\r
\r
- Status = Instance->DataItem[DataType].Status;\r
+ Status = Instance->DataItem[DataType].Status;\r
if (!EFI_ERROR (Status)) {\r
-\r
if (DataItem->GetData != NULL) {\r
-\r
Status = DataItem->GetData (Instance, DataSize, Data);\r
} else if (*DataSize < Instance->DataItem[DataType].DataSize) {\r
//\r
*DataSize = Instance->DataItem[DataType].DataSize;\r
Status = EFI_BUFFER_TOO_SMALL;\r
} else {\r
-\r
*DataSize = Instance->DataItem[DataType].DataSize;\r
CopyMem (Data, Instance->DataItem[DataType].Data.Ptr, *DataSize);\r
}\r
EFI_STATUS\r
EFIAPI\r
EfiIp6ConfigRegisterDataNotify (\r
- IN EFI_IP6_CONFIG_PROTOCOL *This,\r
- IN EFI_IP6_CONFIG_DATA_TYPE DataType,\r
- IN EFI_EVENT Event\r
+ IN EFI_IP6_CONFIG_PROTOCOL *This,\r
+ IN EFI_IP6_CONFIG_DATA_TYPE DataType,\r
+ IN EFI_EVENT Event\r
)\r
{\r
EFI_TPL OldTpl;\r
return EFI_UNSUPPORTED;\r
}\r
\r
- OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
- Instance = IP6_CONFIG_INSTANCE_FROM_PROTOCOL (This);\r
- EventMap = &Instance->DataItem[DataType].EventMap;\r
+ Instance = IP6_CONFIG_INSTANCE_FROM_PROTOCOL (This);\r
+ EventMap = &Instance->DataItem[DataType].EventMap;\r
\r
//\r
// Check whether this event is already registered for this DataType.\r
//\r
Item = NetMapFindKey (EventMap, Event);\r
if (Item == NULL) {\r
-\r
Status = NetMapInsertTail (EventMap, Event, NULL);\r
\r
if (EFI_ERROR (Status)) {\r
-\r
Status = EFI_OUT_OF_RESOURCES;\r
}\r
-\r
} else {\r
-\r
Status = EFI_ACCESS_DENIED;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
EfiIp6ConfigUnregisterDataNotify (\r
- IN EFI_IP6_CONFIG_PROTOCOL *This,\r
- IN EFI_IP6_CONFIG_DATA_TYPE DataType,\r
- IN EFI_EVENT Event\r
+ IN EFI_IP6_CONFIG_PROTOCOL *This,\r
+ IN EFI_IP6_CONFIG_DATA_TYPE DataType,\r
+ IN EFI_EVENT Event\r
)\r
{\r
EFI_TPL OldTpl;\r
\r
Item = NetMapFindKey (&Instance->DataItem[DataType].EventMap, Event);\r
if (Item != NULL) {\r
-\r
NetMapRemoveItem (&Instance->DataItem[DataType].EventMap, Item, NULL);\r
Status = EFI_SUCCESS;\r
} else {\r
-\r
Status = EFI_NOT_FOUND;\r
}\r
\r
Instance->Policy = Ip6ConfigPolicyManual;\r
SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED);\r
\r
- DataItem = &Instance->DataItem[Ip6ConfigDataTypeDupAddrDetectTransmits];\r
- DataItem->SetData = Ip6ConfigSetDadXmits;\r
- DataItem->Data.Ptr = &Instance->DadXmits;\r
- DataItem->DataSize = sizeof (Instance->DadXmits);\r
+ DataItem = &Instance->DataItem[Ip6ConfigDataTypeDupAddrDetectTransmits];\r
+ DataItem->SetData = Ip6ConfigSetDadXmits;\r
+ DataItem->Data.Ptr = &Instance->DadXmits;\r
+ DataItem->DataSize = sizeof (Instance->DadXmits);\r
Instance->DadXmits.DupAddrDetectTransmits = IP6_CONFIG_DEFAULT_DAD_XMITS;\r
SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED);\r
\r
- DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];\r
- DataItem->SetData = Ip6ConfigSetManualAddress;\r
- DataItem->Status = EFI_NOT_FOUND;\r
+ DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];\r
+ DataItem->SetData = Ip6ConfigSetManualAddress;\r
+ DataItem->Status = EFI_NOT_FOUND;\r
\r
- DataItem = &Instance->DataItem[Ip6ConfigDataTypeGateway];\r
- DataItem->SetData = Ip6ConfigSetGateway;\r
- DataItem->Status = EFI_NOT_FOUND;\r
+ DataItem = &Instance->DataItem[Ip6ConfigDataTypeGateway];\r
+ DataItem->SetData = Ip6ConfigSetGateway;\r
+ DataItem->Status = EFI_NOT_FOUND;\r
\r
- DataItem = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];\r
- DataItem->SetData = Ip6ConfigSetDnsServer;\r
- DataItem->Status = EFI_NOT_FOUND;\r
+ DataItem = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];\r
+ DataItem->SetData = Ip6ConfigSetDnsServer;\r
+ DataItem->Status = EFI_NOT_FOUND;\r
\r
//\r
// Create the event used for DHCP.\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- Instance->Configured = TRUE;\r
+ Instance->Configured = TRUE;\r
\r
//\r
// Try to read the config data from NV variable.\r
Instance->Ip6Config.RegisterDataNotify = EfiIp6ConfigRegisterDataNotify;\r
Instance->Ip6Config.UnregisterDataNotify = EfiIp6ConfigUnregisterDataNotify;\r
\r
-\r
//\r
// Publish the IP6 configuration form\r
//\r
}\r
\r
if (!Instance->Configured) {\r
- return ;\r
+ return;\r
}\r
\r
if (Instance->Dhcp6Handle != NULL) {\r
-\r
Ip6ConfigDestroyDhcp6 (Instance);\r
}\r
\r
NetMapClean (&Instance->DadFailedMap);\r
\r
for (Index = 0; Index < Ip6ConfigDataTypeMaximum; Index++) {\r
-\r
DataItem = &Instance->DataItem[Index];\r
\r
if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED)) {\r
if (DataItem->Data.Ptr != NULL) {\r
FreePool (DataItem->Data.Ptr);\r
}\r
+\r
DataItem->Data.Ptr = NULL;\r
DataItem->DataSize = 0;\r
}\r
IN OUT IP6_CONFIG_INSTANCE *Instance\r
)\r
{\r
- IP6_SERVICE *IpSb;\r
- EFI_STATUS Status;\r
- EFI_DHCP6_PROTOCOL *Dhcp6;\r
+ IP6_SERVICE *IpSb;\r
+ EFI_STATUS Status;\r
+ EFI_DHCP6_PROTOCOL *Dhcp6;\r
\r
Dhcp6 = Instance->Dhcp6;\r
ASSERT (Dhcp6 != NULL);\r
\r
return Status;\r
}\r
-\r