1. Update DHCPv6 to use DUID-UUID option

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12018 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
hhuan13 2011-07-14 11:29:47 +00:00
parent 57b301b569
commit 33c09637c6
3 changed files with 93 additions and 46 deletions

View File

@ -166,7 +166,8 @@ Dhcp6CreateService (
); );
// //
// Generate client Duid in the format of Duid-llt. // Generate client Duid: If SMBIOS system UUID is located, generate DUID in DUID-UUID format.
// Otherwise, in DUID-LLT format.
// //
Dhcp6Srv->ClientId = Dhcp6GenerateClientId (Dhcp6Srv->Snp->Mode); Dhcp6Srv->ClientId = Dhcp6GenerateClientId (Dhcp6Srv->Snp->Mode);

View File

@ -1,7 +1,7 @@
/** @file /** @file
Dhcp6 internal data structure and definition declaration. Dhcp6 internal data structure and definition declaration.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -184,7 +184,8 @@ typedef enum {
typedef enum { typedef enum {
Dhcp6DuidTypeLlt = 1, Dhcp6DuidTypeLlt = 1,
Dhcp6DuidTypeEn = 2, Dhcp6DuidTypeEn = 2,
Dhcp6DuidTypeLl = 3 Dhcp6DuidTypeLl = 3,
Dhcp6DuidTypeUuid = 4
} DHCP6_DUID_TYPE; } DHCP6_DUID_TYPE;
// //

View File

@ -34,6 +34,8 @@ Dhcp6GenerateClientId (
EFI_DHCP6_DUID *Duid; EFI_DHCP6_DUID *Duid;
EFI_TIME Time; EFI_TIME Time;
UINT32 Stamp; UINT32 Stamp;
EFI_GUID Uuid;
// //
// Attempt to get client Id from variable to keep it constant. // Attempt to get client Id from variable to keep it constant.
@ -44,17 +46,6 @@ Dhcp6GenerateClientId (
return Duid; return Duid;
} }
//
// Generate a time stamp of the seconds from 2000/1/1, assume 30day/month.
//
gRT->GetTime (&Time, NULL);
Stamp = (UINT32)
(
(((((Time.Year - 2000) * 360 + (Time.Month - 1)) * 30 + (Time.Day - 1)) * 24 + Time.Hour) * 60 + Time.Minute) *
60 +
Time.Second
);
// //
// The format of client identifier option: // The format of client identifier option:
// //
@ -68,43 +59,97 @@ Dhcp6GenerateClientId (
// . . // . .
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// //
//
// The format of DUID-LLT:
//
// 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
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Duid type (1) | hardware type (16 bits) |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | time (32 bits) |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// . .
// . link-layer address (variable length) .
// . .
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
// //
// sizeof (option-len + Duid-type + hardware-type + time) = 10 bytes // If System UUID is found from SMBIOS Table, use DUID-UUID type.
// //
Duid = AllocateZeroPool (10 + Mode->HwAddressSize); if (!EFI_ERROR (NetLibGetSystemGuid (&Uuid))) {
if (Duid == NULL) { //
return NULL; //
// The format of DUID-UUID:
//
// 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
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | DUID-Type (4) | UUID (128 bits) |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
// | |
// | |
// | -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
//
// sizeof (option-len + Duid-type + UUID-size) = 20 bytes
//
Duid = AllocateZeroPool (2 + 2 + sizeof (EFI_GUID));
if (Duid == NULL) {
return NULL;
}
//
// sizeof (Duid-type + UUID-size) = 18 bytes
//
Duid->Length = (UINT16) (18);
//
// Set the Duid-type and copy UUID.
//
WriteUnaligned16 ((UINT16 *) (Duid->Duid), HTONS (Dhcp6DuidTypeUuid));
CopyMem (Duid->Duid + 2, &Uuid, sizeof(EFI_GUID));
} else {
//
//
// The format of DUID-LLT:
//
// 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
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Duid type (1) | hardware type (16 bits) |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | time (32 bits) |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// . .
// . link-layer address (variable length) .
// . .
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
//
// Generate a time stamp of the seconds from 2000/1/1, assume 30day/month.
//
gRT->GetTime (&Time, NULL);
Stamp = (UINT32)
(
(((((Time.Year - 2000) * 360 + (Time.Month - 1)) * 30 + (Time.Day - 1)) * 24 + Time.Hour) * 60 + Time.Minute) *
60 +
Time.Second
);
//
// sizeof (option-len + Duid-type + hardware-type + time) = 10 bytes
//
Duid = AllocateZeroPool (10 + Mode->HwAddressSize);
if (Duid == NULL) {
return NULL;
}
//
// sizeof (Duid-type + hardware-type + time) = 8 bytes
//
Duid->Length = (UINT16) (Mode->HwAddressSize + 8);
//
// Set the Duid-type, hardware-type, time and copy the hardware address.
//
WriteUnaligned16 ((UINT16 *) (Duid->Duid), HTONS (Dhcp6DuidTypeLlt));
WriteUnaligned16 ((UINT16 *) (Duid->Duid + 2), HTONS (NET_IFTYPE_ETHERNET));
WriteUnaligned32 ((UINT32 *) (Duid->Duid + 4), HTONL (Stamp));
CopyMem (Duid->Duid + 8, &Mode->CurrentAddress, Mode->HwAddressSize);
} }
//
// sizeof (Duid-type + hardware-type + time) = 8 bytes
//
Duid->Length = (UINT16) (Mode->HwAddressSize + 8);
//
// Set the Duid-type, hardware-type, time and copy the hardware address.
//
WriteUnaligned16 ((UINT16 *) (Duid->Duid), HTONS (Dhcp6DuidTypeLlt));
WriteUnaligned16 ((UINT16 *) (Duid->Duid + 2), HTONS (NET_IFTYPE_ETHERNET));
WriteUnaligned32 ((UINT32 *) (Duid->Duid + 4), HTONL (Stamp));
CopyMem (Duid->Duid + 8, &Mode->CurrentAddress, Mode->HwAddressSize);
Status = gRT->SetVariable ( Status = gRT->SetVariable (
L"ClientId", L"ClientId",
&gEfiDhcp6ServiceBindingProtocolGuid, &gEfiDhcp6ServiceBindingProtocolGuid,