libiscsi.h

来自「linux 内核源代码」· C头文件 代码 · 共 337 行

H
337
字号
/* * iSCSI lib definitions * * Copyright (C) 2006 Red Hat, Inc.  All rights reserved. * Copyright (C) 2004 - 2006 Mike Christie * Copyright (C) 2004 - 2005 Dmitry Yusupov * Copyright (C) 2004 - 2005 Alex Aizman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#ifndef LIBISCSI_H#define LIBISCSI_H#include <linux/types.h>#include <linux/mutex.h>#include <linux/timer.h>#include <linux/workqueue.h>#include <scsi/iscsi_proto.h>#include <scsi/iscsi_if.h>struct scsi_transport_template;struct scsi_device;struct Scsi_Host;struct scsi_cmnd;struct socket;struct iscsi_transport;struct iscsi_cls_session;struct iscsi_cls_conn;struct iscsi_session;struct iscsi_nopin;/* #define DEBUG_SCSI */#ifdef DEBUG_SCSI#define debug_scsi(fmt...) printk(KERN_INFO "iscsi: " fmt)#else#define debug_scsi(fmt...)#endif#define ISCSI_DEF_XMIT_CMDS_MAX	128	/* must be power of 2 */#define ISCSI_MGMT_CMDS_MAX	16	/* must be power of 2 */#define ISCSI_MGMT_ITT_OFFSET	0xa00#define ISCSI_DEF_CMD_PER_LUN		32#define ISCSI_MAX_CMD_PER_LUN		128/* Task Mgmt states */#define TMABORT_INITIAL			0x0#define TMABORT_SUCCESS			0x1#define TMABORT_FAILED			0x2#define TMABORT_TIMEDOUT		0x3#define TMABORT_NOT_FOUND		0x4/* Connection suspend "bit" */#define ISCSI_SUSPEND_BIT		1#define ISCSI_ITT_MASK			(0xfff)#define ISCSI_CID_SHIFT			12#define ISCSI_CID_MASK			(0xffff << ISCSI_CID_SHIFT)#define ISCSI_AGE_SHIFT			28#define ISCSI_AGE_MASK			(0xf << ISCSI_AGE_SHIFT)#define ISCSI_ADDRESS_BUF_LEN		64struct iscsi_mgmt_task {	/*	 * Becuae LLDs allocate their hdr differently, this is a pointer to	 * that storage. It must be setup at session creation time.	 */	struct iscsi_hdr	*hdr;	char			*data;		/* mgmt payload */	unsigned		data_count;	/* counts data to be sent */	uint32_t		itt;		/* this ITT */	void			*dd_data;	/* driver/transport data */	struct list_head	running;};enum {	ISCSI_TASK_COMPLETED,	ISCSI_TASK_PENDING,	ISCSI_TASK_RUNNING,	ISCSI_TASK_ABORTING,};struct iscsi_cmd_task {	/*	 * Becuae LLDs allocate their hdr differently, this is a pointer to	 * that storage. It must be setup at session creation time.	 */	struct iscsi_cmd	*hdr;	int			itt;		/* this ITT */	uint32_t		unsol_datasn;	unsigned		imm_count;	/* imm-data (bytes)   */	unsigned		unsol_count;	/* unsolicited (bytes)*/	/* offset in unsolicited stream (bytes); */	unsigned		unsol_offset;	unsigned		data_count;	/* remaining Data-Out */	struct scsi_cmnd	*sc;		/* associated SCSI cmd*/	struct iscsi_conn	*conn;		/* used connection    */	struct iscsi_mgmt_task	*mtask;		/* tmf mtask in progr */	/* state set/tested under session->lock */	int			state;	atomic_t		refcount;	struct list_head	running;	/* running cmd list */	void			*dd_data;	/* driver/transport data */};struct iscsi_conn {	struct iscsi_cls_conn	*cls_conn;	/* ptr to class connection */	void			*dd_data;	/* iscsi_transport data */	struct iscsi_session	*session;	/* parent session */	/*	 * LLDs should set this lock. It protects the transport recv	 * code	 */	rwlock_t		*recv_lock;	/*	 * conn_stop() flag: stop to recover, stop to terminate	 */        int			stop_stage;	/* iSCSI connection-wide sequencing */	uint32_t		exp_statsn;	/* control data */	int			id;		/* CID */	int			c_stage;	/* connection state */	/*	 * Preallocated buffer for pdus that have data but do not	 * originate from scsi-ml. We never have two pdus using the	 * buffer at the same time. It is only allocated to	 * the default max recv size because the pdus we support	 * should always fit in this buffer	 */	char			*data;	struct iscsi_mgmt_task	*login_mtask;	/* mtask used for login/text */	struct iscsi_mgmt_task	*mtask;		/* xmit mtask in progress */	struct iscsi_cmd_task	*ctask;		/* xmit ctask in progress */	/* xmit */	struct kfifo		*mgmtqueue;	/* mgmt (control) xmit queue */	struct list_head	mgmt_run_list;	/* list of control tasks */	struct list_head	xmitqueue;	/* data-path cmd queue */	struct list_head	run_list;	/* list of cmds in progress */	struct work_struct	xmitwork;	/* per-conn. xmit workqueue */	unsigned long		suspend_tx;	/* suspend Tx */	unsigned long		suspend_rx;	/* suspend Rx */	/* abort */	wait_queue_head_t	ehwait;		/* used in eh_abort() */	struct iscsi_tm		tmhdr;	struct timer_list	tmabort_timer;	int			tmabort_state;	/* see TMABORT_INITIAL, etc.*/	/* negotiated params */	unsigned		max_recv_dlength; /* initiator_max_recv_dsl*/	unsigned		max_xmit_dlength; /* target_max_recv_dsl */	int			hdrdgst_en;	int			datadgst_en;	int			ifmarker_en;	int			ofmarker_en;	/* values userspace uses to id a conn */	int			persistent_port;	char			*persistent_address;	/* remote portal currently connected to */	int			portal_port;	char			portal_address[ISCSI_ADDRESS_BUF_LEN];	/* local address */	int			local_port;	char			local_address[ISCSI_ADDRESS_BUF_LEN];	/* MIB-statistics */	uint64_t		txdata_octets;	uint64_t		rxdata_octets;	uint32_t		scsicmd_pdus_cnt;	uint32_t		dataout_pdus_cnt;	uint32_t		scsirsp_pdus_cnt;	uint32_t		datain_pdus_cnt;	uint32_t		r2t_pdus_cnt;	uint32_t		tmfcmd_pdus_cnt;	int32_t			tmfrsp_pdus_cnt;	/* custom statistics */	uint32_t		eh_abort_cnt;};struct iscsi_queue {	struct kfifo		*queue;		/* FIFO Queue */	void			**pool;		/* Pool of elements */	int			max;		/* Max number of elements */};struct iscsi_session {	/*	 * Syncs up the scsi eh thread with the iscsi eh thread when sending	 * task management functions. This must be taken before the session	 * and recv lock.	 */	struct mutex		eh_mutex;	/* iSCSI session-wide sequencing */	uint32_t		cmdsn;	uint32_t		exp_cmdsn;	uint32_t		max_cmdsn;	/* This tracks the reqs queued into the initiator */	uint32_t		queued_cmdsn;	/* configuration */	int			initial_r2t_en;	unsigned		max_r2t;	int			imm_data_en;	unsigned		first_burst;	unsigned		max_burst;	int			time2wait;	int			time2retain;	int			pdu_inorder_en;	int			dataseq_inorder_en;	int			erl;	int			tpgt;	char			*username;	char			*username_in;	char			*password;	char			*password_in;	char			*targetname;	char			*initiatorname;	/* hw address or netdev iscsi connection is bound to */	char			*hwaddress;	char			*netdev;	/* control data */	struct iscsi_transport	*tt;	struct Scsi_Host	*host;	struct iscsi_conn	*leadconn;	/* leading connection */	spinlock_t		lock;		/* protects session state, *						 * sequence numbers,       *						 * session resources:      *						 * - cmdpool,		   *						 * - mgmtpool,		   *						 * - r2tpool		   */	int			state;		/* session state           */	int			age;		/* counts session re-opens */	int			cmds_max;	/* size of cmds array */	struct iscsi_cmd_task	**cmds;		/* Original Cmds arr */	struct iscsi_queue	cmdpool;	/* PDU's pool */	int			mgmtpool_max;	/* size of mgmt array */	struct iscsi_mgmt_task	**mgmt_cmds;	/* Original mgmt arr */	struct iscsi_queue	mgmtpool;	/* Mgmt PDU's pool */};/* * scsi host template */extern int iscsi_change_queue_depth(struct scsi_device *sdev, int depth);extern int iscsi_eh_abort(struct scsi_cmnd *sc);extern int iscsi_eh_host_reset(struct scsi_cmnd *sc);extern int iscsi_queuecommand(struct scsi_cmnd *sc,			      void (*done)(struct scsi_cmnd *));/* * iSCSI host helpers. */extern int iscsi_host_set_param(struct Scsi_Host *shost,				enum iscsi_host_param param, char *buf,				int buflen);extern int iscsi_host_get_param(struct Scsi_Host *shost,				enum iscsi_host_param param, char *buf);/* * session management */extern struct iscsi_cls_session *iscsi_session_setup(struct iscsi_transport *, struct scsi_transport_template *,		    uint16_t, uint16_t, int, int, uint32_t, uint32_t *);extern void iscsi_session_teardown(struct iscsi_cls_session *);extern struct iscsi_session *class_to_transport_session(struct iscsi_cls_session *);extern void iscsi_session_recovery_timedout(struct iscsi_cls_session *);extern int iscsi_set_param(struct iscsi_cls_conn *cls_conn,			   enum iscsi_param param, char *buf, int buflen);extern int iscsi_session_get_param(struct iscsi_cls_session *cls_session,				   enum iscsi_param param, char *buf);#define session_to_cls(_sess) \	hostdata_session(_sess->host->hostdata)/* * connection management */extern struct iscsi_cls_conn *iscsi_conn_setup(struct iscsi_cls_session *,					       uint32_t);extern void iscsi_conn_teardown(struct iscsi_cls_conn *);extern int iscsi_conn_start(struct iscsi_cls_conn *);extern void iscsi_conn_stop(struct iscsi_cls_conn *, int);extern int iscsi_conn_bind(struct iscsi_cls_session *, struct iscsi_cls_conn *,			   int);extern void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err);extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,				enum iscsi_param param, char *buf);/* * pdu and task processing */extern void iscsi_update_cmdsn(struct iscsi_session *, struct iscsi_nopin *);extern void iscsi_prep_unsolicit_data_pdu(struct iscsi_cmd_task *,					struct iscsi_data *hdr);extern int iscsi_conn_send_pdu(struct iscsi_cls_conn *, struct iscsi_hdr *,				char *, uint32_t);extern int iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *,			      char *, int);extern int __iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *,				char *, int);extern int iscsi_verify_itt(struct iscsi_conn *, struct iscsi_hdr *,			    uint32_t *);/* * generic helpers */extern void iscsi_pool_free(struct iscsi_queue *, void **);extern int iscsi_pool_init(struct iscsi_queue *, int, void ***, int);#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?