]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/IScsiDxe/IScsiProto.c
SecurityPkg/Tcg2Pei: drop Tcg2PhysicalPresenceLib dependency
[mirror_edk2.git] / NetworkPkg / IScsiDxe / IScsiProto.c
index 88d9bdd8f08c24077cfcf902a1bffbb13af80526..38e4af26bcf8f227fc78fea42b959b23548dbad3 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   The implementation of iSCSI protocol based on RFC3720.\r
 \r
-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -255,6 +255,23 @@ IScsiCreateConnection (
   Conn->HeaderDigest              = IScsiDigestNone;\r
   Conn->DataDigest                = IScsiDigestNone;\r
 \r
+  if (NvData->DnsMode) {\r
+    //\r
+    // perform dns process if target address expressed by domain name.\r
+    //\r
+    if (!Conn->Ipv6Flag) {\r
+      Status = IScsiDns4 (Private->Image, Private->Controller, NvData);\r
+    } else {\r
+      Status = IScsiDns6 (Private->Image, Private->Controller, NvData);\r
+    }\r
+\r
+    if (EFI_ERROR(Status)) {\r
+      DEBUG ((EFI_D_ERROR, "The configuration of Target address or DNS server address is invalid!\n"));\r
+      FreePool (Conn);\r
+      return NULL;\r
+    }\r
+  }\r
+\r
   if (!Conn->Ipv6Flag) {\r
     Tcp4IoConfig = &TcpIoConfig.Tcp4IoConfigData;\r
     \r
@@ -427,14 +444,14 @@ IScsiSessionLogin (
   VOID              *Tcp;\r
   EFI_GUID          *ProtocolGuid;\r
   UINT8             RetryCount;\r
-  BOOLEAN           MediaPresent;\r
+  EFI_STATUS        MediaStatus;\r
 \r
   //\r
   // Check media status before session login.\r
   //\r
-  MediaPresent = TRUE;\r
-  NetLibDetectMedia (Session->Private->Controller, &MediaPresent);\r
-  if (!MediaPresent) {\r
+  MediaStatus = EFI_SUCCESS;\r
+  NetLibDetectMediaWaitTimeout (Session->Private->Controller, ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME, &MediaStatus);\r
+  if (MediaStatus != EFI_SUCCESS) {\r
     return EFI_NO_MEDIA;\r
   }\r
 \r
@@ -786,7 +803,7 @@ IScsiPrepareLoginReq (
 \r
   case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:\r
     //\r
-    // Only negotiate the paramter once.\r
+    // Only negotiate the parameter once.\r
     //\r
     if (!Conn->ParamNegotiated) {\r
       IScsiFillOpParams (Conn, Nbuf);\r
@@ -1091,29 +1108,60 @@ IScsiUpdateTargetAddress (
       break;\r
     }\r
 \r
-    if (!NET_IS_DIGIT (TargetAddress[0])) {\r
+    //\r
+    // RFC 3720 defines format of the TargetAddress=domainname[:port][,portal-group-tag]\r
+    // The domainname can be specified as either a DNS host name, adotted-decimal IPv4 address,\r
+    // or a bracketed IPv6 address as specified in [RFC2732].\r
+    //\r
+    if (NET_IS_DIGIT (TargetAddress[0])) {\r
       //\r
-      // The domainname of the target may be presented in three formats: a DNS host name,\r
-      // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only accept dotted\r
-      // IPv4 address.\r
+      // The domainname of the target is presented in a dotted-decimal IPv4 address format.\r
       //\r
-      continue;\r
-    }\r
+      IpStr = TargetAddress;\r
 \r
-    //\r
-    // Save the origial user setting which specifies the proxy/virtual iSCSI target.\r
-    //\r
-    NvData->OriginalTargetPort = NvData->TargetPort;\r
+      while ((*TargetAddress != '\0') && (*TargetAddress != ':') && (*TargetAddress != ',')) {\r
+        //\r
+        // NULL, ':', or ',' ends the IPv4 string.\r
+        //\r
+        TargetAddress++;\r
+      }\r
+    } else if (*TargetAddress == ISCSI_REDIRECT_ADDR_START_DELIMITER){\r
+      //\r
+      // The domainname of the target is presented in a bracketed IPv6 address format.\r
+      //\r
+      TargetAddress ++;\r
+      IpStr = TargetAddress;\r
+      while ((*TargetAddress != '\0') && (*TargetAddress != ISCSI_REDIRECT_ADDR_END_DELIMITER)) {\r
+        //\r
+        // ']' ends the IPv6 string.\r
+        //\r
+        TargetAddress++;\r
+      }\r
+\r
+      if (*TargetAddress != ISCSI_REDIRECT_ADDR_END_DELIMITER) {\r
+        continue;\r
+      }\r
 \r
-    IpStr = TargetAddress;\r
+      *TargetAddress = '\0';\r
+      TargetAddress ++;\r
 \r
-    while ((*TargetAddress != 0) && (*TargetAddress != ':') && (*TargetAddress != ',')) {\r
+    } else {\r
       //\r
-      // NULL, ':', or ',' ends the IPv4 string.\r
+      // The domainname of the target is presented in the format of a DNS host name.\r
       //\r
-      TargetAddress++;\r
+      IpStr = TargetAddress;\r
+\r
+      while ((*TargetAddress != '\0') && (*TargetAddress != ':') && (*TargetAddress != ',')) {\r
+        TargetAddress++;\r
+      }\r
+      NvData->DnsMode = TRUE;\r
     }\r
 \r
+    //\r
+    // Save the origial user setting which specifies the proxy/virtual iSCSI target.\r
+    //\r
+    NvData->OriginalTargetPort = NvData->TargetPort;\r
+\r
     if (*TargetAddress == ',') {\r
       //\r
       // Comma and the portal group tag MUST be ommitted if the TargetAddress is sent\r
@@ -1133,7 +1181,7 @@ IScsiUpdateTargetAddress (
       }\r
     } else {\r
       //\r
-      // The string only contains the IPv4 address. Use the well-known port.\r
+      // The string only contains the Target address. Use the well-known port.\r
       //\r
       NvData->TargetPort = ISCSI_WELL_KNOWN_PORT;\r
     }\r
@@ -1152,17 +1200,28 @@ IScsiUpdateTargetAddress (
       IpMode = Session->ConfigData->AutoConfigureMode;\r
     }\r
 \r
-    Status = IScsiAsciiStrToIp (\r
-               IpStr,\r
-               IpMode,\r
-               &Session->ConfigData->SessionConfigData.TargetIp\r
-               );\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      continue;\r
+    if (NvData->DnsMode) {\r
+      //\r
+      // Target address is expressed as URL format, just save it and\r
+      // do DNS resolution when creating a TCP connection.\r
+      //\r
+      if (AsciiStrSize (IpStr) > sizeof (Session->ConfigData->SessionConfigData.TargetUrl)){\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+      CopyMem (&Session->ConfigData->SessionConfigData.TargetUrl, IpStr, AsciiStrSize (IpStr));\r
     } else {\r
-      NvData->RedirectFlag = TRUE;\r
-      break;\r
+      Status = IScsiAsciiStrToIp (\r
+                 IpStr,\r
+                 IpMode,\r
+                 &Session->ConfigData->SessionConfigData.TargetIp\r
+                 );\r
+\r
+      if (EFI_ERROR (Status)) {\r
+        continue;\r
+      } else {\r
+        NvData->RedirectFlag = TRUE;\r
+        break;\r
+      }\r
     }\r
   }\r
 \r
@@ -2117,7 +2176,7 @@ IScsiNewDataSegment (
 \r
   @param[in]  Packet The EXT SCSI PASS THRU request packet containing the SCSI command.\r
   @param[in]  Lun    The LUN.\r
-  @param[in]  Tcb    The tcb assocated with this SCSI command.\r
+  @param[in]  Tcb    The tcb associated with this SCSI command.\r
 \r
   @return The  created iSCSI SCSI command PDU.\r
   @retval NULL Other errors as indicated.\r