/** @file\r
Dhcp6 support functions implementation.\r
\r
- Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>\r
+ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<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
#include "Dhcp6Impl.h"\r
\r
-\r
/**\r
Generate client Duid in the format of Duid-llt.\r
\r
**/\r
EFI_DHCP6_DUID *\r
Dhcp6GenerateClientId (\r
- IN EFI_SIMPLE_NETWORK_MODE *Mode\r
+ IN EFI_SIMPLE_NETWORK_MODE *Mode\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_DHCP6_DUID *Duid;\r
- EFI_TIME Time;\r
- UINT32 Stamp;\r
- EFI_GUID Uuid;\r
-\r
+ EFI_STATUS Status;\r
+ EFI_DHCP6_DUID *Duid;\r
+ EFI_TIME Time;\r
+ UINT32 Stamp;\r
+ EFI_GUID Uuid;\r
\r
//\r
// Attempt to get client Id from variable to keep it constant.\r
// See details in section-9 of rfc-3315.\r
//\r
- GetVariable2 (L"ClientId", &gEfiDhcp6ServiceBindingProtocolGuid, (VOID**)&Duid, NULL);\r
+ GetVariable2 (L"ClientId", &gEfiDhcp6ServiceBindingProtocolGuid, (VOID **)&Duid, NULL);\r
if (Duid != NULL) {\r
return Duid;\r
}\r
//\r
// If System UUID is found from SMBIOS Table, use DUID-UUID type.\r
//\r
- if (!EFI_ERROR (NetLibGetSystemGuid (&Uuid))) {\r
+ if ((PcdGet8 (PcdDhcp6UidType) == Dhcp6DuidTypeUuid) && !EFI_ERROR (NetLibGetSystemGuid (&Uuid)) && !CompareGuid (&Uuid, &gZeroGuid)) {\r
//\r
//\r
// The format of DUID-UUID:\r
- // \r
+ //\r
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
// | DUID-Type (4) | UUID (128 bits) |\r
//\r
// sizeof (Duid-type + UUID-size) = 18 bytes\r
//\r
- Duid->Length = (UINT16) (18);\r
- \r
+ Duid->Length = (UINT16)(18);\r
+\r
//\r
// Set the Duid-type and copy UUID.\r
//\r
- WriteUnaligned16 ((UINT16 *) (Duid->Duid), HTONS (Dhcp6DuidTypeUuid));\r
- \r
- CopyMem (Duid->Duid + 2, &Uuid, sizeof(EFI_GUID));\r
+ WriteUnaligned16 ((UINT16 *)(Duid->Duid), HTONS (Dhcp6DuidTypeUuid));\r
\r
+ CopyMem (Duid->Duid + 2, &Uuid, sizeof (EFI_GUID));\r
} else {\r
- \r
//\r
//\r
// The format of DUID-LLT:\r
//\r
gRT->GetTime (&Time, NULL);\r
Stamp = (UINT32)\r
- (\r
- (((((Time.Year - 2000) * 360 + (Time.Month - 1)) * 30 + (Time.Day - 1)) * 24 + Time.Hour) * 60 + Time.Minute) *\r
- 60 +\r
- Time.Second\r
- );\r
+ (\r
+ ((((UINT32)(Time.Year - 2000) * 360 + (Time.Month - 1) * 30 + (Time.Day - 1)) * 24 + Time.Hour) * 60 + Time.Minute) *\r
+ 60 +\r
+ Time.Second\r
+ );\r
\r
//\r
// sizeof (option-len + Duid-type + hardware-type + time) = 10 bytes\r
if (Duid == NULL) {\r
return NULL;\r
}\r
- \r
+\r
//\r
// sizeof (Duid-type + hardware-type + time) = 8 bytes\r
//\r
- Duid->Length = (UINT16) (Mode->HwAddressSize + 8);\r
- \r
+ Duid->Length = (UINT16)(Mode->HwAddressSize + 8);\r
+\r
//\r
// Set the Duid-type, hardware-type, time and copy the hardware address.\r
//\r
- WriteUnaligned16 ((UINT16 *) (Duid->Duid), HTONS (Dhcp6DuidTypeLlt));\r
- WriteUnaligned16 ((UINT16 *) (Duid->Duid + 2), HTONS (NET_IFTYPE_ETHERNET));\r
- WriteUnaligned32 ((UINT32 *) (Duid->Duid + 4), HTONL (Stamp));\r
- \r
+ WriteUnaligned16 ((UINT16 *)((UINT8 *)Duid + OFFSET_OF (EFI_DHCP6_DUID, Duid)), HTONS (Dhcp6DuidTypeLlt));\r
+ WriteUnaligned16 ((UINT16 *)((UINT8 *)Duid + OFFSET_OF (EFI_DHCP6_DUID, Duid) + 2), HTONS (NET_IFTYPE_ETHERNET));\r
+ WriteUnaligned32 ((UINT32 *)((UINT8 *)Duid + OFFSET_OF (EFI_DHCP6_DUID, Duid) + 4), HTONL (Stamp));\r
+\r
CopyMem (Duid->Duid + 8, &Mode->CurrentAddress, Mode->HwAddressSize);\r
}\r
\r
&gEfiDhcp6ServiceBindingProtocolGuid,\r
(EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS),\r
Duid->Length + 2,\r
- (VOID *) Duid\r
+ (VOID *)Duid\r
);\r
if (EFI_ERROR (Status)) {\r
FreePool (Duid);\r
return Duid;\r
}\r
\r
-\r
/**\r
Copy the Dhcp6 configure data.\r
\r
**/\r
EFI_STATUS\r
Dhcp6CopyConfigData (\r
- IN EFI_DHCP6_CONFIG_DATA *DstCfg,\r
- IN EFI_DHCP6_CONFIG_DATA *SorCfg\r
+ IN EFI_DHCP6_CONFIG_DATA *DstCfg,\r
+ IN EFI_DHCP6_CONFIG_DATA *SorCfg\r
)\r
{\r
- UINTN Index;\r
- UINTN OptionListSize;\r
- UINTN OptionSize;\r
+ UINTN Index;\r
+ UINTN OptionListSize;\r
+ UINTN OptionSize;\r
\r
CopyMem (DstCfg, SorCfg, sizeof (EFI_DHCP6_CONFIG_DATA));\r
\r
// Allocate another buffer for solicitretransmission, and copy it.\r
//\r
if (SorCfg->SolicitRetransmission != NULL) {\r
-\r
DstCfg->SolicitRetransmission = AllocateZeroPool (sizeof (EFI_DHCP6_RETRANSMISSION));\r
\r
if (DstCfg->SolicitRetransmission == NULL) {\r
);\r
}\r
\r
- if (SorCfg->OptionList != NULL && SorCfg->OptionCount != 0) {\r
-\r
+ if ((SorCfg->OptionList != NULL) && (SorCfg->OptionCount != 0)) {\r
OptionListSize = SorCfg->OptionCount * sizeof (EFI_DHCP6_PACKET_OPTION *);\r
DstCfg->OptionList = AllocateZeroPool (OptionListSize);\r
\r
}\r
\r
for (Index = 0; Index < SorCfg->OptionCount; Index++) {\r
-\r
OptionSize = NTOHS (SorCfg->OptionList[Index]->OpLen) + 4;\r
DstCfg->OptionList[Index] = AllocateZeroPool (OptionSize);\r
\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
Clean up the configure data.\r
\r
**/\r
VOID\r
Dhcp6CleanupConfigData (\r
- IN OUT EFI_DHCP6_CONFIG_DATA *CfgData\r
+ IN OUT EFI_DHCP6_CONFIG_DATA *CfgData\r
)\r
{\r
- UINTN Index;\r
+ UINTN Index;\r
\r
ASSERT (CfgData != NULL);\r
//\r
FreePool (CfgData->OptionList[Index]);\r
}\r
}\r
+\r
FreePool (CfgData->OptionList);\r
}\r
\r
ZeroMem (CfgData, sizeof (EFI_DHCP6_CONFIG_DATA));\r
}\r
\r
-\r
/**\r
Clean up the mode data.\r
\r
**/\r
VOID\r
Dhcp6CleanupModeData (\r
- IN OUT EFI_DHCP6_MODE_DATA *ModeData\r
+ IN OUT EFI_DHCP6_MODE_DATA *ModeData\r
)\r
{\r
ASSERT (ModeData != NULL);\r
}\r
\r
if (ModeData->Ia != NULL) {\r
-\r
if (ModeData->Ia->ReplyPacket != NULL) {\r
FreePool (ModeData->Ia->ReplyPacket);\r
}\r
+\r
FreePool (ModeData->Ia);\r
}\r
\r
ZeroMem (ModeData, sizeof (EFI_DHCP6_MODE_DATA));\r
}\r
\r
-\r
/**\r
Calculate the expire time by the algorithm defined in rfc.\r
\r
@param[in] Base The base value of the time.\r
@param[in] IsFirstRt If TRUE, it is the first time to calculate expire time.\r
- @param[in] NeedSigned If TRUE, the the signed factor is needed.\r
+ @param[in] NeedSigned If TRUE, the signed factor is needed.\r
\r
@return Expire The calculated result for the new expire time.\r
\r
**/\r
UINT32\r
Dhcp6CalculateExpireTime (\r
- IN UINT32 Base,\r
- IN BOOLEAN IsFirstRt,\r
- IN BOOLEAN NeedSigned\r
+ IN UINT32 Base,\r
+ IN BOOLEAN IsFirstRt,\r
+ IN BOOLEAN NeedSigned\r
)\r
{\r
- EFI_TIME Time;\r
- BOOLEAN Signed;\r
- UINT32 Seed;\r
- UINT32 Expire;\r
+ EFI_TIME Time;\r
+ BOOLEAN Signed;\r
+ UINT32 Seed;\r
+ UINT32 Expire;\r
\r
//\r
// Take the 10bits of microsecond in system time as a uniform distribution.\r
//\r
gRT->GetTime (&Time, NULL);\r
Seed = ((Time.Nanosecond >> 10) & DHCP6_10_BIT_MASK);\r
- Signed = (BOOLEAN) ((((Time.Nanosecond >> 9) & 0x01) != 0) ? TRUE : FALSE);\r
- Signed = (BOOLEAN) (NeedSigned ? Signed : FALSE);\r
+ Signed = (BOOLEAN)((((Time.Nanosecond >> 9) & 0x01) != 0) ? TRUE : FALSE);\r
+ Signed = (BOOLEAN)(NeedSigned ? Signed : FALSE);\r
\r
//\r
// Calculate expire by the following algo:\r
// The (Seed / 0x3ff / 10) is used to a random range (0, 0.1).\r
//\r
if (IsFirstRt && Signed) {\r
-\r
- Expire = Base - (UINT32) (Base * Seed / DHCP6_10_BIT_MASK / 10);\r
-\r
+ Expire = Base - (UINT32)(Base * Seed / DHCP6_10_BIT_MASK / 10);\r
} else if (IsFirstRt && !Signed) {\r
-\r
- Expire = Base + (UINT32) (Base * Seed / DHCP6_10_BIT_MASK / 10);\r
-\r
+ Expire = Base + (UINT32)(Base * Seed / DHCP6_10_BIT_MASK / 10);\r
} else if (!IsFirstRt && Signed) {\r
-\r
- Expire = 2 * Base - (UINT32) (Base * Seed / DHCP6_10_BIT_MASK / 10);\r
-\r
+ Expire = 2 * Base - (UINT32)(Base * Seed / DHCP6_10_BIT_MASK / 10);\r
} else {\r
-\r
- Expire = 2 * Base + (UINT32) (Base * Seed / DHCP6_10_BIT_MASK / 10);\r
+ Expire = 2 * Base + (UINT32)(Base * Seed / DHCP6_10_BIT_MASK / 10);\r
}\r
\r
Expire = (Expire != 0) ? Expire : 1;\r
return Expire;\r
}\r
\r
-\r
/**\r
Calculate the lease time by the algorithm defined in rfc.\r
\r
**/\r
VOID\r
Dhcp6CalculateLeaseTime (\r
- IN DHCP6_IA_CB *IaCb\r
+ IN DHCP6_IA_CB *IaCb\r
)\r
{\r
- EFI_DHCP6_IA_ADDRESS *IaAddr;\r
- UINT32 MinLt;\r
- UINT32 MaxLt;\r
- UINTN Index;\r
+ UINT32 MinLt;\r
+ UINT32 MaxLt;\r
+ UINTN Index;\r
\r
ASSERT (IaCb->Ia->IaAddressCount > 0);\r
\r
- MinLt = (UINT32) (-1);\r
- MaxLt = 0;\r
+ MinLt = (UINT32)(-1);\r
+ MaxLt = 0;\r
\r
//\r
// Calculate minlt as min of all valid life time, and maxlt as max of all\r
// valid life time.\r
//\r
for (Index = 0; Index < IaCb->Ia->IaAddressCount; Index++) {\r
- IaAddr = IaCb->Ia->IaAddress + Index * sizeof (EFI_DHCP6_IA_ADDRESS);\r
- MinLt = MIN (MinLt, IaAddr->ValidLifetime);\r
- MaxLt = MAX (MinLt, IaAddr->ValidLifetime);\r
+ MinLt = MIN (MinLt, IaCb->Ia->IaAddress[Index].ValidLifetime);\r
+ MaxLt = MAX (MinLt, IaCb->Ia->IaAddress[Index].ValidLifetime);\r
}\r
\r
//\r
IaCb->LeaseTime = 0;\r
}\r
\r
-\r
/**\r
Check whether the addresses are all included by the configured Ia.\r
\r
**/\r
EFI_STATUS\r
Dhcp6CheckAddress (\r
- IN EFI_DHCP6_IA *Ia,\r
- IN UINT32 AddressCount,\r
- IN EFI_IPv6_ADDRESS *Addresses\r
+ IN EFI_DHCP6_IA *Ia,\r
+ IN UINT32 AddressCount,\r
+ IN EFI_IPv6_ADDRESS *Addresses\r
)\r
{\r
- UINTN Index1;\r
- UINTN Index2;\r
- BOOLEAN Found;\r
+ UINTN Index1;\r
+ UINTN Index2;\r
+ BOOLEAN Found;\r
\r
//\r
// Check whether the addresses are all included by the configured IA. And it\r
// will return success if address count is zero, which means all addresses.\r
//\r
for (Index1 = 0; Index1 < AddressCount; Index1++) {\r
-\r
Found = FALSE;\r
\r
for (Index2 = 0; Index2 < Ia->IaAddressCount; Index2++) {\r
-\r
if (CompareMem (\r
&Addresses[Index1],\r
&Ia->IaAddress[Index2],\r
sizeof (EFI_IPv6_ADDRESS)\r
- ) == 0) {\r
-\r
+ ) == 0)\r
+ {\r
Found = TRUE;\r
break;\r
}\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
Deprive the addresses from current Ia, and generate another eliminated Ia.\r
\r
**/\r
EFI_DHCP6_IA *\r
Dhcp6DepriveAddress (\r
- IN EFI_DHCP6_IA *Ia,\r
- IN UINT32 AddressCount,\r
- IN EFI_IPv6_ADDRESS *Addresses\r
+ IN EFI_DHCP6_IA *Ia,\r
+ IN UINT32 AddressCount,\r
+ IN EFI_IPv6_ADDRESS *Addresses\r
)\r
{\r
- EFI_DHCP6_IA *IaCopy;\r
- UINTN IaCopySize;\r
- UINTN Index1;\r
- UINTN Index2;\r
- BOOLEAN Found;\r
+ EFI_DHCP6_IA *IaCopy;\r
+ UINTN IaCopySize;\r
+ UINTN Index1;\r
+ UINTN Index2;\r
+ BOOLEAN Found;\r
\r
if (AddressCount == 0) {\r
//\r
//\r
// If release all Ia addresses, just copy the configured Ia and then set\r
// its address count as zero.\r
- // We may decline/release part of addresses at the begining. So it's a\r
+ // We may decline/release part of addresses at the beginning. So it's a\r
// forwarding step to update address infor for decline/release, while the\r
// other infor such as Ia state will be updated when receiving reply.\r
//\r
// Move the addresses from the Ia of instance to the deprived Ia.\r
//\r
for (Index1 = 0; Index1 < AddressCount; Index1++) {\r
-\r
Found = FALSE;\r
\r
for (Index2 = 0; Index2 < Ia->IaAddressCount; Index2++) {\r
-\r
if (CompareMem (\r
&Addresses[Index1],\r
&Ia->IaAddress[Index2],\r
sizeof (EFI_IPv6_ADDRESS)\r
- ) == 0) {\r
+ ) == 0)\r
+ {\r
//\r
// Copy the deprived address to the copy of Ia\r
//\r
(Ia->IaAddressCount - Index2 - 1) * sizeof (EFI_DHCP6_IA_ADDRESS)\r
);\r
}\r
+\r
Found = TRUE;\r
break;\r
}\r
}\r
+\r
ASSERT (Found == TRUE);\r
}\r
\r
return IaCopy;\r
}\r
\r
-\r
/**\r
The dummy ext buffer free callback routine.\r
\r
VOID\r
EFIAPI\r
Dhcp6DummyExtFree (\r
- IN VOID *Arg\r
+ IN VOID *Arg\r
)\r
{\r
}\r
\r
-\r
/**\r
The callback routine once message transmitted.\r
\r
VOID\r
EFIAPI\r
Dhcp6OnTransmitted (\r
- IN NET_BUF *Wrap,\r
- IN UDP_END_POINT *EndPoint,\r
- IN EFI_STATUS IoStatus,\r
- IN VOID *Context\r
+ IN NET_BUF *Wrap,\r
+ IN UDP_END_POINT *EndPoint,\r
+ IN EFI_STATUS IoStatus,\r
+ IN VOID *Context\r
)\r
{\r
NetbufFree (Wrap);\r
}\r
\r
-\r
/**\r
Append the option to Buf, and move Buf to the end.\r
\r
**/\r
UINT8 *\r
Dhcp6AppendOption (\r
- IN OUT UINT8 *Buf,\r
- IN UINT16 OptType,\r
- IN UINT16 OptLen,\r
- IN UINT8 *Data\r
+ IN OUT UINT8 *Buf,\r
+ IN UINT16 OptType,\r
+ IN UINT16 OptLen,\r
+ IN UINT8 *Data\r
)\r
{\r
//\r
\r
ASSERT (OptLen != 0);\r
\r
- WriteUnaligned16 ((UINT16 *) Buf, OptType);\r
- Buf += 2;\r
- WriteUnaligned16 ((UINT16 *) Buf, OptLen);\r
- Buf += 2;\r
+ WriteUnaligned16 ((UINT16 *)Buf, OptType);\r
+ Buf += 2;\r
+ WriteUnaligned16 ((UINT16 *)Buf, OptLen);\r
+ Buf += 2;\r
CopyMem (Buf, Data, NTOHS (OptLen));\r
- Buf += NTOHS (OptLen);\r
+ Buf += NTOHS (OptLen);\r
\r
return Buf;\r
}\r
**/\r
UINT8 *\r
Dhcp6AppendIaAddrOption (\r
- IN OUT UINT8 *Buf,\r
- IN EFI_DHCP6_IA_ADDRESS *IaAddr,\r
- IN UINT32 MessageType\r
-)\r
+ IN OUT UINT8 *Buf,\r
+ IN EFI_DHCP6_IA_ADDRESS *IaAddr,\r
+ IN UINT32 MessageType\r
+ )\r
{\r
-\r
// The format of the IA Address option is:\r
//\r
// 0 1 2 3\r
// . IAaddr-options .\r
// . .\r
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
- \r
+\r
//\r
// Fill the value of Ia Address option type\r
//\r
- WriteUnaligned16 ((UINT16 *) Buf, HTONS (Dhcp6OptIaAddr));\r
- Buf += 2;\r
+ WriteUnaligned16 ((UINT16 *)Buf, HTONS (Dhcp6OptIaAddr));\r
+ Buf += 2;\r
\r
- WriteUnaligned16 ((UINT16 *) Buf, HTONS (sizeof (EFI_DHCP6_IA_ADDRESS)));\r
- Buf += 2;\r
+ WriteUnaligned16 ((UINT16 *)Buf, HTONS (sizeof (EFI_DHCP6_IA_ADDRESS)));\r
+ Buf += 2;\r
\r
- CopyMem (Buf, &IaAddr->IpAddress, sizeof(EFI_IPv6_ADDRESS));\r
- Buf += sizeof(EFI_IPv6_ADDRESS);\r
+ CopyMem (Buf, &IaAddr->IpAddress, sizeof (EFI_IPv6_ADDRESS));\r
+ Buf += sizeof (EFI_IPv6_ADDRESS);\r
\r
//\r
// Fill the value of preferred-lifetime and valid-lifetime.\r
// should set to 0 when initiate a Confirm message.\r
//\r
if (MessageType != Dhcp6MsgConfirm) {\r
- WriteUnaligned32 ((UINT32 *) Buf, HTONL (IaAddr->PreferredLifetime));\r
+ WriteUnaligned32 ((UINT32 *)Buf, HTONL (IaAddr->PreferredLifetime));\r
}\r
- Buf += 4;\r
+\r
+ Buf += 4;\r
\r
if (MessageType != Dhcp6MsgConfirm) {\r
- WriteUnaligned32 ((UINT32 *) Buf, HTONL (IaAddr->ValidLifetime));\r
+ WriteUnaligned32 ((UINT32 *)Buf, HTONL (IaAddr->ValidLifetime));\r
}\r
- Buf += 4;\r
+\r
+ Buf += 4;\r
\r
return Buf;\r
}\r
\r
-\r
/**\r
Append the appointed Ia option to Buf, and move Buf to the end.\r
\r
**/\r
UINT8 *\r
Dhcp6AppendIaOption (\r
- IN OUT UINT8 *Buf,\r
- IN EFI_DHCP6_IA *Ia,\r
- IN UINT32 T1,\r
- IN UINT32 T2,\r
- IN UINT32 MessageType\r
+ IN OUT UINT8 *Buf,\r
+ IN EFI_DHCP6_IA *Ia,\r
+ IN UINT32 T1,\r
+ IN UINT32 T2,\r
+ IN UINT32 MessageType\r
)\r
{\r
- UINT8 *AddrOpt;\r
- UINT16 *Len;\r
- UINTN Index;\r
+ UINT8 *AddrOpt;\r
+ UINT16 *Len;\r
+ UINTN Index;\r
\r
//\r
// The format of IA_NA and IA_TA option:\r
//\r
// Fill the value of Ia option type\r
//\r
- WriteUnaligned16 ((UINT16 *) Buf, HTONS (Ia->Descriptor.Type));\r
- Buf += 2;\r
+ WriteUnaligned16 ((UINT16 *)Buf, HTONS (Ia->Descriptor.Type));\r
+ Buf += 2;\r
\r
//\r
// Fill the len of Ia option later, keep the pointer first\r
//\r
- Len = (UINT16 *) Buf;\r
- Buf += 2;\r
+ Len = (UINT16 *)Buf;\r
+ Buf += 2;\r
\r
//\r
// Fill the value of iaid\r
//\r
- WriteUnaligned32 ((UINT32 *) Buf, HTONL (Ia->Descriptor.IaId));\r
- Buf += 4;\r
+ WriteUnaligned32 ((UINT32 *)Buf, HTONL (Ia->Descriptor.IaId));\r
+ Buf += 4;\r
\r
//\r
// Fill the value of t1 and t2 if iana, keep it 0xffffffff if no specified.\r
//\r
if (Ia->Descriptor.Type == Dhcp6OptIana) {\r
- WriteUnaligned32 ((UINT32 *) Buf, HTONL ((T1 != 0) ? T1 : 0xffffffff));\r
- Buf += 4;\r
- WriteUnaligned32 ((UINT32 *) Buf, HTONL ((T2 != 0) ? T2 : 0xffffffff));\r
- Buf += 4;\r
+ WriteUnaligned32 ((UINT32 *)Buf, HTONL ((T1 != 0) ? T1 : 0xffffffff));\r
+ Buf += 4;\r
+ WriteUnaligned32 ((UINT32 *)Buf, HTONL ((T2 != 0) ? T2 : 0xffffffff));\r
+ Buf += 4;\r
}\r
\r
//\r
// Fill all the addresses belong to the Ia\r
//\r
for (Index = 0; Index < Ia->IaAddressCount; Index++) {\r
- AddrOpt = (UINT8 *) Ia->IaAddress + Index * sizeof (EFI_DHCP6_IA_ADDRESS);\r
- Buf = Dhcp6AppendIaAddrOption (Buf, (EFI_DHCP6_IA_ADDRESS *) AddrOpt, MessageType);\r
+ AddrOpt = (UINT8 *)Ia->IaAddress + Index * sizeof (EFI_DHCP6_IA_ADDRESS);\r
+ Buf = Dhcp6AppendIaAddrOption (Buf, (EFI_DHCP6_IA_ADDRESS *)AddrOpt, MessageType);\r
}\r
\r
//\r
// Fill the value of Ia option length\r
//\r
- *Len = HTONS ((UINT16) (Buf - (UINT8 *) Len - 2));\r
+ *Len = HTONS ((UINT16)(Buf - (UINT8 *)Len - 2));\r
\r
return Buf;\r
}\r
**/\r
UINT8 *\r
Dhcp6AppendETOption (\r
- IN OUT UINT8 *Buf,\r
- IN DHCP6_INSTANCE *Instance,\r
- OUT UINT16 **Elapsed\r
+ IN OUT UINT8 *Buf,\r
+ IN DHCP6_INSTANCE *Instance,\r
+ OUT UINT16 **Elapsed\r
)\r
{\r
//\r
//\r
// Fill the value of elapsed-time option type.\r
//\r
- WriteUnaligned16 ((UINT16 *) Buf, HTONS (Dhcp6OptElapsedTime));\r
- Buf += 2;\r
+ WriteUnaligned16 ((UINT16 *)Buf, HTONS (Dhcp6OptElapsedTime));\r
+ Buf += 2;\r
\r
//\r
// Fill the len of elapsed-time option, which is fixed.\r
//\r
- WriteUnaligned16 ((UINT16 *) Buf, HTONS(2));\r
- Buf += 2;\r
+ WriteUnaligned16 ((UINT16 *)Buf, HTONS (2));\r
+ Buf += 2;\r
\r
//\r
// Fill in elapsed time value with 0 value for now. The actual value is\r
// filled in later just before the packet is transmitted.\r
//\r
- WriteUnaligned16 ((UINT16 *) Buf, HTONS(0));\r
- *Elapsed = (UINT16 *) Buf;\r
- Buf += 2;\r
+ WriteUnaligned16 ((UINT16 *)Buf, HTONS (0));\r
+ *Elapsed = (UINT16 *)Buf;\r
+ Buf += 2;\r
\r
return Buf;\r
}\r
**/\r
VOID\r
SetElapsedTime (\r
- IN UINT16 *Elapsed,\r
- IN DHCP6_INSTANCE *Instance\r
+ IN UINT16 *Elapsed,\r
+ IN DHCP6_INSTANCE *Instance\r
)\r
{\r
- EFI_TIME Time;\r
- UINT64 CurrentStamp;\r
- UINT64 ElapsedTimeValue;\r
+ EFI_TIME Time;\r
+ UINT64 CurrentStamp;\r
+ UINT64 ElapsedTimeValue;\r
\r
//\r
// Generate a time stamp of the centiseconds from 2000/1/1, assume 30day/month.\r
//\r
gRT->GetTime (&Time, NULL);\r
- CurrentStamp = (UINT64)\r
- (\r
- ((((((Time.Year - 2000) * 360 +\r
- (Time.Month - 1)) * 30 +\r
- (Time.Day - 1)) * 24 + Time.Hour) * 60 +\r
- Time.Minute) * 60 + Time.Second) * 100\r
- + DivU64x32(Time.Nanosecond, 10000000)\r
- );\r
+ CurrentStamp = MultU64x32 (\r
+ ((((UINT32)(Time.Year - 2000) * 360 + (Time.Month - 1) * 30 + (Time.Day - 1)) * 24 + Time.Hour) * 60 + Time.Minute) * 60 + Time.Second,\r
+ 100\r
+ ) +\r
+ DivU64x32 (\r
+ Time.Nanosecond,\r
+ 10000000\r
+ );\r
\r
//\r
// Sentinel value of 0 means that this is the first DHCP packet that we are\r
// gets 0 elapsed-time. Otherwise, calculate based on StartTime.\r
//\r
if (Instance->StartTime == 0) {\r
- ElapsedTimeValue = 0;\r
+ ElapsedTimeValue = 0;\r
Instance->StartTime = CurrentStamp;\r
} else {\r
ElapsedTimeValue = CurrentStamp - Instance->StartTime;\r
ElapsedTimeValue = 0xffff;\r
}\r
}\r
- WriteUnaligned16 (Elapsed, HTONS((UINT16) ElapsedTimeValue));\r
-}\r
\r
+ WriteUnaligned16 (Elapsed, HTONS ((UINT16)ElapsedTimeValue));\r
+}\r
\r
/**\r
Seek the address of the first byte of the option header.\r
**/\r
UINT8 *\r
Dhcp6SeekOption (\r
- IN UINT8 *Buf,\r
- IN UINT32 SeekLen,\r
- IN UINT16 OptType\r
+ IN UINT8 *Buf,\r
+ IN UINT32 SeekLen,\r
+ IN UINT16 OptType\r
)\r
{\r
- UINT8 *Cursor;\r
- UINT8 *Option;\r
- UINT16 DataLen;\r
- UINT16 OpCode;\r
+ UINT8 *Cursor;\r
+ UINT8 *Option;\r
+ UINT16 DataLen;\r
+ UINT16 OpCode;\r
\r
Option = NULL;\r
Cursor = Buf;\r
// The format of Dhcp6 option refers to Dhcp6AppendOption().\r
//\r
while (Cursor < Buf + SeekLen) {\r
- OpCode = ReadUnaligned16 ((UINT16 *) Cursor);\r
+ OpCode = ReadUnaligned16 ((UINT16 *)Cursor);\r
if (OpCode == HTONS (OptType)) {\r
Option = Cursor;\r
break;\r
}\r
- DataLen = NTOHS (ReadUnaligned16 ((UINT16 *) (Cursor + 2)));\r
+\r
+ DataLen = NTOHS (ReadUnaligned16 ((UINT16 *)(Cursor + 2)));\r
Cursor += (DataLen + 4);\r
}\r
\r
return Option;\r
}\r
\r
-\r
/**\r
Seek the address of the first byte of the Ia option header.\r
\r
IN EFI_DHCP6_IA_DESCRIPTOR *IaDesc\r
)\r
{\r
- UINT8 *Cursor;\r
- UINT8 *Option;\r
- UINT16 DataLen;\r
- UINT16 OpCode;\r
- UINT32 IaId;\r
+ UINT8 *Cursor;\r
+ UINT8 *Option;\r
+ UINT16 DataLen;\r
+ UINT16 OpCode;\r
+ UINT32 IaId;\r
\r
//\r
// The format of IA_NA and IA_TA option refers to Dhcp6AppendIaOption().\r
Cursor = Buf;\r
\r
while (Cursor < Buf + SeekLen) {\r
- OpCode = ReadUnaligned16 ((UINT16 *) Cursor);\r
- IaId = ReadUnaligned32 ((UINT32 *) (Cursor + 4));\r
- if (OpCode == HTONS (IaDesc->Type) && IaId == HTONL (IaDesc->IaId)) {\r
+ OpCode = ReadUnaligned16 ((UINT16 *)Cursor);\r
+ IaId = ReadUnaligned32 ((UINT32 *)(Cursor + 4));\r
+ if ((OpCode == HTONS (IaDesc->Type)) && (IaId == HTONL (IaDesc->IaId))) {\r
Option = Cursor;\r
break;\r
}\r
- DataLen = NTOHS (ReadUnaligned16 ((UINT16 *) (Cursor + 2)));\r
+\r
+ DataLen = NTOHS (ReadUnaligned16 ((UINT16 *)(Cursor + 2)));\r
Cursor += (DataLen + 4);\r
}\r
\r
}\r
\r
/**\r
- Check whether the incoming IPv6 address in IaAddr is one of the maintained \r
- addresses in the IA control blcok.\r
+ Check whether the incoming IPv6 address in IaAddr is one of the maintained\r
+ addresses in the IA control block.\r
\r
@param[in] IaAddr The pointer to the IA Address to be checked.\r
@param[in] CurrentIa The pointer to the IA in IA control block.\r
**/\r
BOOLEAN\r
Dhcp6AddrIsInCurrentIa (\r
- IN EFI_DHCP6_IA_ADDRESS *IaAddr,\r
- IN EFI_DHCP6_IA *CurrentIa\r
+ IN EFI_DHCP6_IA_ADDRESS *IaAddr,\r
+ IN EFI_DHCP6_IA *CurrentIa\r
)\r
{\r
- UINT32 Index;\r
+ UINT32 Index;\r
\r
ASSERT (IaAddr != NULL && CurrentIa != NULL);\r
- \r
+\r
for (Index = 0; Index < CurrentIa->IaAddressCount; Index++) {\r
- if (EFI_IP6_EQUAL(&IaAddr->IpAddress, &CurrentIa->IaAddress[Index].IpAddress)) {\r
+ if (EFI_IP6_EQUAL (&IaAddr->IpAddress, &CurrentIa->IaAddress[Index].IpAddress)) {\r
return TRUE;\r
}\r
}\r
+\r
return FALSE;\r
}\r
\r
/**\r
- Parse the address option and update the address infomation.\r
+ Parse the address option and update the address information.\r
\r
- @param[in] CurrentIa The pointer to the Ia Address in control blcok.\r
+ @param[in] CurrentIa The pointer to the Ia Address in control block.\r
@param[in] IaInnerOpt The pointer to the buffer.\r
@param[in] IaInnerLen The length to parse.\r
@param[out] AddrNum The number of addresses.\r
**/\r
VOID\r
Dhcp6ParseAddrOption (\r
- IN EFI_DHCP6_IA *CurrentIa,\r
- IN UINT8 *IaInnerOpt,\r
- IN UINT16 IaInnerLen,\r
- OUT UINT32 *AddrNum,\r
- IN OUT EFI_DHCP6_IA_ADDRESS *AddrBuf\r
+ IN EFI_DHCP6_IA *CurrentIa,\r
+ IN UINT8 *IaInnerOpt,\r
+ IN UINT16 IaInnerLen,\r
+ OUT UINT32 *AddrNum,\r
+ IN OUT EFI_DHCP6_IA_ADDRESS *AddrBuf\r
)\r
{\r
- UINT8 *Cursor;\r
- UINT16 DataLen;\r
- UINT16 OpCode;\r
- UINT32 ValidLt;\r
- UINT32 PreferredLt;\r
- EFI_DHCP6_IA_ADDRESS *IaAddr;\r
+ UINT8 *Cursor;\r
+ UINT16 DataLen;\r
+ UINT16 OpCode;\r
+ UINT32 ValidLt;\r
+ UINT32 PreferredLt;\r
+ EFI_DHCP6_IA_ADDRESS *IaAddr;\r
\r
//\r
// The format of the IA Address option:\r
// Refer to RFC3315 Chapter 18.1.8, we need to update lifetimes for any addresses in the IA option\r
// that the client already has recorded in the IA, and discard the Ia address option with 0 valid time.\r
//\r
- OpCode = ReadUnaligned16 ((UINT16 *) Cursor);\r
- PreferredLt = NTOHL (ReadUnaligned32 ((UINT32 *) (Cursor + 20)));\r
- ValidLt = NTOHL (ReadUnaligned32 ((UINT32 *) (Cursor + 24)));\r
- IaAddr = (EFI_DHCP6_IA_ADDRESS *) (Cursor + 4);\r
- if (OpCode == HTONS (Dhcp6OptIaAddr) && ValidLt >= PreferredLt &&\r
- (Dhcp6AddrIsInCurrentIa(IaAddr, CurrentIa) || ValidLt !=0)) {\r
+ OpCode = ReadUnaligned16 ((UINT16 *)Cursor);\r
+ PreferredLt = NTOHL (ReadUnaligned32 ((UINT32 *)(Cursor + 20)));\r
+ ValidLt = NTOHL (ReadUnaligned32 ((UINT32 *)(Cursor + 24)));\r
+ IaAddr = (EFI_DHCP6_IA_ADDRESS *)(Cursor + 4);\r
+ if ((OpCode == HTONS (Dhcp6OptIaAddr)) && (ValidLt >= PreferredLt) &&\r
+ (Dhcp6AddrIsInCurrentIa (IaAddr, CurrentIa) || (ValidLt != 0)))\r
+ {\r
if (AddrBuf != NULL) {\r
CopyMem (AddrBuf, IaAddr, sizeof (EFI_DHCP6_IA_ADDRESS));\r
AddrBuf->PreferredLifetime = PreferredLt;\r
AddrBuf->ValidLifetime = ValidLt;\r
- AddrBuf = (EFI_DHCP6_IA_ADDRESS *) ((UINT8 *) AddrBuf + sizeof (EFI_DHCP6_IA_ADDRESS));\r
+ AddrBuf = (EFI_DHCP6_IA_ADDRESS *)((UINT8 *)AddrBuf + sizeof (EFI_DHCP6_IA_ADDRESS));\r
}\r
+\r
(*AddrNum)++;\r
}\r
- DataLen = NTOHS (ReadUnaligned16 ((UINT16 *) (Cursor + 2)));\r
+\r
+ DataLen = NTOHS (ReadUnaligned16 ((UINT16 *)(Cursor + 2)));\r
Cursor += (DataLen + 4);\r
}\r
}\r
\r
-\r
/**\r
- Create a control blcok for the Ia according to the corresponding options.\r
+ Create a control block for the Ia according to the corresponding options.\r
\r
@param[in] Instance The pointer to DHCP6 Instance.\r
@param[in] IaInnerOpt The pointer to the inner options in the Ia option.\r
**/\r
EFI_STATUS\r
Dhcp6GenerateIaCb (\r
- IN DHCP6_INSTANCE *Instance,\r
- IN UINT8 *IaInnerOpt,\r
- IN UINT16 IaInnerLen,\r
- IN UINT32 T1,\r
- IN UINT32 T2\r
+ IN DHCP6_INSTANCE *Instance,\r
+ IN UINT8 *IaInnerOpt,\r
+ IN UINT16 IaInnerLen,\r
+ IN UINT32 T1,\r
+ IN UINT32 T2\r
)\r
{\r
- UINT32 AddrNum;\r
- UINT32 IaSize;\r
- EFI_DHCP6_IA *Ia;\r
+ UINT32 AddrNum;\r
+ UINT32 IaSize;\r
+ EFI_DHCP6_IA *Ia;\r
\r
if (Instance->IaCb.Ia == NULL) {\r
return EFI_DEVICE_ERROR;\r
// Allocate for new IA.\r
//\r
IaSize = sizeof (EFI_DHCP6_IA) + (AddrNum - 1) * sizeof (EFI_DHCP6_IA_ADDRESS);\r
- Ia = AllocateZeroPool (IaSize);\r
+ Ia = AllocateZeroPool (IaSize);\r
\r
if (Ia == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
if (Instance->IaCb.Ia->ReplyPacket != NULL) {\r
FreePool (Instance->IaCb.Ia->ReplyPacket);\r
}\r
- FreePool (Instance->IaCb.Ia);\r
\r
+ FreePool (Instance->IaCb.Ia);\r
\r
ZeroMem (&Instance->IaCb, sizeof (DHCP6_IA_CB));\r
\r
//\r
// Update IaCb to use new IA.\r
//\r
- Instance->IaCb.Ia = Ia;\r
+ Instance->IaCb.Ia = Ia;\r
\r
//\r
\r
- // Fill in IaCb fields. Such as T1, T2, AllExpireTime and LeaseTime.\r
+ // Fill in IaCb fields. Such as T1, T2, AllExpireTime and LeaseTime.\r
//\r
Instance->IaCb.T1 = T1;\r
Instance->IaCb.T2 = T2;\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
Cache the current IA configuration information.\r
\r
**/\r
EFI_STATUS\r
Dhcp6CacheIa (\r
- IN DHCP6_INSTANCE *Instance\r
+ IN DHCP6_INSTANCE *Instance\r
)\r
{\r
- UINTN IaSize;\r
- EFI_DHCP6_IA *Ia;\r
+ UINTN IaSize;\r
+ EFI_DHCP6_IA *Ia;\r
\r
Ia = Instance->IaCb.Ia;\r
\r
if (Instance->CacheIa == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+\r
CopyMem (Instance->CacheIa, Ia, IaSize);\r
}\r
+\r
return EFI_SUCCESS;\r
}\r
\r
/**\r
- Append CacheIa to the currrent IA. Meanwhile, clear CacheIa.ValidLifetime to 0.\r
+ Append CacheIa to the current IA. Meanwhile, clear CacheIa.ValidLifetime to 0.\r
\r
@param[in] Instance The pointer to DHCP6 instance.\r
\r
**/\r
VOID\r
Dhcp6AppendCacheIa (\r
- IN DHCP6_INSTANCE *Instance\r
+ IN DHCP6_INSTANCE *Instance\r
)\r
{\r
- UINT8 *Ptr;\r
- UINTN Index;\r
- UINTN IaSize;\r
- UINTN NewIaSize;\r
- EFI_DHCP6_IA *Ia;\r
- EFI_DHCP6_IA *NewIa;\r
- EFI_DHCP6_IA *CacheIa;\r
+ UINT8 *Ptr;\r
+ UINTN Index;\r
+ UINTN IaSize;\r
+ UINTN NewIaSize;\r
+ EFI_DHCP6_IA *Ia;\r
+ EFI_DHCP6_IA *NewIa;\r
+ EFI_DHCP6_IA *CacheIa;\r
\r
Ia = Instance->IaCb.Ia;\r
CacheIa = Instance->CacheIa;\r
// Clear old address.ValidLifetime\r
//\r
for (Index = 0; Index < CacheIa->IaAddressCount; Index++) {\r
- CacheIa->IaAddress[Index].ValidLifetime = 0;\r
+ CacheIa->IaAddress[Index].ValidLifetime = 0;\r
}\r
\r
NewIa->IaAddressCount += CacheIa->IaAddressCount;\r
- Ptr = (UINT8*)&NewIa->IaAddress[Ia->IaAddressCount];\r
+ Ptr = (UINT8 *)&NewIa->IaAddress[Ia->IaAddressCount];\r
CopyMem (Ptr, CacheIa->IaAddress, CacheIa->IaAddressCount * sizeof (EFI_DHCP6_IA_ADDRESS));\r
\r
//\r
//\r
FreePool (Instance->CacheIa);\r
FreePool (Instance->IaCb.Ia);\r
- Instance->CacheIa = NULL;\r
- Instance->IaCb.Ia = NewIa;\r
+ Instance->CacheIa = NULL;\r
+ Instance->IaCb.Ia = NewIa;\r
}\r
}\r
\r
/**\r
- Calculate the Dhcp6 get mapping timeout by adding additinal delay to the IP6 DAD transmits count.\r
+ Calculate the Dhcp6 get mapping timeout by adding additional delay to the IP6 DAD transmits count.\r
\r
@param[in] Ip6Cfg The pointer to Ip6 config protocol.\r
@param[out] TimeOut The time out value in 100ns units.\r
**/\r
EFI_STATUS\r
Dhcp6GetMappingTimeOut (\r
- IN EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg,\r
- OUT UINTN *TimeOut\r
- ) \r
+ IN EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg,\r
+ OUT UINTN *TimeOut\r
+ )\r
{\r
- EFI_STATUS Status;\r
- UINTN DataSize;\r
- EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS DadXmits;\r
+ EFI_STATUS Status;\r
+ UINTN DataSize;\r
+ EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS DadXmits;\r
\r
- if (Ip6Cfg == NULL || TimeOut == NULL) {\r
+ if ((Ip6Cfg == NULL) || (TimeOut == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
DataSize = sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS);\r
- Status = Ip6Cfg->GetData (\r
- Ip6Cfg,\r
- Ip6ConfigDataTypeDupAddrDetectTransmits,\r
- &DataSize,\r
- &DadXmits\r
- );\r
+ Status = Ip6Cfg->GetData (\r
+ Ip6Cfg,\r
+ Ip6ConfigDataTypeDupAddrDetectTransmits,\r
+ &DataSize,\r
+ &DadXmits\r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- \r
+\r
*TimeOut = TICKS_PER_SECOND * DadXmits.DupAddrDetectTransmits + DHCP6_DAD_ADDITIONAL_DELAY;\r
- \r
+\r
return EFI_SUCCESS;\r
}\r