diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c index 028c61de06..f91a935634 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c @@ -1060,7 +1060,6 @@ Ip4Config2GetIfInfo ( IN VOID *Data OPTIONAL ) { - IP4_SERVICE *IpSb; UINTN Length; IP4_CONFIG2_DATA_ITEM *Item; @@ -1179,6 +1178,7 @@ Ip4Config2SetPolicy ( DataItem->Data.Ptr = NULL; DataItem->DataSize = 0; DataItem->Status = EFI_NOT_FOUND; + SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_VOLATILE); NetMapIterate (&DataItem->EventMap, Ip4Config2SignalEvent, NULL); } else { // @@ -1459,10 +1459,20 @@ Ip4Config2SetDnsServer ( IN VOID *Data ) { + IP4_CONFIG2_DATA_ITEM *Item; + + Item = NULL; + if (Instance->Policy != Ip4Config2PolicyStatic) { return EFI_WRITE_PROTECTED; } + Item = &Instance->DataItem[Ip4Config2DataTypeDnsServer]; + + if (DATA_ATTRIB_SET (Item->Attribute, DATA_ATTRIB_VOLATILE)) { + REMOVE_DATA_ATTRIB (Item->Attribute, DATA_ATTRIB_VOLATILE); + } + return Ip4Config2SetDnsServerWorker (Instance, DataSize, Data); } diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.h b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.h index b2665bd3c1..b6da11f8ec 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.h +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.h @@ -27,6 +27,7 @@ #define DATA_ATTRIB_SET(Attrib, Bits) (BOOLEAN)((Attrib) & (Bits)) #define SET_DATA_ATTRIB(Attrib, Bits) ((Attrib) |= (Bits)) +#define REMOVE_DATA_ATTRIB(Attrib, Bits) ((Attrib) &= (~Bits)) typedef struct _IP4_CONFIG2_INSTANCE IP4_CONFIG2_INSTANCE; diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c index fcd3ccb9fd..20bc21fec1 100644 --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c @@ -598,6 +598,10 @@ Ip4DriverBindingStart ( if (EFI_ERROR(Status)) { goto UNINSTALL_PROTOCOL; } + + if (Index == Ip4Config2DataTypePolicy && (*(DataItem->Data.Policy) == Ip4Config2PolicyDhcp)) { + break; + } } }