Hi @Liming Gao<mailto:gaolim...@byosoft.com.cn>, @Kinney, Michael 
D<mailto:michael.d.kin...@intel.com>



> If the patch is sent before Soft Feature Freeze, and plans to catch this 
> stable tag, the patch contributor need reply to his patch and notify edk2 
> community



We would like to include this fix to edk2-stable202311 release. Could you 
please help us to merge this patch? This patch review was started on November 
1: https://edk2.groups.io/g/devel/message/110440. Anber and I gave reviewed-by 
to this patch today. We have a pull request ready for merging here: 
https://github.com/tianocore/edk2/pull/4994



Thanks,

Nickle



> -----Original Message-----

> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Chang, Abner

> via groups.io

> Sent: Wednesday, November 8, 2023 8:14 AM

> To: Igor Kulchytskyy <ig...@ami.com>; devel@edk2.groups.io

> Cc: Nickle Wang <nick...@nvidia.com>

> Subject: Re: [edk2-devel] [PATCH v3] RedfishPkg: RedfishDiscoverDxe: Fix 
> issue if

> IPv4 installed after RestEx

>

> External email: Use caution opening links or attachments

>

>

> [AMD Official Use Only - General]

>

> Reviewed-by: Abner Chang <abner.ch...@amd.com<mailto:abner.ch...@amd.com>>

>

> > -----Original Message-----

> > From: Igor Kulchytskyy <ig...@ami.com<mailto:ig...@ami.com>>

> > Sent: Tuesday, November 7, 2023 8:06 PM

> > To: devel@edk2.groups.io<mailto:devel@edk2.groups.io>

> > Cc: Chang, Abner <abner.ch...@amd.com<mailto:abner.ch...@amd.com>>; Nickle 
> > Wang

> > <nick...@nvidia.com<mailto:nick...@nvidia.com>>

> > Subject: [PATCH v3] RedfishPkg: RedfishDiscoverDxe: Fix issue if IPv4

> > installed after RestEx

> >

> > Caution: This message originated from an External Source. Use proper

> > caution when opening attachments, clicking links, or responding.

> >

> >

> > Supported function of the driver changed to wait for all newtwork

> > interface to be installed.

> > Filer out the network interfaces which are not supported by Redfish

> > Host Interface.

> >

> > Cc: Abner Chang <abner.ch...@amd.com<mailto:abner.ch...@amd.com>>

> > Cc: Nickle Wang <nick...@nvidia.com<mailto:nick...@nvidia.com>>

> > Signed-off-by: Igor Kulchytskyy <ig...@ami.com<mailto:ig...@ami.com>>

> > ---

> >  RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c | 165

> > ++++++++++++++------

> >  1 file changed, 117 insertions(+), 48 deletions(-)

> >

> > diff --git a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c

> > b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c

> > index 23da3b968f..85e47843e4 100644

> > --- a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c

> > +++ b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c

> > @@ -322,9 +322,16 @@ GetTargetNetworkInterfaceInternal (  {

> >    EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL

> > *ThisNetworkInterface;

> >

> > +  if (IsListEmpty (&mEfiRedfishDiscoverNetworkInterface)) {

> > +    return NULL;

> > +  }

> > +

> >    ThisNetworkInterface =

> > (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *)GetFirstNode

> > (&mEfiRedfishDiscoverNetworkInterface);

> >    while (TRUE) {

> > -    if (CompareMem ((VOID *)&ThisNetworkInterface->MacAddress,

> > &TargetNetworkInterface->MacAddress, ThisNetworkInterface-

> > >HwAddressSize) == 0) {

> > +    if ((CompareMem ((VOID *)&ThisNetworkInterface->MacAddress,

> > &TargetNetworkInterface->MacAddress, ThisNetworkInterface-

> > >HwAddressSize) == 0) &&

> > +        ((TargetNetworkInterface->IsIpv6 && (ThisNetworkInterface-

> > >NetworkProtocolType == ProtocolTypeTcp6)) ||

> > +         (!TargetNetworkInterface->IsIpv6 && (ThisNetworkInterface-

> > >NetworkProtocolType == ProtocolTypeTcp4))))

> > +    {

> >        return ThisNetworkInterface;

> >      }

> >

> > @@ -354,6 +361,10 @@ GetTargetNetworkInterfaceInternalByController (

> > {

> >    EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL

> > *ThisNetworkInterface;

> >

> > +  if (IsListEmpty (&mEfiRedfishDiscoverNetworkInterface)) {

> > +    return NULL;

> > +  }

> > +

> >    ThisNetworkInterface =

> > (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *)GetFirstNode

> > (&mEfiRedfishDiscoverNetworkInterface);

> >    while (TRUE) {

> >      if (ThisNetworkInterface->OpenDriverControllerHandle ==

> > ControllerHandle) {

> > @@ -476,6 +487,42 @@ CheckIsIpVersion6 (

> >    return FALSE;

> >  }

> >

> > +/**

> > +  This function returns the  IP type supported by the Host Interface.

> > +

> > +  @retval 00h is Unknown

> > +          01h is Ipv4

> > +          02h is Ipv6

> > +

> > +**/

> > +UINT8

> > +GetHiIpProtocolType (

> > +  VOID

> > +  )

> > +{

> > +  EFI_STATUS                     Status;

> > +  REDFISH_OVER_IP_PROTOCOL_DATA  *Data;

> > +  REDFISH_INTERFACE_DATA         *DeviceDescriptor;

> > +

> > +  Data             = NULL;

> > +  DeviceDescriptor = NULL;

> > +  if (mSmbios == NULL) {

> > +    Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL,

> > + (VOID

> > **)&mSmbios);

> > +    if (EFI_ERROR (Status)) {

> > +      return

> > REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_UNKNOWN;

> > +    }

> > +  }

> > +

> > +  Status = RedfishGetHostInterfaceProtocolData (mSmbios,

> > &DeviceDescriptor, &Data); // Search for SMBIOS type 42h

> > +  if (!EFI_ERROR (Status) && (Data != NULL) &&

> > +      (Data->HostIpAssignmentType == RedfishHostIpAssignmentStatic))

> > + {

> > +    return Data->HostIpAddressFormat;  }

> > +

> > +  return

> > REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_UNKNOWN;

> > +}

> > +

> >  /**

> >    This function discover Redfish service through SMBIOS host interface.

> >

> > @@ -512,6 +559,18 @@ DiscoverRedfishHostInterface (

> >

> >    Status = RedfishGetHostInterfaceProtocolData (mSmbios,

> > &DeviceDescriptor, &Data); // Search for SMBIOS type 42h

> >    if (!EFI_ERROR (Status) && (Data != NULL) && (DeviceDescriptor !=

> > NULL)) {

> > +    if ((Instance->NetworkInterface->NetworkProtocolType ==

> > ProtocolTypeTcp4) &&

> > +        (Data->HostIpAddressFormat !=

> > REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP4)) // IPv4 case

> > +    {

> > +      DEBUG ((DEBUG_ERROR, "%a: Network Interface is IPv4, but Host

> > Interface requires Ipv6\n", __func__));

> > +      return EFI_UNSUPPORTED;

> > +    } else if ((Instance->NetworkInterface->NetworkProtocolType ==

> > ProtocolTypeTcp6) &&

> > +               (Data->HostIpAddressFormat !=

> > REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP6)) // IPv6 case

> > +    {

> > +      DEBUG ((DEBUG_ERROR, "%a: Network Interface is IPv6, but Host

> > Interface requires IPv4\n", __func__));

> > +      return EFI_UNSUPPORTED;

> > +    }

> > +

> >      //

> >      // Check if we can reach out Redfish service using this network 
> > interface.

> >      // Check with MAC address using Device Descriptor Data Device

> > Type 04 and Type 05.

> > @@ -1102,6 +1161,7 @@ RedfishServiceGetNetworkInterface (

> >    OUT EFI_REDFISH_DISCOVER_NETWORK_INTERFACE

> > **NetworkIntfInstances

> >    )

> >  {

> > +  EFI_STATUS                                       Status;

> >    EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL

> > *ThisNetworkInterfaceIntn;

> >    EFI_REDFISH_DISCOVER_NETWORK_INTERFACE

> > *ThisNetworkInterface;

> >    EFI_REDFISH_DISCOVER_REST_EX_INSTANCE_INTERNAL   *RestExInstance;

> > @@ -1141,13 +1201,23 @@ RedfishServiceGetNetworkInterface (

> >

> >    ThisNetworkInterfaceIntn =

> > (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *)GetFirstNode

> > (&mEfiRedfishDiscoverNetworkInterface);

> >    while (TRUE) {

> > +    // If Get Subnet Info failed then skip this interface

> > +    Status = NetworkInterfaceGetSubnetInfo (ThisNetworkInterfaceIntn,

> > ImageHandle); // Get subnet info

> > +    if (EFI_ERROR (Status)) {

> > +      if (IsNodeAtEnd (&mEfiRedfishDiscoverNetworkInterface,

> > &ThisNetworkInterfaceIntn->Entry)) {

> > +        break;

> > +      }

> > +

> > +      ThisNetworkInterfaceIntn =

> > (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *)GetNextNode

> > (&mEfiRedfishDiscoverNetworkInterface,

> > &ThisNetworkInterfaceIntn->Entry);

> > +      continue;

> > +    }

> > +

> >      ThisNetworkInterface->IsIpv6 = FALSE;

> >      if (CheckIsIpVersion6 (ThisNetworkInterfaceIntn)) {

> >        ThisNetworkInterface->IsIpv6 = TRUE;

> >      }

> >

> >      CopyMem ((VOID *)&ThisNetworkInterface->MacAddress,

> > &ThisNetworkInterfaceIntn->MacAddress, ThisNetworkInterfaceIntn-

> > >HwAddressSize);

> > -    NetworkInterfaceGetSubnetInfo (ThisNetworkInterfaceIntn, ImageHandle);

> > // Get subnet info.

> >      if (!ThisNetworkInterface->IsIpv6) {

> >        IP4_COPY_ADDRESS (&ThisNetworkInterface->SubnetId.v4,

> > &ThisNetworkInterfaceIntn->SubnetAddr.v4); // IPv4 subnet information.

> >      } else {

> > @@ -1230,7 +1300,12 @@ RedfishServiceAcquireService (

> >

> >    if (TargetNetworkInterface != NULL) {

> >      TargetNetworkInterfaceInternal =

> > GetTargetNetworkInterfaceInternal (TargetNetworkInterface);

> > -    NumNetworkInterfaces           = 1;

> > +    if (TargetNetworkInterfaceInternal == NULL) {

> > +      DEBUG ((DEBUG_ERROR, "%a:No network interface on platform.\n",

> > __func__));

> > +      return EFI_UNSUPPORTED;

> > +    }

> > +

> > +    NumNetworkInterfaces = 1;

> >    } else {

> >      TargetNetworkInterfaceInternal =

> > (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *)GetFirstNode

> > (&mEfiRedfishDiscoverNetworkInterface);

> >      NumNetworkInterfaces           = NumberOfNetworkInterface ();

> > @@ -1260,7 +1335,13 @@ RedfishServiceAcquireService (

> >        // Get subnet information in case subnet information is not set 
> > because

> >        // RedfishServiceGetNetworkInterfaces hasn't been called yet.

> >        //

> > -      NetworkInterfaceGetSubnetInfo (TargetNetworkInterfaceInternal,

> > ImageHandle);

> > +      Status1 = NetworkInterfaceGetSubnetInfo

> > (TargetNetworkInterfaceInternal, ImageHandle);

> > +      if (EFI_ERROR (Status1)) {

> > +        DEBUG ((DEBUG_ERROR, "%a: Get subnet information fail.\n",

> > __func__));

> > +        FreePool (Instance);

> > +        continue;

> > +      }

> > +

> >        NewInstance = TRUE;

> >      }

> >

> > @@ -1547,25 +1628,26 @@ TestForRequiredProtocols (

> >                      ControllerHandle,

> >                      EFI_OPEN_PROTOCOL_TEST_PROTOCOL

> >                      );

> > +    if (EFI_ERROR (Status)) {

> > +      return EFI_UNSUPPORTED;

> > +    }

> > +

> > +    Status = gBS->OpenProtocol (

> > +                    ControllerHandle,

> > +                    gRequiredProtocol[Index].DiscoveredProtocolGuid,

> > +                    (VOID **)&Id,

> > +                    This->DriverBindingHandle,

> > +                    ControllerHandle,

> > +                    EFI_OPEN_PROTOCOL_GET_PROTOCOL

> > +                    );

> >      if (!EFI_ERROR (Status)) {

> > -      Status = gBS->OpenProtocol (

> > -                      ControllerHandle,

> > -                      gRequiredProtocol[Index].DiscoveredProtocolGuid,

> > -                      (VOID **)&Id,

> > -                      This->DriverBindingHandle,

> > -                      ControllerHandle,

> > -                      EFI_OPEN_PROTOCOL_GET_PROTOCOL

> > -                      );

> > -      if (EFI_ERROR (Status)) {

> > -        if (Index == ListCount - 1) {

> > -          DEBUG ((DEBUG_INFO, "%a: all required protocols are found on this

> > controller handle: %p.\n", __func__, ControllerHandle));

> > -          return EFI_SUCCESS;

> > -        }

> > -      }

> > +      // Already installed

> > +      return EFI_UNSUPPORTED;

> >      }

> >    }

> >

> > -  return EFI_UNSUPPORTED;

> > +  DEBUG ((DEBUG_MANAGEABILITY, "%a: all required protocols are found

> > + on

> > this controller handle: %p.\n", __func__, ControllerHandle));

> > +  return EFI_SUCCESS;

> >  }

> >

> >  /**

> > @@ -1600,10 +1682,24 @@ BuildupNetworkInterface (

> >    EFI_REDFISH_DISCOVER_REST_EX_INSTANCE_INTERNAL   *RestExInstance;

> >    EFI_TPL                                          OldTpl;

> >    BOOLEAN                                          
> > NewNetworkInterfaceInstalled;

> > +  UINT8                                            IpType;

> > +  UINTN                                            ListCount;

> >

> > +  ListCount                    = (sizeof (gRequiredProtocol) / sizeof

> > (REDFISH_DISCOVER_REQUIRED_PROTOCOL));

> >    NewNetworkInterfaceInstalled = FALSE;

> >    Index                        = 0;

> > -  do {

> > +

> > +  // Get IP Type to filter out unnecessary network protocol if

> > + possible  IpType = GetHiIpProtocolType ();

> > +

> > +  for (Index = 0; Index < ListCount; Index++) {

> > +    // Check IP Type and skip an unnecessary network protocol if does

> > + not

> > match

> > +    if (((gRequiredProtocol[Index].ProtocolType == ProtocolTypeTcp4)

> > + &&

> > (IpType == REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP6)) ||

> > +        ((gRequiredProtocol[Index].ProtocolType == ProtocolTypeTcp6)

> > + &&

> > (IpType == REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP4)))

> > +    {

> > +      continue;

> > +    }

> > +

> >      Status = gBS->OpenProtocol (

> >                      // Already in list?

> >                      ControllerHandle, @@ -1614,11 +1710,6 @@

> > BuildupNetworkInterface (

> >                      EFI_OPEN_PROTOCOL_GET_PROTOCOL

> >                      );

> >      if (!EFI_ERROR (Status)) {

> > -      Index++;

> > -      if (Index == (sizeof (gRequiredProtocol) / sizeof

> > (REDFISH_DISCOVER_REQUIRED_PROTOCOL))) {

> > -        break;

> > -      }

> > -

> >        continue;

> >      }

> >

> > @@ -1631,11 +1722,6 @@ BuildupNetworkInterface (

> >                      EFI_OPEN_PROTOCOL_GET_PROTOCOL

> >                      );

> >      if (EFI_ERROR (Status)) {

> > -      Index++;

> > -      if (Index == (sizeof (gRequiredProtocol) / sizeof

> > (REDFISH_DISCOVER_REQUIRED_PROTOCOL))) {

> > -        break;

> > -      }

> > -

> >        continue;

> >      }

> >

> > @@ -1694,11 +1780,6 @@ BuildupNetworkInterface (

> >                      ProtocolDiscoverIdPtr

> >                      );

> >      if (EFI_ERROR (Status)) {

> > -      Index++;

> > -      if (Index == (sizeof (gRequiredProtocol) / sizeof

> > (REDFISH_DISCOVER_REQUIRED_PROTOCOL))) {

> > -        break;

> > -      }

> > -

> >        continue;

> >      }

> >

> > @@ -1755,25 +1836,13 @@ BuildupNetworkInterface (

> >            }

> >          } else {

> >            DEBUG ((DEBUG_MANAGEABILITY, "%a: Not REST EX, continue

> > with next\n", __func__));

> > -          Index++;

> > -          if (Index == (sizeof (gRequiredProtocol) / sizeof

> > (REDFISH_DISCOVER_REQUIRED_PROTOCOL))) {

> > -            break;

> > -          }

> > -

> >            continue;

> >          }

> >        }

> >

> >        return Status;

> > -    } else {

> > -      Index++;

> > -      if (Index == (sizeof (gRequiredProtocol) / sizeof

> > (REDFISH_DISCOVER_REQUIRED_PROTOCOL))) {

> > -        break;

> > -      }

> > -

> > -      continue;

> >      }

> > -  } while (Index < (sizeof (gRequiredProtocol) / sizeof

> > (REDFISH_DISCOVER_REQUIRED_PROTOCOL)));

> > +  }

> >

> >    return EFI_DEVICE_ERROR;

> >  }

> > --

> > 2.37.1.windows.1

> > -The information contained in this message may be confidential and

> > proprietary to American Megatrends (AMI). This communication is

> > intended to be read only by the individual or entity to whom it is

> > addressed or by their designee. If the reader of this message is not

> > the intended recipient, you are on notice that any distribution of

> > this message, in any form, is strictly prohibited. Please promptly

> > notify the sender by reply e-mail or by telephone at 770-246-8600, and then

> delete or destroy all copies of the transmission.

>

>

> 

>




-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#110886): https://edk2.groups.io/g/devel/message/110886
Mute This Topic: https://groups.io/mt/102441003/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to