Skip to content
Snippets Groups Projects
Select Git revision
  • f5c7f03113fc9c547012cf403aec4b534d575ef0
  • seco_lf-6.6.52-2.2.1 default protected
  • integrate/gitlab-ci/cleaos-916-jira-jql-api/into/seco_lf-6.6.52-2.2.1
  • seco_lf-6.6.52-2.2.1_d18-e83
  • seco_lf-6.6.52-2.2.1_d18-e71
  • seco_lf_v2024.04_6.6.52_2.2.x-d18-b79-tlv-note
  • integrate/gitlab-ci/cleaos-896-remane-parameters-for-clarity-3/into/seco_lf-5.10.y
  • integrate/gitlab-ci/cleaos-896-remane-parameters-for-clarity-3/into/seco_lf-6.6.52-2.2.1
  • integrate/gitlab-ci/cleaos-896-remane-parameters-for-clarity-2/into/seco_lf-6.6.52-2.2.1
  • integrate/gitlab-ci/cleaos-896-remane-parameters-for-clarity-1/into/seco_lf-6.6.52-2.2.1
  • integrate/gitlab-ci/cleaos-896-remane-parameters-for-clarity/into/seco_lf-6.6.52-2.2.1
  • seco_lf-6.6.52-2.2.1_mx8m-sscg
  • integrate/gitlab-ci/cleaos-913-add-retry-build-job-into-the-configuration/into/seco_lf-6.6.52-2.2.1
  • integrate/gitlab-ci/cleaos-913-add-retry-build-job-into-the-configuration/into/seco_lf-5.10.y
  • seco_lf-5.10.y protected
  • seco_lf_v2024.04_6.6.52_2.2.x-d18-sai
  • seco_lf-6.6.52-2.2.1_e88-lt9611uxc-i2s
  • seco_lf-6.6.52-2.2.1_d18-e71-dev
  • seco_lf-6.6.52-2.2.1_d18-dt-dto-elems
  • integrate/gitlab-ci/create-config-validation-json-schema/into/seco_lf-6.6.52-2.2.1
  • integrate/gitlab-ci/create-config-validation-json-schema/into/seco_lf-5.10.y
  • lf-6.6.52-2.2.1
  • lf-6.1.55-2.2.1
  • lf-6.6.3-1.0.0
  • lf-6.6.3-imx95-er2
  • lf-6.1.55-2.2.0
  • lf-6.6.y-imx95-er1
  • lf-5.15.71-2.2.2
  • lf-6.1.36-2.1.0
  • lf-5.15.71-2.2.1
  • lf-6.1.22-2.0.0
  • lf-6.1.1-1.0.1
  • rel_imx_5.4.24_2.1.4
  • rel_imx_4.9.88_2.0.13
  • rel_imx_4.14.98_2.3.5
  • lf-6.1.1-1.0.0
  • rel_imx_5.4.3_2.0.2
  • lf-5.15.71-2.2.0
  • lf-5.10.72-2.2.3
  • lf-5.15.52-2.1.0
  • imx_5.15.52_imx8ulp_er1
41 results

iscsi_tcp.h

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    iscsi_tcp.h 9.66 KiB
    /*
     * iSCSI Initiator TCP Transport
     * Copyright (C) 2004 Dmitry Yusupov
     * Copyright (C) 2004 Alex Aizman
     * Copyright (C) 2005 Mike Christie
     * maintained by open-iscsi@googlegroups.com
     *
     * 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.
     *
     * See the file COPYING included with this distribution for more details.
     */
    
    #ifndef ISCSI_TCP_H
    #define ISCSI_TCP_H
    
    /* Session's states */
    #define ISCSI_STATE_FREE		1
    #define ISCSI_STATE_LOGGED_IN		2
    #define ISCSI_STATE_FAILED		3
    #define ISCSI_STATE_TERMINATE		4
    
    /* Connection's states */
    #define ISCSI_CONN_INITIAL_STAGE	0
    #define ISCSI_CONN_STARTED		1
    #define ISCSI_CONN_STOPPED		2
    #define ISCSI_CONN_CLEANUP_WAIT		3
    
    /* Connection suspend "bit" */
    #define SUSPEND_BIT			1
    
    /* Socket's Receive state machine */
    #define IN_PROGRESS_WAIT_HEADER		0x0
    #define IN_PROGRESS_HEADER_GATHER	0x1
    #define IN_PROGRESS_DATA_RECV		0x2
    #define IN_PROGRESS_DDIGEST_RECV	0x3
    
    /* Task Mgmt states */
    #define	TMABORT_INITIAL			0x0
    #define	TMABORT_SUCCESS			0x1
    #define	TMABORT_FAILED			0x2
    #define	TMABORT_TIMEDOUT		0x3
    
    /* xmit state machine */
    #define	XMSTATE_IDLE			0x0
    #define	XMSTATE_R_HDR			0x1
    #define	XMSTATE_W_HDR			0x2
    #define	XMSTATE_IMM_HDR			0x4
    #define	XMSTATE_IMM_DATA		0x8
    #define	XMSTATE_UNS_INIT		0x10
    #define	XMSTATE_UNS_HDR			0x20
    #define	XMSTATE_UNS_DATA		0x40
    #define	XMSTATE_SOL_HDR			0x80
    #define	XMSTATE_SOL_DATA		0x100
    #define	XMSTATE_W_PAD			0x200
    #define XMSTATE_DATA_DIGEST		0x400
    
    #define ISCSI_CONN_MAX			1
    #define ISCSI_CONN_RCVBUF_MIN		262144
    #define ISCSI_CONN_SNDBUF_MIN		262144
    #define ISCSI_PAD_LEN			4
    #define ISCSI_R2T_MAX			16
    #define ISCSI_XMIT_CMDS_MAX		128	/* must be power of 2 */
    #define ISCSI_MGMT_CMDS_MAX		32	/* must be power of 2 */
    #define ISCSI_MGMT_ITT_OFFSET		0xa00
    #define ISCSI_SG_TABLESIZE		SG_ALL
    #define ISCSI_CMD_PER_LUN		128
    #define ISCSI_TCP_MAX_CMD_LEN		16
    
    #define ITT_MASK			(0xfff)
    #define CID_SHIFT			12
    #define CID_MASK			(0xffff<<CID_SHIFT)
    #define AGE_SHIFT			28
    #define AGE_MASK			(0xf<<AGE_SHIFT)
    
    struct iscsi_queue {
    	struct kfifo		*queue;		/* FIFO Queue */
    	void			**pool;		/* Pool of elements */
    	int			max;		/* Max number of elements */
    };
    
    struct iscsi_session;
    struct iscsi_cmd_task;
    struct iscsi_mgmt_task;
    
    /* Socket connection recieve helper */
    struct iscsi_tcp_recv {
    	struct iscsi_hdr	*hdr;
    	struct sk_buff		*skb;
    	int			offset;
    	int			len;
    	int			hdr_offset;
    	int			copy;
    	int			copied;
    	int			padding;
    	struct iscsi_cmd_task	*ctask;		/* current cmd in progress */
    
    	/* copied and flipped values */
    	int			opcode;
    	int			flags;
    	int			cmd_status;
    	int			ahslen;
    	int			datalen;
    	uint32_t		itt;
    	int			datadgst;
    };
    
    struct iscsi_conn {
    	struct iscsi_hdr	hdr;		/* header placeholder */
    	char			hdrext[4*sizeof(__u16) +
    				    sizeof(__u32)];
    	int			data_copied;
    	char			*data;		/* data placeholder */
    	struct socket           *sock;          /* TCP socket */
    	int			data_size;	/* actual recv_dlength */
    	int			stop_stage;	/* conn_stop() flag: *
    						 * stop to recover,  *
    						 * stop to terminate */
    	/* iSCSI connection-wide sequencing */
    	uint32_t		exp_statsn;
    	int			hdr_size;	/* PDU header size */
    	unsigned long		suspend_rx;	/* suspend Rx */
    
    	struct crypto_tfm	*rx_tfm;	/* CRC32C (Rx) */
    	struct crypto_tfm	*data_rx_tfm;	/* CRC32C (Rx) for data */
    
    	/* control data */
    	int			senselen;	/* scsi sense length */
    	int			id;		/* CID */
    	struct iscsi_tcp_recv	in;		/* TCP receive context */
    	struct iscsi_session	*session;	/* parent session */
    	struct list_head	item;		/* maintains list of conns */
    	int			in_progress;	/* connection state machine */
    	int			c_stage;	/* connection state */
    	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 */
    	spinlock_t		lock;		/* FIXME: to be removed */
    
    	/* old values for socket callbacks */
    	void			(*old_data_ready)(struct sock *, int);
    	void			(*old_state_change)(struct sock *);
    	void			(*old_write_space)(struct sock *);
    
    	/* xmit */
    	struct crypto_tfm	*tx_tfm;	/* CRC32C (Tx) */
    	struct crypto_tfm	*data_tx_tfm;	/* CRC32C (Tx) for data */
    	struct kfifo		*writequeue;	/* write cmds for Data-Outs */
    	struct kfifo		*immqueue;	/* immediate xmit queue */
    	struct kfifo		*mgmtqueue;	/* mgmt (control) xmit queue */
    	struct kfifo		*xmitqueue;	/* data-path cmd queue */
    	struct work_struct	xmitwork;	/* per-conn. xmit workqueue */
    	struct semaphore	xmitsema;	/* serializes connection xmit,
    						 * access to kfifos:	  *
    						 * xmitqueue, writequeue, *
    						 * immqueue, mgmtqueue    */
    	unsigned long		suspend_tx;	/* suspend Tx */
    
    	/* abort */
    	wait_queue_head_t	ehwait;		/* used in eh_abort()     */
    	struct iscsi_tm		tmhdr;
    	struct timer_list	tmabort_timer;  /* abort timer */
    	int			tmabort_state;  /* see TMABORT_INITIAL, etc.*/
    
    	/* negotiated params */
    	int			max_recv_dlength;
    	int			max_xmit_dlength;
    	int			hdrdgst_en;
    	int			datadgst_en;
    
    	/* 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		sendpage_failures_cnt;
    	uint32_t		discontiguous_hdr_cnt;
    	uint32_t		eh_abort_cnt;
    };
    
    struct iscsi_session {
    	/* iSCSI session-wide sequencing */
    	uint32_t		cmdsn;
    	uint32_t		exp_cmdsn;
    	uint32_t		max_cmdsn;
    
    	/* configuration */
    	int			initial_r2t_en;
    	int			max_r2t;
    	int			imm_data_en;
    	int			first_burst;
    	int			max_burst;
    	int			time2wait;
    	int			time2retain;
    	int			pdu_inorder_en;
    	int			dataseq_inorder_en;
    	int			erl;
    	int			ifmarker_en;
    	int			ofmarker_en;
    
    	/* control data */
    	struct Scsi_Host	*host;
    	int			id;
    	struct iscsi_conn	*leadconn;	/* leading connection */
    	spinlock_t		lock;		/* protects session state, *
    						 * sequence numbers,       *
    						 * session resources:      *
    						 * - cmdpool,		   *
    						 * - mgmtpool,		   *
    						 * - r2tpool		   */
    	int			state;		/* session state           */
    	struct list_head	item;
    	void			*auth_client;
    	int			conn_cnt;
    	int			age;		/* counts session re-opens */
    
    	struct list_head	connections;	/* list of connections */
    	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 */
    };
    
    struct iscsi_buf {
    	struct scatterlist	sg;
    	struct kvec		iov;
    	unsigned int		sent;
    };
    
    struct iscsi_data_task {
    	struct iscsi_data	hdr;			/* PDU */
    	char			hdrext[sizeof(__u32)];	/* Header-Digest */
    	struct list_head	item;			/* data queue item */
    	struct iscsi_buf	digestbuf;		/* digest buffer */
    	uint32_t		digest;			/* data digest */
    };
    #define ISCSI_DTASK_DEFAULT_MAX	ISCSI_SG_TABLESIZE * PAGE_SIZE / 512
    
    struct iscsi_mgmt_task {
    	struct iscsi_hdr	hdr;		/* mgmt. PDU */
    	char			hdrext[sizeof(__u32)];	/* Header-Digest */
    	char			*data;		/* mgmt payload */
    	int			xmstate;	/* mgmt xmit progress */
    	int			data_count;	/* counts data to be sent */
    	struct iscsi_buf	headbuf;	/* header buffer */
    	struct iscsi_buf	sendbuf;	/* in progress buffer */
    	int			sent;
    	uint32_t		itt;		/* this ITT */
    };
    
    struct iscsi_r2t_info {
    	__be32			ttt;		/* copied from R2T */
    	__be32			exp_statsn;	/* copied from R2T */
    	uint32_t		data_length;	/* copied from R2T */
    	uint32_t		data_offset;	/* copied from R2T */
    	struct iscsi_buf	headbuf;	/* Data-Out Header Buffer */
    	struct iscsi_buf	sendbuf;	/* Data-Out in progress buffer*/
    	int			sent;		/* R2T sequence progress */
    	int			data_count;	/* DATA-Out payload progress */
    	struct scatterlist	*sg;		/* per-R2T SG list */
    	int			solicit_datasn;
    	struct iscsi_data_task   *dtask;        /* which data task */
    };
    
    struct iscsi_cmd_task {
    	struct iscsi_cmd	hdr;			/* iSCSI PDU header */
    	char			hdrext[4*sizeof(__u16)+	/* AHS */
    				    sizeof(__u32)];	/* HeaderDigest */
    	char			pad[ISCSI_PAD_LEN];
    	int			itt;			/* this ITT */
    	int			datasn;			/* DataSN */
    	struct iscsi_buf	headbuf;		/* header buf (xmit) */
    	struct iscsi_buf	sendbuf;		/* in progress buffer*/
    	int			sent;
    	struct scatterlist	*sg;			/* per-cmd SG list  */
    	struct scatterlist	*bad_sg;		/* assert statement */
    	int			sg_count;		/* SG's to process  */
    	uint32_t		unsol_datasn;
    	uint32_t		exp_r2tsn;
    	int			xmstate;		/* xmit xtate machine */
    	int			imm_count;		/* imm-data (bytes)   */
    	int			unsol_count;		/* unsolicited (bytes)*/
    	int			r2t_data_count;		/* R2T Data-Out bytes */
    	int			data_count;		/* remaining Data-Out */
    	int			pad_count;		/* padded bytes */
    	struct scsi_cmnd	*sc;			/* associated SCSI cmd*/
    	int			total_length;
    	int			data_offset;
    	struct iscsi_conn	*conn;			/* used connection    */
    	struct iscsi_mgmt_task	*mtask;			/* tmf mtask in progr */
    
    	struct iscsi_r2t_info	*r2t;			/* in progress R2T    */
    	struct iscsi_queue	r2tpool;
    	struct kfifo		*r2tqueue;
    	struct iscsi_r2t_info	**r2ts;
    	struct list_head	dataqueue;		/* Data-Out dataqueue */
    	mempool_t		*datapool;
    	uint32_t		datadigest;		/* for recover digest */
    	int			digest_count;
    	uint32_t		immdigest;		/* for imm data */
    	struct iscsi_buf	immbuf;			/* for imm data digest */
    	struct iscsi_data_task   *dtask;		/* data task in progress*/
    	int			digest_offset;		/* for partial buff digest */
    };
    
    #endif /* ISCSI_H */