]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/IScsiDxe/IScsiMisc.c
NetworkPkg:Add scriptable configuration to iSCSI driver by leveraging x-UEFI.
[mirror_edk2.git] / NetworkPkg / IScsiDxe / IScsiMisc.c
index e8e8f9c9efa1e0a77dfaac3498154f49aa077d57..7b4044fe5ade00d6443c7e68161cb1192e936393 100644 (file)
@@ -643,17 +643,787 @@ IScsiRemoveNic (
     }\r
   }\r
 \r
-  //\r
-  // Free attempt is created but not saved to system.\r
-  //\r
-  if (mPrivate->NewAttempt != NULL) {\r
-    FreePool (mPrivate->NewAttempt);\r
-    mPrivate->NewAttempt = NULL;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Create and initialize the Attempts.\r
+\r
+  @param[in]  AttemptNum          The number of Attempts will be created.\r
+\r
+  @retval EFI_SUCCESS             The Attempts have been created successfully.\r
+  @retval Others                  Failed to create the Attempt.\r
+\r
+**/\r
+EFI_STATUS\r
+IScsiCreateAttempts (\r
+  IN UINTN            AttemptNum\r
+)\r
+{\r
+  ISCSI_ATTEMPT_CONFIG_NVDATA   *AttemptConfigData;\r
+  ISCSI_SESSION_CONFIG_NVDATA   *ConfigData;\r
+  UINT8                         *AttemptConfigOrder;\r
+  UINTN                         AttemptConfigOrderSize;\r
+  UINT8                         *AttemptOrderTmp;\r
+  UINTN                         TotalNumber;\r
+  UINT8                         Index;\r
+  EFI_STATUS                    Status;\r
+\r
+  for (Index = 1; Index <= AttemptNum; Index ++) {\r
+    //\r
+    // Get the initialized attempt order. This is used to essure creating attempts by order.\r
+    //\r
+    AttemptConfigOrder = IScsiGetVariableAndSize (\r
+                           L"InitialAttemptOrder",\r
+                           &gIScsiConfigGuid,\r
+                           &AttemptConfigOrderSize\r
+                           );\r
+    TotalNumber = AttemptConfigOrderSize / sizeof (UINT8);\r
+    if (TotalNumber == AttemptNum) {\r
+      Status = EFI_SUCCESS;\r
+      break;\r
+    }\r
+    TotalNumber++;\r
+\r
+    //\r
+    // Append the new created attempt to the end.\r
+    //\r
+    AttemptOrderTmp = AllocateZeroPool (TotalNumber * sizeof (UINT8));\r
+    if (AttemptOrderTmp == NULL) {\r
+      if (AttemptConfigOrder != NULL) {\r
+        FreePool (AttemptConfigOrder);\r
+      }\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    if (AttemptConfigOrder != NULL) {\r
+      CopyMem (AttemptOrderTmp, AttemptConfigOrder, AttemptConfigOrderSize);\r
+      FreePool (AttemptConfigOrder);\r
+    }\r
+\r
+    AttemptOrderTmp[TotalNumber - 1] = Index;\r
+    AttemptConfigOrder               = AttemptOrderTmp;\r
+    AttemptConfigOrderSize           = TotalNumber * sizeof (UINT8);\r
+\r
+    Status = gRT->SetVariable (\r
+                    L"InitialAttemptOrder",\r
+                    &gIScsiConfigGuid,\r
+                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+                    AttemptConfigOrderSize,\r
+                    AttemptConfigOrder\r
+                    );\r
+    FreePool (AttemptConfigOrder);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+    //\r
+    // Create new Attempt\r
+    //\r
+    AttemptConfigData = AllocateZeroPool (sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA));\r
+    if (AttemptConfigData == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    ConfigData                    = &AttemptConfigData->SessionConfigData;\r
+    ConfigData->TargetPort        = ISCSI_WELL_KNOWN_PORT;\r
+    ConfigData->ConnectTimeout    = CONNECT_DEFAULT_TIMEOUT;\r
+    ConfigData->ConnectRetryCount = CONNECT_MIN_RETRY;\r
+\r
+    AttemptConfigData->AuthenticationType           = ISCSI_AUTH_TYPE_CHAP;\r
+    AttemptConfigData->AuthConfigData.CHAP.CHAPType = ISCSI_CHAP_UNI;\r
+    //\r
+    // Configure the Attempt index and set variable.\r
+    //\r
+    AttemptConfigData->AttemptConfigIndex = Index;\r
+\r
+    //\r
+    // Set the attempt name according to the order.\r
+    //\r
+    UnicodeSPrint (\r
+      mPrivate->PortString,\r
+      (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
+      L"Attempt %d",\r
+      (UINTN) AttemptConfigData->AttemptConfigIndex\r
+      );\r
+    UnicodeStrToAsciiStrS (mPrivate->PortString, AttemptConfigData->AttemptName, ATTEMPT_NAME_SIZE);\r
+\r
+    Status = gRT->SetVariable (\r
+                    mPrivate->PortString,\r
+                    &gEfiIScsiInitiatorNameProtocolGuid,\r
+                    ISCSI_CONFIG_VAR_ATTR,\r
+                    sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),\r
+                    AttemptConfigData\r
+                    );\r
+    FreePool (AttemptConfigData);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Create the iSCSI configuration Keywords for each attempt. You can find the keywords\r
+  defined in the "x-UEFI-ns" namespace (http://www.uefi.org/confignamespace).\r
+\r
+  @param[in]  KeywordNum          The number Sets of Keywords will be created.\r
+\r
+  @retval EFI_SUCCESS             The operation is completed.\r
+  @retval Others                  Failed to create the Keywords.\r
+\r
+**/\r
+EFI_STATUS\r
+IScsiCreateKeywords (\r
+  IN UINTN            KeywordNum\r
+)\r
+{\r
+  VOID                          *StartOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL            *StartLabel;\r
+  VOID                          *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL            *EndLabel;\r
+  UINTN                         Index;\r
+  EFI_STRING_ID                 StringToken;\r
+  CHAR16                        StringId[64];\r
+  CHAR16                        KeywordId[32];\r
+  EFI_STATUS                    Status;\r
+\r
+  Status = IScsiCreateOpCode (\r
+             KEYWORD_ENTRY_LABEL,\r
+             &StartOpCodeHandle,\r
+             &StartLabel,\r
+             &EndOpCodeHandle,\r
+             &EndLabel\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  for (Index = 1; Index <= KeywordNum; Index ++) {\r
+    //\r
+    // Create iSCSIAttemptName Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_ATTEMPTT_NAME_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIAttemptName:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_ATTEMPT_NAME_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_ATTEMPT_NAME_VAR_OFFSET + ATTEMPT_NAME_SIZE * (Index - 1) * sizeof (CHAR16)),\r
+      StringToken,\r
+      StringToken,\r
+      EFI_IFR_FLAG_READ_ONLY,\r
+      0,\r
+      0,\r
+      ATTEMPT_NAME_SIZE,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIBootEnable Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_MODE_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIBootEnable:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateNumericOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_BOOTENABLE_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_BOOTENABLE_VAR_OFFSET + (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      EFI_IFR_NUMERIC_SIZE_1,\r
+      0,\r
+      2,\r
+      0,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIIpAddressType Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_IP_MODE_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIIpAddressType:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateNumericOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_ADDRESS_TYPE_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_ADDRESS_TYPE_VAR_OFFSET + (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      EFI_IFR_NUMERIC_SIZE_1,\r
+      0,\r
+      2,\r
+      0,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIConnectRetry Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_CONNECT_RETRY_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIConnectRetry:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateNumericOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_CONNECT_RETRY_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_CONNECT_RETRY_VAR_OFFSET + (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      EFI_IFR_NUMERIC_SIZE_1,\r
+      0,\r
+      16,\r
+      0,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIConnectTimeout Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_CONNECT_TIMEOUT_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIConnectTimeout:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateNumericOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_CONNECT_TIMEOUT_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_CONNECT_TIMEOUT_VAR_OFFSET + 2 * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      EFI_IFR_NUMERIC_SIZE_2,\r
+      CONNECT_MIN_TIMEOUT,\r
+      CONNECT_MAX_TIMEOUT,\r
+      0,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create ISID Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_ISID_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIISID:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_ISID_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_ISID_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      ISID_CONFIGURABLE_MIN_LEN,\r
+      ISID_CONFIGURABLE_STORAGE,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIInitiatorInfoViaDHCP Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_INITIATOR_VIA_DHCP_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIInitiatorInfoViaDHCP:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateNumericOpCode (\r
+    StartOpCodeHandle,\r
+    (EFI_QUESTION_ID) (ATTEMPT_INITIATOR_VIA_DHCP_QUESTION_ID + (Index - 1)),\r
+    CONFIGURATION_VARSTORE_ID,\r
+    (UINT16) (ATTEMPT_INITIATOR_VIA_DHCP_VAR_OFFSET + (Index - 1)),\r
+    StringToken,\r
+    StringToken,\r
+    0,\r
+    0,\r
+    0,\r
+    1,\r
+    0,\r
+    NULL\r
+    );\r
+\r
+    //\r
+    // Create iSCSIInitiatorIpAddress Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_INITIATOR_IP_ADDRESS_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIInitiatorIpAddress:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_INITIATOR_IP_ADDRESS_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_INITIATOR_IP_ADDRESS_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      IP4_MIN_SIZE,\r
+      IP4_MAX_SIZE,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIInitiatorNetmask Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_INITIATOR_NET_MASK_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIInitiatorNetmask:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_INITIATOR_NET_MASK_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_INITIATOR_NET_MASK_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      IP4_MIN_SIZE,\r
+      IP4_MAX_SIZE,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIInitiatorGateway Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_INITIATOR_GATE_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIInitiatorGateway:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_INITIATOR_GATE_WAY_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_INITIATOR_GATE_WAY_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      IP4_MIN_SIZE,\r
+      IP4_MAX_SIZE,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSITargetInfoViaDHCP Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_TARGET_VIA_DHCP_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSITargetInfoViaDHCP:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateNumericOpCode (\r
+    StartOpCodeHandle,\r
+    (EFI_QUESTION_ID) (ATTEMPT_TARGET_VIA_DHCP_QUESTION_ID + (Index - 1)),\r
+    CONFIGURATION_VARSTORE_ID,\r
+    (UINT16) (ATTEMPT_TARGET_VIA_DHCP_VAR_OFFSET + (Index - 1)),\r
+    StringToken,\r
+    StringToken,\r
+    0,\r
+    0,\r
+    0,\r
+    1,\r
+    0,\r
+    NULL\r
+    );\r
+\r
+    //\r
+    // Create iSCSITargetTcpPort Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_TARGET_TCP_PORT_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSITargetTcpPort:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateNumericOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_TARGET_TCP_PORT_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_TARGET_TCP_PORT_VAR_OFFSET + 2 * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      EFI_IFR_NUMERIC_SIZE_2,\r
+      TARGET_PORT_MIN_NUM,\r
+      TARGET_PORT_MAX_NUM,\r
+      0,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSITargetName Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_TARGET_NAME_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSITargetName:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_TARGET_NAME_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_TARGET_NAME_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      ISCSI_NAME_IFR_MIN_SIZE,\r
+      ISCSI_NAME_IFR_MAX_SIZE,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSITargetIpAddress Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_TARGET_IP_ADDRESS_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSITargetIpAddress:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_TARGET_IP_ADDRESS_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_TARGET_IP_ADDRESS_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      IP_MIN_SIZE,\r
+      IP_MAX_SIZE,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSILUN Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_LUN_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSILUN:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_LUN_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_LUN_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      LUN_MIN_SIZE,\r
+      LUN_MAX_SIZE,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIAuthenticationMethod Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_AUTHENTICATION_METHOD_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIAuthenticationMethod:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateNumericOpCode (\r
+    StartOpCodeHandle,\r
+    (EFI_QUESTION_ID) (ATTEMPT_AUTHENTICATION_METHOD_QUESTION_ID + (Index - 1)),\r
+    CONFIGURATION_VARSTORE_ID,\r
+    (UINT16) (ATTEMPT_AUTHENTICATION_METHOD_VAR_OFFSET + (Index - 1)),\r
+    StringToken,\r
+    StringToken,\r
+    0,\r
+    0,\r
+    0,\r
+    1,\r
+    0,\r
+    NULL\r
+    );\r
+\r
+    //\r
+    // Create iSCSIChapType Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_CHARTYPE_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIChapType:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateNumericOpCode (\r
+    StartOpCodeHandle,\r
+    (EFI_QUESTION_ID) (ATTEMPT_CHARTYPE_QUESTION_ID + (Index - 1)),\r
+    CONFIGURATION_VARSTORE_ID,\r
+    (UINT16) (ATTEMPT_CHARTYPE_VAR_OFFSET + (Index - 1)),\r
+    StringToken,\r
+    StringToken,\r
+    0,\r
+    0,\r
+    0,\r
+    1,\r
+    0,\r
+    NULL\r
+    );\r
+\r
+    //\r
+    // Create iSCSIChapUsername Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_CHAR_USER_NAME_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIChapUsername:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_CHAR_USER_NAME_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_CHAR_USER_NAME_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      0,\r
+      ISCSI_CHAP_NAME_MAX_LEN,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIChapSecret Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_CHAR_SECRET_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIChapSecret:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_CHAR_SECRET_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_CHAR_SECRET_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      ISCSI_CHAP_SECRET_MIN_LEN,\r
+      ISCSI_CHAP_SECRET_MAX_LEN,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIReverseChapUsername Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_CHAR_REVERSE_USER_NAME_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIReverseChapUsername:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_CHAR_REVERSE_USER_NAME_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_CHAR_REVERSE_USER_NAME_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      0,\r
+      ISCSI_CHAP_NAME_MAX_LEN,\r
+      NULL\r
+      );\r
+\r
+    //\r
+    // Create iSCSIReverseChapSecret Keyword.\r
+    //\r
+    UnicodeSPrint (StringId, sizeof (StringId), L"STR_ISCSI_CHAR_REVERSE_SECRET_PROMPT%d", Index);\r
+    StringToken =  HiiSetString (\r
+                     mCallbackInfo->RegisteredHandle,\r
+                     0,\r
+                     StringId,\r
+                     NULL\r
+                     );\r
+    UnicodeSPrint (KeywordId, sizeof (KeywordId), L"iSCSIReverseChapSecret:%d", Index);\r
+    HiiSetString (mCallbackInfo->RegisteredHandle, StringToken, KeywordId, "x-UEFI-ns");\r
+    HiiCreateStringOpCode (\r
+      StartOpCodeHandle,\r
+      (EFI_QUESTION_ID) (ATTEMPT_CHAR_REVERSE_SECRET_QUESTION_ID + (Index - 1)),\r
+      CONFIGURATION_VARSTORE_ID,\r
+      (UINT16) (ATTEMPT_CHAR_REVERSE_SECRET_VAR_OFFSET + sizeof (KEYWORD_STR) * (Index - 1)),\r
+      StringToken,\r
+      StringToken,\r
+      0,\r
+      0,\r
+      ISCSI_CHAP_SECRET_MIN_LEN,\r
+      ISCSI_CHAP_SECRET_MAX_LEN,\r
+      NULL\r
+      );\r
+  }\r
+\r
+  Status = HiiUpdateForm (\r
+             mCallbackInfo->RegisteredHandle, // HII handle\r
+             &gIScsiConfigGuid,               // Formset GUID\r
+             FORMID_ATTEMPT_FORM,             // Form ID\r
+             StartOpCodeHandle,               // Label for where to insert opcodes\r
+             EndOpCodeHandle                  // Replace data\r
+             );\r
+\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+\r
+  Free the attempt configure data variable.\r
+\r
+**/\r
+VOID\r
+IScsiCleanAttemptVariable (\r
+  IN   VOID\r
+)\r
+{\r
+  ISCSI_ATTEMPT_CONFIG_NVDATA   *AttemptConfigData;\r
+  UINT8                         *AttemptConfigOrder;\r
+  UINTN                         AttemptConfigOrderSize;\r
+  UINTN                         Index;\r
+\r
+  //\r
+  // Get the initialized attempt order.\r
+  //\r
+  AttemptConfigOrder = IScsiGetVariableAndSize (\r
+                         L"InitialAttemptOrder",\r
+                         &gIScsiConfigGuid,\r
+                         &AttemptConfigOrderSize\r
+                         );\r
+  if (AttemptConfigOrder == NULL || AttemptConfigOrderSize == 0) {\r
+    return;\r
+  }\r
+\r
+  for (Index = 1; Index < AttemptConfigOrderSize / sizeof (UINT8); Index++) {\r
+    UnicodeSPrint (\r
+      mPrivate->PortString,\r
+      (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
+      L"Attempt %d",\r
+      Index\r
+      );\r
+\r
+    GetVariable2 (\r
+      mPrivate->PortString,\r
+      &gEfiIScsiInitiatorNameProtocolGuid,\r
+      (VOID**)&AttemptConfigData,\r
+      NULL\r
+      );\r
+\r
+    if (AttemptConfigData != NULL) {\r
+      gRT->SetVariable (\r
+             mPrivate->PortString,\r
+             &gEfiIScsiInitiatorNameProtocolGuid,\r
+             0,\r
+             0,\r
+             NULL\r
+             );\r
+    }\r
+  }\r
+  return;\r
+}\r
 \r
 /**\r
   Get the recorded NIC info from global structure by the Index.\r
@@ -931,6 +1701,7 @@ IScsiDhcpIsConfigured (
   UINTN                       HwAddressSize;\r
   UINT16                      VlanId;\r
   CHAR16                      MacString[ISCSI_MAX_MAC_STRING_LEN];\r
+  CHAR16                      AttemptMacString[ISCSI_MAX_MAC_STRING_LEN];\r
   CHAR16                      AttemptName[ISCSI_NAME_IFR_MAX_SIZE];\r
   \r
   AttemptConfigOrder = IScsiGetVariableAndSize (\r
@@ -959,8 +1730,7 @@ IScsiDhcpIsConfigured (
     UnicodeSPrint (\r
       AttemptName,\r
       (UINTN) 128,\r
-      L"%s%d",\r
-      MacString,\r
+      L"Attempt %d",\r
       (UINTN) AttemptConfigOrder[Index]\r
       );\r
     Status = GetVariable2 (\r
@@ -985,7 +1755,13 @@ IScsiDhcpIsConfigured (
       FreePool (AttemptTmp);\r
       continue;\r
     }\r
-    \r
+\r
+    AsciiStrToUnicodeStrS (AttemptTmp->MacString, AttemptMacString, sizeof (AttemptMacString) / sizeof (AttemptMacString[0]));\r
+\r
+    if (AttemptTmp->Actived == ISCSI_ACTIVE_DISABLED || StrCmp (MacString, AttemptMacString)) {\r
+      continue;\r
+    }\r
+\r
     if(AttemptTmp->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG ||\r
        AttemptTmp->SessionConfigData.InitiatorInfoFromDhcp == TRUE ||\r
        AttemptTmp->SessionConfigData.TargetInfoFromDhcp == TRUE) { \r
@@ -1106,6 +1882,7 @@ IScsiGetConfigData (
 {\r
   EFI_STATUS                  Status;\r
   CHAR16                      MacString[ISCSI_MAX_MAC_STRING_LEN];\r
+  CHAR16                      AttemptMacString[ISCSI_MAX_MAC_STRING_LEN];\r
   UINTN                       Index;\r
   ISCSI_NIC_INFO              *NicInfo;\r
   ISCSI_ATTEMPT_CONFIG_NVDATA *AttemptConfigData;\r
@@ -1197,12 +1974,10 @@ IScsiGetConfigData (
           //\r
           // Refresh the state of this attempt to NVR.\r
           //\r
-          AsciiStrToUnicodeStrS (AttemptTmp->MacString, MacString, ARRAY_SIZE (MacString));\r
           UnicodeSPrint (\r
             mPrivate->PortString,\r
             (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
-            L"%s%d",\r
-            MacString,\r
+            L"Attempt %d",\r
             (UINTN) AttemptTmp->AttemptConfigIndex\r
             );\r
 \r
@@ -1236,12 +2011,10 @@ IScsiGetConfigData (
         //\r
         // Refresh the state of this attempt to NVR.\r
         //\r
-        AsciiStrToUnicodeStrS (AttemptTmp->MacString, MacString, ARRAY_SIZE (MacString));\r
         UnicodeSPrint (\r
           mPrivate->PortString,\r
           (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
-          L"%s%d",\r
-          MacString,\r
+          L"Attempt %d",\r
           (UINTN) AttemptTmp->AttemptConfigIndex\r
           );\r
 \r
@@ -1269,9 +2042,8 @@ IScsiGetConfigData (
     IScsiMacAddrToStr (&NicInfo->PermanentAddress, NicInfo->HwAddressSize, NicInfo->VlanId, MacString);\r
     UnicodeSPrint (\r
       mPrivate->PortString,\r
-      (UINTN) 128,\r
-      L"%s%d",\r
-      MacString,\r
+      (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
+      L"Attempt %d",\r
       (UINTN) AttemptConfigOrder[Index]\r
       );\r
 \r
@@ -1281,8 +2053,10 @@ IScsiGetConfigData (
       (VOID**)&AttemptConfigData,\r
       NULL\r
       );\r
+    AsciiStrToUnicodeStrS (AttemptConfigData->MacString, AttemptMacString, sizeof (AttemptMacString) / sizeof (AttemptMacString[0]));\r
 \r
-    if (AttemptConfigData == NULL) {\r
+    if (AttemptConfigData == NULL || AttemptConfigData->Actived == ISCSI_ACTIVE_DISABLED ||\r
+        StrCmp (MacString, AttemptMacString)) {\r
       continue;\r
     }\r
 \r
@@ -1327,12 +2101,10 @@ IScsiGetConfigData (
       //\r
       // Refresh the state of this attempt to NVR.\r
       //\r
-      AsciiStrToUnicodeStrS (AttemptConfigData->MacString, MacString, ARRAY_SIZE (MacString));\r
       UnicodeSPrint (\r
         mPrivate->PortString,\r
         (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
-        L"%s%d",\r
-        MacString,\r
+        L"Attempt %d",\r
         (UINTN) AttemptConfigData->AttemptConfigIndex\r
         );\r
 \r