Reviewed-by: Fu Siyuan siyuan...@intel.com

> -----Original Message-----
> From: Zhang, Lubo
> Sent: Friday, October 14, 2016 2:45 PM
> To: edk2-devel@lists.01.org
> Cc: Ye, Ting <ting...@intel.com>; Fu, Siyuan <siyuan...@intel.com>; Wu,
> Jiaxin <jiaxin...@intel.com>
> Subject: [patch] NetworkPkg: Support bracketed IPv6 address during a
> redirection in iSCSI
> 
> According to RFC 3720, the TargetAddress provided in a redirection
> might be a DNS host name, a dotted-decimal IPv4 address, or a
> bracketed IPv6 address. Current ISCSI driver in Networkpkg only
> supports dotted-decimal IPv4 address, so we need add IPv6 address
> support since it is a combo driver supporting dual stack.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Zhang Lubo <lubo.zh...@intel.com>
> Cc: Ye Ting <ting...@intel.com>
> Cc: Fu Siyuan <siyuan...@intel.com>
> Cc: Wu Jiaxin <jiaxin...@intel.com>
> ---
>  NetworkPkg/IScsiDxe/IScsiProto.c | 51 ++++++++++++++++++++++++++++++-----
> -----
>  NetworkPkg/IScsiDxe/IScsiProto.h |  5 +++-
>  2 files changed, 43 insertions(+), 13 deletions(-)
> 
> diff --git a/NetworkPkg/IScsiDxe/IScsiProto.c
> b/NetworkPkg/IScsiDxe/IScsiProto.c
> index 5092365..a9bf491 100644
> --- a/NetworkPkg/IScsiDxe/IScsiProto.c
> +++ b/NetworkPkg/IScsiDxe/IScsiProto.c
> @@ -1087,26 +1087,53 @@ IScsiUpdateTargetAddress (
>      TargetAddress = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_ADDRESS);
>      if (TargetAddress == NULL) {
>        break;
>      }
> 
> -    if (!NET_IS_DIGIT (TargetAddress[0])) {
> +    //
> +    // RFC 3720 defines format of the
> TargetAddress=domainname[:port][,portal-group-tag]
> +    // The domainname can be specified as either a DNS host name,
> adotted-decimal IPv4 address,
> +    // or a bracketed IPv6 address as specified in [RFC2732].
> +    //
> +    if (NET_IS_DIGIT (TargetAddress[0])) {
>        //
> -      // The domainname of the target may be presented in three formats:
> a DNS host name,
> -      // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only
> accept dotted
> -      // IPv4 address.
> +      // The domainname of the target is presented in a dotted-decimal
> IPv4 address format.
>        //
> -      continue;
> -    }
> -
> -    IpStr = TargetAddress;
> +      IpStr = TargetAddress;
> 
> -    while ((*TargetAddress != 0) && (*TargetAddress != ':') &&
> (*TargetAddress != ',')) {
> +      while ((*TargetAddress != '\0') && (*TargetAddress != ':') &&
> (*TargetAddress != ',')) {
> +        //
> +        // NULL, ':', or ',' ends the IPv4 string.
> +        //
> +        TargetAddress++;
> +      }
> +
> +    } else if (*TargetAddress == ISCSI_REDIRECT_ADDR_START_DELIMITER){
>        //
> -      // NULL, ':', or ',' ends the IPv4 string.
> +      // The domainname of the target is presented in a bracketed IPv6
> address format.
>        //
> -      TargetAddress++;
> +      TargetAddress ++;
> +      IpStr = TargetAddress;
> +      while ((*TargetAddress != '\0') && (*TargetAddress !=
> ISCSI_REDIRECT_ADDR_END_DELIMITER)) {
> +        //
> +        // ']' ends the IPv6 string.
> +        //
> +        TargetAddress++;
> +      }
> +
> +      if (*TargetAddress != ISCSI_REDIRECT_ADDR_END_DELIMITER) {
> +        continue;
> +      }
> +
> +      *TargetAddress = '\0';
> +      TargetAddress ++;
> +
> +    } else {
> +      //
> +      // The domainname of the target is presented in the format of a DNS
> host name.
> +      // Temporary not supported.
> +      continue;
>      }
> 
>      if (*TargetAddress == ',') {
>        //
>        // Comma and the portal group tag MUST be ommitted if the
> TargetAddress is sent
> @@ -1124,11 +1151,11 @@ IScsiUpdateTargetAddress (
>        } else {
>          Session->ConfigData->SessionConfigData.TargetPort = (UINT16)
> Number;
>        }
>      } else {
>        //
> -      // The string only contains the IPv4 address. Use the well-known
> port.
> +      // The string only contains the Target address. Use the well-known
> port.
>        //
>        Session->ConfigData->SessionConfigData.TargetPort =
> ISCSI_WELL_KNOWN_PORT;
>      }
>      //
>      // Update the target IP address.
> diff --git a/NetworkPkg/IScsiDxe/IScsiProto.h
> b/NetworkPkg/IScsiDxe/IScsiProto.h
> index 8099f34..367914d 100644
> --- a/NetworkPkg/IScsiDxe/IScsiProto.h
> +++ b/NetworkPkg/IScsiDxe/IScsiProto.h
> @@ -1,9 +1,9 @@
>  /** @file
>    The header file of iSCSI Protocol that defines many specific data
> structures.
> 
> -Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 2016, 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
> 
> @@ -38,10 +38,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
>  #define DEFAULT_MAX_OUTSTANDING_R2T             1
> 
>  #define ISCSI_VERSION_MAX                       0x00
>  #define ISCSI_VERSION_MIN                       0x00
> 
> +#define ISCSI_REDIRECT_ADDR_START_DELIMITER     '['
> +#define ISCSI_REDIRECT_ADDR_END_DELIMITER       ']'
> +
>  #define ISCSI_KEY_AUTH_METHOD                   "AuthMethod"
>  #define ISCSI_KEY_HEADER_DIGEST                 "HeaderDigest"
>  #define ISCSI_KEY_DATA_DIGEST                   "DataDigest"
>  #define ISCSI_KEY_MAX_CONNECTIONS               "MaxConnections"
>  #define ISCSI_KEY_TARGET_NAME                   "TargetName"
> --
> 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