Blame libopeniscsiusr/idbm.h

Packit eace71
/*
Packit eace71
 * Copyright (C) 2017-2018 Red Hat, Inc.
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 by
Packit eace71
 * the Free Software Foundation, either version 3 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,
Packit eace71
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit eace71
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit eace71
 * GNU General Public License for more details.
Packit eace71
 *
Packit eace71
 * You should have received a copy of the GNU General Public License
Packit eace71
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit eace71
 *
Packit eace71
 * Author: Gris Ge <fge@redhat.com>
Packit eace71
 */
Packit eace71
Packit eace71
#ifndef _GNU_SOURCE
Packit eace71
#define _GNU_SOURCE			/* For NI_MAXHOST */
Packit eace71
#endif
Packit eace71
Packit eace71
#ifndef __ISCSI_OPEN_USR_IDBM_H__
Packit eace71
#define __ISCSI_OPEN_USR_IDBM_H__
Packit eace71
Packit eace71
#include <stdio.h>
Packit eace71
#include <stdbool.h>
Packit eace71
#include <netdb.h>
Packit eace71
Packit eace71
#include "libopeniscsiusr/libopeniscsiusr_common.h"
Packit eace71
Packit eace71
#define ISCSI_CONFIG_ROOT	"/etc/iscsi/"
Packit Service 83beb6
#define IFACE_CONFIG_DIR	ISCSI_CONFIG_ROOT"ifaces"
Packit eace71
#define AUTH_STR_MAX_LEN	256
Packit eace71
#define BOOT_NAME_MAXLEN	256
Packit eace71
#define IDBM_DUMP_SIZE		8192
Packit eace71
Packit eace71
Packit eace71
struct __DLL_LOCAL idbm;
Packit eace71
Packit eace71
struct idbm {
Packit eace71
	int		refs;
Packit eace71
};
Packit eace71
Packit eace71
enum iscsi_auth_method {
Packit eace71
	ISCSI_AUTH_METHOD_NONE,
Packit eace71
	ISCSI_AUTH_METHOD_CHAP,
Packit eace71
};
Packit eace71
Packit eace71
enum iscsi_startup_type {
Packit eace71
	ISCSI_STARTUP_MANUAL,
Packit eace71
	ISCSI_STARTUP_AUTOMATIC,
Packit eace71
	ISCSI_STARTUP_ONBOOT,
Packit eace71
};
Packit eace71
Packit eace71
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
};
Packit eace71
Packit eace71
enum leading_login_type {
Packit eace71
	LEADING_LOGIN_NO,
Packit eace71
	LEADING_LOGIN_YES,
Packit eace71
};
Packit eace71
Packit eace71
enum init_scan_type {
Packit eace71
	INIT_SCAN_MANUAL,
Packit eace71
	INIT_SCAN_AUTO,
Packit eace71
};
Packit eace71
Packit eace71
enum digest_type {
Packit eace71
	DIGEST_NEVER,
Packit eace71
	DIGEST_ALWAYS,
Packit eace71
	DIGEST_PREFER_ON,
Packit eace71
	DIGEST_PREFER_OFF,
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
	enum iscsi_auth_method			authmethod;
Packit eace71
	char					username[AUTH_STR_MAX_LEN];
Packit eace71
	unsigned char				password[AUTH_STR_MAX_LEN];
Packit eace71
	uint32_t				password_length;
Packit eace71
	char					username_in[AUTH_STR_MAX_LEN];
Packit eace71
	unsigned char				password_in[AUTH_STR_MAX_LEN];
Packit eace71
	uint32_t				password_in_length;
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
	int64_t					window_size;
Packit eace71
	int64_t					type_of_service;
Packit eace71
	/* ^ try to set IP TOS bits */
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_tmo_cfg {
Packit eace71
	int64_t					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_tmo_cfg {
Packit eace71
	int64_t					abort_timeout;
Packit eace71
	int64_t					host_reset_timeout;
Packit eace71
	int64_t					lu_reset_timeout;
Packit eace71
	int64_t					tgt_reset_timeout;
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_conn_tmo_cfg {
Packit eace71
	int64_t					login_timeout;
Packit eace71
	int64_t					logout_timeout;
Packit eace71
	int64_t					auth_timeout;
Packit eace71
	int64_t					active_timeout;
Packit eace71
	int64_t					noop_out_interval;
Packit eace71
	int64_t					noop_out_timeout;
Packit eace71
};
Packit eace71
Packit eace71
struct iscsi_conn_op_cfg {
Packit eace71
	int64_t					MaxRecvDataSegmentLength;
Packit eace71
	int64_t					MaxXmitDataSegmentLength;
Packit eace71
	enum digest_type			HeaderDigest;
Packit eace71
	enum digest_type			DataDigest;
Packit eace71
	bool					IFMarker;
Packit eace71
	bool					OFMarker;
Packit eace71
};
Packit eace71
Packit eace71
struct iscsi_conn {
Packit eace71
	enum iscsi_startup_type			startup;
Packit eace71
	char					address[NI_MAXHOST];
Packit eace71
	int32_t					port;
Packit eace71
	struct iscsi_tcp_config			tcp;
Packit eace71
	struct iscsi_conn_tmo_cfg		tmo;
Packit eace71
	struct iscsi_conn_op_cfg		op_cfg;
Packit eace71
	bool					is_ipv6;
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_op_cfg {
Packit eace71
	int64_t					DataPDUInOrder;
Packit eace71
	int64_t					DataSequenceInOrder;
Packit eace71
	int64_t					protocol;
Packit eace71
	bool					InitialR2T;
Packit eace71
	bool					ImmediateData;
Packit eace71
	int64_t					FirstBurstLength;
Packit eace71
	int64_t					MaxBurstLength;
Packit eace71
	int64_t					DefaultTime2Wait;
Packit eace71
	int64_t					DefaultTime2Retain;
Packit eace71
	int64_t					MaxConnections;
Packit eace71
	int64_t					MaxOutstandingR2T;
Packit eace71
	int64_t					ERL;
Packit eace71
	bool					FastAbort;
Packit eace71
};
Packit eace71
Packit eace71
struct iscsi_session_idbm {
Packit eace71
	uint32_t				initial_cmdsn;
Packit eace71
	int64_t					reopen_max;
Packit eace71
	int64_t					initial_login_retry_max;
Packit eace71
	int64_t					xmit_thread_priority;
Packit eace71
	uint16_t				cmds_max;
Packit eace71
	uint16_t				queue_depth;
Packit eace71
	int64_t					nr_sessions;
Packit eace71
	enum init_scan_type			scan;
Packit eace71
	struct iscsi_auth_config		auth;
Packit eace71
	struct iscsi_session_tmo_cfg		tmo;
Packit eace71
	struct iscsi_error_tmo_cfg		err_tmo;
Packit eace71
	struct iscsi_session_op_cfg		op_cfg;
Packit eace71
	struct iscsi_session			*se;
Packit eace71
	uint32_t				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
Packit eace71
};
Packit eace71
Packit eace71
__DLL_LOCAL struct idbm *_idbm_new(void);
Packit eace71
__DLL_LOCAL void _idbm_free(struct idbm *db);
Packit eace71
__DLL_LOCAL int _idbm_lock(struct iscsi_context *ctx);
Packit eace71
__DLL_LOCAL void _idbm_unlock(struct iscsi_context *ctx);
Packit eace71
__DLL_LOCAL void _idbm_iface_print(struct iscsi_iface *iface, FILE *f);
Packit eace71
__DLL_LOCAL int _idbm_iface_get(struct iscsi_context *ctx,
Packit eace71
				const char *iface_name,
Packit eace71
				struct iscsi_iface **iface);
Packit eace71
__DLL_LOCAL int _idbm_node_get(struct iscsi_context *ctx,
Packit eace71
				const char *target_name,
Packit eace71
				const char *portal,
Packit eace71
				const char *iface_name,
Packit eace71
				struct iscsi_node **node);
Packit eace71
__DLL_LOCAL void _idbm_node_print(struct iscsi_node *node, FILE *f,
Packit eace71
				  bool show_secret);
Packit eace71
Packit eace71
#endif /* End of __ISCSI_OPEN_USR_IDBM_H__ */