/** @file
  Define NVData structures used by the iSCSI configuration component.

Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _ISCSI_NVDATASTRUC_H_
#define _ISCSI_NVDATASTRUC_H_

#include <Guid/IScsiConfigHii.h>

#define VAR_EQ_TEST_NAME          0x100
#define CONFIGURATION_VARSTORE_ID 0x6666

#define FORMID_MAIN_FORM          1
#define FORMID_MAC_FORM           2
#define FORMID_ATTEMPT_FORM       3
#define FORMID_ORDER_FORM         4
#define FORMID_DELETE_FORM        5

#define ISCSI_MAX_ATTEMPTS_NUM    FixedPcdGet8 (PcdMaxIScsiAttemptNumber)

#define ISCSI_NAME_IFR_MIN_SIZE   4
#define ISCSI_NAME_IFR_MAX_SIZE   223
#define ISCSI_NAME_MAX_SIZE       224

#define ATTEMPT_NAME_LIST_SIZE    96
#define ATTEMPT_NAME_SIZE         12

#define CONNECT_MIN_RETRY         0
#define CONNECT_MAX_RETRY         16

#define CONNECT_MIN_TIMEOUT       100
#define CONNECT_MAX_TIMEOUT       20000
#define CONNECT_DEFAULT_TIMEOUT   1000

#define ISCSI_ACTIVE_DISABLED     0
#define ISCSI_ACTIVE_ENABLED      1

#define ISCSI_DISABLED            0
#define ISCSI_ENABLED             1
#define ISCSI_ENABLED_FOR_MPIO    2

#define IP_MODE_IP4               0
#define IP_MODE_IP6               1
#define IP_MODE_AUTOCONFIG        2

#define ISCSI_AUTH_TYPE_NONE      0
#define ISCSI_AUTH_TYPE_CHAP      1
#define ISCSI_AUTH_TYPE_KRB       2

#define IP4_MIN_SIZE              7
#define IP4_MAX_SIZE              15
#define IP4_STR_MAX_SIZE          16

//
// Macros used for an IPv4 or an IPv6 address.
//
#define IP_MIN_SIZE               2
#define IP_MAX_SIZE               39
#define IP_STR_MAX_SIZE           40

#define LUN_MIN_SIZE              1
#define LUN_MAX_SIZE              20
#define ISCSI_LUN_STR_MAX_LEN     21

#define ISCSI_CHAP_UNI            0
#define ISCSI_CHAP_MUTUAL         1

#define TARGET_PORT_MIN_NUM       0
#define TARGET_PORT_MAX_NUM       65535
#define LABEL_END                 0xffff

#define KEY_INITIATOR_NAME        0x101
#define KEY_DHCP_ENABLE           0x102
#define KEY_LOCAL_IP              0x103
#define KEY_SUBNET_MASK           0x104
#define KEY_GATE_WAY              0x105
#define KEY_TARGET_IP             0x106
#define KEY_CHAP_NAME             0x107
#define KEY_CHAP_SECRET           0x108
#define KEY_REVERSE_CHAP_NAME     0x109
#define KEY_REVERSE_CHAP_SECRET   0x10a
#define KEY_SAVE_CHANGES          0x10b
#define KEY_TARGET_NAME           0x10c
#define KEY_BOOT_LUN              0x10d

#define KEY_ADD_ATTEMPT           0x10e
#define KEY_SAVE_ATTEMPT_CONFIG   0x10f
#define KEY_ORDER_ATTEMPT_CONFIG  0x110
#define KEY_SAVE_ORDER_CHANGES    0x111
#define KEY_IGNORE_ORDER_CHANGES  0x112
#define KEY_ATTEMPT_NAME          0x113
#define KEY_SAVE_DELETE_ATTEMPT   0x114
#define KEY_IGNORE_DELETE_ATTEMPT 0x115
#define KEY_DELETE_ATTEMPT        0x116

#define KEY_IP_MODE               0x11c
#define KEY_AUTH_TYPE             0x11d
#define KEY_CONFIG_ISID           0x11e

#define ATTEMPT_ENTRY_LABEL       0x9000
#define KEY_ATTEMPT_ENTRY_BASE    0xa000
#define KEY_DE_ATTEMPT_ENTRY_BASE 0xb000

#define KEY_DEVICE_ENTRY_BASE     0x1000
#define KEY_MAC_ENTRY_BASE        0x2000
#define MAC_ENTRY_LABEL           0x3000
#define ORDER_ENTRY_LABEL         0x4000
#define DELETE_ENTRY_LABEL        0x5000
#define KEYWORD_ENTRY_LABEL       0x6000
#define CONFIG_OPTION_OFFSET      0x9000

#define ISCSI_CHAP_SECRET_MIN_LEN 12
#define ISCSI_CHAP_SECRET_MAX_LEN 16
//
// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof (NULL-Terminator)
//
#define ISCSI_CHAP_SECRET_STORAGE  17

#define ISCSI_CHAP_NAME_MAX_LEN    126
#define ISCSI_CHAP_NAME_STORAGE    127

#define KERBEROS_SECRET_MIN_LEN   12
#define KERBEROS_SECRET_MAX_LEN   16
#define KERBEROS_SECRET_STORAGE   17
#define KERBEROS_NAME_MAX_LEN     96
#define KERBEROS_KDC_PORT_MIN_NUM 0
#define KERBEROS_KDC_PORT_MAX_NUM 65535

#define ISID_CONFIGURABLE_MIN_LEN 6
#define ISID_CONFIGURABLE_MAX_LEN 12
#define ISID_CONFIGURABLE_STORAGE 13

//
// sizeof (EFI_MAC_ADDRESS) * 3
//
#define ISCSI_MAX_MAC_STRING_LEN            96

///
/// Macro used for target Url.
///
#define ISCSI_TARGET_URI_MIN_SIZE     0
#define ISCSI_TARGET_URI_MAX_SIZE     255

#pragma pack(1)

//
// Used by keyword.
//
typedef struct {
  CHAR16  ISCSIIsId[ISID_CONFIGURABLE_STORAGE];
  CHAR16  ISCSIInitiatorIpAddress[IP4_STR_MAX_SIZE];
  CHAR16  ISCSIInitiatorNetmask[IP4_STR_MAX_SIZE];
  CHAR16  ISCSIInitiatorGateway[IP4_STR_MAX_SIZE];
  CHAR16  ISCSITargetName[ISCSI_NAME_MAX_SIZE];
  CHAR16  ISCSITargetIpAddress[ISCSI_TARGET_URI_MAX_SIZE];
  CHAR16  ISCSILun[ISCSI_LUN_STR_MAX_LEN];
  CHAR16  ISCSIChapUsername[ISCSI_CHAP_NAME_STORAGE];
  CHAR16  ISCSIChapSecret[ISCSI_CHAP_SECRET_STORAGE];
  CHAR16  ISCSIReverseChapUsername[ISCSI_CHAP_NAME_STORAGE];
  CHAR16  ISCSIReverseChapSecret[ISCSI_CHAP_SECRET_STORAGE];
} KEYWORD_STR;

typedef struct _ISCSI_CONFIG_IFR_NVDATA {
  CHAR16  InitiatorName[ISCSI_NAME_MAX_SIZE];
  CHAR16  AttemptName[ATTEMPT_NAME_SIZE];
  UINT8   Enabled;
  UINT8   IpMode;

  UINT8   ConnectRetryCount;
  UINT8   Padding1;
  UINT16  ConnectTimeout; // Timeout value in milliseconds.

  UINT8   InitiatorInfoFromDhcp;
  UINT8   TargetInfoFromDhcp;
  CHAR16  LocalIp[IP4_STR_MAX_SIZE];
  CHAR16  SubnetMask[IP4_STR_MAX_SIZE];
  CHAR16  Gateway[IP4_STR_MAX_SIZE];

  CHAR16  TargetName[ISCSI_NAME_MAX_SIZE];
  CHAR16  TargetIp[ISCSI_TARGET_URI_MAX_SIZE];
  UINT16  TargetPort;
  CHAR16  BootLun[ISCSI_LUN_STR_MAX_LEN];

  UINT8   AuthenticationType;

  UINT8   CHAPType;
  CHAR16  CHAPName[ISCSI_CHAP_NAME_STORAGE];
  CHAR16  CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
  CHAR16  ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
  CHAR16  ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];

  BOOLEAN MutualRequired;
  UINT8   Padding2;
  CHAR16  KerberosUserName[KERBEROS_NAME_MAX_LEN];
  CHAR16  KerberosUserSecret[KERBEROS_SECRET_STORAGE];
  CHAR16  KerberosKDCName[KERBEROS_NAME_MAX_LEN];
  CHAR16  KerberosKDCRealm[KERBEROS_NAME_MAX_LEN];
  CHAR16  KerberosKDCIp[IP_STR_MAX_SIZE];
  UINT16  KerberosKDCPort;

  UINT8   DynamicOrderedList[ISCSI_MAX_ATTEMPTS_NUM];
  UINT8   DeleteAttemptList[ISCSI_MAX_ATTEMPTS_NUM];
  UINT8   AddAttemptList[ISCSI_MAX_ATTEMPTS_NUM];
  CHAR16  IsId[ISID_CONFIGURABLE_STORAGE];

  //
  // This will be used by keywords.
  //
  CHAR16  ISCSIMacAddr[ISCSI_MAX_MAC_STRING_LEN];
  CHAR16  ISCSIAttemptOrder[ATTEMPT_NAME_LIST_SIZE];
  CHAR16  ISCSIAddAttemptList[ATTEMPT_NAME_LIST_SIZE];
  CHAR16  ISCSIDeleteAttemptList[ATTEMPT_NAME_LIST_SIZE];
  CHAR16  ISCSIDisplayAttemptList[ATTEMPT_NAME_LIST_SIZE];
  CHAR16  ISCSIAttemptName[ATTEMPT_NAME_LIST_SIZE];
  UINT8   ISCSIBootEnableList[ISCSI_MAX_ATTEMPTS_NUM];
  UINT8   ISCSIIpAddressTypeList[ISCSI_MAX_ATTEMPTS_NUM];
  UINT8   ISCSIConnectRetry[ISCSI_MAX_ATTEMPTS_NUM];
  UINT16  ISCSIConnectTimeout[ISCSI_MAX_ATTEMPTS_NUM];
  UINT8   ISCSIInitiatorInfoViaDHCP[ISCSI_MAX_ATTEMPTS_NUM];
  UINT8   ISCSITargetInfoViaDHCP[ISCSI_MAX_ATTEMPTS_NUM];
  UINT16  ISCSITargetTcpPort[ISCSI_MAX_ATTEMPTS_NUM];
  UINT8   ISCSIAuthenticationMethod[ISCSI_MAX_ATTEMPTS_NUM];
  UINT8   ISCSIChapType[ISCSI_MAX_ATTEMPTS_NUM];
  KEYWORD_STR Keyword[ISCSI_MAX_ATTEMPTS_NUM];
} ISCSI_CONFIG_IFR_NVDATA;
#pragma pack()

#endif