]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/IScsiDxe/IScsiConfig.c
BaseTools: Make brotli a submodule
[mirror_edk2.git] / NetworkPkg / IScsiDxe / IScsiConfig.c
index b1696205c4dbff9c29ffe191f68ee238d5502817..326b1da39ea300b2e6e6d2f24bbaf227d6ee3d14 100644 (file)
@@ -1,22 +1,14 @@
 /** @file\r
   Helper functions for configuring or getting the parameters relating to iSCSI.\r
 \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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "IScsiImpl.h"\r
 \r
 CHAR16          mVendorStorageName[]     = L"ISCSI_CONFIG_IFR_NVDATA";\r
-BOOLEAN         mIScsiDeviceListUpdated  = FALSE;\r
-UINTN           mNumberOfIScsiDevices    = 0;\r
 ISCSI_FORM_CALLBACK_INFO  *mCallbackInfo = NULL;\r
 \r
 HII_VENDOR_DEVICE_PATH  mIScsiHiiVendorDevicePath = {\r
@@ -34,7 +26,7 @@ HII_VENDOR_DEVICE_PATH  mIScsiHiiVendorDevicePath = {
   {\r
     END_DEVICE_PATH_TYPE,\r
     END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
-    { \r
+    {\r
       (UINT8) (END_DEVICE_PATH_LENGTH),\r
       (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
     }\r
@@ -205,11 +197,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 +214,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
@@ -297,7 +293,7 @@ IScsiConvertIsIdToString (
   @param[in]  String             The string is "&OFFSET=".\r
   @param[out] Value              The Offset value.\r
 \r
-  @retval EFI_OUT_OF_RESOURCES   Insufficient resources to store neccessary\r
+  @retval EFI_OUT_OF_RESOURCES   Insufficient resources to store necessary\r
                                  structures.\r
   @retval EFI_SUCCESS            Value of <Number> is outputted in Number\r
                                  successfully.\r
@@ -537,6 +533,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,114 +625,146 @@ 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
-  NET_LIST_FOR_EACH (Entry, &mPrivate->AttemptConfigs) {\r
-    Attempt = NET_LIST_USER_STRUCT (Entry, ISCSI_ATTEMPT_CONFIG_NVDATA, Link);\r
-    //\r
-    // Normal session configuration parameters.\r
-    //\r
-    SessionConfigData                 = &Attempt->SessionConfigData;\r
-\r
-    Index   = Attempt->AttemptConfigIndex - 1;\r
+  if ((mPrivate != NULL) && (mPrivate->AttemptCount != 0)) {\r
+    NET_LIST_FOR_EACH (Entry, &mPrivate->AttemptConfigs) {\r
+      Attempt = NET_LIST_USER_STRUCT (Entry, ISCSI_ATTEMPT_CONFIG_NVDATA, Link);\r
+      //\r
+      // Normal session configuration parameters.\r
+      //\r
+      SessionConfigData                 = &Attempt->SessionConfigData;\r
 \r
-    //\r
-    // Save the attempt to AttemptNameList as Attempt:1 Attempt:2\r
-    //\r
-    AsciiStrToUnicodeStrS (\r
-      Attempt->AttemptName,\r
-      AttemptNameList + StrLen (AttemptNameList),\r
-      ATTEMPT_NAME_LIST_SIZE\r
-    );\r
-    *(AttemptNameList + StrLen (AttemptNameList) - 2) = L':';\r
-    *(AttemptNameList + StrLen (AttemptNameList))     = L' ';\r
+      ASSERT ((Attempt->AttemptConfigIndex > 0) && (Attempt->AttemptConfigIndex <= FixedPcdGet8 (PcdMaxIScsiAttemptNumber)));\r
+      Index   = Attempt->AttemptConfigIndex - 1;\r
 \r
-    AsciiStrToUnicodeStrS (\r
-      Attempt->AttemptName,\r
-      IfrNvData->ISCSIAttemptName  + ATTEMPT_NAME_SIZE * Index,\r
-      ATTEMPT_NAME_SIZE\r
-    );\r
+      //\r
+      // Save the attempt to AttemptNameList as Attempt:1 Attempt:2\r
+      //\r
+      AsciiStrToUnicodeStrS (\r
+        Attempt->AttemptName,\r
+        AttemptNameList + StrLen (AttemptNameList),\r
+        ATTEMPT_NAME_LIST_SIZE - StrLen (AttemptNameList)\r
+      );\r
 \r
-    IfrNvData->ISCSIBootEnableList[Index]          = SessionConfigData->Enabled;\r
-    IfrNvData->ISCSIIpAddressTypeList[Index]       = SessionConfigData->IpMode;\r
+      StringLen = StrLen (AttemptNameList);\r
+      ASSERT (StringLen > 2);\r
+      *(AttemptNameList + StringLen - 2) = L':';\r
+      *(AttemptNameList + StringLen)     = L' ';\r
 \r
-    IfrNvData->ISCSIInitiatorInfoViaDHCP[Index]    = SessionConfigData->InitiatorInfoFromDhcp;\r
-    IfrNvData->ISCSITargetInfoViaDHCP[Index]       = SessionConfigData->TargetInfoFromDhcp;\r
-    IfrNvData->ISCSIConnectRetry[Index]            = SessionConfigData->ConnectRetryCount;\r
-    IfrNvData->ISCSIConnectTimeout[Index]          = SessionConfigData->ConnectTimeout;\r
-    IfrNvData->ISCSITargetTcpPort[Index]           = SessionConfigData->TargetPort;\r
+      AsciiStrToUnicodeStrS (\r
+        Attempt->AttemptName,\r
+        IfrNvData->ISCSIAttemptName  + ATTEMPT_NAME_SIZE * Index,\r
+        ATTEMPT_NAME_LIST_SIZE - ATTEMPT_NAME_SIZE * Index\r
+      );\r
 \r
-    if (SessionConfigData->IpMode == IP_MODE_IP4) {\r
-      CopyMem (&Ip.v4, &SessionConfigData->LocalIp, sizeof (EFI_IPv4_ADDRESS));\r
-      IScsiIpToStr (&Ip, FALSE, IfrNvData->Keyword[Index].ISCSIInitiatorIpAddress);\r
-      CopyMem (&Ip.v4, &SessionConfigData->SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
-      IScsiIpToStr (&Ip, FALSE, IfrNvData->Keyword[Index].ISCSIInitiatorNetmask);\r
-      CopyMem (&Ip.v4, &SessionConfigData->Gateway, sizeof (EFI_IPv4_ADDRESS));\r
-      IScsiIpToStr (&Ip, FALSE, IfrNvData->Keyword[Index].ISCSIInitiatorGateway);\r
-      if (SessionConfigData->TargetIp.v4.Addr[0] != '\0') {\r
-        CopyMem (&Ip.v4, &SessionConfigData->TargetIp, sizeof (EFI_IPv4_ADDRESS));\r
-        IScsiIpToStr (&Ip, FALSE, IfrNvData->Keyword[Index].ISCSITargetIpAddress);\r
-      }\r
-    } else if (SessionConfigData->IpMode == IP_MODE_IP6) {\r
-      ZeroMem (IfrNvData->Keyword[Index].ISCSITargetIpAddress, sizeof (IfrNvData->TargetIp));\r
-      if (SessionConfigData->TargetIp.v6.Addr[0] != '\0') {\r
-        IP6_COPY_ADDRESS (&Ip.v6, &SessionConfigData->TargetIp);\r
-        IScsiIpToStr (&Ip, TRUE, IfrNvData->Keyword[Index].ISCSITargetIpAddress);\r
+      IfrNvData->ISCSIBootEnableList[Index]          = SessionConfigData->Enabled;\r
+      IfrNvData->ISCSIIpAddressTypeList[Index]       = SessionConfigData->IpMode;\r
+\r
+      IfrNvData->ISCSIInitiatorInfoViaDHCP[Index]    = SessionConfigData->InitiatorInfoFromDhcp;\r
+      IfrNvData->ISCSITargetInfoViaDHCP[Index]       = SessionConfigData->TargetInfoFromDhcp;\r
+      IfrNvData->ISCSIConnectRetry[Index]            = SessionConfigData->ConnectRetryCount;\r
+      IfrNvData->ISCSIConnectTimeout[Index]          = SessionConfigData->ConnectTimeout;\r
+      IfrNvData->ISCSITargetTcpPort[Index]           = SessionConfigData->TargetPort;\r
+\r
+      if (SessionConfigData->IpMode == IP_MODE_IP4) {\r
+        CopyMem (&Ip.v4, &SessionConfigData->LocalIp, sizeof (EFI_IPv4_ADDRESS));\r
+        IScsiIpToStr (&Ip, FALSE, IfrNvData->Keyword[Index].ISCSIInitiatorIpAddress);\r
+        CopyMem (&Ip.v4, &SessionConfigData->SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
+        IScsiIpToStr (&Ip, FALSE, IfrNvData->Keyword[Index].ISCSIInitiatorNetmask);\r
+        CopyMem (&Ip.v4, &SessionConfigData->Gateway, sizeof (EFI_IPv4_ADDRESS));\r
+        IScsiIpToStr (&Ip, FALSE, IfrNvData->Keyword[Index].ISCSIInitiatorGateway);\r
+        if (SessionConfigData->TargetIp.v4.Addr[0] != '\0') {\r
+          CopyMem (&Ip.v4, &SessionConfigData->TargetIp, sizeof (EFI_IPv4_ADDRESS));\r
+          IScsiIpToStr (&Ip, FALSE, IfrNvData->Keyword[Index].ISCSITargetIpAddress);\r
+        }\r
+      } else if (SessionConfigData->IpMode == IP_MODE_IP6) {\r
+        ZeroMem (IfrNvData->Keyword[Index].ISCSITargetIpAddress, sizeof (IfrNvData->TargetIp));\r
+        if (SessionConfigData->TargetIp.v6.Addr[0] != '\0') {\r
+          IP6_COPY_ADDRESS (&Ip.v6, &SessionConfigData->TargetIp);\r
+          IScsiIpToStr (&Ip, TRUE, IfrNvData->Keyword[Index].ISCSITargetIpAddress);\r
+        }\r
       }\r
-    }\r
 \r
-    AsciiStrToUnicodeStrS (\r
-      SessionConfigData->TargetName,\r
-      IfrNvData->Keyword[Index].ISCSITargetName,\r
-      ISCSI_NAME_MAX_SIZE\r
-      );\r
-\r
-    if (SessionConfigData->DnsMode) {\r
       AsciiStrToUnicodeStrS (\r
-        SessionConfigData->TargetUrl,\r
-        IfrNvData->TargetIp,\r
-        sizeof (IfrNvData->TargetIp) / sizeof (IfrNvData->TargetIp[0])\r
+        SessionConfigData->TargetName,\r
+        IfrNvData->Keyword[Index].ISCSITargetName,\r
+        ISCSI_NAME_MAX_SIZE\r
         );\r
-    }\r
 \r
-    IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->Keyword[Index].ISCSILun);\r
-    IScsiConvertIsIdToString (IfrNvData->Keyword[Index].ISCSIIsId, SessionConfigData->IsId);\r
+      if (SessionConfigData->DnsMode) {\r
+        AsciiStrToUnicodeStrS (\r
+          SessionConfigData->TargetUrl,\r
+          IfrNvData->Keyword[Index].ISCSITargetIpAddress,\r
+          sizeof (IfrNvData->Keyword[Index].ISCSITargetIpAddress) / sizeof (IfrNvData->Keyword[Index].ISCSITargetIpAddress[0])\r
+          );\r
+      }\r
 \r
-    IfrNvData->ISCSIAuthenticationMethod[Index]    = Attempt->AuthenticationType;\r
+      IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->Keyword[Index].ISCSILun);\r
+      IScsiConvertIsIdToString (IfrNvData->Keyword[Index].ISCSIIsId, SessionConfigData->IsId);\r
 \r
-    if (Attempt->AuthenticationType == ISCSI_AUTH_TYPE_CHAP) {\r
-      AuthConfigData      = &Attempt->AuthConfigData.CHAP;\r
-      IfrNvData->ISCSIChapType[Index] = AuthConfigData->CHAPType;\r
-      AsciiStrToUnicodeStrS (\r
-        AuthConfigData->CHAPName,\r
-        IfrNvData->Keyword[Index].ISCSIChapUsername,\r
-        ISCSI_CHAP_NAME_STORAGE\r
-        );\r
+      IfrNvData->ISCSIAuthenticationMethod[Index]    = Attempt->AuthenticationType;\r
 \r
-      AsciiStrToUnicodeStrS (\r
-        AuthConfigData->CHAPSecret,\r
-        IfrNvData->Keyword[Index].ISCSIChapSecret,\r
-        ISCSI_CHAP_SECRET_STORAGE\r
-        );\r
+      if (Attempt->AuthenticationType == ISCSI_AUTH_TYPE_CHAP) {\r
+        AuthConfigData      = &Attempt->AuthConfigData.CHAP;\r
+        IfrNvData->ISCSIChapType[Index] = AuthConfigData->CHAPType;\r
+        AsciiStrToUnicodeStrS (\r
+          AuthConfigData->CHAPName,\r
+          IfrNvData->Keyword[Index].ISCSIChapUsername,\r
+          ISCSI_CHAP_NAME_STORAGE\r
+          );\r
 \r
-      AsciiStrToUnicodeStrS (\r
-        AuthConfigData->ReverseCHAPName,\r
-        IfrNvData->Keyword[Index].ISCSIReverseChapUsername,\r
-        ISCSI_CHAP_NAME_STORAGE\r
-        );\r
+        AsciiStrToUnicodeStrS (\r
+          AuthConfigData->CHAPSecret,\r
+          IfrNvData->Keyword[Index].ISCSIChapSecret,\r
+          ISCSI_CHAP_SECRET_STORAGE\r
+          );\r
 \r
-      AsciiStrToUnicodeStrS (\r
-        AuthConfigData->ReverseCHAPSecret,\r
-        IfrNvData->Keyword[Index].ISCSIReverseChapSecret,\r
-        ISCSI_CHAP_SECRET_STORAGE\r
+        AsciiStrToUnicodeStrS (\r
+          AuthConfigData->ReverseCHAPName,\r
+          IfrNvData->Keyword[Index].ISCSIReverseChapUsername,\r
+          ISCSI_CHAP_NAME_STORAGE\r
+          );\r
+\r
+        AsciiStrToUnicodeStrS (\r
+          AuthConfigData->ReverseCHAPSecret,\r
+          IfrNvData->Keyword[Index].ISCSIReverseChapSecret,\r
+          ISCSI_CHAP_SECRET_STORAGE\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
 \r
-  CopyMem(IfrNvData->ISCSIDisplayAttemptList, AttemptNameList, ATTEMPT_NAME_LIST_SIZE);\r
+    StringLen = StrLen (IfrNvData->ISCSIMacAddr);\r
+    if (StringLen > 0) {\r
+      *(IfrNvData->ISCSIMacAddr + StringLen - 1) = L'\0';\r
+    }\r
+  }\r
 }\r
 \r
 /**\r
@@ -902,7 +931,7 @@ IScsiConvertIfrNvDataToAttemptConfigData (
           L"CHAP Name or CHAP Secret is invalid!",\r
           NULL\r
           );\r
-        \r
+\r
         return EFI_INVALID_PARAMETER;\r
       }\r
 \r
@@ -914,7 +943,7 @@ IScsiConvertIfrNvDataToAttemptConfigData (
           &Key,\r
           L"Reverse CHAP Name or Reverse CHAP Secret is invalid!",\r
           NULL\r
-          );        \r
+          );\r
         return EFI_INVALID_PARAMETER;\r
       }\r
     }\r
@@ -933,7 +962,7 @@ IScsiConvertIfrNvDataToAttemptConfigData (
       if (AttemptName2 == NULL) {\r
         FreePool (AttemptName1);\r
         return EFI_OUT_OF_RESOURCES;\r
-      }      \r
+      }\r
 \r
       AsciiStrToUnicodeStrS (Attempt->AttemptName, AttemptName1, ATTEMPT_NAME_SIZE);\r
       AsciiStrToUnicodeStrS (SameNicAttempt->AttemptName, AttemptName2, ATTEMPT_NAME_SIZE);\r
@@ -951,7 +980,7 @@ IScsiConvertIfrNvDataToAttemptConfigData (
         &Key,\r
         mPrivate->PortString,\r
         NULL\r
-        );       \r
+        );\r
 \r
       FreePool (AttemptName1);\r
       FreePool (AttemptName2);\r
@@ -1188,6 +1217,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
@@ -1201,6 +1232,7 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
   UINT64                           Lun;\r
   EFI_STATUS                       Status;\r
 \r
+  Attempt = NULL;\r
   ZeroMem (IScsiName, sizeof (IScsiName));\r
 \r
   if (OffSet < ATTEMPT_BOOTENABLE_VAR_OFFSET) {\r
@@ -1336,10 +1368,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
@@ -1347,23 +1386,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
@@ -1615,7 +1654,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
@@ -1637,6 +1676,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
@@ -1644,11 +1684,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
@@ -1672,7 +1712,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
@@ -1694,6 +1734,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
@@ -1701,11 +1742,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
@@ -1728,7 +1769,7 @@ IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (
   //\r
   // Record the user configuration information in NVR.\r
   //\r
-\r
+  ASSERT (Attempt != NULL);\r
   UnicodeSPrint (mPrivate->PortString, (UINTN) ISCSI_NAME_IFR_MAX_SIZE, L"Attempt %d", Attempt->AttemptConfigIndex);\r
   return gRT->SetVariable (\r
                 mPrivate->PortString,\r
@@ -1977,7 +2018,7 @@ IScsiConfigAddAttempt (
     PortTitleHelpToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, mPrivate->PortString, NULL);\r
     if (PortTitleHelpToken == 0) {\r
       Status = EFI_INVALID_PARAMETER;\r
-      goto Exit;      \r
+      goto Exit;\r
     }\r
 \r
     HiiCreateGotoOpCode (\r
@@ -2001,14 +2042,14 @@ IScsiConfigAddAttempt (
 Exit:\r
   HiiFreeOpCodeHandle (StartOpCodeHandle);\r
   HiiFreeOpCodeHandle (EndOpCodeHandle);\r
-  \r
+\r
   return Status;\r
 }\r
 \r
 /**\r
   Add the attempts by keyword 'iSCSIAddAttempts', you can use this keyword with\r
   value 'attempt:1 attempt:2' etc to add one or more attempts once. This is different\r
-  with IScsiConfigAddAttempt function which is used to add attempt by UI configuration. \r
+  with IScsiConfigAddAttempt function which is used to add attempt by UI configuration.\r
 \r
   @param[in]  AttemptList        The new attempt List will be added.\r
 \r
@@ -2188,7 +2229,7 @@ IScsiConfigAddAttemptsByKeywords (
 \r
   @retval EFI_NOT_FOUND          Cannot find the corresponding variable.\r
   @retval EFI_SUCCESS            The operation is completed successfully.\r
-  @retval EFI_ABOTRED            This operation is aborted cause of error\r
+  @retval EFI_ABORTED            This operation is aborted cause of error\r
                                  configuration.\r
   @retval EFI_OUT_OF_RESOURCES   Fail to finish the operation due to lack of\r
                                  resources.\r
@@ -2245,10 +2286,6 @@ IScsiConfigDeleteAttempts (
     //\r
 \r
     AttemptConfigData = NET_LIST_USER_STRUCT (Entry, ISCSI_ATTEMPT_CONFIG_NVDATA, Link);\r
-    if (AttemptConfigData == NULL) {\r
-      Status = EFI_NOT_FOUND;\r
-      goto Error;\r
-    }\r
 \r
     //\r
     // Remove this attempt from UI configured attempt list.\r
@@ -2456,7 +2493,7 @@ IScsiConfigDisplayDeleteAttempts (
              FORMID_DELETE_FORM,              // Form ID\r
              StartOpCodeHandle,               // Label for where to insert opcodes\r
              EndOpCodeHandle                  // Replace data\r
-             );    \r
+             );\r
 \r
   HiiFreeOpCodeHandle (StartOpCodeHandle);\r
   HiiFreeOpCodeHandle (EndOpCodeHandle);\r
@@ -2487,8 +2524,8 @@ IScsiConfigDisplayOrderAttempts (
   EFI_IFR_GUID_LABEL          *StartLabel;\r
   VOID                        *EndOpCodeHandle;\r
   EFI_IFR_GUID_LABEL          *EndLabel;\r
-  VOID                        *OptionsOpCodeHandle;  \r
-  \r
+  VOID                        *OptionsOpCodeHandle;\r
+\r
   Status = IScsiCreateOpCode (\r
              ORDER_ENTRY_LABEL,\r
              &StartOpCodeHandle,\r
@@ -2540,14 +2577,14 @@ IScsiConfigDisplayOrderAttempts (
     DYNAMIC_ORDERED_LIST_QUESTION_ID,           // Question ID\r
     CONFIGURATION_VARSTORE_ID,                  // VarStore ID\r
     DYNAMIC_ORDERED_LIST_VAR_OFFSET,            // Offset in Buffer Storage\r
-    STRING_TOKEN (STR_ORDER_ATTEMPT_ENTRY),     // Question prompt text        \r
-    STRING_TOKEN (STR_ORDER_ATTEMPT_ENTRY),     // Question help text       \r
+    STRING_TOKEN (STR_ORDER_ATTEMPT_ENTRY),     // Question prompt text\r
+    STRING_TOKEN (STR_ORDER_ATTEMPT_ENTRY),     // Question help text\r
     0,                                          // Question flag\r
     EFI_IFR_UNIQUE_SET,                         // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
     EFI_IFR_NUMERIC_SIZE_1,                     // Data type of Question value\r
     ISCSI_MAX_ATTEMPTS_NUM,                     // Maximum container\r
-    OptionsOpCodeHandle,                        // Option Opcode list                        \r
-    NULL                                        // Default Opcode is NULL                               \r
+    OptionsOpCodeHandle,                        // Option Opcode list\r
+    NULL                                        // Default Opcode is NULL\r
     );\r
 \r
 Exit:\r
@@ -2557,11 +2594,11 @@ Exit:
              FORMID_ORDER_FORM,               // Form ID\r
              StartOpCodeHandle,               // Label for where to insert opcodes\r
              EndOpCodeHandle                  // Replace data\r
-             );             \r
+             );\r
 \r
 Error:\r
   HiiFreeOpCodeHandle (StartOpCodeHandle);\r
-  HiiFreeOpCodeHandle (EndOpCodeHandle);  \r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
   if (OptionsOpCodeHandle != NULL) {\r
     HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
   }\r
@@ -2707,6 +2744,7 @@ IScsiConfigProcessDefault (
   UINTN                       Index;\r
   EFI_INPUT_KEY               Key;\r
 \r
+  AttemptConfigData = NULL;\r
   //\r
   // Is User creating a new attempt?\r
   //\r
@@ -2751,37 +2789,38 @@ IScsiConfigProcessDefault (
                            &AttemptConfigOrderSize\r
                            );\r
 \r
-    if (AttemptConfigOrder != NULL) {\r
-\r
-      for (Index = 0; Index < AttemptConfigOrderSize / sizeof (UINT8); Index++) {\r
-        UnicodeSPrint (\r
-          mPrivate->PortString,\r
-          (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
-          L"Attempt %d",\r
-          (UINTN) AttemptConfigOrder[Index]\r
-          );\r
-        GetVariable2 (\r
-                     mPrivate->PortString,\r
-                     &gEfiIScsiInitiatorNameProtocolGuid,\r
-                     (VOID**)&AttemptConfigData,\r
-                     NULL\r
-                     );\r
-        if (AttemptConfigData == NULL || AttemptConfigData->Actived == ISCSI_ACTIVE_ENABLED) {\r
-          continue;\r
-        }\r
+    if (AttemptConfigOrder == NULL) {\r
+      return EFI_NOT_FOUND;\r
+    }\r
 \r
-        break;\r
+    for (Index = 0; Index < AttemptConfigOrderSize / sizeof (UINT8); Index++) {\r
+      UnicodeSPrint (\r
+        mPrivate->PortString,\r
+        (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
+        L"Attempt %d",\r
+        (UINTN) AttemptConfigOrder[Index]\r
+        );\r
+      GetVariable2 (\r
+                   mPrivate->PortString,\r
+                   &gEfiIScsiInitiatorNameProtocolGuid,\r
+                   (VOID**)&AttemptConfigData,\r
+                   NULL\r
+                   );\r
+      if (AttemptConfigData == NULL || AttemptConfigData->Actived == ISCSI_ACTIVE_ENABLED) {\r
+        continue;\r
       }\r
 \r
-      if (Index > PcdGet8 (PcdMaxIScsiAttemptNumber)) {\r
-        CreatePopUp (\r
-          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-          &Key,\r
-          L"Can not create more attempts, Please configure the PcdMaxIScsiAttemptNumber if needed!",\r
-          NULL\r
-          );\r
-        return EFI_UNSUPPORTED;\r
-      }\r
+      break;\r
+    }\r
+\r
+    if (Index > PcdGet8 (PcdMaxIScsiAttemptNumber)) {\r
+      CreatePopUp (\r
+        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+        &Key,\r
+        L"Can not create more attempts, Please configure the PcdMaxIScsiAttemptNumber if needed!",\r
+        NULL\r
+        );\r
+      return EFI_UNSUPPORTED;\r
     }\r
 \r
     if (AttemptConfigOrder != NULL) {\r
@@ -2798,6 +2837,7 @@ IScsiConfigProcessDefault (
       MacString\r
       );\r
 \r
+    ASSERT (AttemptConfigData != NULL);\r
     UnicodeStrToAsciiStrS (MacString, AttemptConfigData->MacString, sizeof (AttemptConfigData->MacString));\r
     AttemptConfigData->NicIndex = NicIndex;\r
     AttemptConfigData->Actived = ISCSI_ACTIVE_ENABLED;\r
@@ -2806,7 +2846,7 @@ IScsiConfigProcessDefault (
     // Generate OUI-format ISID based on MAC address.\r
     //\r
     CopyMem (AttemptConfigData->SessionConfigData.IsId, &NicInfo->PermanentAddress, 6);\r
-    AttemptConfigData->SessionConfigData.IsId[0] = \r
+    AttemptConfigData->SessionConfigData.IsId[0] =\r
       (UINT8) (AttemptConfigData->SessionConfigData.IsId[0] & 0x3F);\r
 \r
     //\r
@@ -2856,7 +2896,7 @@ IScsiConfigProcessDefault (
     ZeroMem (IfrNvData->ReverseCHAPName, sizeof (IfrNvData->ReverseCHAPName));\r
     ZeroMem (IfrNvData->ReverseCHAPSecret, sizeof (IfrNvData->ReverseCHAPSecret));\r
   }\r
-  \r
+\r
   IScsiConvertAttemptConfigDataToIfrNvData (AttemptConfigData, IfrNvData);\r
 \r
   //\r
@@ -2869,7 +2909,7 @@ IScsiConfigProcessDefault (
 \r
 \r
 /**\r
-   \r
+\r
   This function allows the caller to request the current\r
   configuration for one or more named elements. The resulting\r
   string is in <ConfigAltResp> format. Also, any and all alternative\r
@@ -2898,7 +2938,7 @@ IScsiConfigProcessDefault (
                          to the most recent "&" before the first\r
                          failing name / value pair (or the beginning\r
                          of the string if the failure is in the first\r
-                         name / value pair) if the request was not successful.                        \r
+                         name / value pair) if the request was not successful.\r
 \r
   @param[out] Results    A null-terminated Unicode string in\r
                          <ConfigAltResp> format which has all values\r
@@ -2919,7 +2959,7 @@ IScsiConfigProcessDefault (
                                   would result in this type of\r
                                   error. In this case, the\r
                                   Progress parameter would be\r
-                                  set to NULL. \r
+                                  set to NULL.\r
 \r
   @retval EFI_NOT_FOUND           Routing data doesn't match any\r
                                   known driver. Progress set to the\r
@@ -2984,7 +3024,7 @@ IScsiFormExtractConfig (
   }\r
 \r
   //\r
-  // Extract all AttemptConfigData to Keyword stroage of IfrNvData.\r
+  // Extract all AttemptConfigData to Keyword storage of IfrNvData.\r
   //\r
   IScsiConvertAttemptConfigDataToIfrNvDataByKeyword (IfrNvData);\r
 \r
@@ -2994,7 +3034,7 @@ IScsiFormExtractConfig (
     FreePool (IfrNvData);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-    \r
+\r
   Status = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize, InitiatorName);\r
   if (EFI_ERROR (Status)) {\r
     IfrNvData->InitiatorName[0] = L'\0';\r
@@ -3062,7 +3102,7 @@ IScsiFormExtractConfig (
 \r
 \r
 /**\r
-   \r
+\r
   This function applies changes in a driver's configuration.\r
   Input is a Configuration, which has the routing data for this\r
   driver followed by name / value configuration pairs. The driver\r
@@ -3075,8 +3115,8 @@ IScsiFormExtractConfig (
   @param[in]  This           Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
 \r
   @param[in]  Configuration  A null-terminated Unicode string in\r
-                             <ConfigString> format. \r
-  \r
+                             <ConfigString> format.\r
+\r
   @param[out] Progress       A pointer to a string filled in with the\r
                              offset of the most recent '&' before the\r
                              first failing name / value pair (or the\r
@@ -3087,16 +3127,16 @@ IScsiFormExtractConfig (
 \r
   @retval EFI_SUCCESS             The results have been distributed or are\r
                                   awaiting distribution.\r
-  \r
+\r
   @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the\r
                                   parts of the results that must be\r
                                   stored awaiting possible future\r
                                   protocols.\r
-  \r
+\r
   @retval EFI_INVALID_PARAMETERS  Passing in a NULL for the\r
                                   Results parameter would result\r
                                   in this type of error.\r
-  \r
+\r
   @retval EFI_NOT_FOUND           Target for the specified routing data\r
                                   was not found.\r
 \r
@@ -3128,6 +3168,7 @@ IScsiFormRouteConfig (
   Index2  = 0;\r
   NicInfo = NULL;\r
   AttemptList = NULL;\r
+  Status = EFI_SUCCESS;\r
 \r
   if (This == NULL || Configuration == NULL || Progress == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -3184,14 +3225,23 @@ IScsiFormRouteConfig (
       goto Exit;\r
     }\r
   } else {\r
-    Status = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize, InitiatorName);\r
+    Status = IScsiGetValue (Configuration, L"&OFFSET=", &OffSet);\r
     if (EFI_ERROR (Status)) {\r
-      CreatePopUp (\r
-        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-        &Key,\r
-        L"Error: please configure iSCSI initiator name first!",\r
-        NULL\r
-        );\r
+      goto Exit;\r
+    }\r
+\r
+    if (OffSet >= ATTEMPT_MAC_ADDR_VAR_OFFSET) {\r
+      Status = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize, InitiatorName);\r
+      if (EFI_ERROR (Status)) {\r
+        CreatePopUp (\r
+          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+          &Key,\r
+          L"Error: please configure iSCSI initiator name first!",\r
+          NULL\r
+          );\r
+        goto Exit;\r
+      }\r
+    } else {\r
       goto Exit;\r
     }\r
 \r
@@ -3290,10 +3340,6 @@ IScsiFormRouteConfig (
       }\r
 \r
     } else {\r
-      Status = IScsiGetValue (Configuration, L"&OFFSET=", &OffSet);\r
-      if (EFI_ERROR (Status)) {\r
-        goto Exit;\r
-      }\r
       Status = IScsiConvertlfrNvDataToAttemptConfigDataByKeyword (IfrNvData, OffSet);\r
       if (EFI_ERROR (Status)) {\r
         goto Exit;\r
@@ -3303,8 +3349,6 @@ IScsiFormRouteConfig (
 \r
   IScsiConfigUpdateAttempt ();\r
 \r
-  Status = EFI_SUCCESS;\r
-\r
 Exit:\r
   if (InitiatorName != NULL) {\r
     FreePool (InitiatorName);\r
@@ -3318,7 +3362,7 @@ Exit:
 }\r
 \r
 /**\r
-   \r
+\r
   This function is called to provide results data to the driver.\r
   This data consists of a unique key that is used to identify\r
   which data is either being passed back or being asked for.\r
@@ -3327,7 +3371,7 @@ Exit:
   @param[in]       Action        Specifies the type of action taken by the browser.\r
   @param[in]       QuestionId    A unique value which is sent to the original\r
                                  exporting driver so that it can identify the type\r
-                                 of data to expect. The format of the data tends to \r
+                                 of data to expect. The format of the data tends to\r
                                  vary based on the opcode that generated the callback.\r
   @param[in]       Type          The type of value for the question.\r
   @param[in, out]  Value         A pointer to the data being sent to the original\r
@@ -3366,6 +3410,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
@@ -3386,29 +3433,29 @@ IScsiFormCallback (
   }\r
 \r
   Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);\r
-  \r
+\r
   //\r
   // Retrieve uncommitted data from Browser\r
   //\r
-  \r
+\r
   BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);\r
   IfrNvData = AllocateZeroPool (BufferSize);\r
   if (IfrNvData == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-  \r
+\r
   IScsiName = (CHAR8 *) AllocateZeroPool (ISCSI_NAME_MAX_SIZE);\r
   if (IScsiName == NULL) {\r
     FreePool (IfrNvData);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-  \r
+\r
   Status = EFI_SUCCESS;\r
-  \r
+\r
   ZeroMem (&OldIfrNvData, BufferSize);\r
-  \r
+\r
   HiiGetBrowserData (NULL, NULL, BufferSize, (UINT8 *) IfrNvData);\r
-  \r
+\r
   CopyMem (&OldIfrNvData, IfrNvData, BufferSize);\r
 \r
   if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
@@ -3429,10 +3476,10 @@ IScsiFormCallback (
           &Key,\r
           L"Error: please configure iSCSI initiator name first!",\r
           NULL\r
-          );        \r
+          );\r
         break;\r
       }\r
-      \r
+\r
       Status = IScsiConfigAddAttempt ();\r
       break;\r
 \r
@@ -3456,12 +3503,12 @@ IScsiFormCallback (
         );\r
       IScsiConfigDisplayOrderAttempts ();\r
       break;\r
-    \r
+\r
     default:\r
       Status = IScsiConfigProcessDefault (QuestionId, IfrNvData);\r
       break;\r
     }\r
-  } else if (Action == EFI_BROWSER_ACTION_CHANGED) {  \r
+  } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
     switch (QuestionId) {\r
     case KEY_INITIATOR_NAME:\r
       UnicodeStrToAsciiStrS (IfrNvData->InitiatorName, IScsiName, ISCSI_NAME_MAX_SIZE);\r
@@ -3474,12 +3521,12 @@ IScsiFormCallback (
           &Key,\r
           L"Invalid iSCSI Name!",\r
           NULL\r
-          );      \r
+          );\r
       }\r
 \r
       *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
       break;\r
-      \r
+\r
     case KEY_SAVE_ATTEMPT_CONFIG:\r
       Status = IScsiConvertIfrNvDataToAttemptConfigData (IfrNvData, Private->Current);\r
       if (EFI_ERROR (Status)) {\r
@@ -3536,9 +3583,35 @@ 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
+        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
@@ -3547,16 +3620,16 @@ IScsiFormCallback (
 \r
     case KEY_LOCAL_IP:\r
       Status = NetLibStrToIp4 (IfrNvData->LocalIp, &HostIp.v4);\r
-      if (EFI_ERROR (Status) || \r
-          ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && \r
+      if (EFI_ERROR (Status) ||\r
+          ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&\r
            !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) {\r
         CreatePopUp (\r
           EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
           &Key,\r
           L"Invalid IP address!",\r
           NULL\r
-          ); \r
-        \r
+          );\r
+\r
         Status = EFI_INVALID_PARAMETER;\r
       } else {\r
         CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4));\r
@@ -3572,8 +3645,8 @@ IScsiFormCallback (
           &Key,\r
           L"Invalid Subnet Mask!",\r
           NULL\r
-          ); \r
-        \r
+          );\r
+\r
         Status = EFI_INVALID_PARAMETER;\r
       } else {\r
         CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));\r
@@ -3583,16 +3656,16 @@ IScsiFormCallback (
 \r
     case KEY_GATE_WAY:\r
       Status = NetLibStrToIp4 (IfrNvData->Gateway, &Gateway.v4);\r
-      if (EFI_ERROR (Status) || \r
-          ((Gateway.Addr[0] != 0) && \r
-           (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && \r
+      if (EFI_ERROR (Status) ||\r
+          ((Gateway.Addr[0] != 0) &&\r
+           (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&\r
            !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) {\r
         CreatePopUp (\r
           EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
           &Key,\r
           L"Invalid Gateway!",\r
           NULL\r
-          );       \r
+          );\r
         Status = EFI_INVALID_PARAMETER;\r
       } else {\r
         CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4));\r
@@ -3649,7 +3722,7 @@ IScsiFormCallback (
           &Key,\r
           L"Invalid LUN string!",\r
           NULL\r
-          );       \r
+          );\r
       } else {\r
         CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun));\r
       }\r
@@ -3766,7 +3839,7 @@ IScsiConfigFormInit (
                   NULL\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
-  \r
+\r
   //\r
   // Publish our HII data.\r
   //\r
@@ -3779,7 +3852,7 @@ IScsiConfigFormInit (
                                      );\r
   if (CallbackInfo->RegisteredHandle == NULL) {\r
     gBS->UninstallMultipleProtocolInterfaces (\r
-           &CallbackInfo->DriverHandle,\r
+           CallbackInfo->DriverHandle,\r
            &gEfiDevicePathProtocolGuid,\r
            &mIScsiHiiVendorDevicePath,\r
            &gEfiHiiConfigAccessProtocolGuid,\r