|
Packit |
eace71 |
/*
|
|
Packit |
eace71 |
* iSCSI Configuration
|
|
Packit |
eace71 |
*
|
|
Packit |
eace71 |
* Copyright (C) 2002 Cisco Systems, Inc.
|
|
Packit |
eace71 |
* maintained by linux-iscsi-devel@lists.sourceforge.net
|
|
Packit |
eace71 |
*
|
|
Packit |
eace71 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
eace71 |
* it under the terms of the GNU General Public License as published
|
|
Packit |
eace71 |
* by the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
eace71 |
* (at your option) any later version.
|
|
Packit |
eace71 |
*
|
|
Packit |
eace71 |
* This program is distributed in the hope that it will be useful, but
|
|
Packit |
eace71 |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
eace71 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
eace71 |
* General Public License for more details.
|
|
Packit |
eace71 |
*
|
|
Packit |
eace71 |
* See the file COPYING included with this distribution for more details.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
#ifndef CONFIG_H
|
|
Packit |
eace71 |
#define CONFIG_H
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
#include <netdb.h>
|
|
Packit |
eace71 |
#include <net/if.h>
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
#include "types.h"
|
|
Packit |
eace71 |
#include "auth.h" /* for the username and password sizes */
|
|
Packit |
eace71 |
#include "list.h"
|
|
Packit |
eace71 |
#include "iscsi_proto.h"
|
|
Packit |
eace71 |
#include "iscsi_net_util.h"
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
/* ISIDs now have a typed naming authority in them. We use an OUI */
|
|
Packit |
eace71 |
#define DRIVER_ISID_0 0x00
|
|
Packit |
eace71 |
#define DRIVER_ISID_1 0x02
|
|
Packit |
eace71 |
#define DRIVER_ISID_2 0x3D
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
/* number of possible connections per session */
|
|
Packit |
eace71 |
#define ISCSI_CONN_MAX 1
|
|
Packit |
eace71 |
/* max len of interface */
|
|
Packit |
eace71 |
#define ISCSI_MAX_IFACE_LEN 65
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
/* the following structures store the options set in the config file.
|
|
Packit |
eace71 |
* a structure is defined for each logically-related group of options.
|
|
Packit |
eace71 |
* if you are adding a new option, first check if it should belong
|
|
Packit |
eace71 |
* to one of the existing groups. If it does, add it. If not, define
|
|
Packit |
eace71 |
* a new structure.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
/* all authentication-related options should be added to this structure.
|
|
Packit |
eace71 |
* this structure is per-session, and can be configured
|
|
Packit |
eace71 |
* by TargetName but not Subnet.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
struct iscsi_auth_config {
|
|
Packit |
eace71 |
unsigned int authmethod;
|
|
Packit |
eace71 |
char username[AUTH_STR_MAX_LEN];
|
|
Packit |
eace71 |
unsigned char password[AUTH_STR_MAX_LEN];
|
|
Packit |
eace71 |
unsigned int password_length;
|
|
Packit |
eace71 |
char username_in[AUTH_STR_MAX_LEN];
|
|
Packit |
eace71 |
unsigned char password_in[AUTH_STR_MAX_LEN];
|
|
Packit |
eace71 |
unsigned int password_in_length;
|
|
Packit Service |
342b59 |
unsigned int chap_algs[AUTH_CHAP_ALG_MAX_COUNT];
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
/* all per-connection timeouts go in this structure.
|
|
Packit |
eace71 |
* this structure is per-portal, and can be configured
|
|
Packit |
eace71 |
* both by TargetName and Subnet.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
struct iscsi_connection_timeout_config {
|
|
Packit |
eace71 |
int login_timeout;
|
|
Packit |
eace71 |
int logout_timeout;
|
|
Packit |
eace71 |
int auth_timeout;
|
|
Packit |
eace71 |
int active_timeout;
|
|
Packit |
eace71 |
int noop_out_interval;
|
|
Packit |
eace71 |
int noop_out_timeout;
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
/* all per-session timeouts go in this structure.
|
|
Packit |
eace71 |
* this structure is per-session, and can be configured
|
|
Packit |
eace71 |
* by TargetName but not by Subnet.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
struct iscsi_session_timeout_config {
|
|
Packit |
eace71 |
int replacement_timeout;
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
/* all error handling timeouts go in this structure.
|
|
Packit |
eace71 |
* this structure is per-portal, and can be configured
|
|
Packit |
eace71 |
* both by TargetName and Subnet.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
struct iscsi_error_timeout_config {
|
|
Packit |
eace71 |
int abort_timeout;
|
|
Packit |
eace71 |
int host_reset_timeout;
|
|
Packit |
eace71 |
int lu_reset_timeout;
|
|
Packit |
eace71 |
int tgt_reset_timeout;
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
/* all TCP options go in this structure.
|
|
Packit |
eace71 |
* this structure is per-portal, and can be configured
|
|
Packit |
eace71 |
* both by TargetName and Subnet.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
struct iscsi_tcp_config {
|
|
Packit |
eace71 |
int window_size;
|
|
Packit |
eace71 |
int type_of_service; /* try to set IP TOS bits */
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
struct iscsi_conn_operational_config {
|
|
Packit |
eace71 |
int MaxRecvDataSegmentLength;
|
|
Packit |
eace71 |
int MaxXmitDataSegmentLength;
|
|
Packit |
eace71 |
int HeaderDigest;
|
|
Packit |
eace71 |
int DataDigest;
|
|
Packit |
eace71 |
int IFMarker;
|
|
Packit |
eace71 |
int OFMarker;
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
/* all iSCSI operational params go in this structure.
|
|
Packit |
eace71 |
* this structure is per-portal, and can be configured
|
|
Packit |
eace71 |
* both by TargetName and Subnet.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
struct iscsi_session_operational_config {
|
|
Packit |
eace71 |
int DataPDUInOrder;
|
|
Packit |
eace71 |
int DataSequenceInOrder;
|
|
Packit |
eace71 |
int protocol;
|
|
Packit |
eace71 |
int InitialR2T;
|
|
Packit |
eace71 |
int ImmediateData;
|
|
Packit |
eace71 |
int FirstBurstLength;
|
|
Packit |
eace71 |
int MaxBurstLength;
|
|
Packit |
eace71 |
int DefaultTime2Wait;
|
|
Packit |
eace71 |
int DefaultTime2Retain;
|
|
Packit |
eace71 |
int MaxConnections;
|
|
Packit |
eace71 |
int MaxOutstandingR2T;
|
|
Packit |
eace71 |
int ERL;
|
|
Packit |
eace71 |
int FastAbort;
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
#define CONFIG_DIGEST_NEVER 0
|
|
Packit |
eace71 |
#define CONFIG_DIGEST_ALWAYS 1
|
|
Packit |
eace71 |
#define CONFIG_DIGEST_PREFER_ON 2
|
|
Packit |
eace71 |
#define CONFIG_DIGEST_PREFER_OFF 3
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
struct iscsi_sendtargets_config {
|
|
Packit |
eace71 |
int reopen_max;
|
|
Packit |
eace71 |
int use_discoveryd;
|
|
Packit |
eace71 |
int discoveryd_poll_inval;
|
|
Packit |
eace71 |
struct iscsi_auth_config auth;
|
|
Packit |
eace71 |
struct iscsi_connection_timeout_config conn_timeo;
|
|
Packit |
eace71 |
struct iscsi_conn_operational_config conn_conf;
|
|
Packit |
eace71 |
struct iscsi_session_operational_config session_conf;
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
struct iscsi_isns_config {
|
|
Packit |
eace71 |
int use_discoveryd;
|
|
Packit |
eace71 |
int discoveryd_poll_inval;
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
struct iscsi_slp_config {
|
|
Packit |
eace71 |
char *scopes;
|
|
Packit |
eace71 |
char *interfaces; /* for multicast, list of interfaces names,
|
|
Packit |
eace71 |
* "all", or "none" */
|
|
Packit |
eace71 |
int poll_interval;
|
|
Packit |
eace71 |
struct iscsi_auth_config auth;
|
|
Packit |
eace71 |
};
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef enum iscsi_startup {
|
|
Packit |
eace71 |
ISCSI_STARTUP_MANUAL,
|
|
Packit |
eace71 |
ISCSI_STARTUP_AUTOMATIC,
|
|
Packit |
eace71 |
ISCSI_STARTUP_ONBOOT,
|
|
Packit |
eace71 |
} iscsi_startup_e;
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef enum discovery_type {
|
|
Packit |
eace71 |
DISCOVERY_TYPE_SENDTARGETS,
|
|
Packit |
eace71 |
DISCOVERY_TYPE_ISNS,
|
|
Packit |
eace71 |
DISCOVERY_TYPE_OFFLOAD_SENDTARGETS,
|
|
Packit |
eace71 |
DISCOVERY_TYPE_SLP,
|
|
Packit |
eace71 |
DISCOVERY_TYPE_STATIC,
|
|
Packit |
eace71 |
DISCOVERY_TYPE_FW,
|
|
Packit |
eace71 |
} discovery_type_e;
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef struct conn_rec {
|
|
Packit |
eace71 |
iscsi_startup_e startup;
|
|
Packit |
eace71 |
char address[NI_MAXHOST];
|
|
Packit |
eace71 |
int port;
|
|
Packit |
eace71 |
struct iscsi_tcp_config tcp;
|
|
Packit |
eace71 |
struct iscsi_connection_timeout_config timeo;
|
|
Packit |
eace71 |
struct iscsi_conn_operational_config iscsi;
|
|
Packit |
eace71 |
} conn_rec_t;
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef struct session_rec {
|
|
Packit |
eace71 |
int initial_cmdsn;
|
|
Packit |
eace71 |
int reopen_max;
|
|
Packit |
eace71 |
int xmit_thread_priority;
|
|
Packit |
eace71 |
int cmds_max;
|
|
Packit |
eace71 |
int queue_depth;
|
|
Packit |
eace71 |
int initial_login_retry_max;
|
|
Packit |
eace71 |
int nr_sessions;
|
|
Packit |
eace71 |
int scan;
|
|
Packit |
eace71 |
struct iscsi_auth_config auth;
|
|
Packit |
eace71 |
struct iscsi_session_timeout_config timeo;
|
|
Packit |
eace71 |
struct iscsi_error_timeout_config err_timeo;
|
|
Packit |
eace71 |
struct iscsi_session_operational_config iscsi;
|
|
Packit |
eace71 |
struct session_info *info;
|
|
Packit |
eace71 |
unsigned sid;
|
|
Packit |
eace71 |
/*
|
|
Packit |
eace71 |
* This is a flag passed to iscsid. If set, multiple sessions are
|
|
Packit |
eace71 |
* allowed to be initiated on this record
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
unsigned char multiple;
|
|
Packit |
eace71 |
char boot_root[BOOT_NAME_MAXLEN];
|
|
Packit |
eace71 |
char boot_nic[BOOT_NAME_MAXLEN];
|
|
Packit |
eace71 |
char boot_target[BOOT_NAME_MAXLEN];
|
|
Packit |
eace71 |
} session_rec_t;
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
#define ISCSI_TRANSPORT_NAME_MAXLEN 16
|
|
Packit |
eace71 |
#define ISCSI_MAX_STR_LEN 80
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef struct iface_rec {
|
|
Packit |
eace71 |
struct list_head list;
|
|
Packit |
eace71 |
/* iscsi iface record name */
|
|
Packit |
eace71 |
char name[ISCSI_MAX_IFACE_LEN];
|
|
Packit |
eace71 |
uint32_t iface_num;
|
|
Packit |
eace71 |
/* network layer iface name (eth0) */
|
|
Packit |
eace71 |
char netdev[IFNAMSIZ];
|
|
Packit |
eace71 |
char ipaddress[NI_MAXHOST];
|
|
Packit |
eace71 |
char subnet_mask[NI_MAXHOST];
|
|
Packit |
eace71 |
char gateway[NI_MAXHOST];
|
|
Packit |
eace71 |
char bootproto[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char ipv6_linklocal[NI_MAXHOST];
|
|
Packit |
eace71 |
char ipv6_router[NI_MAXHOST];
|
|
Packit |
eace71 |
char ipv6_autocfg[NI_MAXHOST];
|
|
Packit |
eace71 |
char linklocal_autocfg[NI_MAXHOST];
|
|
Packit |
eace71 |
char router_autocfg[NI_MAXHOST];
|
|
Packit |
eace71 |
uint8_t prefix_len;
|
|
Packit |
eace71 |
uint16_t vlan_id;
|
|
Packit |
eace71 |
uint8_t vlan_priority;
|
|
Packit |
eace71 |
char vlan_state[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char state[ISCSI_MAX_STR_LEN]; /* 0 = disable,
|
|
Packit |
eace71 |
* 1 = enable */
|
|
Packit |
eace71 |
uint16_t mtu;
|
|
Packit |
eace71 |
uint16_t port;
|
|
Packit |
eace71 |
char delayed_ack[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char nagle[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char tcp_wsf_state[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
uint8_t tcp_wsf;
|
|
Packit |
eace71 |
uint8_t tcp_timer_scale;
|
|
Packit |
eace71 |
char tcp_timestamp[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char dhcp_dns[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char dhcp_slp_da[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char tos_state[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
uint8_t tos;
|
|
Packit |
eace71 |
char gratuitous_arp[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char dhcp_alt_client_id_state[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char dhcp_alt_client_id[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char dhcp_req_vendor_id_state[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char dhcp_vendor_id_state[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char dhcp_vendor_id[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char dhcp_learn_iqn[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char fragmentation[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char incoming_forwarding[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
uint8_t ttl;
|
|
Packit |
eace71 |
char gratuitous_neighbor_adv[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char redirect[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char mld[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
uint32_t flow_label;
|
|
Packit |
eace71 |
uint32_t traffic_class;
|
|
Packit |
eace71 |
uint8_t hop_limit;
|
|
Packit |
eace71 |
uint32_t nd_reachable_tmo;
|
|
Packit |
eace71 |
uint32_t nd_rexmit_time;
|
|
Packit |
eace71 |
uint32_t nd_stale_tmo;
|
|
Packit |
eace71 |
uint8_t dup_addr_detect_cnt;
|
|
Packit |
eace71 |
uint32_t router_adv_link_mtu;
|
|
Packit |
eace71 |
uint16_t def_task_mgmt_tmo;
|
|
Packit |
eace71 |
char header_digest[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char data_digest[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char immediate_data[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char initial_r2t[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char data_seq_inorder[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char data_pdu_inorder[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
uint8_t erl;
|
|
Packit |
eace71 |
uint32_t max_recv_dlength;
|
|
Packit |
eace71 |
uint32_t first_burst_len;
|
|
Packit |
eace71 |
uint16_t max_out_r2t;
|
|
Packit |
eace71 |
uint32_t max_burst_len;
|
|
Packit |
eace71 |
char chap_auth[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char bidi_chap[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char strict_login_comp[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char discovery_auth[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char discovery_logout[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char port_state[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
char port_speed[ISCSI_MAX_STR_LEN];
|
|
Packit |
eace71 |
/*
|
|
Packit |
eace71 |
* TODO: we may have to make this bigger and interconnect
|
|
Packit |
eace71 |
* specific for infiniband
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
char hwaddress[ISCSI_HWADDRESS_BUF_SIZE];
|
|
Packit |
eace71 |
char transport_name[ISCSI_TRANSPORT_NAME_MAXLEN];
|
|
Packit |
eace71 |
/*
|
|
Packit |
eace71 |
* This is only used for boot now, but the iser guys
|
|
Packit |
eace71 |
* can use this for their virtualization idea.
|
|
Packit |
eace71 |
*/
|
|
Packit |
eace71 |
char alias[TARGET_NAME_MAXLEN + 1];
|
|
Packit |
eace71 |
char iname[TARGET_NAME_MAXLEN + 1];
|
|
Packit |
eace71 |
} iface_rec_t;
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef struct node_rec {
|
|
Packit |
eace71 |
struct list_head list;
|
|
Packit |
eace71 |
char name[TARGET_NAME_MAXLEN];
|
|
Packit |
eace71 |
int tpgt;
|
|
Packit |
eace71 |
iscsi_startup_e startup;
|
|
Packit |
eace71 |
int leading_login;
|
|
Packit |
eace71 |
session_rec_t session;
|
|
Packit |
eace71 |
conn_rec_t conn[ISCSI_CONN_MAX];
|
|
Packit |
eace71 |
iface_rec_t iface;
|
|
Packit |
eace71 |
discovery_type_e disc_type;
|
|
Packit |
eace71 |
char disc_address[NI_MAXHOST];
|
|
Packit |
eace71 |
int disc_port;
|
|
Packit |
eace71 |
} node_rec_t;
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
typedef struct discovery_rec {
|
|
Packit |
eace71 |
iscsi_startup_e startup;
|
|
Packit |
eace71 |
discovery_type_e type;
|
|
Packit |
eace71 |
char address[NI_MAXHOST];
|
|
Packit |
eace71 |
int port;
|
|
Packit |
eace71 |
int iscsid_req_tmo;
|
|
Packit |
eace71 |
union {
|
|
Packit |
eace71 |
struct iscsi_sendtargets_config sendtargets;
|
|
Packit |
eace71 |
struct iscsi_slp_config slp;
|
|
Packit |
eace71 |
struct iscsi_isns_config isns;
|
|
Packit |
eace71 |
} u;
|
|
Packit |
eace71 |
} discovery_rec_t;
|
|
Packit |
eace71 |
|
|
Packit |
eace71 |
#endif /* CONFIG_H */
|