/** @file
  Vfr file for iSCSI config.
  
Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution.  The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/


#include "IScsiConfigNVDataStruc.h"
#define EFI_NETWORK_DEVICE_CLASS  0x04

formset 
  guid     = IP4_ISCSI_CONFIG_GUID,
  title    = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE),
  help     = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP),

  varstore ISCSI_CONFIG_IFR_NVDATA,
    name = ISCSI_CONFIG_IFR_NVDATA,
    guid = IP4_ISCSI_CONFIG_GUID;
  form formid = FORMID_MAIN_FORM,
    title  = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE);

    string  varid   = ISCSI_CONFIG_IFR_NVDATA.InitiatorName, 
            prompt  = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME),
            help    = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP),
            flags   = INTERACTIVE,
            key     = KEY_INITIATOR_NAME,
            minsize = ISCSI_NAME_IFR_MIN_SIZE,
            maxsize = ISCSI_NAME_IFR_MAX_SIZE,
    endstring;

    label DEVICE_ENTRY_LABEL;
    label LABEL_END;

  endform;

  form formid = FORMID_DEVICE_FORM,
    title  = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE);

    checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled,
            prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE),
            help   = STRING_TOKEN(STR_NULL),
            flags  = 0,
    endcheckbox;

    checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp,
            prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
            help   = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
            flags  = INTERACTIVE,
            key    = KEY_DHCP_ENABLE,
    endcheckbox;

    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x01; 
    string  varid   = ISCSI_CONFIG_IFR_NVDATA.LocalIp, 
            prompt  = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS),
            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
            flags   = INTERACTIVE,
            key     = KEY_LOCAL_IP,
            minsize = IP_MIN_SIZE,
            maxsize = IP_MAX_SIZE,
    endstring;

    string  varid   = ISCSI_CONFIG_IFR_NVDATA.SubnetMask, 
            prompt  = STRING_TOKEN(STR_ISCSI_LOCAL_MASK),
            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
            flags   = INTERACTIVE,
            key     = KEY_SUBNET_MASK,
            minsize = IP_MIN_SIZE,
            maxsize = IP_MAX_SIZE,
    endstring;

    string  varid   = ISCSI_CONFIG_IFR_NVDATA.Gateway, 
            prompt  = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY),
            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
            flags   = INTERACTIVE,
            key     = KEY_GATE_WAY,
            minsize = IP_MIN_SIZE,
            maxsize = IP_MAX_SIZE,
    endstring;
    endif;

    subtitle text = STRING_TOKEN(STR_NULL); 

    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x00; 
    checkbox varid  = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp,
             prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
             help   = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
             flags  = 0,
    endcheckbox;
    endif;
      
    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp == 0x01; 

    string  varid   = ISCSI_CONFIG_IFR_NVDATA.TargetName, 
            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
            help    = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
            flags   = INTERACTIVE,
            key     = KEY_TARGET_NAME,
            minsize = ISCSI_NAME_IFR_MIN_SIZE,
            maxsize = ISCSI_NAME_IFR_MAX_SIZE,
    endstring;

    string  varid   = ISCSI_CONFIG_IFR_NVDATA.TargetIp, 
            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS),
            help    = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
            flags   = INTERACTIVE,
            key     = KEY_TARGET_IP,
            minsize = IP_MIN_SIZE,
            maxsize = IP_MAX_SIZE,
    endstring;
    
    numeric varid   = ISCSI_CONFIG_IFR_NVDATA.TargetPort, 
            prompt  = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
            help    = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
            flags   = 0,
            minimum = TARGET_PORT_MIN_NUM,
            maximum = TARGET_PORT_MAX_NUM,     
            step    = 0,
    endnumeric;
    
    string varid    = ISCSI_CONFIG_IFR_NVDATA.BootLun, 
            prompt  = STRING_TOKEN(STR_ISCSI_BOOT_LUN),
            help    = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP),
            flags   = INTERACTIVE,
            key     = KEY_BOOT_LUN,
            minsize = LUN_MIN_SIZE,
            maxsize = LUN_MAX_SIZE,
    endstring;
    endif;

    subtitle text = STRING_TOKEN(STR_NULL); 

    oneof varid  = ISCSI_CONFIG_IFR_NVDATA.CHAPType,
          prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT),
          help   = STRING_TOKEN(STR_CHAP_TYPE_HELP),  
          option text = STRING_TOKEN(STR_CHAP_TYPE_NONE),   value = ISCSI_CHAP_NONE,   flags = DEFAULT;
          option text = STRING_TOKEN(STR_CHAP_TYPE_UNI),    value = ISCSI_CHAP_UNI,    flags = 0;
          option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value = ISCSI_CHAP_MUTUAL, flags = 0;
    endoneof;

    suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_NONE; 

    string  varid   = ISCSI_CONFIG_IFR_NVDATA.CHAPName, 
            prompt  = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
            help    = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
            flags   = INTERACTIVE,
            key     = KEY_CHAP_NAME,
            minsize = 0,
            maxsize = ISCSI_CHAP_NAME_MAX_LEN,
    endstring;

    string  varid    = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret, 
            prompt   = STRING_TOKEN(STR_ISCSI_CHAP_SECRET),
            help     = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
            flags    = INTERACTIVE,
            key      = KEY_CHAP_SECRET,
            minsize  = ISCSI_CHAP_SECRET_MIN_LEN,
            maxsize  = ISCSI_CHAP_SECRET_MAX_LEN,
    endstring;

    endif;

    suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_MUTUAL;

    string  varid   = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName, 
            prompt  = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
            help    = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
            flags   = INTERACTIVE,
            key     = KEY_REVERSE_CHAP_NAME,
            minsize = 0,
            maxsize = ISCSI_CHAP_NAME_MAX_LEN,
    endstring;

    string  varid    = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret, 
            prompt   = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET),
            help     = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
            flags    = INTERACTIVE,
            key      = KEY_REVERSE_CHAP_SECRET,
            minsize  = ISCSI_CHAP_SECRET_MIN_LEN,
            maxsize  = ISCSI_CHAP_SECRET_MAX_LEN,
    endstring;

    endif;

    subtitle text = STRING_TOKEN(STR_NULL); 

    string  varid   = ISCSI_CONFIG_IFR_NVDATA.IsId, 
            prompt  = STRING_TOKEN(STR_ISCSI_CONFIG_ISID),
            help    = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP),
            flags   = INTERACTIVE,
            key     = KEY_CONFIG_ISID,
            minsize = ISID_CONFIGURABLE_MIN_LEN,
            maxsize = ISID_CONFIGURABLE_MAX_LEN,
    endstring;

    subtitle text = STRING_TOKEN(STR_NULL); 

    text
      help   = STRING_TOKEN (STR_SAVE_CHANGES),
      text   = STRING_TOKEN (STR_SAVE_CHANGES),
      flags  = INTERACTIVE,
      key    = KEY_SAVE_CHANGES;
      
    goto FORMID_MAIN_FORM, 
    prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM), 
    help   = STRING_TOKEN (STR_RETURN_MAIN_FORM),
    flags  = 0;

  endform;

endformset;

