1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
267f091f2SSagi Grimberg #ifndef ISCSI_TARGET_CORE_H
367f091f2SSagi Grimberg #define ISCSI_TARGET_CORE_H
467f091f2SSagi Grimberg
58dcf07beSBart Van Assche #include <linux/dma-direction.h> /* enum dma_data_direction */
68dcf07beSBart Van Assche #include <linux/list.h> /* struct list_head */
710e9cbb6SMatthew Wilcox #include <linux/sched.h>
88dcf07beSBart Van Assche #include <linux/socket.h> /* struct sockaddr_storage */
98dcf07beSBart Van Assche #include <linux/types.h> /* u8 */
108dcf07beSBart Van Assche #include <scsi/iscsi_proto.h> /* itt_t */
118dcf07beSBart Van Assche #include <target/target_core_base.h> /* struct se_cmd */
128dcf07beSBart Van Assche
138dcf07beSBart Van Assche struct sock;
1467f091f2SSagi Grimberg
1567f091f2SSagi Grimberg #define ISCSIT_VERSION "v4.1.0"
1667f091f2SSagi Grimberg #define ISCSI_MAX_DATASN_MISSING_COUNT 16
1767f091f2SSagi Grimberg #define ISCSI_TX_THREAD_TCP_TIMEOUT 2
1867f091f2SSagi Grimberg #define ISCSI_RX_THREAD_TCP_TIMEOUT 2
1967f091f2SSagi Grimberg #define SECONDS_FOR_ASYNC_LOGOUT 10
2067f091f2SSagi Grimberg #define SECONDS_FOR_ASYNC_TEXT 10
2167f091f2SSagi Grimberg #define SECONDS_FOR_LOGOUT_COMP 15
2267f091f2SSagi Grimberg #define WHITE_SPACE " \t\v\f\n\r"
2367f091f2SSagi Grimberg #define ISCSIT_MIN_TAGS 16
2467f091f2SSagi Grimberg #define ISCSIT_EXTRA_TAGS 8
2567f091f2SSagi Grimberg #define ISCSIT_TCP_BACKLOG 256
26073900bdSNicholas Bellinger #define ISCSI_RX_THREAD_NAME "iscsi_trx"
27073900bdSNicholas Bellinger #define ISCSI_TX_THREAD_NAME "iscsi_ttx"
28df711553SDavid Disseldorp #define ISCSI_IQN_LEN 224
29a6e0d179SDmitry Bogdanov #define NA_AUTHENTICATION_INHERITED -1
3067f091f2SSagi Grimberg
3167f091f2SSagi Grimberg /* struct iscsi_node_attrib sanity values */
3267f091f2SSagi Grimberg #define NA_DATAOUT_TIMEOUT 3
3367f091f2SSagi Grimberg #define NA_DATAOUT_TIMEOUT_MAX 60
3467f091f2SSagi Grimberg #define NA_DATAOUT_TIMEOUT_MIX 2
3567f091f2SSagi Grimberg #define NA_DATAOUT_TIMEOUT_RETRIES 5
3667f091f2SSagi Grimberg #define NA_DATAOUT_TIMEOUT_RETRIES_MAX 15
3767f091f2SSagi Grimberg #define NA_DATAOUT_TIMEOUT_RETRIES_MIN 1
3867f091f2SSagi Grimberg #define NA_NOPIN_TIMEOUT 15
3967f091f2SSagi Grimberg #define NA_NOPIN_TIMEOUT_MAX 60
4067f091f2SSagi Grimberg #define NA_NOPIN_TIMEOUT_MIN 3
4167f091f2SSagi Grimberg #define NA_NOPIN_RESPONSE_TIMEOUT 30
4267f091f2SSagi Grimberg #define NA_NOPIN_RESPONSE_TIMEOUT_MAX 60
4367f091f2SSagi Grimberg #define NA_NOPIN_RESPONSE_TIMEOUT_MIN 3
4467f091f2SSagi Grimberg #define NA_RANDOM_DATAIN_PDU_OFFSETS 0
4567f091f2SSagi Grimberg #define NA_RANDOM_DATAIN_SEQ_OFFSETS 0
4667f091f2SSagi Grimberg #define NA_RANDOM_R2T_OFFSETS 0
4767f091f2SSagi Grimberg
4867f091f2SSagi Grimberg /* struct iscsi_tpg_attrib sanity values */
4967f091f2SSagi Grimberg #define TA_AUTHENTICATION 1
5067f091f2SSagi Grimberg #define TA_LOGIN_TIMEOUT 15
5167f091f2SSagi Grimberg #define TA_LOGIN_TIMEOUT_MAX 30
5267f091f2SSagi Grimberg #define TA_LOGIN_TIMEOUT_MIN 5
5367f091f2SSagi Grimberg #define TA_GENERATE_NODE_ACLS 0
5467f091f2SSagi Grimberg #define TA_DEFAULT_CMDSN_DEPTH 64
5567f091f2SSagi Grimberg #define TA_DEFAULT_CMDSN_DEPTH_MAX 512
5667f091f2SSagi Grimberg #define TA_DEFAULT_CMDSN_DEPTH_MIN 1
5767f091f2SSagi Grimberg #define TA_CACHE_DYNAMIC_ACLS 0
5867f091f2SSagi Grimberg /* Enabled by default in demo mode (generic_node_acls=1) */
5967f091f2SSagi Grimberg #define TA_DEMO_MODE_WRITE_PROTECT 1
6067f091f2SSagi Grimberg /* Disabled by default in production mode w/ explict ACLs */
6167f091f2SSagi Grimberg #define TA_PROD_MODE_WRITE_PROTECT 0
6267f091f2SSagi Grimberg #define TA_DEMO_MODE_DISCOVERY 1
6367f091f2SSagi Grimberg #define TA_DEFAULT_ERL 0
6467f091f2SSagi Grimberg #define TA_CACHE_CORE_NPS 0
6567f091f2SSagi Grimberg /* T10 protection information disabled by default */
6667f091f2SSagi Grimberg #define TA_DEFAULT_T10_PI 0
67901c04a3SNicholas Bellinger #define TA_DEFAULT_FABRIC_PROT_TYPE 0
68a6415cddSDavid Disseldorp /* TPG status needs to be enabled to return sendtargets discovery endpoint info */
69a6415cddSDavid Disseldorp #define TA_DEFAULT_TPG_ENABLED_SENDTARGETS 1
70138d351eSNicholas Bellinger /*
71138d351eSNicholas Bellinger * Used to control the sending of keys with optional to respond state bit,
72138d351eSNicholas Bellinger * as a workaround for non RFC compliant initiators,that do not propose,
73138d351eSNicholas Bellinger * nor respond to specific keys required for login to complete.
74138d351eSNicholas Bellinger *
75138d351eSNicholas Bellinger * See iscsi_check_proposer_for_optional_reply() for more details.
76138d351eSNicholas Bellinger */
77138d351eSNicholas Bellinger #define TA_DEFAULT_LOGIN_KEYS_WORKAROUND 1
7867f091f2SSagi Grimberg
7967f091f2SSagi Grimberg #define ISCSI_IOV_DATA_BUFFER 5
8067f091f2SSagi Grimberg
8167f091f2SSagi Grimberg enum iscsit_transport_type {
8267f091f2SSagi Grimberg ISCSI_TCP = 0,
8367f091f2SSagi Grimberg ISCSI_SCTP_TCP = 1,
8467f091f2SSagi Grimberg ISCSI_SCTP_UDP = 2,
8567f091f2SSagi Grimberg ISCSI_IWARP_TCP = 3,
8667f091f2SSagi Grimberg ISCSI_IWARP_SCTP = 4,
8767f091f2SSagi Grimberg ISCSI_INFINIBAND = 5,
88ff7199b0SNicholas Bellinger ISCSI_CXGBIT = 6,
8967f091f2SSagi Grimberg };
9067f091f2SSagi Grimberg
9167f091f2SSagi Grimberg /* RFC-3720 7.1.4 Standard Connection State Diagram for a Target */
9267f091f2SSagi Grimberg enum target_conn_state_table {
9367f091f2SSagi Grimberg TARG_CONN_STATE_FREE = 0x1,
9467f091f2SSagi Grimberg TARG_CONN_STATE_XPT_UP = 0x3,
9567f091f2SSagi Grimberg TARG_CONN_STATE_IN_LOGIN = 0x4,
9667f091f2SSagi Grimberg TARG_CONN_STATE_LOGGED_IN = 0x5,
9767f091f2SSagi Grimberg TARG_CONN_STATE_IN_LOGOUT = 0x6,
9867f091f2SSagi Grimberg TARG_CONN_STATE_LOGOUT_REQUESTED = 0x7,
9967f091f2SSagi Grimberg TARG_CONN_STATE_CLEANUP_WAIT = 0x8,
10067f091f2SSagi Grimberg };
10167f091f2SSagi Grimberg
10267f091f2SSagi Grimberg /* RFC-3720 7.3.2 Session State Diagram for a Target */
10367f091f2SSagi Grimberg enum target_sess_state_table {
10467f091f2SSagi Grimberg TARG_SESS_STATE_FREE = 0x1,
10567f091f2SSagi Grimberg TARG_SESS_STATE_ACTIVE = 0x2,
10667f091f2SSagi Grimberg TARG_SESS_STATE_LOGGED_IN = 0x3,
10767f091f2SSagi Grimberg TARG_SESS_STATE_FAILED = 0x4,
10867f091f2SSagi Grimberg TARG_SESS_STATE_IN_CONTINUE = 0x5,
10967f091f2SSagi Grimberg };
11067f091f2SSagi Grimberg
11167f091f2SSagi Grimberg /* struct iscsi_data_count->type */
11267f091f2SSagi Grimberg enum data_count_type {
11367f091f2SSagi Grimberg ISCSI_RX_DATA = 1,
11467f091f2SSagi Grimberg ISCSI_TX_DATA = 2,
11567f091f2SSagi Grimberg };
11667f091f2SSagi Grimberg
11767f091f2SSagi Grimberg /* struct iscsi_datain_req->dr_complete */
11867f091f2SSagi Grimberg enum datain_req_comp_table {
11967f091f2SSagi Grimberg DATAIN_COMPLETE_NORMAL = 1,
12067f091f2SSagi Grimberg DATAIN_COMPLETE_WITHIN_COMMAND_RECOVERY = 2,
12167f091f2SSagi Grimberg DATAIN_COMPLETE_CONNECTION_RECOVERY = 3,
12267f091f2SSagi Grimberg };
12367f091f2SSagi Grimberg
12467f091f2SSagi Grimberg /* struct iscsi_datain_req->recovery */
12567f091f2SSagi Grimberg enum datain_req_rec_table {
12667f091f2SSagi Grimberg DATAIN_WITHIN_COMMAND_RECOVERY = 1,
12767f091f2SSagi Grimberg DATAIN_CONNECTION_RECOVERY = 2,
12867f091f2SSagi Grimberg };
12967f091f2SSagi Grimberg
13067f091f2SSagi Grimberg /* struct iscsi_portal_group->state */
13167f091f2SSagi Grimberg enum tpg_state_table {
13267f091f2SSagi Grimberg TPG_STATE_FREE = 0,
13367f091f2SSagi Grimberg TPG_STATE_ACTIVE = 1,
13467f091f2SSagi Grimberg TPG_STATE_INACTIVE = 2,
13567f091f2SSagi Grimberg TPG_STATE_COLD_RESET = 3,
13667f091f2SSagi Grimberg };
13767f091f2SSagi Grimberg
13867f091f2SSagi Grimberg /* struct iscsi_tiqn->tiqn_state */
13967f091f2SSagi Grimberg enum tiqn_state_table {
14067f091f2SSagi Grimberg TIQN_STATE_ACTIVE = 1,
14167f091f2SSagi Grimberg TIQN_STATE_SHUTDOWN = 2,
14267f091f2SSagi Grimberg };
14367f091f2SSagi Grimberg
14466cd9d4eSMax Gurtovoy /* struct iscsit_cmd->cmd_flags */
14567f091f2SSagi Grimberg enum cmd_flags_table {
14667f091f2SSagi Grimberg ICF_GOT_LAST_DATAOUT = 0x00000001,
14767f091f2SSagi Grimberg ICF_GOT_DATACK_SNACK = 0x00000002,
14867f091f2SSagi Grimberg ICF_NON_IMMEDIATE_UNSOLICITED_DATA = 0x00000004,
14967f091f2SSagi Grimberg ICF_SENT_LAST_R2T = 0x00000008,
15067f091f2SSagi Grimberg ICF_WITHIN_COMMAND_RECOVERY = 0x00000010,
15167f091f2SSagi Grimberg ICF_CONTIG_MEMORY = 0x00000020,
15267f091f2SSagi Grimberg ICF_ATTACHED_TO_RQUEUE = 0x00000040,
15367f091f2SSagi Grimberg ICF_OOO_CMDSN = 0x00000080,
154e20d3ef5SLinus Torvalds ICF_SENDTARGETS_ALL = 0x00000100,
155e20d3ef5SLinus Torvalds ICF_SENDTARGETS_SINGLE = 0x00000200,
15667f091f2SSagi Grimberg };
15767f091f2SSagi Grimberg
15866cd9d4eSMax Gurtovoy /* struct iscsit_cmd->i_state */
15967f091f2SSagi Grimberg enum cmd_i_state_table {
16067f091f2SSagi Grimberg ISTATE_NO_STATE = 0,
16167f091f2SSagi Grimberg ISTATE_NEW_CMD = 1,
16267f091f2SSagi Grimberg ISTATE_DEFERRED_CMD = 2,
16367f091f2SSagi Grimberg ISTATE_UNSOLICITED_DATA = 3,
16467f091f2SSagi Grimberg ISTATE_RECEIVE_DATAOUT = 4,
16567f091f2SSagi Grimberg ISTATE_RECEIVE_DATAOUT_RECOVERY = 5,
16667f091f2SSagi Grimberg ISTATE_RECEIVED_LAST_DATAOUT = 6,
16767f091f2SSagi Grimberg ISTATE_WITHIN_DATAOUT_RECOVERY = 7,
16867f091f2SSagi Grimberg ISTATE_IN_CONNECTION_RECOVERY = 8,
16967f091f2SSagi Grimberg ISTATE_RECEIVED_TASKMGT = 9,
17067f091f2SSagi Grimberg ISTATE_SEND_ASYNCMSG = 10,
17167f091f2SSagi Grimberg ISTATE_SENT_ASYNCMSG = 11,
17267f091f2SSagi Grimberg ISTATE_SEND_DATAIN = 12,
17367f091f2SSagi Grimberg ISTATE_SEND_LAST_DATAIN = 13,
17467f091f2SSagi Grimberg ISTATE_SENT_LAST_DATAIN = 14,
17567f091f2SSagi Grimberg ISTATE_SEND_LOGOUTRSP = 15,
17667f091f2SSagi Grimberg ISTATE_SENT_LOGOUTRSP = 16,
17767f091f2SSagi Grimberg ISTATE_SEND_NOPIN = 17,
17867f091f2SSagi Grimberg ISTATE_SENT_NOPIN = 18,
17967f091f2SSagi Grimberg ISTATE_SEND_REJECT = 19,
18067f091f2SSagi Grimberg ISTATE_SENT_REJECT = 20,
18167f091f2SSagi Grimberg ISTATE_SEND_R2T = 21,
18267f091f2SSagi Grimberg ISTATE_SENT_R2T = 22,
18367f091f2SSagi Grimberg ISTATE_SEND_R2T_RECOVERY = 23,
18467f091f2SSagi Grimberg ISTATE_SENT_R2T_RECOVERY = 24,
18567f091f2SSagi Grimberg ISTATE_SEND_LAST_R2T = 25,
18667f091f2SSagi Grimberg ISTATE_SENT_LAST_R2T = 26,
18767f091f2SSagi Grimberg ISTATE_SEND_LAST_R2T_RECOVERY = 27,
18867f091f2SSagi Grimberg ISTATE_SENT_LAST_R2T_RECOVERY = 28,
18967f091f2SSagi Grimberg ISTATE_SEND_STATUS = 29,
19067f091f2SSagi Grimberg ISTATE_SEND_STATUS_BROKEN_PC = 30,
19167f091f2SSagi Grimberg ISTATE_SENT_STATUS = 31,
19267f091f2SSagi Grimberg ISTATE_SEND_STATUS_RECOVERY = 32,
19367f091f2SSagi Grimberg ISTATE_SENT_STATUS_RECOVERY = 33,
19467f091f2SSagi Grimberg ISTATE_SEND_TASKMGTRSP = 34,
19567f091f2SSagi Grimberg ISTATE_SENT_TASKMGTRSP = 35,
19667f091f2SSagi Grimberg ISTATE_SEND_TEXTRSP = 36,
19767f091f2SSagi Grimberg ISTATE_SENT_TEXTRSP = 37,
19867f091f2SSagi Grimberg ISTATE_SEND_NOPIN_WANT_RESPONSE = 38,
19967f091f2SSagi Grimberg ISTATE_SENT_NOPIN_WANT_RESPONSE = 39,
20067f091f2SSagi Grimberg ISTATE_SEND_NOPIN_NO_RESPONSE = 40,
20167f091f2SSagi Grimberg ISTATE_REMOVE = 41,
20267f091f2SSagi Grimberg ISTATE_FREE = 42,
20367f091f2SSagi Grimberg };
20467f091f2SSagi Grimberg
20567f091f2SSagi Grimberg /* Used for iscsi_recover_cmdsn() return values */
20667f091f2SSagi Grimberg enum recover_cmdsn_ret_table {
20767f091f2SSagi Grimberg CMDSN_ERROR_CANNOT_RECOVER = -1,
20867f091f2SSagi Grimberg CMDSN_NORMAL_OPERATION = 0,
20967f091f2SSagi Grimberg CMDSN_LOWER_THAN_EXP = 1,
21067f091f2SSagi Grimberg CMDSN_HIGHER_THAN_EXP = 2,
21167f091f2SSagi Grimberg CMDSN_MAXCMDSN_OVERRUN = 3,
21267f091f2SSagi Grimberg };
21367f091f2SSagi Grimberg
21467f091f2SSagi Grimberg /* Used for iscsi_handle_immediate_data() return values */
21567f091f2SSagi Grimberg enum immedate_data_ret_table {
21667f091f2SSagi Grimberg IMMEDIATE_DATA_CANNOT_RECOVER = -1,
21767f091f2SSagi Grimberg IMMEDIATE_DATA_NORMAL_OPERATION = 0,
21867f091f2SSagi Grimberg IMMEDIATE_DATA_ERL1_CRC_FAILURE = 1,
21967f091f2SSagi Grimberg };
22067f091f2SSagi Grimberg
22167f091f2SSagi Grimberg /* Used for iscsi_decide_dataout_action() return values */
22267f091f2SSagi Grimberg enum dataout_action_ret_table {
22367f091f2SSagi Grimberg DATAOUT_CANNOT_RECOVER = -1,
22467f091f2SSagi Grimberg DATAOUT_NORMAL = 0,
22567f091f2SSagi Grimberg DATAOUT_SEND_R2T = 1,
22667f091f2SSagi Grimberg DATAOUT_SEND_TO_TRANSPORT = 2,
22767f091f2SSagi Grimberg DATAOUT_WITHIN_COMMAND_RECOVERY = 3,
22867f091f2SSagi Grimberg };
22967f091f2SSagi Grimberg
23067f091f2SSagi Grimberg /* Used for struct iscsi_node_auth->naf_flags */
23167f091f2SSagi Grimberg enum naf_flags_table {
23267f091f2SSagi Grimberg NAF_USERID_SET = 0x01,
23367f091f2SSagi Grimberg NAF_PASSWORD_SET = 0x02,
23467f091f2SSagi Grimberg NAF_USERID_IN_SET = 0x04,
23567f091f2SSagi Grimberg NAF_PASSWORD_IN_SET = 0x08,
23667f091f2SSagi Grimberg };
23767f091f2SSagi Grimberg
23867f091f2SSagi Grimberg /* Used by various struct timer_list to manage iSCSI specific state */
23967f091f2SSagi Grimberg enum iscsi_timer_flags_table {
24067f091f2SSagi Grimberg ISCSI_TF_RUNNING = 0x01,
24167f091f2SSagi Grimberg ISCSI_TF_STOP = 0x02,
24267f091f2SSagi Grimberg ISCSI_TF_EXPIRED = 0x04,
24367f091f2SSagi Grimberg };
24467f091f2SSagi Grimberg
24567f091f2SSagi Grimberg /* Used for struct iscsi_np->np_flags */
24667f091f2SSagi Grimberg enum np_flags_table {
24767f091f2SSagi Grimberg NPF_IP_NETWORK = 0x00,
24867f091f2SSagi Grimberg };
24967f091f2SSagi Grimberg
25067f091f2SSagi Grimberg /* Used for struct iscsi_np->np_thread_state */
25167f091f2SSagi Grimberg enum np_thread_state_table {
25267f091f2SSagi Grimberg ISCSI_NP_THREAD_ACTIVE = 1,
25367f091f2SSagi Grimberg ISCSI_NP_THREAD_INACTIVE = 2,
25467f091f2SSagi Grimberg ISCSI_NP_THREAD_RESET = 3,
25567f091f2SSagi Grimberg ISCSI_NP_THREAD_SHUTDOWN = 4,
25667f091f2SSagi Grimberg ISCSI_NP_THREAD_EXIT = 5,
25767f091f2SSagi Grimberg };
25867f091f2SSagi Grimberg
25967f091f2SSagi Grimberg struct iscsi_conn_ops {
26067f091f2SSagi Grimberg u8 HeaderDigest; /* [0,1] == [None,CRC32C] */
26167f091f2SSagi Grimberg u8 DataDigest; /* [0,1] == [None,CRC32C] */
26267f091f2SSagi Grimberg u32 MaxRecvDataSegmentLength; /* [512..2**24-1] */
26367f091f2SSagi Grimberg u32 MaxXmitDataSegmentLength; /* [512..2**24-1] */
26467f091f2SSagi Grimberg /*
26567f091f2SSagi Grimberg * iSER specific connection parameters
26667f091f2SSagi Grimberg */
26767f091f2SSagi Grimberg u32 InitiatorRecvDataSegmentLength; /* [512..2**24-1] */
26867f091f2SSagi Grimberg u32 TargetRecvDataSegmentLength; /* [512..2**24-1] */
26967f091f2SSagi Grimberg };
27067f091f2SSagi Grimberg
27167f091f2SSagi Grimberg struct iscsi_sess_ops {
272df711553SDavid Disseldorp char InitiatorName[ISCSI_IQN_LEN];
27367f091f2SSagi Grimberg char InitiatorAlias[256];
274df711553SDavid Disseldorp char TargetName[ISCSI_IQN_LEN];
27567f091f2SSagi Grimberg char TargetAlias[256];
27667f091f2SSagi Grimberg char TargetAddress[256];
27767f091f2SSagi Grimberg u16 TargetPortalGroupTag; /* [0..65535] */
27867f091f2SSagi Grimberg u16 MaxConnections; /* [1..65535] */
27967f091f2SSagi Grimberg u8 InitialR2T; /* [0,1] == [No,Yes] */
28067f091f2SSagi Grimberg u8 ImmediateData; /* [0,1] == [No,Yes] */
28167f091f2SSagi Grimberg u32 MaxBurstLength; /* [512..2**24-1] */
28267f091f2SSagi Grimberg u32 FirstBurstLength; /* [512..2**24-1] */
28367f091f2SSagi Grimberg u16 DefaultTime2Wait; /* [0..3600] */
28467f091f2SSagi Grimberg u16 DefaultTime2Retain; /* [0..3600] */
28567f091f2SSagi Grimberg u16 MaxOutstandingR2T; /* [1..65535] */
28667f091f2SSagi Grimberg u8 DataPDUInOrder; /* [0,1] == [No,Yes] */
28767f091f2SSagi Grimberg u8 DataSequenceInOrder; /* [0,1] == [No,Yes] */
28867f091f2SSagi Grimberg u8 ErrorRecoveryLevel; /* [0..2] */
28967f091f2SSagi Grimberg u8 SessionType; /* [0,1] == [Normal,Discovery]*/
29067f091f2SSagi Grimberg /*
29167f091f2SSagi Grimberg * iSER specific session parameters
29267f091f2SSagi Grimberg */
29367f091f2SSagi Grimberg u8 RDMAExtensions; /* [0,1] == [No,Yes] */
29467f091f2SSagi Grimberg };
29567f091f2SSagi Grimberg
29667f091f2SSagi Grimberg struct iscsi_queue_req {
29767f091f2SSagi Grimberg int state;
29866cd9d4eSMax Gurtovoy struct iscsit_cmd *cmd;
29967f091f2SSagi Grimberg struct list_head qr_list;
30067f091f2SSagi Grimberg };
30167f091f2SSagi Grimberg
30267f091f2SSagi Grimberg struct iscsi_param_list {
30367f091f2SSagi Grimberg bool iser;
30467f091f2SSagi Grimberg struct list_head param_list;
30567f091f2SSagi Grimberg struct list_head extra_response_list;
30667f091f2SSagi Grimberg };
30767f091f2SSagi Grimberg
30867f091f2SSagi Grimberg struct iscsi_datain_req {
30967f091f2SSagi Grimberg enum datain_req_comp_table dr_complete;
31067f091f2SSagi Grimberg int generate_recovery_values;
31167f091f2SSagi Grimberg enum datain_req_rec_table recovery;
31267f091f2SSagi Grimberg u32 begrun;
31367f091f2SSagi Grimberg u32 runlength;
31467f091f2SSagi Grimberg u32 data_length;
31567f091f2SSagi Grimberg u32 data_offset;
31667f091f2SSagi Grimberg u32 data_sn;
31767f091f2SSagi Grimberg u32 next_burst_len;
31867f091f2SSagi Grimberg u32 read_data_done;
31967f091f2SSagi Grimberg u32 seq_send_order;
32067f091f2SSagi Grimberg struct list_head cmd_datain_node;
32167f091f2SSagi Grimberg } ____cacheline_aligned;
32267f091f2SSagi Grimberg
32367f091f2SSagi Grimberg struct iscsi_ooo_cmdsn {
32467f091f2SSagi Grimberg u16 cid;
32567f091f2SSagi Grimberg u32 batch_count;
32667f091f2SSagi Grimberg u32 cmdsn;
32767f091f2SSagi Grimberg u32 exp_cmdsn;
32866cd9d4eSMax Gurtovoy struct iscsit_cmd *cmd;
32967f091f2SSagi Grimberg struct list_head ooo_list;
33067f091f2SSagi Grimberg } ____cacheline_aligned;
33167f091f2SSagi Grimberg
33267f091f2SSagi Grimberg struct iscsi_datain {
33367f091f2SSagi Grimberg u8 flags;
33467f091f2SSagi Grimberg u32 data_sn;
33567f091f2SSagi Grimberg u32 length;
33667f091f2SSagi Grimberg u32 offset;
33767f091f2SSagi Grimberg } ____cacheline_aligned;
33867f091f2SSagi Grimberg
33967f091f2SSagi Grimberg struct iscsi_r2t {
34067f091f2SSagi Grimberg int seq_complete;
34167f091f2SSagi Grimberg int recovery_r2t;
34267f091f2SSagi Grimberg int sent_r2t;
34367f091f2SSagi Grimberg u32 r2t_sn;
34467f091f2SSagi Grimberg u32 offset;
34567f091f2SSagi Grimberg u32 targ_xfer_tag;
34667f091f2SSagi Grimberg u32 xfer_len;
34767f091f2SSagi Grimberg struct list_head r2t_list;
34867f091f2SSagi Grimberg } ____cacheline_aligned;
34967f091f2SSagi Grimberg
35066cd9d4eSMax Gurtovoy struct iscsit_cmd {
35167f091f2SSagi Grimberg enum iscsi_timer_flags_table dataout_timer_flags;
35267f091f2SSagi Grimberg /* DataOUT timeout retries */
35367f091f2SSagi Grimberg u8 dataout_timeout_retries;
35467f091f2SSagi Grimberg /* Within command recovery count */
35567f091f2SSagi Grimberg u8 error_recovery_count;
35667f091f2SSagi Grimberg /* iSCSI dependent state for out or order CmdSNs */
35767f091f2SSagi Grimberg enum cmd_i_state_table deferred_i_state;
35867f091f2SSagi Grimberg /* iSCSI dependent state */
35967f091f2SSagi Grimberg enum cmd_i_state_table i_state;
36067f091f2SSagi Grimberg /* Command is an immediate command (ISCSI_OP_IMMEDIATE set) */
36167f091f2SSagi Grimberg u8 immediate_cmd;
36267f091f2SSagi Grimberg /* Immediate data present */
36367f091f2SSagi Grimberg u8 immediate_data;
36467f091f2SSagi Grimberg /* iSCSI Opcode */
36567f091f2SSagi Grimberg u8 iscsi_opcode;
36667f091f2SSagi Grimberg /* iSCSI Response Code */
36767f091f2SSagi Grimberg u8 iscsi_response;
36867f091f2SSagi Grimberg /* Logout reason when iscsi_opcode == ISCSI_INIT_LOGOUT_CMND */
36967f091f2SSagi Grimberg u8 logout_reason;
37067f091f2SSagi Grimberg /* Logout response code when iscsi_opcode == ISCSI_INIT_LOGOUT_CMND */
37167f091f2SSagi Grimberg u8 logout_response;
37267f091f2SSagi Grimberg /* MaxCmdSN has been incremented */
37367f091f2SSagi Grimberg u8 maxcmdsn_inc;
37467f091f2SSagi Grimberg /* Immediate Unsolicited Dataout */
37567f091f2SSagi Grimberg u8 unsolicited_data;
37667f091f2SSagi Grimberg /* Reject reason code */
37767f091f2SSagi Grimberg u8 reject_reason;
37867f091f2SSagi Grimberg /* CID contained in logout PDU when opcode == ISCSI_INIT_LOGOUT_CMND */
37967f091f2SSagi Grimberg u16 logout_cid;
38067f091f2SSagi Grimberg /* Command flags */
38167f091f2SSagi Grimberg enum cmd_flags_table cmd_flags;
38267f091f2SSagi Grimberg /* Initiator Task Tag assigned from Initiator */
38367f091f2SSagi Grimberg itt_t init_task_tag;
38467f091f2SSagi Grimberg /* Target Transfer Tag assigned from Target */
38567f091f2SSagi Grimberg u32 targ_xfer_tag;
38667f091f2SSagi Grimberg /* CmdSN assigned from Initiator */
38767f091f2SSagi Grimberg u32 cmd_sn;
38867f091f2SSagi Grimberg /* ExpStatSN assigned from Initiator */
38967f091f2SSagi Grimberg u32 exp_stat_sn;
39067f091f2SSagi Grimberg /* StatSN assigned to this ITT */
39167f091f2SSagi Grimberg u32 stat_sn;
39267f091f2SSagi Grimberg /* DataSN Counter */
39367f091f2SSagi Grimberg u32 data_sn;
39467f091f2SSagi Grimberg /* R2TSN Counter */
39567f091f2SSagi Grimberg u32 r2t_sn;
39667f091f2SSagi Grimberg /* Last DataSN acknowledged via DataAck SNACK */
39767f091f2SSagi Grimberg u32 acked_data_sn;
39867f091f2SSagi Grimberg /* Used for echoing NOPOUT ping data */
39967f091f2SSagi Grimberg u32 buf_ptr_size;
40067f091f2SSagi Grimberg /* Used to store DataDigest */
40167f091f2SSagi Grimberg u32 data_crc;
40267f091f2SSagi Grimberg /* Counter for MaxOutstandingR2T */
40367f091f2SSagi Grimberg u32 outstanding_r2ts;
40467f091f2SSagi Grimberg /* Next R2T Offset when DataSequenceInOrder=Yes */
40567f091f2SSagi Grimberg u32 r2t_offset;
40666cd9d4eSMax Gurtovoy /* Iovec current and orig count for iscsit_cmd->iov_data */
40767f091f2SSagi Grimberg u32 iov_data_count;
40867f091f2SSagi Grimberg u32 orig_iov_data_count;
40967f091f2SSagi Grimberg /* Number of miscellaneous iovecs used for IP stack calls */
41067f091f2SSagi Grimberg u32 iov_misc_count;
41166cd9d4eSMax Gurtovoy /* Number of struct iscsi_pdu in struct iscsit_cmd->pdu_list */
41267f091f2SSagi Grimberg u32 pdu_count;
41366cd9d4eSMax Gurtovoy /* Next struct iscsi_pdu to send in struct iscsit_cmd->pdu_list */
41467f091f2SSagi Grimberg u32 pdu_send_order;
41566cd9d4eSMax Gurtovoy /* Current struct iscsi_pdu in struct iscsit_cmd->pdu_list */
41667f091f2SSagi Grimberg u32 pdu_start;
41766cd9d4eSMax Gurtovoy /* Next struct iscsi_seq to send in struct iscsit_cmd->seq_list */
41867f091f2SSagi Grimberg u32 seq_send_order;
41966cd9d4eSMax Gurtovoy /* Number of struct iscsi_seq in struct iscsit_cmd->seq_list */
42067f091f2SSagi Grimberg u32 seq_count;
42166cd9d4eSMax Gurtovoy /* Current struct iscsi_seq in struct iscsit_cmd->seq_list */
42267f091f2SSagi Grimberg u32 seq_no;
42367f091f2SSagi Grimberg /* Lowest offset in current DataOUT sequence */
42467f091f2SSagi Grimberg u32 seq_start_offset;
42567f091f2SSagi Grimberg /* Highest offset in current DataOUT sequence */
42667f091f2SSagi Grimberg u32 seq_end_offset;
42767f091f2SSagi Grimberg /* Total size in bytes received so far of READ data */
42867f091f2SSagi Grimberg u32 read_data_done;
42967f091f2SSagi Grimberg /* Total size in bytes received so far of WRITE data */
43067f091f2SSagi Grimberg u32 write_data_done;
43167f091f2SSagi Grimberg /* Counter for FirstBurstLength key */
43267f091f2SSagi Grimberg u32 first_burst_len;
43367f091f2SSagi Grimberg /* Counter for MaxBurstLength key */
43467f091f2SSagi Grimberg u32 next_burst_len;
43567f091f2SSagi Grimberg /* Transfer size used for IP stack calls */
43667f091f2SSagi Grimberg u32 tx_size;
43767f091f2SSagi Grimberg /* Buffer used for various purposes */
43867f091f2SSagi Grimberg void *buf_ptr;
43967f091f2SSagi Grimberg /* Used by SendTargets=[iqn.,eui.] discovery */
44067f091f2SSagi Grimberg void *text_in_ptr;
44167f091f2SSagi Grimberg /* See include/linux/dma-mapping.h */
44267f091f2SSagi Grimberg enum dma_data_direction data_direction;
44367f091f2SSagi Grimberg /* iSCSI PDU Header + CRC */
44467f091f2SSagi Grimberg unsigned char pdu[ISCSI_HDR_LEN + ISCSI_CRC_LEN];
44566cd9d4eSMax Gurtovoy /* Number of times struct iscsit_cmd is present in immediate queue */
44667f091f2SSagi Grimberg atomic_t immed_queue_count;
44767f091f2SSagi Grimberg atomic_t response_queue_count;
44867f091f2SSagi Grimberg spinlock_t datain_lock;
44967f091f2SSagi Grimberg spinlock_t dataout_timeout_lock;
45066cd9d4eSMax Gurtovoy /* spinlock for protecting struct iscsit_cmd->i_state */
45167f091f2SSagi Grimberg spinlock_t istate_lock;
45267f091f2SSagi Grimberg /* spinlock for adding within command recovery entries */
45367f091f2SSagi Grimberg spinlock_t error_lock;
45467f091f2SSagi Grimberg /* spinlock for adding R2Ts */
45567f091f2SSagi Grimberg spinlock_t r2t_lock;
45667f091f2SSagi Grimberg /* DataIN List */
45767f091f2SSagi Grimberg struct list_head datain_list;
45867f091f2SSagi Grimberg /* R2T List */
45967f091f2SSagi Grimberg struct list_head cmd_r2t_list;
46067f091f2SSagi Grimberg /* Timer for DataOUT */
46167f091f2SSagi Grimberg struct timer_list dataout_timer;
46267f091f2SSagi Grimberg /* Iovecs for SCSI data payload RX/TX w/ kernel level sockets */
46367f091f2SSagi Grimberg struct kvec *iov_data;
4640ca650c1SBart Van Assche void *overflow_buf;
46567f091f2SSagi Grimberg /* Iovecs for miscellaneous purposes */
46667f091f2SSagi Grimberg #define ISCSI_MISC_IOVECS 5
46767f091f2SSagi Grimberg struct kvec iov_misc[ISCSI_MISC_IOVECS];
46867f091f2SSagi Grimberg /* Array of struct iscsi_pdu used for DataPDUInOrder=No */
46967f091f2SSagi Grimberg struct iscsi_pdu *pdu_list;
47067f091f2SSagi Grimberg /* Current struct iscsi_pdu used for DataPDUInOrder=No */
47167f091f2SSagi Grimberg struct iscsi_pdu *pdu_ptr;
47267f091f2SSagi Grimberg /* Array of struct iscsi_seq used for DataSequenceInOrder=No */
47367f091f2SSagi Grimberg struct iscsi_seq *seq_list;
47467f091f2SSagi Grimberg /* Current struct iscsi_seq used for DataSequenceInOrder=No */
47567f091f2SSagi Grimberg struct iscsi_seq *seq_ptr;
47667f091f2SSagi Grimberg /* TMR Request when iscsi_opcode == ISCSI_OP_SCSI_TMFUNC */
47767f091f2SSagi Grimberg struct iscsi_tmr_req *tmr_req;
47867f091f2SSagi Grimberg /* Connection this command is alligient to */
479be36d683SMax Gurtovoy struct iscsit_conn *conn;
48067f091f2SSagi Grimberg /* Pointer to connection recovery entry */
48167f091f2SSagi Grimberg struct iscsi_conn_recovery *cr;
48267f091f2SSagi Grimberg /* Session the command is part of, used for connection recovery */
4830873fe44SMax Gurtovoy struct iscsit_session *sess;
48467f091f2SSagi Grimberg /* list_head for connection list */
48567f091f2SSagi Grimberg struct list_head i_conn_node;
48667f091f2SSagi Grimberg /* The TCM I/O descriptor that is accessed via container_of() */
48767f091f2SSagi Grimberg struct se_cmd se_cmd;
48867f091f2SSagi Grimberg /* Sense buffer that will be mapped into outgoing status */
48967f091f2SSagi Grimberg #define ISCSI_SENSE_BUFFER_LEN (TRANSPORT_SENSE_BUFFER + 2)
49067f091f2SSagi Grimberg unsigned char sense_buffer[ISCSI_SENSE_BUFFER_LEN];
49167f091f2SSagi Grimberg
49267f091f2SSagi Grimberg u32 padding;
49367f091f2SSagi Grimberg u8 pad_bytes[4];
49467f091f2SSagi Grimberg
49567f091f2SSagi Grimberg struct scatterlist *first_data_sg;
49667f091f2SSagi Grimberg u32 first_data_sg_off;
49767f091f2SSagi Grimberg u32 kmapped_nents;
49867f091f2SSagi Grimberg sense_reason_t sense_reason;
49967f091f2SSagi Grimberg } ____cacheline_aligned;
50067f091f2SSagi Grimberg
50167f091f2SSagi Grimberg struct iscsi_tmr_req {
50267f091f2SSagi Grimberg bool task_reassign:1;
50367f091f2SSagi Grimberg u32 exp_data_sn;
50466cd9d4eSMax Gurtovoy struct iscsit_cmd *ref_cmd;
50567f091f2SSagi Grimberg struct iscsi_conn_recovery *conn_recovery;
50667f091f2SSagi Grimberg struct se_tmr_req *se_tmr_req;
50767f091f2SSagi Grimberg };
50867f091f2SSagi Grimberg
509be36d683SMax Gurtovoy struct iscsit_conn {
51067f091f2SSagi Grimberg wait_queue_head_t queues_wq;
51167f091f2SSagi Grimberg /* Authentication Successful for this connection */
51267f091f2SSagi Grimberg u8 auth_complete;
51367f091f2SSagi Grimberg /* State connection is currently in */
51467f091f2SSagi Grimberg u8 conn_state;
51567f091f2SSagi Grimberg u8 conn_logout_reason;
51667f091f2SSagi Grimberg u8 network_transport;
51767f091f2SSagi Grimberg enum iscsi_timer_flags_table nopin_timer_flags;
51867f091f2SSagi Grimberg enum iscsi_timer_flags_table nopin_response_timer_flags;
51967f091f2SSagi Grimberg /* Used to know what thread encountered a transport failure */
52067f091f2SSagi Grimberg u8 which_thread;
52167f091f2SSagi Grimberg /* connection id assigned by the Initiator */
52267f091f2SSagi Grimberg u16 cid;
52367f091f2SSagi Grimberg /* Remote TCP Port */
52467f091f2SSagi Grimberg u16 login_port;
52567f091f2SSagi Grimberg int net_size;
52667f091f2SSagi Grimberg int login_family;
52767f091f2SSagi Grimberg u32 auth_id;
52867f091f2SSagi Grimberg u32 conn_flags;
52967f091f2SSagi Grimberg /* Used for iscsi_tx_login_rsp() */
53067f091f2SSagi Grimberg itt_t login_itt;
53167f091f2SSagi Grimberg u32 exp_statsn;
53267f091f2SSagi Grimberg /* Per connection status sequence number */
53367f091f2SSagi Grimberg u32 stat_sn;
53413a3cf08SAndy Grover struct sockaddr_storage login_sockaddr;
53513a3cf08SAndy Grover struct sockaddr_storage local_sockaddr;
53667f091f2SSagi Grimberg int conn_usage_count;
53767f091f2SSagi Grimberg int conn_waiting_on_uc;
53867f091f2SSagi Grimberg atomic_t check_immediate_queue;
53967f091f2SSagi Grimberg atomic_t conn_logout_remove;
54067f091f2SSagi Grimberg atomic_t connection_exit;
54167f091f2SSagi Grimberg atomic_t connection_recovery;
54267f091f2SSagi Grimberg atomic_t connection_reinstatement;
54367f091f2SSagi Grimberg atomic_t connection_wait_rcfr;
54467f091f2SSagi Grimberg atomic_t sleep_on_conn_wait_comp;
54567f091f2SSagi Grimberg atomic_t transport_failed;
54667f091f2SSagi Grimberg struct completion conn_post_wait_comp;
54767f091f2SSagi Grimberg struct completion conn_wait_comp;
54867f091f2SSagi Grimberg struct completion conn_wait_rcfr_comp;
54967f091f2SSagi Grimberg struct completion conn_waiting_on_uc_comp;
55067f091f2SSagi Grimberg struct completion conn_logout_comp;
55167f091f2SSagi Grimberg struct completion tx_half_close_comp;
55267f091f2SSagi Grimberg struct completion rx_half_close_comp;
55367f091f2SSagi Grimberg /* socket used by this connection */
55467f091f2SSagi Grimberg struct socket *sock;
55567f091f2SSagi Grimberg void (*orig_data_ready)(struct sock *);
55667f091f2SSagi Grimberg void (*orig_state_change)(struct sock *);
5574e108d4fSHou Pu #define LOGIN_FLAGS_READY 0
5584e108d4fSHou Pu #define LOGIN_FLAGS_INITIAL_PDU 1
5594e108d4fSHou Pu #define LOGIN_FLAGS_READ_ACTIVE 2
5604e108d4fSHou Pu #define LOGIN_FLAGS_WRITE_ACTIVE 3
5614e108d4fSHou Pu #define LOGIN_FLAGS_CLOSED 4
562*13247018SMaurizio Lombardi #define LOGIN_FLAGS_WORKER_RUNNING 5
56367f091f2SSagi Grimberg unsigned long login_flags;
56467f091f2SSagi Grimberg struct delayed_work login_work;
56567f091f2SSagi Grimberg struct iscsi_login *login;
56667f091f2SSagi Grimberg struct timer_list nopin_timer;
56767f091f2SSagi Grimberg struct timer_list nopin_response_timer;
568*13247018SMaurizio Lombardi struct timer_list login_timer;
56967f091f2SSagi Grimberg struct task_struct *login_kworker;
57067f091f2SSagi Grimberg /* Spinlock used for add/deleting cmd's from conn_cmd_list */
57167f091f2SSagi Grimberg spinlock_t cmd_lock;
57267f091f2SSagi Grimberg spinlock_t conn_usage_lock;
57367f091f2SSagi Grimberg spinlock_t immed_queue_lock;
57467f091f2SSagi Grimberg spinlock_t nopin_timer_lock;
57567f091f2SSagi Grimberg spinlock_t response_queue_lock;
57667f091f2SSagi Grimberg spinlock_t state_lock;
577*13247018SMaurizio Lombardi spinlock_t login_timer_lock;
578*13247018SMaurizio Lombardi spinlock_t login_worker_lock;
57967f091f2SSagi Grimberg /* libcrypto RX and TX contexts for crc32c */
58069110e3cSHerbert Xu struct ahash_request *conn_rx_hash;
58169110e3cSHerbert Xu struct ahash_request *conn_tx_hash;
58267f091f2SSagi Grimberg /* Used for scheduling TX and RX connection kthreads */
58367f091f2SSagi Grimberg cpumask_var_t conn_cpumask;
584d72d827fSMingzhe Zou cpumask_var_t allowed_cpumask;
58567f091f2SSagi Grimberg unsigned int conn_rx_reset_cpumask:1;
58667f091f2SSagi Grimberg unsigned int conn_tx_reset_cpumask:1;
58766cd9d4eSMax Gurtovoy /* list_head of struct iscsit_cmd for this connection */
58867f091f2SSagi Grimberg struct list_head conn_cmd_list;
58967f091f2SSagi Grimberg struct list_head immed_queue_list;
59067f091f2SSagi Grimberg struct list_head response_queue_list;
59167f091f2SSagi Grimberg struct iscsi_conn_ops *conn_ops;
59267f091f2SSagi Grimberg struct iscsi_login *conn_login;
59367f091f2SSagi Grimberg struct iscsit_transport *conn_transport;
59467f091f2SSagi Grimberg struct iscsi_param_list *param_list;
59567f091f2SSagi Grimberg /* Used for per connection auth state machine */
59667f091f2SSagi Grimberg void *auth_protocol;
59767f091f2SSagi Grimberg void *context;
59867f091f2SSagi Grimberg struct iscsi_login_thread_s *login_thread;
59967f091f2SSagi Grimberg struct iscsi_portal_group *tpg;
60067f091f2SSagi Grimberg struct iscsi_tpg_np *tpg_np;
60167f091f2SSagi Grimberg /* Pointer to parent session */
6020873fe44SMax Gurtovoy struct iscsit_session *sess;
603becd9be6SMike Christie struct target_cmd_counter *cmd_cnt;
60488dcd2daSNicholas Bellinger int bitmap_id;
60588dcd2daSNicholas Bellinger int rx_thread_active;
60688dcd2daSNicholas Bellinger struct task_struct *rx_thread;
607e5419865SNicholas Bellinger struct completion rx_login_comp;
60888dcd2daSNicholas Bellinger int tx_thread_active;
60988dcd2daSNicholas Bellinger struct task_struct *tx_thread;
61067f091f2SSagi Grimberg /* list_head for session connection list */
61167f091f2SSagi Grimberg struct list_head conn_list;
61267f091f2SSagi Grimberg } ____cacheline_aligned;
61367f091f2SSagi Grimberg
61467f091f2SSagi Grimberg struct iscsi_conn_recovery {
61567f091f2SSagi Grimberg u16 cid;
61667f091f2SSagi Grimberg u32 cmd_count;
61767f091f2SSagi Grimberg u32 maxrecvdatasegmentlength;
61867f091f2SSagi Grimberg u32 maxxmitdatasegmentlength;
61967f091f2SSagi Grimberg int ready_for_reallegiance;
62067f091f2SSagi Grimberg struct list_head conn_recovery_cmd_list;
62167f091f2SSagi Grimberg spinlock_t conn_recovery_cmd_lock;
62267f091f2SSagi Grimberg struct timer_list time2retain_timer;
6230873fe44SMax Gurtovoy struct iscsit_session *sess;
62467f091f2SSagi Grimberg struct list_head cr_list;
62567f091f2SSagi Grimberg } ____cacheline_aligned;
62667f091f2SSagi Grimberg
6270873fe44SMax Gurtovoy struct iscsit_session {
62867f091f2SSagi Grimberg u8 initiator_vendor;
62967f091f2SSagi Grimberg u8 isid[6];
63067f091f2SSagi Grimberg enum iscsi_timer_flags_table time2retain_timer_flags;
63167f091f2SSagi Grimberg u8 version_active;
63267f091f2SSagi Grimberg u16 cid_called;
63367f091f2SSagi Grimberg u16 conn_recovery_count;
63467f091f2SSagi Grimberg u16 tsih;
63567f091f2SSagi Grimberg /* state session is currently in */
63667f091f2SSagi Grimberg u32 session_state;
63767f091f2SSagi Grimberg /* session wide counter: initiator assigned task tag */
63867f091f2SSagi Grimberg itt_t init_task_tag;
63967f091f2SSagi Grimberg /* session wide counter: target assigned task tag */
64067f091f2SSagi Grimberg u32 targ_xfer_tag;
64167f091f2SSagi Grimberg u32 cmdsn_window;
64267f091f2SSagi Grimberg
64367f091f2SSagi Grimberg /* protects cmdsn values */
64467f091f2SSagi Grimberg struct mutex cmdsn_mutex;
64567f091f2SSagi Grimberg /* session wide counter: expected command sequence number */
64667f091f2SSagi Grimberg u32 exp_cmd_sn;
64767f091f2SSagi Grimberg /* session wide counter: maximum allowed command sequence number */
648109e2381SRoland Dreier atomic_t max_cmd_sn;
64967f091f2SSagi Grimberg struct list_head sess_ooo_cmdsn_list;
65067f091f2SSagi Grimberg
65167f091f2SSagi Grimberg /* LIO specific session ID */
65267f091f2SSagi Grimberg u32 sid;
65367f091f2SSagi Grimberg char auth_type[8];
65467f091f2SSagi Grimberg /* unique within the target */
65567f091f2SSagi Grimberg int session_index;
65667f091f2SSagi Grimberg /* Used for session reference counting */
65767f091f2SSagi Grimberg int session_usage_count;
65867f091f2SSagi Grimberg int session_waiting_on_uc;
65967f091f2SSagi Grimberg atomic_long_t cmd_pdus;
66067f091f2SSagi Grimberg atomic_long_t rsp_pdus;
66167f091f2SSagi Grimberg atomic_long_t tx_data_octets;
66267f091f2SSagi Grimberg atomic_long_t rx_data_octets;
66367f091f2SSagi Grimberg atomic_long_t conn_digest_errors;
66467f091f2SSagi Grimberg atomic_long_t conn_timeout_errors;
66567f091f2SSagi Grimberg u64 creation_time;
66667f091f2SSagi Grimberg /* Number of active connections */
66767f091f2SSagi Grimberg atomic_t nconn;
66867f091f2SSagi Grimberg atomic_t session_continuation;
66967f091f2SSagi Grimberg atomic_t session_fall_back_to_erl0;
67067f091f2SSagi Grimberg atomic_t session_logout;
67167f091f2SSagi Grimberg atomic_t session_reinstatement;
67267f091f2SSagi Grimberg atomic_t session_stop_active;
67357c46e9fSMaurizio Lombardi atomic_t session_close;
67467f091f2SSagi Grimberg /* connection list */
67567f091f2SSagi Grimberg struct list_head sess_conn_list;
67667f091f2SSagi Grimberg struct list_head cr_active_list;
67767f091f2SSagi Grimberg struct list_head cr_inactive_list;
67867f091f2SSagi Grimberg spinlock_t conn_lock;
67967f091f2SSagi Grimberg spinlock_t cr_a_lock;
68067f091f2SSagi Grimberg spinlock_t cr_i_lock;
68167f091f2SSagi Grimberg spinlock_t session_usage_lock;
68267f091f2SSagi Grimberg spinlock_t ttt_lock;
68367f091f2SSagi Grimberg struct completion async_msg_comp;
68467f091f2SSagi Grimberg struct completion reinstatement_comp;
68567f091f2SSagi Grimberg struct completion session_wait_comp;
68667f091f2SSagi Grimberg struct completion session_waiting_on_uc_comp;
68767f091f2SSagi Grimberg struct timer_list time2retain_timer;
68867f091f2SSagi Grimberg struct iscsi_sess_ops *sess_ops;
68967f091f2SSagi Grimberg struct se_session *se_sess;
69067f091f2SSagi Grimberg struct iscsi_portal_group *tpg;
69167f091f2SSagi Grimberg } ____cacheline_aligned;
69267f091f2SSagi Grimberg
69367f091f2SSagi Grimberg struct iscsi_login {
69467f091f2SSagi Grimberg u8 auth_complete;
69567f091f2SSagi Grimberg u8 checked_for_existing;
69667f091f2SSagi Grimberg u8 current_stage;
69767f091f2SSagi Grimberg u8 leading_connection;
69867f091f2SSagi Grimberg u8 first_request;
69967f091f2SSagi Grimberg u8 version_min;
70067f091f2SSagi Grimberg u8 version_max;
70167f091f2SSagi Grimberg u8 login_complete;
70267f091f2SSagi Grimberg u8 login_failed;
70367f091f2SSagi Grimberg bool zero_tsih;
70467f091f2SSagi Grimberg char isid[6];
70567f091f2SSagi Grimberg u32 cmd_sn;
70667f091f2SSagi Grimberg itt_t init_task_tag;
70767f091f2SSagi Grimberg u32 initial_exp_statsn;
70867f091f2SSagi Grimberg u32 rsp_length;
70967f091f2SSagi Grimberg u16 cid;
71067f091f2SSagi Grimberg u16 tsih;
71167f091f2SSagi Grimberg char req[ISCSI_HDR_LEN];
71267f091f2SSagi Grimberg char rsp[ISCSI_HDR_LEN];
71367f091f2SSagi Grimberg char *req_buf;
71467f091f2SSagi Grimberg char *rsp_buf;
715be36d683SMax Gurtovoy struct iscsit_conn *conn;
71667f091f2SSagi Grimberg struct iscsi_np *np;
71767f091f2SSagi Grimberg } ____cacheline_aligned;
71867f091f2SSagi Grimberg
71967f091f2SSagi Grimberg struct iscsi_node_attrib {
720a6e0d179SDmitry Bogdanov s32 authentication;
72167f091f2SSagi Grimberg u32 dataout_timeout;
72267f091f2SSagi Grimberg u32 dataout_timeout_retries;
72367f091f2SSagi Grimberg u32 default_erl;
72467f091f2SSagi Grimberg u32 nopin_timeout;
72567f091f2SSagi Grimberg u32 nopin_response_timeout;
72667f091f2SSagi Grimberg u32 random_datain_pdu_offsets;
72767f091f2SSagi Grimberg u32 random_datain_seq_offsets;
72867f091f2SSagi Grimberg u32 random_r2t_offsets;
72967f091f2SSagi Grimberg u32 tmr_cold_reset;
73067f091f2SSagi Grimberg u32 tmr_warm_reset;
73167f091f2SSagi Grimberg struct iscsi_node_acl *nacl;
73267f091f2SSagi Grimberg };
73367f091f2SSagi Grimberg
73467f091f2SSagi Grimberg struct se_dev_entry_s;
73567f091f2SSagi Grimberg
73667f091f2SSagi Grimberg struct iscsi_node_auth {
73767f091f2SSagi Grimberg enum naf_flags_table naf_flags;
73867f091f2SSagi Grimberg int authenticate_target;
73967f091f2SSagi Grimberg /* Used for iscsit_global->discovery_auth,
74067f091f2SSagi Grimberg * set to zero (auth disabled) by default */
74167f091f2SSagi Grimberg int enforce_discovery_auth;
74267f091f2SSagi Grimberg #define MAX_USER_LEN 256
74367f091f2SSagi Grimberg #define MAX_PASS_LEN 256
74467f091f2SSagi Grimberg char userid[MAX_USER_LEN];
74567f091f2SSagi Grimberg char password[MAX_PASS_LEN];
74667f091f2SSagi Grimberg char userid_mutual[MAX_USER_LEN];
74767f091f2SSagi Grimberg char password_mutual[MAX_PASS_LEN];
74867f091f2SSagi Grimberg };
74967f091f2SSagi Grimberg
75067f091f2SSagi Grimberg #include "iscsi_target_stat.h"
75167f091f2SSagi Grimberg
75267f091f2SSagi Grimberg struct iscsi_node_stat_grps {
75367f091f2SSagi Grimberg struct config_group iscsi_sess_stats_group;
75467f091f2SSagi Grimberg struct config_group iscsi_conn_stats_group;
75567f091f2SSagi Grimberg };
75667f091f2SSagi Grimberg
75767f091f2SSagi Grimberg struct iscsi_node_acl {
758144bc4c2SChristoph Hellwig struct se_node_acl se_node_acl;
75967f091f2SSagi Grimberg struct iscsi_node_attrib node_attrib;
76067f091f2SSagi Grimberg struct iscsi_node_auth node_auth;
76167f091f2SSagi Grimberg struct iscsi_node_stat_grps node_stat_grps;
76267f091f2SSagi Grimberg };
76367f091f2SSagi Grimberg
764a11b8069SDmitry Bogdanov static inline struct iscsi_node_acl *
to_iscsi_nacl(struct se_node_acl * se_nacl)765a11b8069SDmitry Bogdanov to_iscsi_nacl(struct se_node_acl *se_nacl)
766a11b8069SDmitry Bogdanov {
767a11b8069SDmitry Bogdanov return container_of(se_nacl, struct iscsi_node_acl, se_node_acl);
768a11b8069SDmitry Bogdanov }
769a11b8069SDmitry Bogdanov
77067f091f2SSagi Grimberg struct iscsi_tpg_attrib {
77167f091f2SSagi Grimberg u32 authentication;
77267f091f2SSagi Grimberg u32 login_timeout;
77367f091f2SSagi Grimberg u32 generate_node_acls;
77467f091f2SSagi Grimberg u32 cache_dynamic_acls;
77567f091f2SSagi Grimberg u32 default_cmdsn_depth;
77667f091f2SSagi Grimberg u32 demo_mode_write_protect;
77767f091f2SSagi Grimberg u32 prod_mode_write_protect;
77867f091f2SSagi Grimberg u32 demo_mode_discovery;
77967f091f2SSagi Grimberg u32 default_erl;
78067f091f2SSagi Grimberg u8 t10_pi;
781901c04a3SNicholas Bellinger u32 fabric_prot_type;
782a6415cddSDavid Disseldorp u32 tpg_enabled_sendtargets;
783138d351eSNicholas Bellinger u32 login_keys_workaround;
78467f091f2SSagi Grimberg struct iscsi_portal_group *tpg;
78567f091f2SSagi Grimberg };
78667f091f2SSagi Grimberg
78767f091f2SSagi Grimberg struct iscsi_np {
78867f091f2SSagi Grimberg int np_network_transport;
78967f091f2SSagi Grimberg int np_ip_proto;
79067f091f2SSagi Grimberg int np_sock_type;
79167f091f2SSagi Grimberg enum np_thread_state_table np_thread_state;
79267f091f2SSagi Grimberg bool enabled;
793978d13d6SNicholas Bellinger atomic_t np_reset_count;
79467f091f2SSagi Grimberg u32 np_exports;
79567f091f2SSagi Grimberg enum np_flags_table np_flags;
79667f091f2SSagi Grimberg spinlock_t np_thread_lock;
79767f091f2SSagi Grimberg struct completion np_restart_comp;
79867f091f2SSagi Grimberg struct socket *np_socket;
79913a3cf08SAndy Grover struct sockaddr_storage np_sockaddr;
80067f091f2SSagi Grimberg struct task_struct *np_thread;
80167f091f2SSagi Grimberg void *np_context;
80267f091f2SSagi Grimberg struct iscsit_transport *np_transport;
80367f091f2SSagi Grimberg struct list_head np_list;
80467f091f2SSagi Grimberg } ____cacheline_aligned;
80567f091f2SSagi Grimberg
80667f091f2SSagi Grimberg struct iscsi_tpg_np {
80767f091f2SSagi Grimberg struct iscsi_np *tpg_np;
80867f091f2SSagi Grimberg struct iscsi_portal_group *tpg;
80967f091f2SSagi Grimberg struct iscsi_tpg_np *tpg_np_parent;
81067f091f2SSagi Grimberg struct list_head tpg_np_list;
81167f091f2SSagi Grimberg struct list_head tpg_np_child_list;
81267f091f2SSagi Grimberg struct list_head tpg_np_parent_list;
81367f091f2SSagi Grimberg struct se_tpg_np se_tpg_np;
81467f091f2SSagi Grimberg spinlock_t tpg_np_parent_lock;
81567f091f2SSagi Grimberg struct completion tpg_np_comp;
81667f091f2SSagi Grimberg struct kref tpg_np_kref;
81767f091f2SSagi Grimberg };
81867f091f2SSagi Grimberg
81967f091f2SSagi Grimberg struct iscsi_portal_group {
82067f091f2SSagi Grimberg unsigned char tpg_chap_id;
82167f091f2SSagi Grimberg /* TPG State */
82267f091f2SSagi Grimberg enum tpg_state_table tpg_state;
82367f091f2SSagi Grimberg /* Target Portal Group Tag */
82467f091f2SSagi Grimberg u16 tpgt;
82567f091f2SSagi Grimberg /* Id assigned to target sessions */
82667f091f2SSagi Grimberg u16 ntsih;
82767f091f2SSagi Grimberg /* Number of active sessions */
82867f091f2SSagi Grimberg u32 nsessions;
82967f091f2SSagi Grimberg /* Number of Network Portals available for this TPG */
83067f091f2SSagi Grimberg u32 num_tpg_nps;
83167f091f2SSagi Grimberg /* Per TPG LIO specific session ID. */
83267f091f2SSagi Grimberg u32 sid;
83367f091f2SSagi Grimberg /* Spinlock for adding/removing Network Portals */
83467f091f2SSagi Grimberg spinlock_t tpg_np_lock;
83567f091f2SSagi Grimberg spinlock_t tpg_state_lock;
83667f091f2SSagi Grimberg struct se_portal_group tpg_se_tpg;
83767f091f2SSagi Grimberg struct mutex tpg_access_lock;
83867f091f2SSagi Grimberg struct semaphore np_login_sem;
83967f091f2SSagi Grimberg struct iscsi_tpg_attrib tpg_attrib;
84067f091f2SSagi Grimberg struct iscsi_node_auth tpg_demo_auth;
84167f091f2SSagi Grimberg /* Pointer to default list of iSCSI parameters for TPG */
84267f091f2SSagi Grimberg struct iscsi_param_list *param_list;
84367f091f2SSagi Grimberg struct iscsi_tiqn *tpg_tiqn;
84467f091f2SSagi Grimberg struct list_head tpg_gnp_list;
84567f091f2SSagi Grimberg struct list_head tpg_list;
84667f091f2SSagi Grimberg } ____cacheline_aligned;
84767f091f2SSagi Grimberg
848a11b8069SDmitry Bogdanov static inline struct iscsi_portal_group *
to_iscsi_tpg(struct se_portal_group * se_tpg)849a11b8069SDmitry Bogdanov to_iscsi_tpg(struct se_portal_group *se_tpg)
850a11b8069SDmitry Bogdanov {
851a11b8069SDmitry Bogdanov return container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
852a11b8069SDmitry Bogdanov }
853a11b8069SDmitry Bogdanov
85467f091f2SSagi Grimberg struct iscsi_wwn_stat_grps {
85567f091f2SSagi Grimberg struct config_group iscsi_stat_group;
85667f091f2SSagi Grimberg struct config_group iscsi_instance_group;
85767f091f2SSagi Grimberg struct config_group iscsi_sess_err_group;
85867f091f2SSagi Grimberg struct config_group iscsi_tgt_attr_group;
85967f091f2SSagi Grimberg struct config_group iscsi_login_stats_group;
86067f091f2SSagi Grimberg struct config_group iscsi_logout_stats_group;
86167f091f2SSagi Grimberg };
86267f091f2SSagi Grimberg
86367f091f2SSagi Grimberg struct iscsi_tiqn {
86467f091f2SSagi Grimberg unsigned char tiqn[ISCSI_IQN_LEN];
86567f091f2SSagi Grimberg enum tiqn_state_table tiqn_state;
86667f091f2SSagi Grimberg int tiqn_access_count;
86767f091f2SSagi Grimberg u32 tiqn_active_tpgs;
86867f091f2SSagi Grimberg u32 tiqn_ntpgs;
86967f091f2SSagi Grimberg u32 tiqn_num_tpg_nps;
87067f091f2SSagi Grimberg u32 tiqn_nsessions;
87167f091f2SSagi Grimberg struct list_head tiqn_list;
87267f091f2SSagi Grimberg struct list_head tiqn_tpg_list;
87367f091f2SSagi Grimberg spinlock_t tiqn_state_lock;
87467f091f2SSagi Grimberg spinlock_t tiqn_tpg_lock;
87567f091f2SSagi Grimberg struct se_wwn tiqn_wwn;
87667f091f2SSagi Grimberg struct iscsi_wwn_stat_grps tiqn_stat_grps;
87767f091f2SSagi Grimberg int tiqn_index;
87867f091f2SSagi Grimberg struct iscsi_sess_err_stats sess_err_stats;
87967f091f2SSagi Grimberg struct iscsi_login_stats login_stats;
88067f091f2SSagi Grimberg struct iscsi_logout_stats logout_stats;
88167f091f2SSagi Grimberg } ____cacheline_aligned;
88267f091f2SSagi Grimberg
88367f091f2SSagi Grimberg struct iscsit_global {
88467f091f2SSagi Grimberg /* In core shutdown */
88567f091f2SSagi Grimberg u32 in_shutdown;
88667f091f2SSagi Grimberg u32 active_ts;
88767f091f2SSagi Grimberg /* Unique identifier used for the authentication daemon */
88867f091f2SSagi Grimberg u32 auth_id;
88967f091f2SSagi Grimberg u32 inactive_ts;
89088dcd2daSNicholas Bellinger #define ISCSIT_BITMAP_BITS 262144
89167f091f2SSagi Grimberg /* Thread Set bitmap pointer */
89267f091f2SSagi Grimberg unsigned long *ts_bitmap;
89388dcd2daSNicholas Bellinger spinlock_t ts_bitmap_lock;
894d72d827fSMingzhe Zou cpumask_var_t allowed_cpumask;
89567f091f2SSagi Grimberg /* Used for iSCSI discovery session authentication */
89667f091f2SSagi Grimberg struct iscsi_node_acl discovery_acl;
89767f091f2SSagi Grimberg struct iscsi_portal_group *discovery_tpg;
89867f091f2SSagi Grimberg };
89967f091f2SSagi Grimberg
session_get_next_ttt(struct iscsit_session * session)9000873fe44SMax Gurtovoy static inline u32 session_get_next_ttt(struct iscsit_session *session)
901c1e34b64SSagi Grimberg {
902c1e34b64SSagi Grimberg u32 ttt;
903c1e34b64SSagi Grimberg
904c1e34b64SSagi Grimberg spin_lock_bh(&session->ttt_lock);
905c1e34b64SSagi Grimberg ttt = session->targ_xfer_tag++;
906c1e34b64SSagi Grimberg if (ttt == 0xFFFFFFFF)
907c1e34b64SSagi Grimberg ttt = session->targ_xfer_tag++;
908c1e34b64SSagi Grimberg spin_unlock_bh(&session->ttt_lock);
909c1e34b64SSagi Grimberg
910c1e34b64SSagi Grimberg return ttt;
911c1e34b64SSagi Grimberg }
912c1e34b64SSagi Grimberg
913be36d683SMax Gurtovoy extern struct iscsit_cmd *iscsit_find_cmd_from_itt(struct iscsit_conn *, itt_t);
914c0b7373bSVarun Prakash
915be36d683SMax Gurtovoy extern void iscsit_thread_check_cpumask(struct iscsit_conn *conn,
916c0b7373bSVarun Prakash struct task_struct *p,
917d72d827fSMingzhe Zou int mode);
918d72d827fSMingzhe Zou
91967f091f2SSagi Grimberg #endif /* ISCSI_TARGET_CORE_H */
920