/** @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
