Hello Bhupesh,

Any test result or feedback for this patch? 

Thanks.
Jiaxin

> -----Original Message-----
> From: Carsey, Jaben
> Sent: Wednesday, April 20, 2016 1:10 AM
> To: Wu, Jiaxin <jiaxin...@intel.com>; edk2-devel@lists.01.org
> Cc: David Van Arnem <dvanar...@cmlab.biz>; Bhupesh Sharma
> <bhupesh.sha...@nxp.com>; Ye, Ting <ting...@intel.com>; Fu, Siyuan
> <siyuan...@intel.com>; Carsey, Jaben <jaben.car...@intel.com>
> Subject: RE: [Patch] ShellPkg: Enhance ping to select the interface
> automatically
> 
> Reviewed-by: Jaben Carsey <jaben.car...@intel.com>
> 
> 
> 
> > -----Original Message-----
> > From: Wu, Jiaxin
> > Sent: Monday, April 18, 2016 6:52 PM
> > To: edk2-devel@lists.01.org
> > Cc: David Van Arnem <dvanar...@cmlab.biz>; Bhupesh Sharma
> > <bhupesh.sha...@nxp.com>; Carsey, Jaben <jaben.car...@intel.com>;
> Ye,
> > Ting <ting...@intel.com>; Fu, Siyuan <siyuan...@intel.com>
> > Subject: [Patch] ShellPkg: Enhance ping to select the interface
> > automatically
> > Importance: High
> >
> > This patch is used to support no source IP specified case while
> > multiple NICs existed in the platform. The command will select the
> > first both connected and configured interface automatically.
> >
> > Cc: David Van Arnem <dvanar...@cmlab.biz>
> > Cc: Bhupesh Sharma <bhupesh.sha...@nxp.com>
> > Cc: Jaben Carsey <jaben.car...@intel.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>
> > ---
> >  .../Library/UefiShellNetwork1CommandsLib/Ping.c    | 224 ++++++++++++-
> ---
> > -----
> >  1 file changed, 127 insertions(+), 97 deletions(-)
> >
> > diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
> > b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
> > index 13bcdde..6b05884 100644
> > --- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
> > +++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ping.c
> > @@ -874,20 +874,24 @@ PingCreateIpInstance (  {
> >    EFI_STATUS                       Status;
> >    UINTN                            HandleIndex;
> >    UINTN                            HandleNum;
> >    EFI_HANDLE                       *HandleBuffer;
> > +  BOOLEAN                          UnspecifiedSrc;
> > +  BOOLEAN                          MediaPresent;
> >    EFI_SERVICE_BINDING_PROTOCOL     *EfiSb;
> >    VOID                             *IpXCfg;
> >    EFI_IP6_CONFIG_DATA              Ip6Config;
> >    EFI_IP4_CONFIG_DATA              Ip4Config;
> >    VOID                             *IpXInterfaceInfo;
> >    UINTN                            IfInfoSize;
> >    EFI_IPv6_ADDRESS                 *Addr;
> >    UINTN                            AddrIndex;
> >
> >    HandleBuffer      = NULL;
> > +  UnspecifiedSrc    = FALSE;
> > +  MediaPresent      = TRUE;
> >    EfiSb             = NULL;
> >    IpXInterfaceInfo  = NULL;
> >    IfInfoSize        = 0;
> >
> >    //
> > @@ -923,139 +927,165 @@ PingCreateIpInstance (
> >        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN
> > (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ping", mSrcString);
> >        Status = EFI_INVALID_PARAMETER;
> >        goto ON_ERROR;
> >      }
> >    }
> > +
> > +  if (Private->IpChoice == PING_IP_CHOICE_IP6 ?
> > + NetIp6IsUnspecifiedAddr
> > ((EFI_IPv6_ADDRESS*)&Private->SrcAddress) : \
> > +      PingNetIp4IsUnspecifiedAddr ((EFI_IPv4_ADDRESS*)&Private-
> > >SrcAddress)) {
> > +    //
> > +    // SrcAddress is unspecified. So, both connected and configured
> > + interface
> > will be automatic selected.
> > +    //
> > +    UnspecifiedSrc = TRUE;
> > +  }
> > +
> >    //
> >    // For each ip6 protocol, check interface addresses list.
> >    //
> >    for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {
> > -
> >      EfiSb             = NULL;
> >      IpXInterfaceInfo  = NULL;
> >      IfInfoSize        = 0;
> >
> > +    if (UnspecifiedSrc) {
> > +      //
> > +      // Check media.
> > +      //
> > +      NetLibDetectMedia (HandleBuffer[HandleIndex], &MediaPresent);
> > +      if (!MediaPresent) {
> > +        //
> > +        // Skip this one.
> > +        //
> > +        continue;
> > +      }
> > +    }
> > +
> >      Status = gBS->HandleProtocol (
> >                      HandleBuffer[HandleIndex],
> >                      Private->IpChoice ==
> >
> PING_IP_CHOICE_IP6?&gEfiIp6ServiceBindingProtocolGuid:&gEfiIp4ServiceB
> > i
> > ndingProtocolGuid,
> >                      (VOID **) &EfiSb
> >                      );
> >      if (EFI_ERROR (Status)) {
> >        goto ON_ERROR;
> >      }
> >
> > -    if (Private->IpChoice == PING_IP_CHOICE_IP6?NetIp6IsUnspecifiedAddr
> > ((EFI_IPv6_ADDRESS*)&Private-
> >SrcAddress):PingNetIp4IsUnspecifiedAddr
> > ((EFI_IPv4_ADDRESS*)&Private->SrcAddress)) {
> > -      //
> > -      // No need to match interface address.
> > -      //
> > -      break;
> > +    //
> > +    // Ip6config protocol and ip6 service binding protocol are installed
> > +    // on the same handle.
> > +    //
> > +    Status = gBS->HandleProtocol (
> > +                    HandleBuffer[HandleIndex],
> > +                    Private->IpChoice ==
> >
> PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2Protocol
> G
> > u
> > id,
> > +                    (VOID **) &IpXCfg
> > +                    );
> > +
> > +    if (EFI_ERROR (Status)) {
> > +      goto ON_ERROR;
> > +    }
> > +    //
> > +    // Get the interface information size.
> > +    //
> > +    if (Private->IpChoice == PING_IP_CHOICE_IP6) {
> > +      Status = ((EFI_IP6_CONFIG_PROTOCOL*)IpXCfg)->GetData (
> > +                         IpXCfg,
> > +                         Ip6ConfigDataTypeInterfaceInfo,
> > +                         &IfInfoSize,
> > +                         NULL
> > +                         );
> >      } else {
> > -      //
> > -      // Ip6config protocol and ip6 service binding protocol are installed
> > -      // on the same handle.
> > -      //
> > -      Status = gBS->HandleProtocol (
> > -                      HandleBuffer[HandleIndex],
> > -                      Private->IpChoice ==
> >
> PING_IP_CHOICE_IP6?&gEfiIp6ConfigProtocolGuid:&gEfiIp4Config2Protocol
> G
> > u
> > id,
> > -                      (VOID **) &IpXCfg
> > -                      );
> > +      Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
> > +                         IpXCfg,
> > +                         Ip4Config2DataTypeInterfaceInfo,
> > +                         &IfInfoSize,
> > +                         NULL
> > +                         );
> > +    }
> > +
> > +    //
> > +    // Skip the ones not in current use.
> > +    //
> > +    if (Status == EFI_NOT_STARTED) {
> > +      continue;
> > +    }
> >
> > -      if (EFI_ERROR (Status)) {
> > -        goto ON_ERROR;
> > -      }
> > -      //
> > -      // Get the interface information size.
> > -      //
> > -      if (Private->IpChoice == PING_IP_CHOICE_IP6) {
> > -        Status = ((EFI_IP6_CONFIG_PROTOCOL*)IpXCfg)->GetData (
> > -                           IpXCfg,
> > -                           Ip6ConfigDataTypeInterfaceInfo,
> > -                           &IfInfoSize,
> > -                           NULL
> > -                           );
> > -      } else {
> > -        Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
> > -                           IpXCfg,
> > -                           Ip4Config2DataTypeInterfaceInfo,
> > -                           &IfInfoSize,
> > -                           NULL
> > -                           );
> > -      }
> > -
> > -      //
> > -      // Skip the ones not in current use.
> > -      //
> > -      if (Status == EFI_NOT_STARTED) {
> > -        continue;
> > -      }
> > +    if (Status != EFI_BUFFER_TOO_SMALL) {
> > +      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_GETDATA),
> > gShellNetwork1HiiHandle, Status);
> > +      goto ON_ERROR;
> > +    }
> >
> > -      if (Status != EFI_BUFFER_TOO_SMALL) {
> > -        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_GETDATA),
> > gShellNetwork1HiiHandle, Status);
> > -        goto ON_ERROR;
> > -      }
> > +    IpXInterfaceInfo = AllocateZeroPool (IfInfoSize);
> >
> > -      IpXInterfaceInfo = AllocateZeroPool (IfInfoSize);
> > +    if (IpXInterfaceInfo == NULL) {
> > +      Status = EFI_OUT_OF_RESOURCES;
> > +      goto ON_ERROR;
> > +    }
> > +    //
> > +    // Get the interface info.
> > +    //
> > +    if (Private->IpChoice == PING_IP_CHOICE_IP6) {
> > +      Status = ((EFI_IP6_CONFIG_PROTOCOL*)IpXCfg)->GetData (
> > +                         IpXCfg,
> > +                         Ip6ConfigDataTypeInterfaceInfo,
> > +                         &IfInfoSize,
> > +                         IpXInterfaceInfo
> > +                         );
> > +    } else {
> > +      Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
> > +                         IpXCfg,
> > +                         Ip4Config2DataTypeInterfaceInfo,
> > +                         &IfInfoSize,
> > +                         IpXInterfaceInfo
> > +                         );
> > +    }
> >
> > -      if (IpXInterfaceInfo == NULL) {
> > -        Status = EFI_OUT_OF_RESOURCES;
> > -        goto ON_ERROR;
> > -      }
> > -      //
> > -      // Get the interface info.
> > -      //
> > -      if (Private->IpChoice == PING_IP_CHOICE_IP6) {
> > -        Status = ((EFI_IP6_CONFIG_PROTOCOL*)IpXCfg)->GetData (
> > -                           IpXCfg,
> > -                           Ip6ConfigDataTypeInterfaceInfo,
> > -                           &IfInfoSize,
> > -                           IpXInterfaceInfo
> > -                           );
> > -      } else {
> > -        Status = ((EFI_IP4_CONFIG2_PROTOCOL*)IpXCfg)->GetData (
> > -                           IpXCfg,
> > -                           Ip4Config2DataTypeInterfaceInfo,
> > -                           &IfInfoSize,
> > -                           IpXInterfaceInfo
> > -                           );
> > -      }
> > +    if (EFI_ERROR (Status)) {
> > +      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_GETDATA),
> > gShellNetwork1HiiHandle, Status);
> > +      goto ON_ERROR;
> > +    }
> > +    //
> > +    // Check whether the source address is one of the interface addresses.
> > +    //
> > +    if (Private->IpChoice == PING_IP_CHOICE_IP6) {
> > +      for (AddrIndex = 0; AddrIndex <
> > ((EFI_IP6_CONFIG_INTERFACE_INFO*)IpXInterfaceInfo)-
> >AddressInfoCount;
> > AddrIndex++) {
> >
> > -      if (EFI_ERROR (Status)) {
> > -        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_PING_GETDATA),
> > gShellNetwork1HiiHandle, Status);
> > -        goto ON_ERROR;
> > -      }
> > -      //
> > -      // Check whether the source address is one of the interface 
> > addresses.
> > -      //
> > -      if (Private->IpChoice == PING_IP_CHOICE_IP6) {
> > -        for (AddrIndex = 0; AddrIndex <
> > ((EFI_IP6_CONFIG_INTERFACE_INFO*)IpXInterfaceInfo)-
> >AddressInfoCount;
> > AddrIndex++) {
> > -
> > -          Addr = &(((EFI_IP6_CONFIG_INTERFACE_INFO*)IpXInterfaceInfo)-
> > >AddressInfo[AddrIndex].Address);
> > -          if (EFI_IP6_EQUAL (&Private->SrcAddress, Addr)) {
> > -            //
> > -            // Match a certain interface address.
> > -            //
> > -            break;
> > -          }
> > -        }
> > +        Addr = &(((EFI_IP6_CONFIG_INTERFACE_INFO*)IpXInterfaceInfo)-
> > >AddressInfo[AddrIndex].Address);
> >
> > -        if (AddrIndex <
> ((EFI_IP6_CONFIG_INTERFACE_INFO*)IpXInterfaceInfo)-
> > >AddressInfoCount) {
> > -          //
> > -          // Found a nic handle with right interface address.
> > -          //
> > +        if (UnspecifiedSrc && !NetIp6IsUnspecifiedAddr (Addr) &&
> > !NetIp6IsLinkLocalAddr (Addr)) {
> > +          CopyMem(&Private->SrcAddress, Addr,
> > + sizeof(Private->SrcAddress));
> >            break;
> >          }
> > -      } else {
> > -        //
> > -        // IP4 address check
> > -        //
> > -        if (EFI_IP4_EQUAL (&Private->SrcAddress,
> > &((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)-
> >StationAddress))
> > {
> > +
> > +        if (!UnspecifiedSrc && EFI_IP6_EQUAL (&Private->SrcAddress,
> > + Addr)) {
> >            //
> >            // Match a certain interface address.
> >            //
> >            break;
> >          }
> >        }
> > +
> > +      if (AddrIndex <
> > + ((EFI_IP6_CONFIG_INTERFACE_INFO*)IpXInterfaceInfo)-
> > >AddressInfoCount) {
> > +        //
> > +        // Found a nic handle with right interface address.
> > +        //
> > +        break;
> > +      }
> > +    } else {
> > +      if (UnspecifiedSrc &&
> > +          !PingNetIp4IsUnspecifiedAddr
> > (&((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)-
> >StationAddress)
> > &&
> > +          !PingNetIp4IsLinkLocalAddr
> > (&((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)-
> >StationAddress)
> > ) {
> > +        break;
> > +      }
> > +
> > +      //
> > +      // IP4 address check
> > +      //
> > +      if (!UnspecifiedSrc && EFI_IP4_EQUAL (&Private->SrcAddress,
> > &((EFI_IP4_CONFIG2_INTERFACE_INFO*)IpXInterfaceInfo)-
> >StationAddress))
> > {
> > +        //
> > +        // Match a certain interface address.
> > +        //
> > +        break;
> > +      }
> >      }
> >
> >      FreePool (IpXInterfaceInfo);
> >      IpXInterfaceInfo = NULL;
> >    }
> > --
> > 1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to