public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Wu, Jiaxin" <jiaxin.wu@intel.com>
To: "Zhang, Lubo" <lubo.zhang@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Ye, Ting" <ting.ye@intel.com>, "Fu, Siyuan" <siyuan.fu@intel.com>
Subject: Re: [PATCH V2] NetworkPkg: Add dns support for target URL configuration in ISCSI.
Date: Wed, 18 Jan 2017 04:34:13 +0000	[thread overview]
Message-ID: <895558F6EA4E3B41AC93A00D163B727416294A4D@SHSMSX103.ccr.corp.intel.com> (raw)
In-Reply-To: <1484122079-3996-1-git-send-email-lubo.zhang@intel.com>

Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com>

Thanks,
Jiaxin

> -----Original Message-----
> From: Zhang, Lubo
> Sent: Wednesday, January 11, 2017 4:08 PM
> To: edk2-devel@lists.01.org
> Cc: Ye, Ting <ting.ye@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> Subject: [PATCH V2] NetworkPkg: Add dns support for target URL configuration
> in ISCSI.
> 
> v2:
> *1. Add IScsiDnsIsConfigured function in IScsiSupported to check
> attempt using DNS protocol or not.2. Fix wrongs typos in IScsiDns.c
> and .uni file.3. define a macro for the length of target URL.4.
> update the Copyright to 2017.
> 
> Add DNS support for target URL directly configuration in UI.
> 
> Besides, When we enable the option (Get target info via DHCP) ,
> the dhcp server will return target info include the  rootpath,
> like the format
> "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
> According to the RFC 4173,the server name region is expressed as
> IPv4(192.168.10.20 )or IPv6 ([2000:bbbb::3]) or domain name,
> but currently we only support the IP address format.
> To enable this feature, we can support both.
> 
> Another enhancement is that we can deal with the data received from
> the iSCSI login response with an target redirection status,
> in which contains the Target Address in the format
> domainname[:port][,portal-group-tag] required by RFC 3720.
> 
> Cc: Ye Ting <ting.ye@intel.com>
> Cc: Fu Siyuan <siyuan.fu@intel.com>
> Cc: Wu Jiaxin <jiaxin.wu@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Zhang Lubo <lubo.zhang@intel.com>
> ---
>  NetworkPkg/IScsiDxe/IScsiConfig.c            |  78 +++--
>  NetworkPkg/IScsiDxe/IScsiConfigNVDataStruc.h |  10 +-
>  NetworkPkg/IScsiDxe/IScsiConfigStrings.uni   |   5 +-
>  NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr       |  10 +-
>  NetworkPkg/IScsiDxe/IScsiDhcp.c              |  23 +-
>  NetworkPkg/IScsiDxe/IScsiDhcp6.c             |  25 +-
>  NetworkPkg/IScsiDxe/IScsiDns.c               | 435
> +++++++++++++++++++++++++++
>  NetworkPkg/IScsiDxe/IScsiDns.h               |  59 ++++
>  NetworkPkg/IScsiDxe/IScsiDriver.c            |  22 +-
>  NetworkPkg/IScsiDxe/IScsiDxe.inf             |  22 +-
>  NetworkPkg/IScsiDxe/IScsiImpl.h              |   8 +-
>  NetworkPkg/IScsiDxe/IScsiMisc.c              |  90 +++++-
>  NetworkPkg/IScsiDxe/IScsiMisc.h              |  21 +-
>  NetworkPkg/IScsiDxe/IScsiProto.c             |  59 +++-
>  14 files changed, 794 insertions(+), 73 deletions(-)
>  create mode 100644 NetworkPkg/IScsiDxe/IScsiDns.c
>  create mode 100644 NetworkPkg/IScsiDxe/IScsiDns.h
> 
> diff --git a/NetworkPkg/IScsiDxe/IScsiConfig.c
> b/NetworkPkg/IScsiDxe/IScsiConfig.c
> index 57571ad..40ea75a 100644
> --- a/NetworkPkg/IScsiDxe/IScsiConfig.c
> +++ b/NetworkPkg/IScsiDxe/IScsiConfig.c
> @@ -1,9 +1,9 @@
>  /** @file
>    Helper functions for configuring or getting the parameters relating to iSCSI.
> 
> -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2017, 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
> 
> @@ -364,17 +364,19 @@ IScsiConvertAttemptConfigDataToIfrNvData (
>    )
>  {
>    ISCSI_SESSION_CONFIG_NVDATA   *SessionConfigData;
>    ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData;
>    EFI_IP_ADDRESS                Ip;
> +  BOOLEAN                       DnsMode;
> 
>    //
>    // Normal session configuration parameters.
>    //
>    SessionConfigData                 = &Attempt->SessionConfigData;
>    IfrNvData->Enabled                = SessionConfigData->Enabled;
>    IfrNvData->IpMode                 = SessionConfigData->IpMode;
> +  DnsMode                           = SessionConfigData->DnsMode;
> 
>    IfrNvData->InitiatorInfoFromDhcp  = SessionConfigData-
> >InitiatorInfoFromDhcp;
>    IfrNvData->TargetInfoFromDhcp     = SessionConfigData-
> >TargetInfoFromDhcp;
>    IfrNvData->TargetPort             = SessionConfigData->TargetPort;
> 
> @@ -383,23 +385,37 @@ IScsiConvertAttemptConfigDataToIfrNvData (
>      IScsiIpToStr (&Ip, FALSE, IfrNvData->LocalIp);
>      CopyMem (&Ip.v4, &SessionConfigData->SubnetMask, sizeof
> (EFI_IPv4_ADDRESS));
>      IScsiIpToStr (&Ip, FALSE, IfrNvData->SubnetMask);
>      CopyMem (&Ip.v4, &SessionConfigData->Gateway, sizeof
> (EFI_IPv4_ADDRESS));
>      IScsiIpToStr (&Ip, FALSE, IfrNvData->Gateway);
> -    CopyMem (&Ip.v4, &SessionConfigData->TargetIp, sizeof
> (EFI_IPv4_ADDRESS));
> -    IScsiIpToStr (&Ip, FALSE, IfrNvData->TargetIp);
> +    if (SessionConfigData->TargetIp.v4.Addr[0] != '\0') {
> +      CopyMem (&Ip.v4, &SessionConfigData->TargetIp, sizeof
> (EFI_IPv4_ADDRESS));
> +      IScsiIpToStr (&Ip, FALSE, IfrNvData->TargetIp);
> +    }
> +
>    } else if (IfrNvData->IpMode == IP_MODE_IP6) {
>      ZeroMem (IfrNvData->TargetIp, sizeof (IfrNvData->TargetIp));
> -    IP6_COPY_ADDRESS (&Ip.v6, &SessionConfigData->TargetIp);
> -    IScsiIpToStr (&Ip, TRUE, IfrNvData->TargetIp);
> +    if (SessionConfigData->TargetIp.v6.Addr[0] != '\0') {
> +      IP6_COPY_ADDRESS (&Ip.v6, &SessionConfigData->TargetIp);
> +      IScsiIpToStr (&Ip, TRUE, IfrNvData->TargetIp);
> +    }
>    }
> 
>    AsciiStrToUnicodeStrS (
>      SessionConfigData->TargetName,
>      IfrNvData->TargetName,
>      sizeof (IfrNvData->TargetName) / sizeof (IfrNvData->TargetName[0])
>      );
> +
> +  if (DnsMode) {
> +    AsciiStrToUnicodeStrS (
> +      SessionConfigData->TargetUrl,
> +      IfrNvData->TargetIp,
> +      sizeof (IfrNvData->TargetIp) / sizeof (IfrNvData->TargetIp[0])
> +      );
> +  }
> +
>    IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->BootLun);
>    IScsiConvertIsIdToString (IfrNvData->IsId, SessionConfigData->IsId);
> 
>    IfrNvData->ConnectRetryCount = SessionConfigData->ConnectRetryCount;
>    IfrNvData->ConnectTimeout    = SessionConfigData->ConnectTimeout;
> @@ -557,18 +573,30 @@ IScsiConvertIfrNvDataToAttemptConfigData (
>      }
>      //
>      // Validate target configuration if DHCP isn't deployed.
>      //
>      if (!Attempt->SessionConfigData.TargetInfoFromDhcp && Attempt-
> >SessionConfigData.IpMode < IP_MODE_AUTOCONFIG) {
> -      if (!IpIsUnicast (&Attempt->SessionConfigData.TargetIp, IfrNvData-
> >IpMode)) {
> -        CreatePopUp (
> -          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> -          &Key,
> -          L"Target IP is invalid!",
> -          NULL
> -          );
> -        return EFI_INVALID_PARAMETER;
> +      if (!Attempt->SessionConfigData.DnsMode) {
> +        if (!IpIsUnicast (&Attempt->SessionConfigData.TargetIp, IfrNvData-
> >IpMode)) {
> +          CreatePopUp (
> +            EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> +            &Key,
> +            L"Target IP is invalid!",
> +            NULL
> +            );
> +          return EFI_INVALID_PARAMETER;
> +        }
> +      } else {
> +        if (Attempt->SessionConfigData.TargetUrl[0] == '\0') {
> +          CreatePopUp (
> +            EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> +            &Key,
> +            L"iSCSI target Url should not be NULL!",
> +            NULL
> +            );
> +          return EFI_INVALID_PARAMETER;
> +        }
>        }
> 
>        //
>        // Validate iSCSI target name configuration again:
>        // The format of iSCSI target name is already verified in IScsiFormCallback()
> when
> @@ -2134,11 +2162,11 @@ IScsiFormCallback (
>    )
>  {
>    ISCSI_FORM_CALLBACK_INFO    *Private;
>    UINTN                       BufferSize;
>    CHAR8                       *IScsiName;
> -  CHAR8                       IpString[IP_STR_MAX_SIZE];
> +  CHAR8                       IpString[ISCSI_NAME_MAX_SIZE];
>    CHAR8                       LunString[ISCSI_LUN_STR_MAX_LEN];
>    UINT64                      Lun;
>    EFI_IP_ADDRESS              HostIp;
>    EFI_IP_ADDRESS              SubnetMask;
>    EFI_IP_ADDRESS              Gateway;
> @@ -2333,18 +2361,12 @@ IScsiFormCallback (
>        break;
> 
>      case KEY_IP_MODE:
>        switch (Value->u8) {
>        case IP_MODE_IP6:
> -        ZeroMem (IfrNvData->TargetIp, sizeof (IfrNvData->TargetIp));
> -        IScsiIpToStr (&Private->Current->SessionConfigData.TargetIp, TRUE,
> IfrNvData->TargetIp);
> -        Private->Current->AutoConfigureMode = 0;
> -        break;
> -
>        case IP_MODE_IP4:
>          ZeroMem (IfrNvData->TargetIp, sizeof (IfrNvData->TargetIp));
> -        IScsiIpToStr (&Private->Current->SessionConfigData.TargetIp, FALSE,
> IfrNvData->TargetIp);
>          Private->Current->AutoConfigureMode = 0;
> 
>          break;
>        }
> 
> @@ -2406,19 +2428,19 @@ IScsiFormCallback (
>        break;
> 
>      case KEY_TARGET_IP:
>        UnicodeStrToAsciiStrS (IfrNvData->TargetIp, IpString, sizeof (IpString));
>        Status = IScsiAsciiStrToIp (IpString, IfrNvData->IpMode, &HostIp);
> -      if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST
> (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) {
> -        CreatePopUp (
> -          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> -          &Key,
> -          L"Invalid IP address!",
> -          NULL
> -          );
> -        Status = EFI_INVALID_PARAMETER;
> +      if (EFI_ERROR (Status) || !IpIsUnicast (&HostIp, IfrNvData->IpMode)) {
> +      //
> +      // The target is expressed in URL format or an invalid Ip address, just save.
> +      //
> +      Private->Current->SessionConfigData.DnsMode = TRUE;
> +      ZeroMem (&Private->Current->SessionConfigData.TargetIp, sizeof
> (Private->Current->SessionConfigData.TargetIp));
> +      UnicodeStrToAsciiStrS (IfrNvData->TargetIp, Private->Current-
> >SessionConfigData.TargetUrl, ISCSI_NAME_MAX_SIZE);
>        } else {
> +        Private->Current->SessionConfigData.DnsMode = FALSE;
>          CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp,
> sizeof (HostIp));
>        }
> 
>        break;
> 
> diff --git a/NetworkPkg/IScsiDxe/IScsiConfigNVDataStruc.h
> b/NetworkPkg/IScsiDxe/IScsiConfigNVDataStruc.h
> index 56ebb50..5f22767 100644
> --- a/NetworkPkg/IScsiDxe/IScsiConfigNVDataStruc.h
> +++ b/NetworkPkg/IScsiDxe/IScsiConfigNVDataStruc.h
> @@ -1,9 +1,9 @@
>  /** @file
>    Define NVData structures used by the iSCSI configuration component.
> 
> -Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2017, 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
> 
> @@ -133,10 +133,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND, EITHER EXPRESS OR IMPLIED.
> 
>  #define ISID_CONFIGURABLE_MIN_LEN 6
>  #define ISID_CONFIGURABLE_MAX_LEN 12
>  #define ISID_CONFIGURABLE_STORAGE 13
> 
> +///
> +/// Macro used for target Url.
> +///
> +#define ISCSI_TARGET_URI_MIN_SIZE     0
> +#define ISCSI_TARGET_URI_MAX_SIZE     255
> +
>  #pragma pack(1)
>  typedef struct _ISCSI_CONFIG_IFR_NVDATA {
>    CHAR16  InitiatorName[ISCSI_NAME_MAX_SIZE];
>    CHAR16  AttemptName[ATTEMPT_NAME_MAX_SIZE];
> 
> @@ -152,11 +158,11 @@ typedef struct _ISCSI_CONFIG_IFR_NVDATA {
>    CHAR16  LocalIp[IP4_STR_MAX_SIZE];
>    CHAR16  SubnetMask[IP4_STR_MAX_SIZE];
>    CHAR16  Gateway[IP4_STR_MAX_SIZE];
> 
>    CHAR16  TargetName[ISCSI_NAME_MAX_SIZE];
> -  CHAR16  TargetIp[IP_STR_MAX_SIZE];
> +  CHAR16  TargetIp[ISCSI_TARGET_URI_MAX_SIZE];
>    UINT16  TargetPort;
>    CHAR16  BootLun[ISCSI_LUN_STR_MAX_LEN];
> 
>    UINT8   AuthenticationType;
> 
> diff --git a/NetworkPkg/IScsiDxe/IScsiConfigStrings.uni
> b/NetworkPkg/IScsiDxe/IScsiConfigStrings.uni
> index 7a80fab..11e8b09 100644
> --- a/NetworkPkg/IScsiDxe/IScsiConfigStrings.uni
> +++ b/NetworkPkg/IScsiDxe/IScsiConfigStrings.uni
> @@ -1,8 +1,8 @@
>  // *++
>  //
> -// Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
> +// Copyright (c) 2004 - 2017, 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
>  //
> @@ -61,11 +61,12 @@
>  #string STR_ISCSI_LOCAL_MASK            #language en-US "  Initiator Subnet
> Mask"
>  #string STR_ISCSI_LOCAL_GATEWAY         #language en-US "  Gateway"
>  #string STR_ISCSI_IP_ADDRESS_HELP       #language en-US "Enter IP address in
> dotted-decimal notation."
>  #string STR_ISCSI_TARGET_NAME           #language en-US "  Target Name"
>  #string STR_ISCSI_TARGET_NAME_HELP      #language en-US "The worldwide
> unique name of the target. Only iqn. format is accepted."
> -#string STR_ISCSI_TARGET_IP_ADDRESS     #language en-US "  Target IP
> Address"
> +#string STR_ISCSI_TARGET_ADDRESS        #language en-US "  Target Address"
> +#string STR_ISCSI_TARGET_ADDRESS_HELP   #language en-US "Enter Target
> address in IPv4,IPv6 or URL format.You need to configure DNS server address in
> advance if input a URL string."
>  #string STR_ISCSI_TARGET_PORT           #language en-US "  Target Port"
>  #string STR_ISCSI_BOOT_LUN              #language en-US "  Boot LUN"
>  #string STR_ISCSI_BOOT_LUN_HELP         #language en-US "Hexadecimal
> representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, 6734-9-
> 156f-127, 4186-9"
>  #string STR_ISCSI_ENABLE_DHCP           #language en-US "Enable DHCP"
>  #string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target
> info via DHCP"
> diff --git a/NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr
> b/NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr
> index db77c0f..c469a78 100644
> --- a/NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr
> +++ b/NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr
> @@ -1,9 +1,9 @@
>  /** @file
>    VFR file used by the iSCSI configuration component.
> 
> -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2017, 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
> 
> @@ -247,16 +247,16 @@ formset
>              minsize = ISCSI_NAME_IFR_MIN_SIZE,
>              maxsize = ISCSI_NAME_IFR_MAX_SIZE,
>      endstring;
> 
>      string  varid   = ISCSI_CONFIG_IFR_NVDATA.TargetIp,
> -            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS),
> -            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> +            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_ADDRESS),
> +            help    = STRING_TOKEN(STR_ISCSI_TARGET_ADDRESS_HELP),
>              flags   = INTERACTIVE,
>              key     = KEY_TARGET_IP,
> -            minsize = IP_MIN_SIZE,
> -            maxsize = IP_MAX_SIZE,
> +            minsize = ISCSI_TARGET_URI_MIN_SIZE,
> +            maxsize = ISCSI_TARGET_URI_MAX_SIZE,
>      endstring;
> 
>      numeric varid   = ISCSI_CONFIG_IFR_NVDATA.TargetPort,
>              prompt  = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
>              help    = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
> diff --git a/NetworkPkg/IScsiDxe/IScsiDhcp.c b/NetworkPkg/IScsiDxe/IScsiDhcp.c
> index 0e42805..43ae50b 100644
> --- a/NetworkPkg/IScsiDxe/IScsiDhcp.c
> +++ b/NetworkPkg/IScsiDxe/IScsiDhcp.c
> @@ -1,9 +1,9 @@
>  /** @file
>    iSCSI DHCP4 related configuration routines.
> 
> -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2017, 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
> 
> @@ -121,15 +121,28 @@ IScsiDhcpExtractRootPath (
>      IpMode = ConfigNvData->IpMode;
>    } else {
>      IpMode = ConfigData->AutoConfigureMode;
>    }
> 
> -  Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip);
> -  CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS));
> +  //
> +  // Server name is expressed as domain name, just save it.
> +  //
> +  if ((!NET_IS_DIGIT (*(Field->Str))) && (*(Field->Str) != '[')) {
> +    ConfigNvData->DnsMode = TRUE;
> +    if (Field->Len > sizeof (ConfigNvData->TargetUrl)) {
> +      return EFI_INVALID_PARAMETER;
> +    }
> +    CopyMem (&ConfigNvData->TargetUrl, Field->Str, Field->Len);
> +    ConfigNvData->TargetUrl[Field->Len + 1] = '\0';
> +  } else {
> +    ZeroMem(ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl));
> +    Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip);
> +    CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS));
> 
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> +    if (EFI_ERROR (Status)) {
> +      goto ON_EXIT;
> +    }
>    }
>    //
>    // Check the protocol type.
>    //
>    Field = &Fields[RP_FIELD_IDX_PROTOCOL];
> diff --git a/NetworkPkg/IScsiDxe/IScsiDhcp6.c
> b/NetworkPkg/IScsiDxe/IScsiDhcp6.c
> index 0cd0bd8..d3535d5 100644
> --- a/NetworkPkg/IScsiDxe/IScsiDhcp6.c
> +++ b/NetworkPkg/IScsiDxe/IScsiDhcp6.c
> @@ -1,9 +1,9 @@
>  /** @file
>    iSCSI DHCP6 related configuration routines.
> 
> -Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2009 - 2017, 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
> 
> @@ -148,17 +148,30 @@ IScsiDhcp6ExtractRootPath (
>      IpMode = ConfigNvData->IpMode;
>    } else {
>      IpMode = ConfigData->AutoConfigureMode;
>    }
> 
> -  Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip);
> -  CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS));
> -
> +  //
> +  // Server name is expressed as domain name, just save it.
> +  //
> +  if ((!NET_IS_DIGIT (*(Field->Str))) && (*(Field->Str) != '[')) {
> +    ConfigNvData->DnsMode = TRUE;
> +    if (Field->Len > sizeof (ConfigNvData->TargetUrl)) {
> +      return EFI_INVALID_PARAMETER;
> +    }
> +    CopyMem (&ConfigNvData->TargetUrl, Field->Str, Field->Len);
> +    ConfigNvData->TargetUrl[Field->Len + 1] = '\0';
> +  } else {
> +    ZeroMem(&ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl));
> +    Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip);
> +    CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS));
> 
> -  if (EFI_ERROR (Status)) {
> -    goto ON_EXIT;
> +    if (EFI_ERROR (Status)) {
> +      goto ON_EXIT;
> +    }
>    }
> +
>    //
>    // Check the protocol type.
>    //
>    Field = &Fields[RP_FIELD_IDX_PROTOCOL];
>    if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) {
> diff --git a/NetworkPkg/IScsiDxe/IScsiDns.c b/NetworkPkg/IScsiDxe/IScsiDns.c
> new file mode 100644
> index 0000000..0ddfcbd
> --- /dev/null
> +++ b/NetworkPkg/IScsiDxe/IScsiDns.c
> @@ -0,0 +1,435 @@
> +/** @file
> + Perform DNS resolution based on UEFI DNS protocols.
> +
> +Copyright (c) 2017, 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
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include "IScsiImpl.h"
> +
> +/**
> +  Notify the callback function when an event is triggered.
> +
> +  @param[in]  Event           The triggered event.
> +  @param[in]  Context         The opaque parameter to the function.
> +
> +**/
> +VOID
> +EFIAPI
> +IScsiCommonNotify (
> +  IN EFI_EVENT           Event,
> +  IN VOID                *Context
> +  )
> +{
> +  *((BOOLEAN *) Context) = TRUE;
> +}
> +
> +/**
> +  Retrieve the host address using the EFI_DNS4_PROTOCOL.
> +
> +  @param[in]  Image               The handle of the driver image.
> +  @param[in]  Controller          The handle of the controller.
> +  @param[in, out]  NvData         The Session config data structure.
> +
> +  @retval EFI_SUCCESS             Operation succeeded.
> +  @retval EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
> +  @retval EFI_DEVICE_ERROR        An unexpected network error occurred.
> +  @retval Others                  Other errors as indicated.
> +
> +**/
> +EFI_STATUS
> +IScsiDns4 (
> +  IN     EFI_HANDLE                      Image,
> +  IN     EFI_HANDLE                      Controller,
> +  IN OUT ISCSI_SESSION_CONFIG_NVDATA     *NvData
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  EFI_DNS4_PROTOCOL               *Dns4;
> +  EFI_DNS4_CONFIG_DATA            Dns4CfgData;
> +  EFI_DNS4_COMPLETION_TOKEN       Token;
> +  BOOLEAN                         IsDone;
> +  EFI_HANDLE                      Dns4Handle;
> +  EFI_IP4_CONFIG2_PROTOCOL        *Ip4Config2;
> +  EFI_IPv4_ADDRESS                *DnsServerList;
> +  UINTN                           DnsServerListCount;
> +  UINTN                           DataSize;
> +  CHAR16                          *HostName;
> +
> +  DnsServerList      = NULL;
> +  DnsServerListCount = 0;
> +  Dns4Handle         = NULL;
> +  Dns4               = NULL;
> +  ZeroMem (&Token, sizeof (EFI_DNS4_COMPLETION_TOKEN));
> +
> +  //
> +  // Get DNS server list from EFI IPv4 Configuration II protocol.
> +  //
> +  Status = gBS->HandleProtocol (Controller, &gEfiIp4Config2ProtocolGuid,
> (VOID **) &Ip4Config2);
> +  if (!EFI_ERROR (Status)) {
> +    //
> +    // Get the required size.
> +    //
> +    DataSize = 0;
> +    Status   = Ip4Config2->GetData (Ip4Config2, Ip4Config2DataTypeDnsServer,
> &DataSize, NULL);
> +    if (Status == EFI_BUFFER_TOO_SMALL) {
> +      DnsServerList = AllocatePool (DataSize);
> +      if (DnsServerList == NULL) {
> +        return EFI_OUT_OF_RESOURCES;
> +      }
> +
> +      Status   = Ip4Config2->GetData (Ip4Config2, Ip4Config2DataTypeDnsServer,
> &DataSize, DnsServerList);
> +      if (EFI_ERROR (Status)) {
> +        FreePool (DnsServerList);
> +        DnsServerList = NULL;
> +      } else {
> +        DnsServerListCount = DataSize / sizeof (EFI_IPv4_ADDRESS);
> +      }
> +    }
> +  }
> +
> +
> +  //
> +  // Create a DNS child instance and get the protocol.
> +  //
> +  Status = NetLibCreateServiceChild (
> +             Controller,
> +             Image,
> +             &gEfiDns4ServiceBindingProtocolGuid,
> +             &Dns4Handle
> +             );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +
> +  Status = gBS->OpenProtocol (
> +                  Dns4Handle,
> +                  &gEfiDns4ProtocolGuid,
> +                  (VOID **) &Dns4,
> +                  Image,
> +                  Controller,
> +                  EFI_OPEN_PROTOCOL_BY_DRIVER
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +
> +  //
> +  // Configure DNS4 instance for the DNS server address and protocol.
> +  //
> +  ZeroMem (&Dns4CfgData, sizeof (Dns4CfgData));
> +  Dns4CfgData.DnsServerListCount = DnsServerListCount;
> +  Dns4CfgData.DnsServerList      = DnsServerList;
> +  Dns4CfgData.EnableDnsCache     = TRUE;
> +  IP4_COPY_ADDRESS (&Dns4CfgData.StationIp, &NvData->LocalIp);
> +  IP4_COPY_ADDRESS (&Dns4CfgData.SubnetMask, &NvData->SubnetMask);
> +  Dns4CfgData.Protocol           = EFI_IP_PROTO_UDP;
> +  Status = Dns4->Configure (
> +                   Dns4,
> +                   &Dns4CfgData
> +                   );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +
> +  //
> +  // Create event to set the is done flag when name resolution is finished.
> +  //
> +  ZeroMem (&Token, sizeof (Token));
> +  Status = gBS->CreateEvent (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_NOTIFY,
> +                  IScsiCommonNotify,
> +                  &IsDone,
> +                  &Token.Event
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +
> +  //
> +  // Start asynchronous name resolution.
> +  //
> +  Token.Status = EFI_NOT_READY;
> +  IsDone       = FALSE;
> +
> +  HostName = (CHAR16 *) AllocateZeroPool (ISCSI_NAME_MAX_SIZE);
> +  if (HostName == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  AsciiStrToUnicodeStrS (
> +    NvData->TargetUrl,
> +    HostName,
> +    ISCSI_NAME_MAX_SIZE
> +    );
> +
> +  Status = Dns4->HostNameToIp (Dns4, HostName, &Token);
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +
> +  while (!IsDone) {
> +    Dns4->Poll (Dns4);
> +  }
> +
> +  //
> +  // Name resolution is done, check result.
> +  //
> +  Status = Token.Status;
> +  if (!EFI_ERROR (Status)) {
> +    if (Token.RspData.H2AData == NULL) {
> +      Status = EFI_DEVICE_ERROR;
> +      goto Exit;
> +    }
> +    if (Token.RspData.H2AData->IpCount == 0 || Token.RspData.H2AData-
> >IpList == NULL) {
> +      Status = EFI_DEVICE_ERROR;
> +      goto Exit;
> +    }
> +    //
> +    // We just return the first IP address from DNS protocol.
> +    //
> +    IP4_COPY_ADDRESS (&NvData->TargetIp.v4, Token.RspData.H2AData-
> >IpList);
> +    Status = EFI_SUCCESS;
> +  }
> +
> +Exit:
> +
> +  if (Token.Event != NULL) {
> +    gBS->CloseEvent (Token.Event);
> +  }
> +  if (Token.RspData.H2AData != NULL) {
> +    if (Token.RspData.H2AData->IpList != NULL) {
> +      FreePool (Token.RspData.H2AData->IpList);
> +    }
> +    FreePool (Token.RspData.H2AData);
> +  }
> +
> +  if (Dns4 != NULL) {
> +    Dns4->Configure (Dns4, NULL);
> +
> +    gBS->CloseProtocol (
> +           Dns4Handle,
> +           &gEfiDns4ProtocolGuid,
> +           Image,
> +           Controller
> +           );
> +  }
> +
> +  if (Dns4Handle != NULL) {
> +    NetLibDestroyServiceChild (
> +      Controller,
> +      Image,
> +      &gEfiDns4ServiceBindingProtocolGuid,
> +      Dns4Handle
> +      );
> +  }
> +
> +  return Status;
> +}
> +
> +/**
> +  Retrieve the host address using the EFI_DNS6_PROTOCOL.
> +
> +  @param[in]  Image               The handle of the driver image.
> +  @param[in]  Controller          The handle of the controller.
> +  @param[in, out]  NvData         The Session config data structure.
> +
> +  @retval EFI_SUCCESS             Operation succeeded.
> +  @retval EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
> +  @retval EFI_DEVICE_ERROR        An unexpected network error occurred.
> +  @retval Others                  Other errors as indicated.
> +
> +**/
> +EFI_STATUS
> +IScsiDns6 (
> +  IN     EFI_HANDLE                      Image,
> +  IN     EFI_HANDLE                      Controller,
> +  IN OUT ISCSI_SESSION_CONFIG_NVDATA     *NvData
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  EFI_DNS6_PROTOCOL               *Dns6;
> +  EFI_DNS6_CONFIG_DATA            Dns6ConfigData;
> +  EFI_DNS6_COMPLETION_TOKEN       Token;
> +  EFI_HANDLE                      Dns6Handle;
> +  EFI_IP6_CONFIG_PROTOCOL         *Ip6Config;
> +  EFI_IPv6_ADDRESS                *DnsServerList;
> +  UINTN                           DnsServerListCount;
> +  UINTN                           DataSize;
> +  BOOLEAN                         IsDone;
> +  CHAR16                          *HostName;
> +
> +  DnsServerList       = NULL;
> +  DnsServerListCount  = 0;
> +  Dns6                = NULL;
> +  Dns6Handle          = NULL;
> +  ZeroMem (&Token, sizeof (EFI_DNS6_COMPLETION_TOKEN));
> +
> +  //
> +  // Get DNS server list from EFI IPv6 Configuration protocol.
> +  //
> +  Status = gBS->HandleProtocol (Controller, &gEfiIp6ConfigProtocolGuid,
> (VOID **) &Ip6Config);
> +  if (!EFI_ERROR (Status)) {
> +    //
> +    // Get the required size.
> +    //
> +    DataSize = 0;
> +    Status = Ip6Config->GetData (Ip6Config, Ip6ConfigDataTypeDnsServer,
> &DataSize, NULL);
> +    if (Status == EFI_BUFFER_TOO_SMALL) {
> +      DnsServerList = AllocatePool (DataSize);
> +      if (DnsServerList == NULL) {
> +        return EFI_OUT_OF_RESOURCES;
> +      }
> +
> +      Status = Ip6Config->GetData (Ip6Config, Ip6ConfigDataTypeDnsServer,
> &DataSize, DnsServerList);
> +      if (EFI_ERROR (Status)) {
> +        FreePool (DnsServerList);
> +        DnsServerList = NULL;
> +      } else {
> +        DnsServerListCount = DataSize / sizeof (EFI_IPv6_ADDRESS);
> +      }
> +    }
> +  }
> +
> +  //
> +  // Create a DNSv6 child instance and get the protocol.
> +  //
> +  Status = NetLibCreateServiceChild (
> +             Controller,
> +             Image,
> +             &gEfiDns6ServiceBindingProtocolGuid,
> +             &Dns6Handle
> +             );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +
> +  Status = gBS->OpenProtocol (
> +                  Dns6Handle,
> +                  &gEfiDns6ProtocolGuid,
> +                  (VOID **) &Dns6,
> +                  Image,
> +                  Controller,
> +                  EFI_OPEN_PROTOCOL_BY_DRIVER
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +
> +  //
> +  // Configure DNS6 instance for the DNS server address and protocol.
> +  //
> +  ZeroMem (&Dns6ConfigData, sizeof (EFI_DNS6_CONFIG_DATA));
> +  Dns6ConfigData.DnsServerCount = (UINT32)DnsServerListCount;
> +  Dns6ConfigData.DnsServerList  = DnsServerList;
> +  Dns6ConfigData.EnableDnsCache = TRUE;
> +  Dns6ConfigData.Protocol       = EFI_IP_PROTO_UDP;
> +  Status = Dns6->Configure (
> +                   Dns6,
> +                   &Dns6ConfigData
> +                   );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +
> +  Token.Status = EFI_NOT_READY;
> +  IsDone       = FALSE;
> +  //
> +  // Create event to set the  IsDone flag when name resolution is finished.
> +  //
> +  Status = gBS->CreateEvent (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_NOTIFY,
> +                  IScsiCommonNotify,
> +                  &IsDone,
> +                  &Token.Event
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +
> +  //
> +  // Start asynchronous name resolution.
> +  //
> +  HostName = (CHAR16 *) AllocateZeroPool (ISCSI_NAME_MAX_SIZE);
> +  if (HostName == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  AsciiStrToUnicodeStrS (
> +    NvData->TargetUrl,
> +    HostName,
> +    ISCSI_NAME_MAX_SIZE
> +    );
> +  Status = Dns6->HostNameToIp (Dns6, HostName, &Token);
> +  if (EFI_ERROR (Status)) {
> +    goto Exit;
> +  }
> +
> +  while (!IsDone) {
> +    Dns6->Poll (Dns6);
> +  }
> +
> +  //
> +  // Name resolution is done, check result.
> +  //
> +  Status = Token.Status;
> +  if (!EFI_ERROR (Status)) {
> +    if (Token.RspData.H2AData == NULL) {
> +      Status = EFI_DEVICE_ERROR;
> +      goto Exit;
> +    }
> +    if (Token.RspData.H2AData->IpCount == 0 || Token.RspData.H2AData-
> >IpList == NULL) {
> +      Status = EFI_DEVICE_ERROR;
> +      goto Exit;
> +    }
> +    //
> +    // We just return the first IPv6 address from DNS protocol.
> +    //
> +    IP6_COPY_ADDRESS (&NvData->TargetIp.v6, Token.RspData.H2AData-
> >IpList);
> +    Status = EFI_SUCCESS;
> +  }
> +
> +Exit:
> +
> +  if (Token.Event != NULL) {
> +    gBS->CloseEvent (Token.Event);
> +  }
> +  if (Token.RspData.H2AData != NULL) {
> +    if (Token.RspData.H2AData->IpList != NULL) {
> +      FreePool (Token.RspData.H2AData->IpList);
> +    }
> +    FreePool (Token.RspData.H2AData);
> +  }
> +
> +  if (Dns6 != NULL) {
> +    Dns6->Configure (Dns6, NULL);
> +
> +    gBS->CloseProtocol (
> +           Dns6Handle,
> +           &gEfiDns6ProtocolGuid,
> +           Image,
> +           Controller
> +           );
> +  }
> +
> +  if (Dns6Handle != NULL) {
> +    NetLibDestroyServiceChild (
> +      Controller,
> +      Image,
> +      &gEfiDns6ServiceBindingProtocolGuid,
> +      Dns6Handle
> +      );
> +  }
> +
> +  return Status;
> +}
> +
> diff --git a/NetworkPkg/IScsiDxe/IScsiDns.h b/NetworkPkg/IScsiDxe/IScsiDns.h
> new file mode 100644
> index 0000000..0b7ff86
> --- /dev/null
> +++ b/NetworkPkg/IScsiDxe/IScsiDns.h
> @@ -0,0 +1,59 @@
> +/** @file
> + The header file of routines for IScsi driver to perform DNS
> + resolution based on UEFI DNS protocols.
> +
> +Copyright (c) 2017, 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
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef _ISCSI_DNS_H_
> +#define _ISCSI_DNS_H_
> +
> +/**
> +  Retrieve the host address using the EFI_DNS4_PROTOCOL.
> +
> +  @param[in]  Image               The handle of the driver image.
> +  @param[in]  Controller          The handle of the controller.
> +  @param[in, out]  NvData         The Session config data structure.
> +
> +  @retval EFI_SUCCESS             Operation succeeded.
> +  @retval EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
> +  @retval EFI_DEVICE_ERROR        An unexpected network error occurred.
> +  @retval Others                  Other errors as indicated.
> +
> +**/
> +EFI_STATUS
> +IScsiDns4 (
> +  IN     EFI_HANDLE                      Image,
> +  IN     EFI_HANDLE                      Controller,
> +  IN OUT ISCSI_SESSION_CONFIG_NVDATA     *NvData
> +  );
> +
> +/**
> +  Retrieve the host address using the EFI_DNS6_PROTOCOL.
> +
> +  @param[in]  Image               The handle of the driver image.
> +  @param[in]  Controller          The handle of the controller.
> +  @param[in, out]  NvData         The Session config data structure.
> +
> +  @retval EFI_SUCCESS             Operation succeeded.
> +  @retval EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
> +  @retval EFI_DEVICE_ERROR        An unexpected network error occurred.
> +  @retval Others                  Other errors as indicated.
> +
> +**/
> +EFI_STATUS
> +IScsiDns6 (
> +  IN     EFI_HANDLE                      Image,
> +  IN     EFI_HANDLE                      Controller,
> +  IN OUT ISCSI_SESSION_CONFIG_NVDATA     *NvData
> +  );
> +
> +#endif
> \ No newline at end of file
> diff --git a/NetworkPkg/IScsiDxe/IScsiDriver.c
> b/NetworkPkg/IScsiDxe/IScsiDriver.c
> index ac10fa2..78c93ba 100644
> --- a/NetworkPkg/IScsiDxe/IScsiDriver.c
> +++ b/NetworkPkg/IScsiDxe/IScsiDriver.c
> @@ -1,9 +1,9 @@
>  /** @file
>    The entry point of IScsi driver.
> 
> -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2017, 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
> 
> @@ -250,19 +250,23 @@ IScsiSupported (
>  {
>    EFI_STATUS                Status;
>    EFI_GUID                  *IScsiServiceBindingGuid;
>    EFI_GUID                  *TcpServiceBindingGuid;
>    EFI_GUID                  *DhcpServiceBindingGuid;
> +  EFI_GUID                  *DnsServiceBindingGuid;
> 
>    if (IpVersion == IP_VERSION_4) {
>      IScsiServiceBindingGuid  = &gIScsiV4PrivateGuid;
>      TcpServiceBindingGuid    = &gEfiTcp4ServiceBindingProtocolGuid;
>      DhcpServiceBindingGuid   = &gEfiDhcp4ServiceBindingProtocolGuid;
> +    DnsServiceBindingGuid    = &gEfiDns4ServiceBindingProtocolGuid;
> +
>    } else {
>      IScsiServiceBindingGuid  = &gIScsiV6PrivateGuid;
>      TcpServiceBindingGuid    = &gEfiTcp6ServiceBindingProtocolGuid;
>      DhcpServiceBindingGuid   = &gEfiDhcp6ServiceBindingProtocolGuid;
> +    DnsServiceBindingGuid    = &gEfiDns6ServiceBindingProtocolGuid;
>    }
> 
>    Status = gBS->OpenProtocol (
>                    ControllerHandle,
>                    IScsiServiceBindingGuid,
> @@ -303,11 +307,25 @@ IScsiSupported (
>                      );
>      if (EFI_ERROR (Status)) {
>        return EFI_UNSUPPORTED;
>      }
>    }
> -
> +
> +  if (IScsiDnsIsConfigured (ControllerHandle)) {
> +    Status = gBS->OpenProtocol (
> +                    ControllerHandle,
> +                    DnsServiceBindingGuid,
> +                    NULL,
> +                    This->DriverBindingHandle,
> +                    ControllerHandle,
> +                    EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> +                    );
> +    if (EFI_ERROR (Status)) {
> +      return EFI_UNSUPPORTED;
> +    }
> +  }
> +
>    return EFI_SUCCESS;
>  }
> 
> 
>  /**
> diff --git a/NetworkPkg/IScsiDxe/IScsiDxe.inf
> b/NetworkPkg/IScsiDxe/IScsiDxe.inf
> index 8952120..699ffd1 100644
> --- a/NetworkPkg/IScsiDxe/IScsiDxe.inf
> +++ b/NetworkPkg/IScsiDxe/IScsiDxe.inf
> @@ -2,11 +2,11 @@
>  #  Client-side iSCSI service.
>  #
>  #  The iSCSI driver provides iSCSI service in the preboot environment and
> supports
>  #  booting over iSCSI.
>  #
> -# Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2004 - 2017, 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
>  #
> @@ -48,10 +48,12 @@
>    IScsiConfigVfr.vfr
>    IScsiDhcp.c
>    IScsiDhcp.h
>    IScsiDhcp6.c
>    IScsiDhcp6.h
> +  IScsiDns.c
> +  IScsiDns.h
>    IScsiDriver.c
>    IScsiDriver.h
>    IScsiExtScsiPassThru.c
>    IScsiIbft.c
>    IScsiIbft.h
> @@ -87,18 +89,24 @@
> 
>  [Protocols]
>    gEfiAcpiTableProtocolGuid                     ## SOMETIMES_CONSUMES ##
> SystemTable
>    gEfiDriverBindingProtocolGuid                 ## SOMETIMES_PRODUCES
>    gEfiPciIoProtocolGuid                         ## SOMETIMES_CONSUMES
> -  gEfiDhcp4ProtocolGuid                         ## TO_START
> -  gEfiDhcp6ProtocolGuid                         ## TO_START
> -  gEfiDhcp4ServiceBindingProtocolGuid           ## TO_START
> -  gEfiDhcp6ServiceBindingProtocolGuid           ## TO_START
> +  gEfiDhcp4ProtocolGuid                         ## SOMETIMES_CONSUMES
> +  gEfiDhcp6ProtocolGuid                         ## SOMETIMES_CONSUMES
> +  gEfiDhcp4ServiceBindingProtocolGuid           ## SOMETIMES_CONSUMES
> +  gEfiDhcp6ServiceBindingProtocolGuid           ## SOMETIMES_CONSUMES
> +  gEfiDns4ServiceBindingProtocolGuid            ## SOMETIMES_CONSUMES
> +  gEfiDns4ProtocolGuid                          ## SOMETIMES_CONSUMES
> +  gEfiDns6ServiceBindingProtocolGuid            ## SOMETIMES_CONSUMES
> +  gEfiDns6ProtocolGuid                          ## SOMETIMES_CONSUMES
> +  gEfiIp4Config2ProtocolGuid                    ## SOMETIMES_CONSUMES
> +  gEfiIp6ConfigProtocolGuid                     ## SOMETIMES_CONSUMES
>    gEfiTcp4ProtocolGuid                          ## TO_START
> -  gEfiTcp6ProtocolGuid                          ## TO_START
> +  gEfiTcp6ProtocolGuid                          ## TO_START
>    gEfiTcp4ServiceBindingProtocolGuid            ## TO_START
> -  gEfiTcp6ServiceBindingProtocolGuid            ## TO_START
> +  gEfiTcp6ServiceBindingProtocolGuid            ## TO_START
>    gEfiExtScsiPassThruProtocolGuid               ## BY_START
>    gEfiHiiConfigAccessProtocolGuid               ## PRODUCES
>    ## TO_START
>    ## PRODUCES
>    gEfiDevicePathProtocolGuid
> diff --git a/NetworkPkg/IScsiDxe/IScsiImpl.h b/NetworkPkg/IScsiDxe/IScsiImpl.h
> index af46871..741c497 100644
> --- a/NetworkPkg/IScsiDxe/IScsiImpl.h
> +++ b/NetworkPkg/IScsiDxe/IScsiImpl.h
> @@ -1,9 +1,9 @@
>  /** @file
>    The shared head file for iSCSI driver.
> 
> -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2017, 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
> 
> @@ -26,12 +26,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY
> KIND, EITHER EXPRESS OR IMPLIED.
>  #include <Protocol/HiiConfigAccess.h>
> 
>  #include <Protocol/Ip6.h>
>  #include <Protocol/Dhcp4.h>
>  #include <Protocol/Dhcp6.h>
> +#include <Protocol/Dns4.h>
> +#include <Protocol/Dns6.h>
>  #include <Protocol/Tcp4.h>
>  #include <Protocol/Tcp6.h>
> +#include <Protocol/Ip4Config2.h>
> +#include <Protocol/Ip6Config.h>
> 
>  #include <Protocol/AuthenticationInfo.h>
>  #include <Protocol/IScsiInitiatorName.h>
>  #include <Protocol/ScsiPassThruExt.h>
>  #include <Protocol/AdapterInformation.h>
> @@ -60,12 +64,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY
> KIND, EITHER EXPRESS OR IMPLIED.
>  #include "IScsiDriver.h"
>  #include "IScsiProto.h"
>  #include "IScsiCHAP.h"
>  #include "IScsiDhcp.h"
>  #include "IScsiDhcp6.h"
> +
>  #include "IScsiIbft.h"
>  #include "IScsiMisc.h"
> +#include "IScsiDns.h"
>  #include "IScsiConfig.h"
> 
>  #define ISCSI_AUTH_INITIAL        0
> 
>  #define ISCSI_SESSION_SIGNATURE   SIGNATURE_32 ('I', 'S', 'S', 'N')
> diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c
> index 11a80f2..e8e8f9c 100644
> --- a/NetworkPkg/IScsiDxe/IScsiMisc.c
> +++ b/NetworkPkg/IScsiDxe/IScsiMisc.c
> @@ -1,9 +1,9 @@
>  /** @file
>    Miscellaneous routines for iSCSI driver.
> 
> -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2017, 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
> 
> @@ -1000,10 +1000,98 @@ IScsiDhcpIsConfigured (
>    FreePool (AttemptConfigOrder);
>    return FALSE;
>  }
> 
>  /**
> +  Check wheather the Controller handle is configured to use DNS protocol.
> +
> +  @param[in]  Controller           The handle of the controller.
> +
> +  @retval TRUE                     The handle of the controller need the Dns
> protocol.
> +  @retval FALSE                    The handle of the controller does not need the
> Dns protocol.
> +
> +**/
> +BOOLEAN
> +IScsiDnsIsConfigured (
> +  IN EFI_HANDLE  Controller
> +  )
> +{
> +  ISCSI_ATTEMPT_CONFIG_NVDATA *AttemptTmp;
> +  UINT8                       *AttemptConfigOrder;
> +  UINTN                       AttemptConfigOrderSize;
> +  UINTN                       Index;
> +  EFI_STATUS                  Status;
> +  EFI_MAC_ADDRESS             MacAddr;
> +  UINTN                       HwAddressSize;
> +  UINT16                      VlanId;
> +  CHAR16                      MacString[ISCSI_MAX_MAC_STRING_LEN];
> +  CHAR16                      AttemptName[ISCSI_NAME_IFR_MAX_SIZE];
> +
> +  AttemptConfigOrder = IScsiGetVariableAndSize (
> +                         L"AttemptOrder",
> +                         &gIScsiConfigGuid,
> +                         &AttemptConfigOrderSize
> +                         );
> +  if (AttemptConfigOrder == NULL || AttemptConfigOrderSize == 0) {
> +    return FALSE;
> +  }
> +
> +  //
> +  // Get MAC address of this network device.
> +  //
> +  Status = NetLibGetMacAddress (Controller, &MacAddr, &HwAddressSize);
> +  if(EFI_ERROR (Status)) {
> +    return FALSE;
> +  }
> +  //
> +  // Get VLAN ID of this network device.
> +  //
> +  VlanId = NetLibGetVlanId (Controller);
> +  IScsiMacAddrToStr (&MacAddr, (UINT32) HwAddressSize, VlanId, MacString);
> +
> +  for (Index = 0; Index < AttemptConfigOrderSize / sizeof (UINT8); Index++) {
> +    UnicodeSPrint (
> +      AttemptName,
> +      (UINTN) 128,
> +      L"%s%d",
> +      MacString,
> +      (UINTN) AttemptConfigOrder[Index]
> +      );
> +    Status = GetVariable2 (
> +               AttemptName,
> +               &gEfiIScsiInitiatorNameProtocolGuid,
> +               (VOID**)&AttemptTmp,
> +               NULL
> +               );
> +    if(AttemptTmp == NULL || EFI_ERROR (Status)) {
> +      continue;
> +    }
> +
> +    ASSERT (AttemptConfigOrder[Index] == AttemptTmp->AttemptConfigIndex);
> +
> +    if (AttemptTmp->SessionConfigData.Enabled == ISCSI_DISABLED) {
> +      FreePool (AttemptTmp);
> +      continue;
> +    }
> +
> +    if (AttemptTmp->SessionConfigData.DnsMode) {
> +      FreePool (AttemptTmp);
> +      FreePool (AttemptConfigOrder);
> +      return TRUE;
> +    } else {
> +      FreePool (AttemptTmp);
> +      continue;
> +    }
> +
> +  }
> +
> +  FreePool (AttemptConfigOrder);
> +  return FALSE;
> +
> +}
> +
> +/**
>    Get the various configuration data.
> 
>    @param[in]  Private   The iSCSI driver data.
> 
>    @retval EFI_SUCCESS            The configuration data is retrieved.
> diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h
> index 912a871..2c0fe07 100644
> --- a/NetworkPkg/IScsiDxe/IScsiMisc.h
> +++ b/NetworkPkg/IScsiDxe/IScsiMisc.h
> @@ -1,9 +1,9 @@
>  /** @file
>    Miscellaneous definitions for iSCSI driver.
> 
> -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2017, 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
> 
> @@ -31,10 +31,11 @@ typedef struct _ISCSI_DRIVER_DATA
> ISCSI_DRIVER_DATA;
>  ///
>  /// The ignored field StaticIpAddress's offset in old IPv6 Device Path
>  ///
>  #define IP6_OLD_IPADDRESS_OFFSET      42
> 
> +
>  #pragma pack(1)
>  typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
>    UINT16            TargetPort;
>    UINT8             Enabled;
>    UINT8             IpMode;
> @@ -43,10 +44,11 @@ typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
>    EFI_IPv4_ADDRESS  SubnetMask;
>    EFI_IP_ADDRESS    Gateway;
> 
>    BOOLEAN           InitiatorInfoFromDhcp;
>    BOOLEAN           TargetInfoFromDhcp;
> +
>    CHAR8             TargetName[ISCSI_NAME_MAX_SIZE];
>    EFI_IP_ADDRESS    TargetIp;
>    UINT8             PrefixLength;
>    UINT8             BootLun[8];
> 
> @@ -55,10 +57,13 @@ typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
>    UINT8             IsId[6];
> 
>    BOOLEAN           RedirectFlag;
>    UINT16            OriginalTargetPort;     // The port of proxy/virtual target.
>    EFI_IP_ADDRESS    OriginalTargetIp;       // The address of proxy/virtual target.
> +
> +  BOOLEAN           DnsMode;  // Flag indicate whether the Target address is
> expressed as URL format.
> +  CHAR8             TargetUrl[ISCSI_TARGET_URI_MAX_SIZE];
> 
>  } ISCSI_SESSION_CONFIG_NVDATA;
>  #pragma pack()
> 
>  /**
> @@ -337,10 +342,24 @@ IScsiDhcpIsConfigured (
>    IN EFI_HANDLE  Controller,
>    IN UINT8       IpVersion
>    );
> 
>  /**
> +  Check wheather the Controller handle is configured to use DNS protocol.
> +
> +  @param[in]  Controller           The handle of the controller.
> +
> +  @retval TRUE                     The handle of the controller need the DNS
> protocol.
> +  @retval FALSE                    The handle of the controller does not need the
> DNS protocol.
> +
> +**/
> +BOOLEAN
> +IScsiDnsIsConfigured (
> +  IN EFI_HANDLE  Controller
> +  );
> +
> +/**
>    Get the various configuration data of this iSCSI instance.
> 
>    @param[in]  Private   The iSCSI driver data.
> 
>    @retval EFI_SUCCESS   Obtained the configuration of this instance.
> diff --git a/NetworkPkg/IScsiDxe/IScsiProto.c
> b/NetworkPkg/IScsiDxe/IScsiProto.c
> index a67bbd5..1602a26 100644
> --- a/NetworkPkg/IScsiDxe/IScsiProto.c
> +++ b/NetworkPkg/IScsiDxe/IScsiProto.c
> @@ -1,9 +1,9 @@
>  /** @file
>    The implementation of iSCSI protocol based on RFC3720.
> 
> -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2017, 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
> 
> @@ -253,10 +253,27 @@ IScsiCreateConnection (
>    //
>    Conn->MaxRecvDataSegmentLength  =
> DEFAULT_MAX_RECV_DATA_SEG_LEN;
>    Conn->HeaderDigest              = IScsiDigestNone;
>    Conn->DataDigest                = IScsiDigestNone;
> 
> +  if (NvData->DnsMode) {
> +    //
> +    // perform dns process if target address expressed by domain name.
> +    //
> +    if (!Conn->Ipv6Flag) {
> +      Status = IScsiDns4 (Private->Image, Private->Controller, NvData);
> +    } else {
> +      Status = IScsiDns6 (Private->Image, Private->Controller, NvData);
> +    }
> +
> +    if (EFI_ERROR(Status)) {
> +      DEBUG ((EFI_D_ERROR, "The configuration of Target address or DNS
> server address is invalid!\n"));
> +      FreePool (Conn);
> +      return NULL;
> +    }
> +  }
> +
>    if (!Conn->Ipv6Flag) {
>      Tcp4IoConfig = &TcpIoConfig.Tcp4IoConfigData;
> 
>      CopyMem (&Tcp4IoConfig->LocalIp, &NvData->LocalIp, sizeof
> (EFI_IPv4_ADDRESS));
>      CopyMem (&Tcp4IoConfig->SubnetMask, &NvData->SubnetMask, sizeof
> (EFI_IPv4_ADDRESS));
> @@ -1129,12 +1146,17 @@ IScsiUpdateTargetAddress (
>        TargetAddress ++;
> 
>      } else {
>        //
>        // The domainname of the target is presented in the format of a DNS host
> name.
> -      // Temporary not supported.
> -      continue;
> +      //
> +      IpStr = TargetAddress;
> +
> +      while ((*TargetAddress != '\0') && (*TargetAddress != ':') &&
> (*TargetAddress != ',')) {
> +        TargetAddress++;
> +      }
> +      NvData->DnsMode = TRUE;
>      }
> 
>      //
>      // Save the origial user setting which specifies the proxy/virtual iSCSI target.
>      //
> @@ -1176,21 +1198,32 @@ IScsiUpdateTargetAddress (
>        IpMode = NvData->IpMode;
>      } else {
>        IpMode = Session->ConfigData->AutoConfigureMode;
>      }
> 
> -    Status = IScsiAsciiStrToIp (
> -               IpStr,
> -               IpMode,
> -               &Session->ConfigData->SessionConfigData.TargetIp
> -               );
> -
> -    if (EFI_ERROR (Status)) {
> -      continue;
> +    if (NvData->DnsMode) {
> +      //
> +      // Target address is expressed as URL format, just save it and
> +      // do DNS resolution when creating a TCP connection.
> +      //
> +      if (AsciiStrSize (IpStr) > sizeof (Session->ConfigData-
> >SessionConfigData.TargetUrl)){
> +        return EFI_INVALID_PARAMETER;
> +      }
> +      CopyMem (&Session->ConfigData->SessionConfigData.TargetUrl, IpStr,
> AsciiStrSize (IpStr));
>      } else {
> -      NvData->RedirectFlag = TRUE;
> -      break;
> +      Status = IScsiAsciiStrToIp (
> +                 IpStr,
> +                 IpMode,
> +                 &Session->ConfigData->SessionConfigData.TargetIp
> +                 );
> +
> +      if (EFI_ERROR (Status)) {
> +        continue;
> +      } else {
> +        NvData->RedirectFlag = TRUE;
> +        break;
> +      }
>      }
>    }
> 
>    IScsiFreeKeyValueList (KeyValueList);
> 
> --
> 1.9.5.msysgit.1



      parent reply	other threads:[~2017-01-18  4:34 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-11  8:07 [PATCH V2] NetworkPkg: Add dns support for target URL configuration in ISCSI Zhang Lubo
2017-01-16  8:41 ` Ye, Ting
2017-01-18  4:34 ` Wu, Jiaxin [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=895558F6EA4E3B41AC93A00D163B727416294A4D@SHSMSX103.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox