Hi, Jiaxin The reconfig event should be created before start the tick timer, other parts are good to me.
Reviewed-by: Fu Siyuan <siyuan...@intel.com> > -----Original Message----- > From: Wu, Jiaxin > Sent: Thursday, February 25, 2016 12:22 PM > To: edk2-devel@lists.01.org > Cc: Subramanian Sriram <srira...@hpe.com>; El-Haj-Mahmoud Samer > <samer.el-haj-mahm...@hpe.com>; Ye, Ting <ting...@intel.com>; Fu, > Siyuan <siyuan...@intel.com> > Subject: [Patch 1/4] MdeModulePkg: Change the default IPv4 config policy > > Git version '3d0a49ad' commit provided a scenario to resolve the > performance issue for IPv4, but it's not workable for IPv6. To > avoid IPv4 and IPv6 inconsistency, we decided to revert that version > fix. > > If so, the default policy for Ip4Config2 is Ip4Config2PolicyDhcp, > which results in all NIC ports attempting DHCP. So, this patch is > used to changes the the default IPv4 config policy to > Ip4Config2PolicyStatic and also defer the SetData operation after > Ip4Config2Protocol installed. This update let the other platform > drivers have chance to change the default config data by consume > Ip4Config2Protocol. > > Cc: Subramanian Sriram <srira...@hpe.com> > Cc: El-Haj-Mahmoud Samer <samer.el-haj-mahm...@hpe.com> > Cc: Ye Ting <ting...@intel.com> > Cc: Fu Siyuan <siyuan...@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Jiaxin Wu <jiaxin...@intel.com> > --- > .../Universal/Network/Ip4Dxe/Ip4Config2Impl.c | 76 +++++++++++++----- > .../Universal/Network/Ip4Dxe/Ip4Config2Impl.h | 36 ++++++++- > MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c | 57 > +++++++++++++- > MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf | 2 +- > MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c | 90 > ++-------------------- > 5 files changed, 155 insertions(+), 106 deletions(-) > > diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c > b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c > index edbddba..1f763b6 100644 > --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c > +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.c > @@ -1,9 +1,9 @@ > /** @file > The implementation of EFI IPv4 Configuration II Protocol. > > - Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> > + Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR> > (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> > > This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD > License > which accompanies this distribution. The full text of the license may be > found at > @@ -1142,11 +1142,13 @@ Ip4Config2SetPolicy ( > if (NewPolicy >= Ip4Config2PolicyMax) { > return EFI_INVALID_PARAMETER; > } > > if (NewPolicy == Instance->Policy) { > - return EFI_ABORTED; > + if (NewPolicy != Ip4Config2PolicyDhcp || Instance->DhcpSuccess) { > + return EFI_ABORTED; > + } > } else { > if (NewPolicy == Ip4Config2PolicyDhcp) { > // > // The policy is changed from static to dhcp: > // Clean the ManualAddress, Gateway and DnsServers, shrink the variable > @@ -1906,11 +1908,11 @@ Ip4Config2InitInstance ( > > DataItem = &Instance->DataItem[Ip4Config2DataTypePolicy]; > DataItem->SetData = Ip4Config2SetPolicy; > DataItem->Data.Ptr = &Instance->Policy; > DataItem->DataSize = sizeof (Instance->Policy); > - Instance->Policy = Ip4Config2PolicyDhcp; > + Instance->Policy = Ip4Config2PolicyStatic; > SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED); > > DataItem = &Instance->DataItem[Ip4Config2DataTypeManualAddress]; > DataItem->SetData = Ip4Config2SetMaunualAddress; > DataItem->Status = EFI_NOT_FOUND; > @@ -1937,34 +1939,22 @@ Ip4Config2InitInstance ( > > Instance->Configured = TRUE; > > // > // Try to read the config data from NV variable. > + // If not found, write initialized config data into NV variable > + // as a default config data. > // > Status = Ip4Config2ReadConfigData (IpSb->MacString, Instance); > if (Status == EFI_NOT_FOUND) { > Status = Ip4Config2WriteConfigData (IpSb->MacString, Instance); > } > > if (EFI_ERROR (Status)) { > return Status; > } > - > - // > - // Try to set the configured parameter. > - // > - for (Index = Ip4Config2DataTypePolicy; Index < > Ip4Config2DataTypeMaximum; Index++) { > - DataItem = &IpSb->Ip4Config2Instance.DataItem[Index]; > - if (DataItem->Data.Ptr != NULL) { > - DataItem->SetData ( > - &IpSb->Ip4Config2Instance, > - DataItem->DataSize, > - DataItem->Data.Ptr > - ); > - } > - } > - > + > Instance->Ip4Config2.SetData = EfiIp4Config2SetData; > Instance->Ip4Config2.GetData = EfiIp4Config2GetData; > Instance->Ip4Config2.RegisterDataNotify = > EfiIp4Config2RegisterDataNotify; > Instance->Ip4Config2.UnregisterDataNotify = > EfiIp4Config2UnregisterDataNotify; > > @@ -2027,5 +2017,55 @@ Ip4Config2CleanInstance ( > Ip4Config2FormUnload (Instance); > > RemoveEntryList (&Instance->Link); > } > > +/** > + The event handle for IP4 auto reconfiguration. The original default > + interface and route table will be removed as the default. > + > + @param[in] Context The IP4 service binding instance. > + > +**/ > +VOID > +EFIAPI > +Ip4AutoReconfigCallBackDpc ( > + IN VOID *Context > + ) > +{ > + IP4_SERVICE *IpSb; > + > + IpSb = (IP4_SERVICE *) Context; > + NET_CHECK_SIGNATURE (IpSb, IP4_SERVICE_SIGNATURE); > + > + if (IpSb->State > IP4_SERVICE_UNSTARTED) { > + IpSb->State = IP4_SERVICE_UNSTARTED; > + } > + > + IpSb->Reconfig = TRUE; > + > + Ip4StartAutoConfig (&IpSb->Ip4Config2Instance); > + > + return ; > +} > + > + > +/** > + Request Ip4AutoReconfigCallBackDpc as a DPC at TPL_CALLBACK. > + > + @param Event The event that is signalled. > + @param Context The IP4 service binding instance. > + > +**/ > +VOID > +EFIAPI > +Ip4AutoReconfigCallBack ( > + IN EFI_EVENT Event, > + IN VOID *Context > + ) > +{ > + // > + // Request Ip4AutoReconfigCallBackDpc as a DPC at TPL_CALLBACK > + // > + QueueDpc (TPL_CALLBACK, Ip4AutoReconfigCallBackDpc, Context); > +} > + > diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.h > b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.h > index ab72525..77bdc8d 100644 > --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.h > +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Config2Impl.h > @@ -1,9 +1,9 @@ > /** @file > Definitions for EFI IPv4 Configuration II Protocol implementation. > > - Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> > + Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR> > (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> > > This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD > License > which accompanies this distribution. The full text of the license may be > found at > @@ -211,10 +211,30 @@ typedef struct { > UINT8 Dns; > } IP4_CONFIG2_DHCP4_OPTION; > #pragma pack() > > /** > + Read the configuration data from variable storage according to the > VarName and > + gEfiIp4Config2ProtocolGuid. It checks the integrity of variable data. If > the > + data is corrupted, it clears the variable data to ZERO. Othewise, it > outputs > the > + configuration data to IP4_CONFIG2_INSTANCE. > + > + @param[in] VarName The pointer to the variable name > + @param[in, out] Instance The pointer to the IP4 config2 instance data. > + > + @retval EFI_NOT_FOUND The variable can not be found or already > corrupted. > + @retval EFI_OUT_OF_RESOURCES Fail to allocate resource to complete the > operation. > + @retval EFI_SUCCESS The configuration data was retrieved > successfully. > + > +**/ > +EFI_STATUS > +Ip4Config2ReadConfigData ( > + IN CHAR16 *VarName, > + IN OUT IP4_CONFIG2_INSTANCE *Instance > + ); > + > +/** > Start the DHCP configuration for this IP service instance. > It will locates the EFI_IP4_CONFIG2_PROTOCOL, then start the > DHCP configuration. > > @param[in] Instance The IP4 config2 instance to configure. > @@ -252,10 +272,24 @@ VOID > Ip4Config2CleanInstance ( > IN OUT IP4_CONFIG2_INSTANCE *Instance > ); > > /** > + Request Ip4AutoReconfigCallBackDpc as a DPC at TPL_CALLBACK. > + > + @param Event The event that is signalled. > + @param Context The IP4 service binding instance. > + > +**/ > +VOID > +EFIAPI > +Ip4AutoReconfigCallBack ( > + IN EFI_EVENT Event, > + IN VOID *Context > + ); > + > +/** > Destroy the Dhcp4 child in IP4_CONFIG2_INSTANCE and release the > resources. > > @param[in, out] Instance The buffer of IP4 config2 instance to be freed. > > @retval EFI_SUCCESS The child was successfully destroyed. > diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c > b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c > index 3dc4d88..e12ebe9 100644 > --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c > +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c > @@ -1,9 +1,9 @@ > /** @file > The driver binding and service binding protocol for IP4 driver. > > -Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR> > (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> > > This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD > License > which accompanies this distribution. The full text of the license may be > found at > @@ -509,10 +509,17 @@ Ip4DriverBindingStart ( > IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > ) > { > EFI_STATUS Status; > IP4_SERVICE *IpSb; > + EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2; > + UINTN Index; > + IP4_CONFIG2_DATA_ITEM *DataItem; > + > + IpSb = NULL; > + Ip4Cfg2 = NULL; > + DataItem = NULL; > > // > // Test for the Ip4 service binding protocol > // > Status = gBS->OpenProtocol ( > @@ -534,25 +541,54 @@ Ip4DriverBindingStart ( > return Status; > } > > ASSERT (IpSb != NULL); > > + Ip4Cfg2 = &IpSb->Ip4Config2Instance.Ip4Config2; > + > // > // Install the Ip4ServiceBinding Protocol onto ControlerHandle > // > Status = gBS->InstallMultipleProtocolInterfaces ( > &ControllerHandle, > &gEfiIp4ServiceBindingProtocolGuid, > &IpSb->ServiceBinding, > &gEfiIp4Config2ProtocolGuid, > - &IpSb->Ip4Config2Instance.Ip4Config2, > + Ip4Cfg2, > NULL > ); > > if (EFI_ERROR (Status)) { > goto FREE_SERVICE; > } > + > + // > + // Read the config data from NV variable again. > + // The default data can be changed by other drivers. > + // > + Status = Ip4Config2ReadConfigData (IpSb->MacString, &IpSb- > >Ip4Config2Instance); > + if (EFI_ERROR (Status)) { > + goto UNINSTALL_PROTOCOL; > + } > + > + // > + // Consume the installed EFI_IP4_CONFIG2_PROTOCOL to set the default > data items. > + // > + for (Index = Ip4Config2DataTypePolicy; Index < > Ip4Config2DataTypeMaximum; Index++) { > + DataItem = &IpSb->Ip4Config2Instance.DataItem[Index]; > + if (DataItem->Data.Ptr != NULL) { > + Status = Ip4Cfg2->SetData ( > + Ip4Cfg2, > + Index, > + DataItem->DataSize, > + DataItem->Data.Ptr > + ); > + if (EFI_ERROR(Status)) { > + goto UNINSTALL_PROTOCOL; > + } > + } > + } > > // > // Ready to go: start the receiving and timer. > // Ip4Config2SetPolicy maybe call Ip4ReceiveFrame() to set the default > interface's RecvRequest first after > // Ip4Config2 instance is initialized. So, EFI_ALREADY_STARTED is the > allowed return status. > @@ -568,10 +604,27 @@ Ip4DriverBindingStart ( > if (EFI_ERROR (Status)) { > goto UNINSTALL_PROTOCOL; > } > > // > + // Create the ReconfigEvent to start the new configuration. > + // > + if (IpSb->ReconfigEvent == NULL) { > + Status = gBS->CreateEvent ( > + EVT_NOTIFY_SIGNAL, > + TPL_NOTIFY, > + Ip4AutoReconfigCallBack, > + IpSb, > + &IpSb->ReconfigEvent > + ); > + > + if (EFI_ERROR (Status)) { > + goto UNINSTALL_PROTOCOL; > + } > + } > + > + // > // Initialize the IP4 ID > // > mIp4Id = (UINT16)NET_RANDOM (NetRandomInitSeed ()); > > return Status; > diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf > b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf > index f561af0..3135287 100644 > --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf > +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf > @@ -4,11 +4,11 @@ > # This module produces EFI IPv4 Protocol upon EFI MNP Protocol and EFI > ARP Protocol, > # to provide basic network IPv4 packet I/O services, which includes support > for a > # subset of the Internet Control Message Protocol (ICMP) and may include > support for > # the Internet Group Management Protocol (IGMP). > # > -# Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> > # This program and the accompanying materials > # are licensed and made available under the terms and conditions of the > BSD License > # which accompanies this distribution. The full text of the license may be > found at > # http://opensource.org/licenses/bsd-license.php > # > diff --git a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c > b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c > index b9a294b..58adba7 100644 > --- a/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c > +++ b/MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c > @@ -1,8 +1,8 @@ > /** @file > > -Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR> > This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD > License > which accompanies this distribution. The full text of the license may be > found at > http://opensource.org/licenses/bsd-license.php > > @@ -562,61 +562,10 @@ Ip4InitProtocol ( > EfiInitializeLock (&IpInstance->RecycleLock, TPL_NOTIFY); > } > > > /** > - The event handle for IP4 auto reconfiguration. The original default > - interface and route table will be removed as the default. > - > - @param[in] Context The IP4 service binding instance. > - > -**/ > -VOID > -EFIAPI > -Ip4AutoReconfigCallBackDpc ( > - IN VOID *Context > - ) > -{ > - IP4_SERVICE *IpSb; > - > - IpSb = (IP4_SERVICE *) Context; > - NET_CHECK_SIGNATURE (IpSb, IP4_SERVICE_SIGNATURE); > - > - if (IpSb->State > IP4_SERVICE_UNSTARTED) { > - IpSb->State = IP4_SERVICE_UNSTARTED; > - } > - > - IpSb->Reconfig = TRUE; > - > - Ip4StartAutoConfig (&IpSb->Ip4Config2Instance); > - > - return ; > -} > - > - > -/** > - Request Ip4AutoReconfigCallBackDpc as a DPC at TPL_CALLBACK. > - > - @param Event The event that is signalled. > - @param Context The IP4 service binding instance. > - > -**/ > -VOID > -EFIAPI > -Ip4AutoReconfigCallBack ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - // > - // Request Ip4AutoReconfigCallBackDpc as a DPC at TPL_CALLBACK > - // > - QueueDpc (TPL_CALLBACK, Ip4AutoReconfigCallBackDpc, Context); > -} > - > - > -/** > Configure the IP4 child. If the child is already configured, > change the configuration parameter. Otherwise configure it > for the first time. The caller should validate the configuration > before deliver them to it. It also don't do configure NULL. > > @@ -722,36 +671,15 @@ Ip4ConfigProtocol ( > // > Ip4AddRoute (IpInstance->RouteTable, Ip, Netmask, > IP4_ALLZERO_ADDRESS); > > } else { > // > - // Use the default address. If the default configuration hasn't > - // been started, start it. > + // Use the default address. Check the state. > // > if (IpSb->State == IP4_SERVICE_UNSTARTED) { > - // > - // Create the ReconfigEvent to start the new configuration. > - // > - if (IpSb->ReconfigEvent == NULL) { > - Status = gBS->CreateEvent ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - Ip4AutoReconfigCallBack, > - IpSb, > - &IpSb->ReconfigEvent > - ); > - > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - } > - > - Status = Ip4StartAutoConfig (&IpSb->Ip4Config2Instance); > - > - if (EFI_ERROR (Status)) { > - goto CLOSE_RECONFIG_EVENT; > - } > + Status = EFI_NO_MAPPING; > + goto ON_ERROR; > } > > IpIf = IpSb->DefaultInterface; > NET_GET_REF (IpSb->DefaultInterface); > > @@ -776,11 +704,11 @@ Ip4ConfigProtocol ( > gIp4DriverBinding.DriverBindingHandle, > IpInstance->Handle, > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER > ); > if (EFI_ERROR (Status)) { > - goto CLOSE_RECONFIG_EVENT; > + goto ON_ERROR; > } > } > InsertTailList (&IpIf->IpInstances, &IpInstance->AddrLink); > > CopyMem (&IpInstance->ConfigData, Config, sizeof (IpInstance- > >ConfigData)); > @@ -795,16 +723,10 @@ Ip4ConfigProtocol ( > return EFI_NO_MAPPING; > } > > return EFI_SUCCESS; > > -CLOSE_RECONFIG_EVENT: > - if (IpSb->ReconfigEvent != NULL) { > - gBS->CloseEvent (IpSb->ReconfigEvent); > - IpSb->ReconfigEvent = NULL; > - } > - > ON_ERROR: > Ip4FreeRouteTable (IpInstance->RouteTable); > IpInstance->RouteTable = NULL; > return Status; > } > @@ -2415,11 +2337,11 @@ Ip4TimerTicking ( > > IpSb->MediaPresent = SnpModeData.MediaPresent; > // > // Media transimit Unpresent to Present means new link movement is > detected. > // > - if (!OldMediaPresent && IpSb->MediaPresent) { > + if (!OldMediaPresent && IpSb->MediaPresent && (IpSb- > >Ip4Config2Instance.Policy == Ip4Config2PolicyDhcp)) { > // > // Signal the IP4 to run the dhcp configuration again. IP4 driver will > free > // old IP address related resource, such as route table and Interface, > then > // initiate a DHCP round to acquire new IP, eventually > // create route table for new IP address. > -- > 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel