mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-28 16:14:04 +02:00
NetworkPkg/Ip6Dxe: Support SetData interface to clear specific configuration
UEFI Spec 2.7 adds the clarification on SetData interface usage to clear specific individual data types. This patch is to support this feature. Cc: Ye Ting <ting.ye@intel.com> Cc: Fu Siyuan <siyuan.fu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Wu Jiaxin <jiaxin.wu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com>
This commit is contained in:
parent
1126570464
commit
bee7fe0ef9
@ -953,10 +953,26 @@ Ip6ConfigSetManualAddress (
|
||||
IP6_PREFIX_LIST_ENTRY *PrefixEntry;
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN IsUpdated;
|
||||
LIST_ENTRY *Next;
|
||||
IP6_DAD_ENTRY *DadEntry;
|
||||
IP6_DELAY_JOIN_LIST *DelayNode;
|
||||
|
||||
NewAddress = NULL;
|
||||
TmpAddress = NULL;
|
||||
CurrentAddrInfo = NULL;
|
||||
Copy = NULL;
|
||||
Entry = NULL;
|
||||
Entry2 = NULL;
|
||||
IpIf = NULL;
|
||||
PrefixEntry = NULL;
|
||||
Next = NULL;
|
||||
DadEntry = NULL;
|
||||
DelayNode = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
ASSERT (Instance->DataItem[Ip6ConfigDataTypeManualAddress].Status != EFI_NOT_READY);
|
||||
|
||||
if (((DataSize % sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS)) != 0) || (DataSize == 0)) {
|
||||
if ((DataSize != 0) && ((DataSize % sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS)) != 0)) {
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
@ -964,6 +980,11 @@ Ip6ConfigSetManualAddress (
|
||||
return EFI_WRITE_PROTECTED;
|
||||
}
|
||||
|
||||
IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
|
||||
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
|
||||
|
||||
if (Data != NULL && DataSize != 0) {
|
||||
NewAddressCount = DataSize / sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS);
|
||||
NewAddress = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) Data;
|
||||
|
||||
@ -992,8 +1013,6 @@ Ip6ConfigSetManualAddress (
|
||||
}
|
||||
}
|
||||
|
||||
IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
|
||||
|
||||
//
|
||||
// Build the current source address list.
|
||||
//
|
||||
@ -1030,7 +1049,6 @@ Ip6ConfigSetManualAddress (
|
||||
// Store the new data, and init the DataItem status to EFI_NOT_READY because
|
||||
// we may have an asynchronous configuration process.
|
||||
//
|
||||
DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
|
||||
if (DataItem->Data.Ptr != NULL) {
|
||||
FreePool (DataItem->Data.Ptr);
|
||||
}
|
||||
@ -1198,6 +1216,67 @@ Ip6ConfigSetManualAddress (
|
||||
DataItem->Status = EFI_SUCCESS;
|
||||
Status = EFI_ABORTED;
|
||||
}
|
||||
} else {
|
||||
//
|
||||
// DataSize is 0 and Data is NULL, clean up the manual address.
|
||||
//
|
||||
if (DataItem->Data.Ptr != NULL) {
|
||||
FreePool (DataItem->Data.Ptr);
|
||||
}
|
||||
DataItem->Data.Ptr = NULL;
|
||||
DataItem->DataSize = 0;
|
||||
DataItem->Status = EFI_NOT_FOUND;
|
||||
|
||||
Ip6CleanDefaultRouterList (IpSb);
|
||||
Ip6CleanPrefixListTable (IpSb, &IpSb->OnlinkPrefix);
|
||||
Ip6CleanPrefixListTable (IpSb, &IpSb->AutonomousPrefix);
|
||||
Ip6CleanAssembleTable (&IpSb->Assemble);
|
||||
|
||||
if (IpSb->LinkLocalOk) {
|
||||
Ip6CreatePrefixListEntry (
|
||||
IpSb,
|
||||
TRUE,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
(UINT32) IP6_INFINIT_LIFETIME,
|
||||
IP6_LINK_LOCAL_PREFIX_LENGTH,
|
||||
&IpSb->LinkLocalAddr
|
||||
);
|
||||
}
|
||||
|
||||
Ip6RemoveAddr (
|
||||
IpSb,
|
||||
&IpSb->DefaultInterface->AddressList,
|
||||
&IpSb->DefaultInterface->AddressCount,
|
||||
NULL,
|
||||
0
|
||||
);
|
||||
|
||||
NET_LIST_FOR_EACH (Entry, &IpSb->Interfaces) {
|
||||
//
|
||||
// Remove all pending delay node and DAD entries for the global addresses.
|
||||
//
|
||||
IpIf = NET_LIST_USER_STRUCT_S (Entry, IP6_INTERFACE, Link, IP6_INTERFACE_SIGNATURE);
|
||||
|
||||
NET_LIST_FOR_EACH_SAFE (Entry2, Next, &IpIf->DelayJoinList) {
|
||||
DelayNode = NET_LIST_USER_STRUCT (Entry2, IP6_DELAY_JOIN_LIST, Link);
|
||||
if (!NetIp6IsLinkLocalAddr (&DelayNode->AddressInfo->Address)) {
|
||||
RemoveEntryList (&DelayNode->Link);
|
||||
FreePool (DelayNode);
|
||||
}
|
||||
}
|
||||
|
||||
NET_LIST_FOR_EACH_SAFE (Entry2, Next, &IpIf->DupAddrDetectList) {
|
||||
DadEntry = NET_LIST_USER_STRUCT_S (Entry2, IP6_DAD_ENTRY, Link, IP6_DAD_ENTRY_SIGNATURE);
|
||||
|
||||
if (!NetIp6IsLinkLocalAddr (&DadEntry->AddressInfo->Address)) {
|
||||
//
|
||||
// Fail this DAD entry if the address is not link-local.
|
||||
//
|
||||
Ip6OnDADFinished (FALSE, IpIf, DadEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
@ -1244,7 +1323,15 @@ Ip6ConfigSetGateway (
|
||||
IP6_DEFAULT_ROUTER *DefaultRouter;
|
||||
VOID *Tmp;
|
||||
|
||||
if ((DataSize % sizeof (EFI_IPv6_ADDRESS) != 0) || (DataSize == 0)) {
|
||||
OldGateway = NULL;
|
||||
NewGateway = NULL;
|
||||
Item = NULL;
|
||||
DefaultRouter = NULL;
|
||||
Tmp = NULL;
|
||||
OneRemoved = FALSE;
|
||||
OneAdded = FALSE;
|
||||
|
||||
if ((DataSize != 0) && (DataSize % sizeof (EFI_IPv6_ADDRESS) != 0)) {
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
@ -1252,6 +1339,23 @@ Ip6ConfigSetGateway (
|
||||
return EFI_WRITE_PROTECTED;
|
||||
}
|
||||
|
||||
IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
|
||||
Item = &Instance->DataItem[Ip6ConfigDataTypeGateway];
|
||||
OldGateway = Item->Data.Gateway;
|
||||
OldGatewayCount = Item->DataSize / sizeof (EFI_IPv6_ADDRESS);
|
||||
|
||||
for (Index1 = 0; Index1 < OldGatewayCount; Index1++) {
|
||||
//
|
||||
// Remove this default router.
|
||||
//
|
||||
DefaultRouter = Ip6FindDefaultRouter (IpSb, OldGateway + Index1);
|
||||
if (DefaultRouter != NULL) {
|
||||
Ip6DestroyDefaultRouter (IpSb, DefaultRouter);
|
||||
OneRemoved = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (Data != NULL && DataSize != 0) {
|
||||
NewGateway = (EFI_IPv6_ADDRESS *) Data;
|
||||
NewGatewayCount = DataSize / sizeof (EFI_IPv6_ADDRESS);
|
||||
for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {
|
||||
@ -1268,13 +1372,6 @@ Ip6ConfigSetGateway (
|
||||
}
|
||||
}
|
||||
|
||||
IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
|
||||
Item = &Instance->DataItem[Ip6ConfigDataTypeGateway];
|
||||
OldGateway = Item->Data.Gateway;
|
||||
OldGatewayCount = Item->DataSize / sizeof (EFI_IPv6_ADDRESS);
|
||||
OneRemoved = FALSE;
|
||||
OneAdded = FALSE;
|
||||
|
||||
if (NewGatewayCount != OldGatewayCount) {
|
||||
Tmp = AllocatePool (DataSize);
|
||||
if (Tmp == NULL) {
|
||||
@ -1284,28 +1381,6 @@ Ip6ConfigSetGateway (
|
||||
Tmp = NULL;
|
||||
}
|
||||
|
||||
for (Index1 = 0; Index1 < OldGatewayCount; Index1++) {
|
||||
//
|
||||
// Find the gateways that are no long in the new setting and remove them.
|
||||
//
|
||||
for (Index2 = 0; Index2 < NewGatewayCount; Index2++) {
|
||||
if (EFI_IP6_EQUAL (OldGateway + Index1, NewGateway + Index2)) {
|
||||
OneRemoved = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Index2 == NewGatewayCount) {
|
||||
//
|
||||
// Remove this default router.
|
||||
//
|
||||
DefaultRouter = Ip6FindDefaultRouter (IpSb, OldGateway + Index1);
|
||||
if (DefaultRouter != NULL) {
|
||||
Ip6DestroyDefaultRouter (IpSb, DefaultRouter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {
|
||||
|
||||
DefaultRouter = Ip6FindDefaultRouter (IpSb, NewGateway + Index1);
|
||||
@ -1332,6 +1407,19 @@ Ip6ConfigSetGateway (
|
||||
Item->Status = EFI_SUCCESS;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
} else {
|
||||
//
|
||||
// DataSize is 0 and Data is NULL, clean up the Gateway address.
|
||||
//
|
||||
if (Item->Data.Ptr != NULL) {
|
||||
FreePool (Item->Data.Ptr);
|
||||
}
|
||||
Item->Data.Ptr = NULL;
|
||||
Item->DataSize = 0;
|
||||
Item->Status = EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1373,7 +1461,12 @@ Ip6ConfigSetDnsServer (
|
||||
BOOLEAN OneAdded;
|
||||
VOID *Tmp;
|
||||
|
||||
if ((DataSize % sizeof (EFI_IPv6_ADDRESS) != 0) || (DataSize == 0)) {
|
||||
OldDns = NULL;
|
||||
NewDns = NULL;
|
||||
Item = NULL;
|
||||
Tmp = NULL;
|
||||
|
||||
if ((DataSize == 0) && (DataSize % sizeof (EFI_IPv6_ADDRESS) != 0)) {
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
@ -1382,6 +1475,8 @@ Ip6ConfigSetDnsServer (
|
||||
}
|
||||
|
||||
Item = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];
|
||||
|
||||
if (Data != NULL && DataSize != 0) {
|
||||
NewDns = (EFI_IPv6_ADDRESS *) Data;
|
||||
OldDns = Item->Data.DnsServers;
|
||||
NewDnsCount = DataSize / sizeof (EFI_IPv6_ADDRESS);
|
||||
@ -1448,8 +1543,20 @@ Ip6ConfigSetDnsServer (
|
||||
CopyMem (Item->Data.Ptr, Data, DataSize);
|
||||
Item->DataSize = DataSize;
|
||||
Item->Status = EFI_SUCCESS;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
} else {
|
||||
//
|
||||
// DataSize is 0 and Data is NULL, clean up the DnsServer address.
|
||||
//
|
||||
if (Item->Data.Ptr != NULL) {
|
||||
FreePool (Item->Data.Ptr);
|
||||
}
|
||||
Item->Data.Ptr = NULL;
|
||||
Item->DataSize = 0;
|
||||
Item->Status = EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1858,9 +1965,8 @@ Ip6ConfigOnDhcp6SbInstalled (
|
||||
network stack was set successfully.
|
||||
@retval EFI_INVALID_PARAMETER One or more of the following are TRUE:
|
||||
- This is NULL.
|
||||
- Data is NULL.
|
||||
- One or more fields in Data do not match the requirement of the
|
||||
data type indicated by DataType.
|
||||
- One or more fields in Data and DataSizedo not match the
|
||||
requirement of the data type indicated by DataType.
|
||||
@retval EFI_WRITE_PROTECTED The specified configuration data is read-only or the specified
|
||||
configuration data cannot be set under the current policy.
|
||||
@retval EFI_ACCESS_DENIED Another set operation on the specified configuration
|
||||
@ -1888,7 +1994,7 @@ EfiIp6ConfigSetData (
|
||||
IP6_CONFIG_INSTANCE *Instance;
|
||||
IP6_SERVICE *IpSb;
|
||||
|
||||
if ((This == NULL) || (Data == NULL)) {
|
||||
if ((This == NULL) || (Data == NULL && DataSize != 0) || (Data != NULL && DataSize == 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user