]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/IScsiDxe/IScsiConfig.c
ArmVirtPkg: switch to KVM safe IoLib implementation
[mirror_edk2.git] / NetworkPkg / IScsiDxe / IScsiConfig.c
index 1fe279e96b516166e5af9bce6ac7362513749f10..62df367da78afb23e62d729ccb5a7a1f1638ba2d 100644 (file)
@@ -205,11 +205,11 @@ IScsiParseIsIdFromString (
 \r
   IsIdStr = (CHAR16 *) String;\r
 \r
-  if (StrLen (IsIdStr) != 6) {\r
+  if (StrLen (IsIdStr) != 6 && StrLen (IsIdStr) != 12) {\r
     UnicodeSPrint (\r
       PortString,\r
       (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
-      L"Error! Input is incorrect, please input 6 hex numbers!\n"\r
+      L"Error! Only last 3 bytes are configurable, please input 6 hex numbers for last 3 bytes only or 12 hex numbers for full SSID!\n"\r
       );\r
 \r
     CreatePopUp (\r
@@ -222,6 +222,10 @@ IScsiParseIsIdFromString (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  if (StrLen (IsIdStr) == 12) {\r
+    IsIdStr += 6;\r
+  }\r
+\r
   for (Index = 3; Index < 6; Index++) {\r
     CopyMem (TempStr, IsIdStr, sizeof (TempStr));\r
     TempStr[2] = L'\0';\r
@@ -537,6 +541,7 @@ IScsiConvertAttemptConfigDataToIfrNvData (
     IScsiIpToStr (&Ip, FALSE, IfrNvData->SubnetMask);\r
     CopyMem (&Ip.v4, &SessionConfigData->Gateway, sizeof (EFI_IPv4_ADDRESS));\r
     IScsiIpToStr (&Ip, FALSE, IfrNvData->Gateway);\r
+    ZeroMem (IfrNvData->TargetIp, sizeof (IfrNvData->TargetIp));\r
     if (SessionConfigData->TargetIp.v4.Addr[0] != '\0') {\r
       CopyMem (&Ip.v4, &SessionConfigData->TargetIp, sizeof (EFI_IPv4_ADDRESS));\r
       IScsiIpToStr (&Ip, FALSE, IfrNvData->TargetIp);\r
@@ -628,10 +633,13 @@ IScsiConvertAttemptConfigDataToIfrNvDataByKeyword (
   ISCSI_SESSION_CONFIG_NVDATA   *SessionConfigData;\r
   ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData;\r
   CHAR16                        AttemptNameList[ATTEMPT_NAME_LIST_SIZE];\r
+  ISCSI_NIC_INFO                *NicInfo;\r
+  CHAR16                        MacString[ISCSI_MAX_MAC_STRING_LEN];\r
   EFI_IP_ADDRESS                Ip;\r
   UINTN                         Index;\r
   UINTN                         StringLen;\r
 \r
+  NicInfo = NULL;\r
   ZeroMem (AttemptNameList, sizeof (AttemptNameList));\r
 \r
   if ((mPrivate != NULL) && (mPrivate->AttemptCount != 0)) {\r
@@ -702,8 +710,8 @@ IScsiConvertAttemptConfigDataToIfrNvDataByKeyword (
       if (SessionConfigData->DnsMode) {\r
         AsciiStrToUnicodeStrS (\r
           SessionConfigData->TargetUrl,\r
-          IfrNvData->TargetIp,\r
-          sizeof (IfrNvData->TargetIp) / sizeof (IfrNvData->TargetIp[0])\r
+          IfrNvData->Keyword[Index].ISCSITargetIpAddress,\r
+          sizeof (IfrNvData->Keyword[Index].ISCSITargetIpAddress) / sizeof (IfrNvData->Keyword[Index].ISCSITargetIpAddress[0])\r
           );\r
       }\r
 \r
@@ -740,8 +748,30 @@ IScsiConvertAttemptConfigDataToIfrNvDataByKeyword (
           );\r
       }\r
     }\r
-\r
     CopyMem(IfrNvData->ISCSIDisplayAttemptList, AttemptNameList, ATTEMPT_NAME_LIST_SIZE);\r
+\r
+    ZeroMem (IfrNvData->ISCSIMacAddr, sizeof (IfrNvData->ISCSIMacAddr));\r
+    NET_LIST_FOR_EACH (Entry, &mPrivate->NicInfoList) {\r
+      NicInfo = NET_LIST_USER_STRUCT (Entry, ISCSI_NIC_INFO, Link);\r
+      IScsiMacAddrToStr (\r
+        &NicInfo->PermanentAddress,\r
+        NicInfo->HwAddressSize,\r
+        NicInfo->VlanId,\r
+        MacString\r
+        );\r
+      CopyMem (\r
+        IfrNvData->ISCSIMacAddr + StrLen (IfrNvData->ISCSIMacAddr),\r
+        MacString,\r
+        StrLen (MacString) * sizeof (CHAR16)\r
+        );\r
+\r
+      *(IfrNvData->ISCSIMacAddr + StrLen (IfrNvData->ISCSIMacAddr)) = L'/';\r
+    }\r
+\r
+    StringLen = StrLen (IfrNvData->ISCSIMacAddr);\r
+    if (StringLen > 0) {\r
+      *(IfrNvData->ISCSIMacAddr + StringLen - 1) = L'\0';\r
+    }\r
   }\r
 }\r
 \r
@@ -1195,6 +1225,8 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
   ISCSI_ATTEMPT_CONFIG_NVDATA      *Attempt;\r
   UINT8                            AttemptIndex;\r
   UINT8                            Index;\r
+  UINT8                            ChapSecretLen;\r
+  UINT8                            ReverseChapSecretLen;\r
   CHAR16                           *AttemptName1;\r
   CHAR16                           *AttemptName2;\r
   ISCSI_ATTEMPT_CONFIG_NVDATA      *SameNicAttempt;\r
@@ -1344,10 +1376,17 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
     if (Attempt == NULL) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-    Attempt->SessionConfigData.ConnectRetryCount = IfrNvData->ISCSIConnectRetry[AttemptIndex - 1];\r
-    if (Attempt->SessionConfigData.ConnectRetryCount == 0) {\r
-      Attempt->SessionConfigData.ConnectRetryCount = CONNECT_MIN_RETRY;\r
+\r
+    if (IfrNvData->ISCSIConnectRetry[AttemptIndex - 1] > CONNECT_MAX_RETRY) {\r
+      CreatePopUp (\r
+          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+          &Key,\r
+          L"The minimum value is 0 and the maximum is 16. 0 means no retry.",\r
+          NULL\r
+          );\r
+      return EFI_INVALID_PARAMETER;\r
     }\r
+    Attempt->SessionConfigData.ConnectRetryCount = IfrNvData->ISCSIConnectRetry[AttemptIndex - 1];\r
 \r
   } else if ((OffSet >= ATTEMPT_CONNECT_TIMEOUT_VAR_OFFSET) && (OffSet < ATTEMPT_INITIATOR_VIA_DHCP_VAR_OFFSET)) {\r
     AttemptIndex = (UINT8) ((OffSet - ATTEMPT_CONNECT_TIMEOUT_VAR_OFFSET) / 2 + 1);\r
@@ -1355,23 +1394,23 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
     if (Attempt == NULL) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
+\r
+    if ((IfrNvData->ISCSIConnectTimeout[AttemptIndex - 1] < CONNECT_MIN_TIMEOUT) ||\r
+        (IfrNvData->ISCSIConnectTimeout[AttemptIndex - 1] > CONNECT_MAX_TIMEOUT)) {\r
+      CreatePopUp (\r
+        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+        &Key,\r
+        L"The minimum value is 100 milliseconds and the maximum is 20 seconds.",\r
+        NULL\r
+        );\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
     Attempt->SessionConfigData.ConnectTimeout = IfrNvData->ISCSIConnectTimeout[AttemptIndex - 1];\r
     if (Attempt->SessionConfigData.ConnectTimeout == 0) {\r
       Attempt->SessionConfigData.ConnectTimeout = CONNECT_DEFAULT_TIMEOUT;\r
     }\r
 \r
-    if (Attempt->SessionConfigData.Enabled != ISCSI_DISABLED) {\r
-      if (Attempt->SessionConfigData.ConnectTimeout < CONNECT_MIN_TIMEOUT) {\r
-        CreatePopUp (\r
-          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-          &Key,\r
-          L"Connection Establishing Timeout is less than minimum value 100ms.",\r
-          NULL\r
-          );\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    }\r
-\r
   } else if ((OffSet >= ATTEMPT_INITIATOR_VIA_DHCP_VAR_OFFSET) && (OffSet < ATTEMPT_TARGET_VIA_DHCP_VAR_OFFSET)) {\r
     AttemptIndex = (UINT8) ((OffSet - ATTEMPT_INITIATOR_VIA_DHCP_VAR_OFFSET) + 1);\r
     Attempt = IScsiConfigGetAttemptByConfigIndex (AttemptIndex);\r
@@ -1623,7 +1662,7 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
           );\r
 \r
         if (Attempt->SessionConfigData.Enabled != ISCSI_DISABLED) {\r
-          if (IfrNvData->CHAPName[0] == L'\0') {\r
+          if (IfrNvData->Keyword[Index].ISCSIChapUsername[0] == L'\0') {\r
             CreatePopUp (\r
               EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
               &Key,\r
@@ -1645,6 +1684,7 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
 \r
     } else if ((OffSet >= ATTEMPT_CHAR_SECRET_VAR_OFFSET) && (OffSet < ATTEMPT_CHAR_REVERSE_USER_NAME_VAR_OFFSET)) {\r
       if (Attempt->AuthenticationType == ISCSI_AUTH_TYPE_CHAP) {\r
+        ChapSecretLen = (UINT8)StrLen (IfrNvData->Keyword[Index].ISCSIChapSecret);\r
         UnicodeStrToAsciiStrS (\r
           IfrNvData->Keyword[Index].ISCSIChapSecret,\r
           Attempt->AuthConfigData.CHAP.CHAPSecret,\r
@@ -1652,11 +1692,11 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
           );\r
 \r
         if (Attempt->SessionConfigData.Enabled != ISCSI_DISABLED) {\r
-          if (IfrNvData->CHAPSecret[0] == L'\0') {\r
+          if ((ChapSecretLen < ISCSI_CHAP_SECRET_MIN_LEN) || (ChapSecretLen > ISCSI_CHAP_SECRET_MAX_LEN)) {\r
             CreatePopUp (\r
               EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
               &Key,\r
-              L"CHAP Secret is invalid!",\r
+              L"The Chap Secret minimum length is 12 bytes and the maximum length is 16 bytes.",\r
               NULL\r
               );\r
             return EFI_INVALID_PARAMETER;\r
@@ -1680,7 +1720,7 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
           ISCSI_CHAP_NAME_STORAGE\r
           );\r
         if (Attempt->SessionConfigData.Enabled != ISCSI_DISABLED) {\r
-          if (IfrNvData->ReverseCHAPName[0] == L'\0') {\r
+          if (IfrNvData->Keyword[Index].ISCSIReverseChapUsername[0] == L'\0') {\r
             CreatePopUp (\r
               EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
               &Key,\r
@@ -1702,6 +1742,7 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
 \r
     } else if (OffSet >= ATTEMPT_CHAR_REVERSE_SECRET_VAR_OFFSET) {\r
       if (Attempt->AuthConfigData.CHAP.CHAPType == ISCSI_CHAP_MUTUAL) {\r
+        ReverseChapSecretLen = (UINT8)StrLen (IfrNvData->Keyword[Index].ISCSIReverseChapSecret);\r
         UnicodeStrToAsciiStrS (\r
           IfrNvData->Keyword[Index].ISCSIReverseChapSecret,\r
           Attempt->AuthConfigData.CHAP.ReverseCHAPSecret,\r
@@ -1709,11 +1750,11 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
           );\r
 \r
         if (Attempt->SessionConfigData.Enabled != ISCSI_DISABLED) {\r
-          if (IfrNvData->ReverseCHAPSecret[0] == L'\0') {\r
+          if ((ReverseChapSecretLen < ISCSI_CHAP_SECRET_MIN_LEN) || (ReverseChapSecretLen > ISCSI_CHAP_SECRET_MAX_LEN)) {\r
             CreatePopUp (\r
               EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
               &Key,\r
-              L"Reverse CHAP Secret is invalid!",\r
+              L"The Reverse CHAP Secret minimum length is 12 bytes and the maximum length is 16 bytes.",\r
               NULL\r
               );\r
             return EFI_INVALID_PARAMETER;\r
@@ -3381,6 +3422,9 @@ IScsiFormCallback (
   ISCSI_CONFIG_IFR_NVDATA     OldIfrNvData;\r
   EFI_STATUS                  Status;\r
   EFI_INPUT_KEY               Key;\r
+  ISCSI_NIC_INFO              *NicInfo;\r
+\r
+  NicInfo = NULL;\r
 \r
   if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)) {\r
     //\r
@@ -3551,10 +3595,36 @@ IScsiFormCallback (
     case KEY_IP_MODE:\r
       switch (Value->u8) {\r
       case IP_MODE_IP6:\r
+        NicInfo = IScsiGetNicInfoByIndex (Private->Current->NicIndex); \r
+        if(NicInfo == NULL) {\r
+          break;\r
+        }\r
+\r
+        if(!NicInfo->Ipv6Available) {                  \r
+             //\r
+          // Current NIC doesn't Support IPv6, hence use IPv4.    \r
+          //    \r
+          IfrNvData->IpMode = IP_MODE_IP4;\r
+               \r
+          CreatePopUp (\r
+            EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+            &Key,\r
+            L"Current NIC doesn't Support IPv6!",\r
+            NULL\r
+            );\r
+        }\r
+         \r
       case IP_MODE_IP4:\r
+        ZeroMem (IfrNvData->LocalIp, sizeof (IfrNvData->LocalIp));\r
+        ZeroMem (IfrNvData->SubnetMask, sizeof (IfrNvData->SubnetMask));\r
+        ZeroMem (IfrNvData->Gateway, sizeof (IfrNvData->Gateway));\r
         ZeroMem (IfrNvData->TargetIp, sizeof (IfrNvData->TargetIp));\r
         Private->Current->AutoConfigureMode = 0;\r
-\r
+        ZeroMem (&Private->Current->SessionConfigData.LocalIp, sizeof (EFI_IP_ADDRESS));\r
+        ZeroMem (&Private->Current->SessionConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
+        ZeroMem (&Private->Current->SessionConfigData.Gateway, sizeof (EFI_IP_ADDRESS));\r
+        ZeroMem (&Private->Current->SessionConfigData.TargetIp, sizeof (EFI_IP_ADDRESS));\r
+        \r
         break;\r
       }\r
 \r