Hi Igor,

On Wed, Nov 15, 2023 at 9:37 PM Igor Kulchytskyy <ig...@ami.com> wrote:
>
> Hi Mike,
> My implementation of checking the IpType supposed to be like this:
> /**
>   Check if Network Protocol Type matches with SMBIOS Type 42 IP Address Type.
>
>   @param[in]  NetworkProtocolType  The Network Protocol Type to check with.
>   @param[in]  IpType               The Host IP Address Type from SMBIOS Type 
> 42.
> **/
> STATIC
> BOOLEAN
> IsTcpTypeMatch (
>   IN UINT32 NetworkProtocolType,

NetworkProtocolType has defined type -
NETWORK_INTERFACE_PROTOCOL_TYPE, why don't you use it.
Ah. I see it is declared as UINT32 in REDFISH_DISCOVER_REQUIRED_PROTOCOL... Ok.
It's not clear why, because it is internal structure.

>   IN UINT8 IpType
>   )
> {
>   if ((NetworkProtocolType == ProtocolTypeTcp4) && (IpType == 
> REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP4)) {
>     return TRUE;
>   }
>   if ((NetworkProtocolType == ProtocolTypeTcp6) && (IpType == 
> REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP6)) {
>     return TRUE;
>   }
>   return FALSE;
> }
>
> And then in BuildupNetworkInterface function.
>
>   // 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 (!IsTcpTypeMatch (mRequiredProtocol[Index].ProtocolType, IpType)) {
>       continue;
>     }

So, where is REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_UNKNOWN handled now?

If IpType == REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_UNKNOWN
IsTcpTypeMatch() always returns FALSE,
so !IsTcpTypeMatch() gives TRUE and we skip this iteration.
Effectively this means
if (IpType  == REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_UNKNOWN ) {
  return EFI_DEVICE_ERROR
}
Just because there is nothing after this loop.
And this is not what we wanted, and recognized as my mistake previously.


>
> -----Original Message-----
> From: Mike Maslenkin <mike.maslen...@gmail.com>
> Sent: Wednesday, November 15, 2023 1:27 PM
> To: Igor Kulchytskyy <ig...@ami.com>
> Cc: Leif Lindholm <quic_llind...@quicinc.com>; devel@edk2.groups.io; Abner 
> Chang <abner.ch...@amd.com>; Nickle Wang <nick...@nvidia.com>
> Subject: Re: [EXTERNAL] Re: [edk2-devel] [PATCH v5 2/2] RedfishPkg: 
> RedfishDiscoverDxe: Optimize the Redfish Discover flow
>
> On Wed, Nov 15, 2023 at 4:52 PM Igor Kulchytskyy <ig...@ami.com> wrote:
> >
> > Hello Leif and Mike,
> > Let me try to explain the idea of the filtering IP.
> > That filtering should work only if we know exactly that IP is IPv4 or IPv6 
> > in SMBIOS Type 42.
> Hm. I've already composed a reply below, but then a returned to this
> statement...
>
> Is this a difference in condition between v3 and v5? I came to the
> conclusion that at the place we are discussing
> SMBIOS table 42h can be absent because
> PlatformHostInterfaceInformationReady hasn't been called yet,
> so REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_UNKNOWN is expected.
>
>
> > And it just helping to reduce the work in case we know the exact type of 
> > IP, which supposed to be used in BIOS BMC communication.
> > In that case there is no need to build network interface for the unused IP 
> > Type.
> > On some systems IP address could be dynamic and we will not be able to know 
> > the version of IP from SMBIOS.
> > If you see I check HostIpAssignmentType in GetHiIpProtocolType function. 
> > And return IP type UNKNOWN if it is not static.
> > If we get an unknown IP type, we should not return from 
> > BuildupNetworkInterface function, but just proceed and build the network 
> > interface for all IPs.
> > So, later Redfish Discover driver can find the right one.
> > Based on this logic I'm going to prepare the patch v6.
> > Thank you,
> > Igor
>
> Agree.. I was focused on edk2 implementation of
> RedfishPlatformHostInterfaceLib and PlatformHostInterfaceBmcUsbNicLib
> where HostIpAddressFormat is specified (hardcoded). I guess
> HostIpAddressFormat  as well as SMBIOS table 42h must be available
> by the time RedfishServiceAcquireService()->DiscoverRedfishHostInterface()
> call, while it might be not available at the moment
> RedfishDiscoverDriverBindingStart()->BuildupNetworkInterface(). So,
> condition from v3 looks correct to me.
>
> My main concern was introduction of defines. Those don't look great.
> Those are huge (it even doesn't fit into the screen) and misleading a
> bit.
> For example:
> +#define MAC_COMPARE(ThisNetworkInterface, TargetNetworkInterface)
> (CompareMem ((VOID *)&ThisNetworkInterface->MacAddress,
> &TargetNetworkInterface->MacAddress,
> ThisNetworkInterface->HwAddressSize))
>
> The proposed variant is equal to #define MAC_COMPARE(A, B)
> (CompareMem ((VOID *)&ThisNetworkInterface->MacAddress,
> &TargetNetworkInterface->MacAddress,
> ThisNetworkInterface->HwAddressSize)), i.e a bit useless.
>
> I would expect it could be declared at least as:
> #define MAC_COMPARE(This, Target)  CompareMem ((VOID
> *)&(This)->MacAddress, &(Target)->MacAddress, (This)->HwAddressSize)
> I.e define should really replace some arguments  also reducing the line 
> length.
>
> BTW: there is a place in ValidateTargetNetworkInterface() where
> CompareMem  can be replaced with MAC_COMPARE too.
>
> Also, I found IP6_LINK_EQUAL(Mac1, Mac2) define, that is unused in
> edk2. But according to that one, please consider moving "== 0" check
> to #define declaration.
> But I do not think this macro is required at all, because there are 5
> MAC compares left in this module. So, it just brings some
> inconsistency.
>
> Agreed that static helper function would be the best.
>
> Leif, do you expect something like this?
> STATIC
> BOOLEAN
> FilterInterface (
>   IN NETWORK_INTERFACE_PROTOCOL_TYPE ProtocolType,
>   IN UINT8 HostIpAddressFormat
>   )
> {
>   // This is based on v5, but according to the comments above
>   // v3 is correct as it allows
> REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_UNKNOWN
>
>   if (ProtocolType == ProtocolTypeTcp4) {
>     return IpType != REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP4;
>   } else if (ProtocolType == ProtocolTypeTcp6) {
>     return IpType != REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP6;
>   }
>   return false;
> }
>
> and then::
>
> // 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 (FilterInterface (gRequiredProtocol[Index].ProtocolType, IpType)) {
>     continue;
>   }
>
> Regards,
> Mike.
> -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 (#111290): https://edk2.groups.io/g/devel/message/111290
Mute This Topic: https://groups.io/mt/102584140/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to