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