* [PATCH V2] NetworkPkg: Add dns support for target URL configuration in ISCSI.
@ 2017-01-11 8:07 Zhang Lubo
2017-01-16 8:41 ` Ye, Ting
2017-01-18 4:34 ` Wu, Jiaxin
0 siblings, 2 replies; 3+ messages in thread
From: Zhang Lubo @ 2017-01-11 8:07 UTC (permalink / raw)
To: edk2-devel; +Cc: Ye Ting, Fu Siyuan, Wu Jiaxin
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH V2] NetworkPkg: Add dns support for target URL configuration in ISCSI.
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
1 sibling, 0 replies; 3+ messages in thread
From: Ye, Ting @ 2017-01-16 8:41 UTC (permalink / raw)
To: Zhang, Lubo, edk2-devel@lists.01.org; +Cc: Fu, Siyuan, Wu, Jiaxin
Looks good to me.
Reviewed-by: Ye Ting <ting.ye@intel.com>
-----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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH V2] NetworkPkg: Add dns support for target URL configuration in ISCSI.
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
1 sibling, 0 replies; 3+ messages in thread
From: Wu, Jiaxin @ 2017-01-18 4:34 UTC (permalink / raw)
To: Zhang, Lubo, edk2-devel@lists.01.org; +Cc: Ye, Ting, Fu, Siyuan
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
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-01-18 4:34 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox