(You have my old now-dysfunctional @nuviainc.com email address on cc, please delete that one if you can.)

I think it's fine to merge this bugfix, but I have a couple of review comments I will make on the v3 code itself, replying to that submission. (I am however not the maintainer of RedFishPkg, so Nickle is free to ignore me and push this version.)

/
    Leif


On 2023-11-09 13:49, gaoliming via groups.io wrote:
Nickle:

 This is a bug fix. Its impact is only in RedfishDiscoverDxe. I think it can be merged for this stable tag.

Thanks

Liming

*发件人:*devel@edk2.groups.io <devel@edk2.groups.io> *代表 *Nickle Wang via groups.io
*发送时间:*2023年11月8日10:44
*收件人:*Liming Gao <gaolim...@byosoft.com.cn>; Kinney, Michael D <michael.d.kin...@intel.com>; devel@edk2.groups.io
*抄送:*Igor Kulchytskyy <ig...@ami.com>; Chang, Abner <abner.ch...@amd.com>
*主题:*Re: [edk2-devel] [PATCH v3] RedfishPkg: RedfishDiscoverDxe: Fix issue if IPv4 installed after RestEx

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 <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 <https://github.com/tianocore/edk2/pull/4994>

Thanks,

Nickle

-----Original Message-----

From: devel@edk2.groups.io <mailto:devel@edk2.groups.io> <devel@edk2.groups.io
<mailto: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 <mailto:ig...@ami.com>>; devel@edk2.groups.io
<mailto:devel@edk2.groups.io>

Cc: Nickle Wang <nick...@nvidia.com <mailto: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 (#110988): https://edk2.groups.io/g/devel/message/110988
Mute This Topic: https://groups.io/mt/102485712/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: 
https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to