Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef ISCSI_TARGET_CORE_H
0003 #define ISCSI_TARGET_CORE_H
0004 
0005 #include <linux/dma-direction.h>     /* enum dma_data_direction */
0006 #include <linux/list.h>              /* struct list_head */
0007 #include <linux/sched.h>
0008 #include <linux/socket.h>            /* struct sockaddr_storage */
0009 #include <linux/types.h>             /* u8 */
0010 #include <scsi/iscsi_proto.h>        /* itt_t */
0011 #include <target/target_core_base.h> /* struct se_cmd */
0012 
0013 struct sock;
0014 
0015 #define ISCSIT_VERSION          "v4.1.0"
0016 #define ISCSI_MAX_DATASN_MISSING_COUNT  16
0017 #define ISCSI_TX_THREAD_TCP_TIMEOUT 2
0018 #define ISCSI_RX_THREAD_TCP_TIMEOUT 2
0019 #define SECONDS_FOR_ASYNC_LOGOUT    10
0020 #define SECONDS_FOR_ASYNC_TEXT      10
0021 #define SECONDS_FOR_LOGOUT_COMP     15
0022 #define WHITE_SPACE         " \t\v\f\n\r"
0023 #define ISCSIT_MIN_TAGS         16
0024 #define ISCSIT_EXTRA_TAGS       8
0025 #define ISCSIT_TCP_BACKLOG      256
0026 #define ISCSI_RX_THREAD_NAME        "iscsi_trx"
0027 #define ISCSI_TX_THREAD_NAME        "iscsi_ttx"
0028 #define ISCSI_IQN_LEN           224
0029 #define NA_AUTHENTICATION_INHERITED -1
0030 
0031 /* struct iscsi_node_attrib sanity values */
0032 #define NA_DATAOUT_TIMEOUT      3
0033 #define NA_DATAOUT_TIMEOUT_MAX      60
0034 #define NA_DATAOUT_TIMEOUT_MIX      2
0035 #define NA_DATAOUT_TIMEOUT_RETRIES  5
0036 #define NA_DATAOUT_TIMEOUT_RETRIES_MAX  15
0037 #define NA_DATAOUT_TIMEOUT_RETRIES_MIN  1
0038 #define NA_NOPIN_TIMEOUT        15
0039 #define NA_NOPIN_TIMEOUT_MAX        60
0040 #define NA_NOPIN_TIMEOUT_MIN        3
0041 #define NA_NOPIN_RESPONSE_TIMEOUT   30
0042 #define NA_NOPIN_RESPONSE_TIMEOUT_MAX   60
0043 #define NA_NOPIN_RESPONSE_TIMEOUT_MIN   3
0044 #define NA_RANDOM_DATAIN_PDU_OFFSETS    0
0045 #define NA_RANDOM_DATAIN_SEQ_OFFSETS    0
0046 #define NA_RANDOM_R2T_OFFSETS       0
0047 
0048 /* struct iscsi_tpg_attrib sanity values */
0049 #define TA_AUTHENTICATION       1
0050 #define TA_LOGIN_TIMEOUT        15
0051 #define TA_LOGIN_TIMEOUT_MAX        30
0052 #define TA_LOGIN_TIMEOUT_MIN        5
0053 #define TA_NETIF_TIMEOUT        2
0054 #define TA_NETIF_TIMEOUT_MAX        15
0055 #define TA_NETIF_TIMEOUT_MIN        2
0056 #define TA_GENERATE_NODE_ACLS       0
0057 #define TA_DEFAULT_CMDSN_DEPTH      64
0058 #define TA_DEFAULT_CMDSN_DEPTH_MAX  512
0059 #define TA_DEFAULT_CMDSN_DEPTH_MIN  1
0060 #define TA_CACHE_DYNAMIC_ACLS       0
0061 /* Enabled by default in demo mode (generic_node_acls=1) */
0062 #define TA_DEMO_MODE_WRITE_PROTECT  1
0063 /* Disabled by default in production mode w/ explict ACLs */
0064 #define TA_PROD_MODE_WRITE_PROTECT  0
0065 #define TA_DEMO_MODE_DISCOVERY      1
0066 #define TA_DEFAULT_ERL          0
0067 #define TA_CACHE_CORE_NPS       0
0068 /* T10 protection information disabled by default */
0069 #define TA_DEFAULT_T10_PI       0
0070 #define TA_DEFAULT_FABRIC_PROT_TYPE 0
0071 /* TPG status needs to be enabled to return sendtargets discovery endpoint info */
0072 #define TA_DEFAULT_TPG_ENABLED_SENDTARGETS 1
0073 /*
0074  * Used to control the sending of keys with optional to respond state bit,
0075  * as a workaround for non RFC compliant initiators,that do not propose,
0076  * nor respond to specific keys required for login to complete.
0077  *
0078  * See iscsi_check_proposer_for_optional_reply() for more details.
0079  */
0080 #define TA_DEFAULT_LOGIN_KEYS_WORKAROUND 1
0081 
0082 #define ISCSI_IOV_DATA_BUFFER       5
0083 
0084 enum iscsit_transport_type {
0085     ISCSI_TCP               = 0,
0086     ISCSI_SCTP_TCP              = 1,
0087     ISCSI_SCTP_UDP              = 2,
0088     ISCSI_IWARP_TCP             = 3,
0089     ISCSI_IWARP_SCTP            = 4,
0090     ISCSI_INFINIBAND            = 5,
0091     ISCSI_CXGBIT                = 6,
0092 };
0093 
0094 /* RFC-3720 7.1.4  Standard Connection State Diagram for a Target */
0095 enum target_conn_state_table {
0096     TARG_CONN_STATE_FREE            = 0x1,
0097     TARG_CONN_STATE_XPT_UP          = 0x3,
0098     TARG_CONN_STATE_IN_LOGIN        = 0x4,
0099     TARG_CONN_STATE_LOGGED_IN       = 0x5,
0100     TARG_CONN_STATE_IN_LOGOUT       = 0x6,
0101     TARG_CONN_STATE_LOGOUT_REQUESTED    = 0x7,
0102     TARG_CONN_STATE_CLEANUP_WAIT        = 0x8,
0103 };
0104 
0105 /* RFC-3720 7.3.2  Session State Diagram for a Target */
0106 enum target_sess_state_table {
0107     TARG_SESS_STATE_FREE            = 0x1,
0108     TARG_SESS_STATE_ACTIVE          = 0x2,
0109     TARG_SESS_STATE_LOGGED_IN       = 0x3,
0110     TARG_SESS_STATE_FAILED          = 0x4,
0111     TARG_SESS_STATE_IN_CONTINUE     = 0x5,
0112 };
0113 
0114 /* struct iscsi_data_count->type */
0115 enum data_count_type {
0116     ISCSI_RX_DATA   = 1,
0117     ISCSI_TX_DATA   = 2,
0118 };
0119 
0120 /* struct iscsi_datain_req->dr_complete */
0121 enum datain_req_comp_table {
0122     DATAIN_COMPLETE_NORMAL          = 1,
0123     DATAIN_COMPLETE_WITHIN_COMMAND_RECOVERY = 2,
0124     DATAIN_COMPLETE_CONNECTION_RECOVERY = 3,
0125 };
0126 
0127 /* struct iscsi_datain_req->recovery */
0128 enum datain_req_rec_table {
0129     DATAIN_WITHIN_COMMAND_RECOVERY      = 1,
0130     DATAIN_CONNECTION_RECOVERY      = 2,
0131 };
0132 
0133 /* struct iscsi_portal_group->state */
0134 enum tpg_state_table {
0135     TPG_STATE_FREE              = 0,
0136     TPG_STATE_ACTIVE            = 1,
0137     TPG_STATE_INACTIVE          = 2,
0138     TPG_STATE_COLD_RESET            = 3,
0139 };
0140 
0141 /* struct iscsi_tiqn->tiqn_state */
0142 enum tiqn_state_table {
0143     TIQN_STATE_ACTIVE           = 1,
0144     TIQN_STATE_SHUTDOWN         = 2,
0145 };
0146 
0147 /* struct iscsit_cmd->cmd_flags */
0148 enum cmd_flags_table {
0149     ICF_GOT_LAST_DATAOUT            = 0x00000001,
0150     ICF_GOT_DATACK_SNACK            = 0x00000002,
0151     ICF_NON_IMMEDIATE_UNSOLICITED_DATA  = 0x00000004,
0152     ICF_SENT_LAST_R2T           = 0x00000008,
0153     ICF_WITHIN_COMMAND_RECOVERY     = 0x00000010,
0154     ICF_CONTIG_MEMORY           = 0x00000020,
0155     ICF_ATTACHED_TO_RQUEUE          = 0x00000040,
0156     ICF_OOO_CMDSN               = 0x00000080,
0157     ICF_SENDTARGETS_ALL         = 0x00000100,
0158     ICF_SENDTARGETS_SINGLE          = 0x00000200,
0159 };
0160 
0161 /* struct iscsit_cmd->i_state */
0162 enum cmd_i_state_table {
0163     ISTATE_NO_STATE         = 0,
0164     ISTATE_NEW_CMD          = 1,
0165     ISTATE_DEFERRED_CMD     = 2,
0166     ISTATE_UNSOLICITED_DATA     = 3,
0167     ISTATE_RECEIVE_DATAOUT      = 4,
0168     ISTATE_RECEIVE_DATAOUT_RECOVERY = 5,
0169     ISTATE_RECEIVED_LAST_DATAOUT    = 6,
0170     ISTATE_WITHIN_DATAOUT_RECOVERY  = 7,
0171     ISTATE_IN_CONNECTION_RECOVERY   = 8,
0172     ISTATE_RECEIVED_TASKMGT     = 9,
0173     ISTATE_SEND_ASYNCMSG        = 10,
0174     ISTATE_SENT_ASYNCMSG        = 11,
0175     ISTATE_SEND_DATAIN      = 12,
0176     ISTATE_SEND_LAST_DATAIN     = 13,
0177     ISTATE_SENT_LAST_DATAIN     = 14,
0178     ISTATE_SEND_LOGOUTRSP       = 15,
0179     ISTATE_SENT_LOGOUTRSP       = 16,
0180     ISTATE_SEND_NOPIN       = 17,
0181     ISTATE_SENT_NOPIN       = 18,
0182     ISTATE_SEND_REJECT      = 19,
0183     ISTATE_SENT_REJECT      = 20,
0184     ISTATE_SEND_R2T         = 21,
0185     ISTATE_SENT_R2T         = 22,
0186     ISTATE_SEND_R2T_RECOVERY    = 23,
0187     ISTATE_SENT_R2T_RECOVERY    = 24,
0188     ISTATE_SEND_LAST_R2T        = 25,
0189     ISTATE_SENT_LAST_R2T        = 26,
0190     ISTATE_SEND_LAST_R2T_RECOVERY   = 27,
0191     ISTATE_SENT_LAST_R2T_RECOVERY   = 28,
0192     ISTATE_SEND_STATUS      = 29,
0193     ISTATE_SEND_STATUS_BROKEN_PC    = 30,
0194     ISTATE_SENT_STATUS      = 31,
0195     ISTATE_SEND_STATUS_RECOVERY = 32,
0196     ISTATE_SENT_STATUS_RECOVERY = 33,
0197     ISTATE_SEND_TASKMGTRSP      = 34,
0198     ISTATE_SENT_TASKMGTRSP      = 35,
0199     ISTATE_SEND_TEXTRSP     = 36,
0200     ISTATE_SENT_TEXTRSP     = 37,
0201     ISTATE_SEND_NOPIN_WANT_RESPONSE = 38,
0202     ISTATE_SENT_NOPIN_WANT_RESPONSE = 39,
0203     ISTATE_SEND_NOPIN_NO_RESPONSE   = 40,
0204     ISTATE_REMOVE           = 41,
0205     ISTATE_FREE         = 42,
0206 };
0207 
0208 /* Used for iscsi_recover_cmdsn() return values */
0209 enum recover_cmdsn_ret_table {
0210     CMDSN_ERROR_CANNOT_RECOVER  = -1,
0211     CMDSN_NORMAL_OPERATION      = 0,
0212     CMDSN_LOWER_THAN_EXP        = 1,
0213     CMDSN_HIGHER_THAN_EXP       = 2,
0214     CMDSN_MAXCMDSN_OVERRUN      = 3,
0215 };
0216 
0217 /* Used for iscsi_handle_immediate_data() return values */
0218 enum immedate_data_ret_table {
0219     IMMEDIATE_DATA_CANNOT_RECOVER   = -1,
0220     IMMEDIATE_DATA_NORMAL_OPERATION = 0,
0221     IMMEDIATE_DATA_ERL1_CRC_FAILURE = 1,
0222 };
0223 
0224 /* Used for iscsi_decide_dataout_action() return values */
0225 enum dataout_action_ret_table {
0226     DATAOUT_CANNOT_RECOVER      = -1,
0227     DATAOUT_NORMAL          = 0,
0228     DATAOUT_SEND_R2T        = 1,
0229     DATAOUT_SEND_TO_TRANSPORT   = 2,
0230     DATAOUT_WITHIN_COMMAND_RECOVERY = 3,
0231 };
0232 
0233 /* Used for struct iscsi_node_auth->naf_flags */
0234 enum naf_flags_table {
0235     NAF_USERID_SET          = 0x01,
0236     NAF_PASSWORD_SET        = 0x02,
0237     NAF_USERID_IN_SET       = 0x04,
0238     NAF_PASSWORD_IN_SET     = 0x08,
0239 };
0240 
0241 /* Used by various struct timer_list to manage iSCSI specific state */
0242 enum iscsi_timer_flags_table {
0243     ISCSI_TF_RUNNING        = 0x01,
0244     ISCSI_TF_STOP           = 0x02,
0245     ISCSI_TF_EXPIRED        = 0x04,
0246 };
0247 
0248 /* Used for struct iscsi_np->np_flags */
0249 enum np_flags_table {
0250     NPF_IP_NETWORK      = 0x00,
0251 };
0252 
0253 /* Used for struct iscsi_np->np_thread_state */
0254 enum np_thread_state_table {
0255     ISCSI_NP_THREAD_ACTIVE      = 1,
0256     ISCSI_NP_THREAD_INACTIVE    = 2,
0257     ISCSI_NP_THREAD_RESET       = 3,
0258     ISCSI_NP_THREAD_SHUTDOWN    = 4,
0259     ISCSI_NP_THREAD_EXIT        = 5,
0260 };
0261 
0262 struct iscsi_conn_ops {
0263     u8  HeaderDigest;           /* [0,1] == [None,CRC32C] */
0264     u8  DataDigest;         /* [0,1] == [None,CRC32C] */
0265     u32 MaxRecvDataSegmentLength;   /* [512..2**24-1] */
0266     u32 MaxXmitDataSegmentLength;   /* [512..2**24-1] */
0267     /*
0268      * iSER specific connection parameters
0269      */
0270     u32 InitiatorRecvDataSegmentLength; /* [512..2**24-1] */
0271     u32 TargetRecvDataSegmentLength;    /* [512..2**24-1] */
0272 };
0273 
0274 struct iscsi_sess_ops {
0275     char    InitiatorName[ISCSI_IQN_LEN];
0276     char    InitiatorAlias[256];
0277     char    TargetName[ISCSI_IQN_LEN];
0278     char    TargetAlias[256];
0279     char    TargetAddress[256];
0280     u16 TargetPortalGroupTag;       /* [0..65535] */
0281     u16 MaxConnections;         /* [1..65535] */
0282     u8  InitialR2T;         /* [0,1] == [No,Yes] */
0283     u8  ImmediateData;          /* [0,1] == [No,Yes] */
0284     u32 MaxBurstLength;         /* [512..2**24-1] */
0285     u32 FirstBurstLength;       /* [512..2**24-1] */
0286     u16 DefaultTime2Wait;       /* [0..3600] */
0287     u16 DefaultTime2Retain;     /* [0..3600] */
0288     u16 MaxOutstandingR2T;      /* [1..65535] */
0289     u8  DataPDUInOrder;         /* [0,1] == [No,Yes] */
0290     u8  DataSequenceInOrder;        /* [0,1] == [No,Yes] */
0291     u8  ErrorRecoveryLevel;     /* [0..2] */
0292     u8  SessionType;            /* [0,1] == [Normal,Discovery]*/
0293     /*
0294      * iSER specific session parameters
0295      */
0296     u8  RDMAExtensions;         /* [0,1] == [No,Yes] */
0297 };
0298 
0299 struct iscsi_queue_req {
0300     int         state;
0301     struct iscsit_cmd   *cmd;
0302     struct list_head    qr_list;
0303 };
0304 
0305 struct iscsi_param_list {
0306     bool            iser;
0307     struct list_head    param_list;
0308     struct list_head    extra_response_list;
0309 };
0310 
0311 struct iscsi_datain_req {
0312     enum datain_req_comp_table dr_complete;
0313     int         generate_recovery_values;
0314     enum datain_req_rec_table recovery;
0315     u32         begrun;
0316     u32         runlength;
0317     u32         data_length;
0318     u32         data_offset;
0319     u32         data_sn;
0320     u32         next_burst_len;
0321     u32         read_data_done;
0322     u32         seq_send_order;
0323     struct list_head    cmd_datain_node;
0324 } ____cacheline_aligned;
0325 
0326 struct iscsi_ooo_cmdsn {
0327     u16         cid;
0328     u32         batch_count;
0329     u32         cmdsn;
0330     u32         exp_cmdsn;
0331     struct iscsit_cmd   *cmd;
0332     struct list_head    ooo_list;
0333 } ____cacheline_aligned;
0334 
0335 struct iscsi_datain {
0336     u8          flags;
0337     u32         data_sn;
0338     u32         length;
0339     u32         offset;
0340 } ____cacheline_aligned;
0341 
0342 struct iscsi_r2t {
0343     int         seq_complete;
0344     int         recovery_r2t;
0345     int         sent_r2t;
0346     u32         r2t_sn;
0347     u32         offset;
0348     u32         targ_xfer_tag;
0349     u32         xfer_len;
0350     struct list_head    r2t_list;
0351 } ____cacheline_aligned;
0352 
0353 struct iscsit_cmd {
0354     enum iscsi_timer_flags_table dataout_timer_flags;
0355     /* DataOUT timeout retries */
0356     u8          dataout_timeout_retries;
0357     /* Within command recovery count */
0358     u8          error_recovery_count;
0359     /* iSCSI dependent state for out or order CmdSNs */
0360     enum cmd_i_state_table  deferred_i_state;
0361     /* iSCSI dependent state */
0362     enum cmd_i_state_table  i_state;
0363     /* Command is an immediate command (ISCSI_OP_IMMEDIATE set) */
0364     u8          immediate_cmd;
0365     /* Immediate data present */
0366     u8          immediate_data;
0367     /* iSCSI Opcode */
0368     u8          iscsi_opcode;
0369     /* iSCSI Response Code */
0370     u8          iscsi_response;
0371     /* Logout reason when iscsi_opcode == ISCSI_INIT_LOGOUT_CMND */
0372     u8          logout_reason;
0373     /* Logout response code when iscsi_opcode == ISCSI_INIT_LOGOUT_CMND */
0374     u8          logout_response;
0375     /* MaxCmdSN has been incremented */
0376     u8          maxcmdsn_inc;
0377     /* Immediate Unsolicited Dataout */
0378     u8          unsolicited_data;
0379     /* Reject reason code */
0380     u8          reject_reason;
0381     /* CID contained in logout PDU when opcode == ISCSI_INIT_LOGOUT_CMND */
0382     u16         logout_cid;
0383     /* Command flags */
0384     enum cmd_flags_table    cmd_flags;
0385     /* Initiator Task Tag assigned from Initiator */
0386     itt_t           init_task_tag;
0387     /* Target Transfer Tag assigned from Target */
0388     u32         targ_xfer_tag;
0389     /* CmdSN assigned from Initiator */
0390     u32         cmd_sn;
0391     /* ExpStatSN assigned from Initiator */
0392     u32         exp_stat_sn;
0393     /* StatSN assigned to this ITT */
0394     u32         stat_sn;
0395     /* DataSN Counter */
0396     u32         data_sn;
0397     /* R2TSN Counter */
0398     u32         r2t_sn;
0399     /* Last DataSN acknowledged via DataAck SNACK */
0400     u32         acked_data_sn;
0401     /* Used for echoing NOPOUT ping data */
0402     u32         buf_ptr_size;
0403     /* Used to store DataDigest */
0404     u32         data_crc;
0405     /* Counter for MaxOutstandingR2T */
0406     u32         outstanding_r2ts;
0407     /* Next R2T Offset when DataSequenceInOrder=Yes */
0408     u32         r2t_offset;
0409     /* Iovec current and orig count for iscsit_cmd->iov_data */
0410     u32         iov_data_count;
0411     u32         orig_iov_data_count;
0412     /* Number of miscellaneous iovecs used for IP stack calls */
0413     u32         iov_misc_count;
0414     /* Number of struct iscsi_pdu in struct iscsit_cmd->pdu_list */
0415     u32         pdu_count;
0416     /* Next struct iscsi_pdu to send in struct iscsit_cmd->pdu_list */
0417     u32         pdu_send_order;
0418     /* Current struct iscsi_pdu in struct iscsit_cmd->pdu_list */
0419     u32         pdu_start;
0420     /* Next struct iscsi_seq to send in struct iscsit_cmd->seq_list */
0421     u32         seq_send_order;
0422     /* Number of struct iscsi_seq in struct iscsit_cmd->seq_list */
0423     u32         seq_count;
0424     /* Current struct iscsi_seq in struct iscsit_cmd->seq_list */
0425     u32         seq_no;
0426     /* Lowest offset in current DataOUT sequence */
0427     u32         seq_start_offset;
0428     /* Highest offset in current DataOUT sequence */
0429     u32         seq_end_offset;
0430     /* Total size in bytes received so far of READ data */
0431     u32         read_data_done;
0432     /* Total size in bytes received so far of WRITE data */
0433     u32         write_data_done;
0434     /* Counter for FirstBurstLength key */
0435     u32         first_burst_len;
0436     /* Counter for MaxBurstLength key */
0437     u32         next_burst_len;
0438     /* Transfer size used for IP stack calls */
0439     u32         tx_size;
0440     /* Buffer used for various purposes */
0441     void            *buf_ptr;
0442     /* Used by SendTargets=[iqn.,eui.] discovery */
0443     void            *text_in_ptr;
0444     /* See include/linux/dma-mapping.h */
0445     enum dma_data_direction data_direction;
0446     /* iSCSI PDU Header + CRC */
0447     unsigned char       pdu[ISCSI_HDR_LEN + ISCSI_CRC_LEN];
0448     /* Number of times struct iscsit_cmd is present in immediate queue */
0449     atomic_t        immed_queue_count;
0450     atomic_t        response_queue_count;
0451     spinlock_t      datain_lock;
0452     spinlock_t      dataout_timeout_lock;
0453     /* spinlock for protecting struct iscsit_cmd->i_state */
0454     spinlock_t      istate_lock;
0455     /* spinlock for adding within command recovery entries */
0456     spinlock_t      error_lock;
0457     /* spinlock for adding R2Ts */
0458     spinlock_t      r2t_lock;
0459     /* DataIN List */
0460     struct list_head    datain_list;
0461     /* R2T List */
0462     struct list_head    cmd_r2t_list;
0463     /* Timer for DataOUT */
0464     struct timer_list   dataout_timer;
0465     /* Iovecs for SCSI data payload RX/TX w/ kernel level sockets */
0466     struct kvec     *iov_data;
0467     void            *overflow_buf;
0468     /* Iovecs for miscellaneous purposes */
0469 #define ISCSI_MISC_IOVECS           5
0470     struct kvec     iov_misc[ISCSI_MISC_IOVECS];
0471     /* Array of struct iscsi_pdu used for DataPDUInOrder=No */
0472     struct iscsi_pdu    *pdu_list;
0473     /* Current struct iscsi_pdu used for DataPDUInOrder=No */
0474     struct iscsi_pdu    *pdu_ptr;
0475     /* Array of struct iscsi_seq used for DataSequenceInOrder=No */
0476     struct iscsi_seq    *seq_list;
0477     /* Current struct iscsi_seq used for DataSequenceInOrder=No */
0478     struct iscsi_seq    *seq_ptr;
0479     /* TMR Request when iscsi_opcode == ISCSI_OP_SCSI_TMFUNC */
0480     struct iscsi_tmr_req    *tmr_req;
0481     /* Connection this command is alligient to */
0482     struct iscsit_conn  *conn;
0483     /* Pointer to connection recovery entry */
0484     struct iscsi_conn_recovery *cr;
0485     /* Session the command is part of,  used for connection recovery */
0486     struct iscsit_session   *sess;
0487     /* list_head for connection list */
0488     struct list_head    i_conn_node;
0489     /* The TCM I/O descriptor that is accessed via container_of() */
0490     struct se_cmd       se_cmd;
0491     /* Sense buffer that will be mapped into outgoing status */
0492 #define ISCSI_SENSE_BUFFER_LEN          (TRANSPORT_SENSE_BUFFER + 2)
0493     unsigned char       sense_buffer[ISCSI_SENSE_BUFFER_LEN];
0494 
0495     u32         padding;
0496     u8          pad_bytes[4];
0497 
0498     struct scatterlist  *first_data_sg;
0499     u32         first_data_sg_off;
0500     u32         kmapped_nents;
0501     sense_reason_t      sense_reason;
0502 }  ____cacheline_aligned;
0503 
0504 struct iscsi_tmr_req {
0505     bool            task_reassign:1;
0506     u32         exp_data_sn;
0507     struct iscsit_cmd   *ref_cmd;
0508     struct iscsi_conn_recovery *conn_recovery;
0509     struct se_tmr_req   *se_tmr_req;
0510 };
0511 
0512 struct iscsit_conn {
0513     wait_queue_head_t   queues_wq;
0514     /* Authentication Successful for this connection */
0515     u8          auth_complete;
0516     /* State connection is currently in */
0517     u8          conn_state;
0518     u8          conn_logout_reason;
0519     u8          network_transport;
0520     enum iscsi_timer_flags_table nopin_timer_flags;
0521     enum iscsi_timer_flags_table nopin_response_timer_flags;
0522     /* Used to know what thread encountered a transport failure */
0523     u8          which_thread;
0524     /* connection id assigned by the Initiator */
0525     u16         cid;
0526     /* Remote TCP Port */
0527     u16         login_port;
0528     int         net_size;
0529     int         login_family;
0530     u32         auth_id;
0531     u32         conn_flags;
0532     /* Used for iscsi_tx_login_rsp() */
0533     itt_t           login_itt;
0534     u32         exp_statsn;
0535     /* Per connection status sequence number */
0536     u32         stat_sn;
0537     struct sockaddr_storage login_sockaddr;
0538     struct sockaddr_storage local_sockaddr;
0539     int         conn_usage_count;
0540     int         conn_waiting_on_uc;
0541     atomic_t        check_immediate_queue;
0542     atomic_t        conn_logout_remove;
0543     atomic_t        connection_exit;
0544     atomic_t        connection_recovery;
0545     atomic_t        connection_reinstatement;
0546     atomic_t        connection_wait_rcfr;
0547     atomic_t        sleep_on_conn_wait_comp;
0548     atomic_t        transport_failed;
0549     struct completion   conn_post_wait_comp;
0550     struct completion   conn_wait_comp;
0551     struct completion   conn_wait_rcfr_comp;
0552     struct completion   conn_waiting_on_uc_comp;
0553     struct completion   conn_logout_comp;
0554     struct completion   tx_half_close_comp;
0555     struct completion   rx_half_close_comp;
0556     /* socket used by this connection */
0557     struct socket       *sock;
0558     void            (*orig_data_ready)(struct sock *);
0559     void            (*orig_state_change)(struct sock *);
0560 #define LOGIN_FLAGS_READY       0
0561 #define LOGIN_FLAGS_INITIAL_PDU     1
0562 #define LOGIN_FLAGS_READ_ACTIVE     2
0563 #define LOGIN_FLAGS_WRITE_ACTIVE    3
0564 #define LOGIN_FLAGS_CLOSED      4
0565     unsigned long       login_flags;
0566     struct delayed_work login_work;
0567     struct iscsi_login  *login;
0568     struct timer_list   nopin_timer;
0569     struct timer_list   nopin_response_timer;
0570     struct timer_list   transport_timer;
0571     struct task_struct  *login_kworker;
0572     /* Spinlock used for add/deleting cmd's from conn_cmd_list */
0573     spinlock_t      cmd_lock;
0574     spinlock_t      conn_usage_lock;
0575     spinlock_t      immed_queue_lock;
0576     spinlock_t      nopin_timer_lock;
0577     spinlock_t      response_queue_lock;
0578     spinlock_t      state_lock;
0579     /* libcrypto RX and TX contexts for crc32c */
0580     struct ahash_request    *conn_rx_hash;
0581     struct ahash_request    *conn_tx_hash;
0582     /* Used for scheduling TX and RX connection kthreads */
0583     cpumask_var_t       conn_cpumask;
0584     cpumask_var_t       allowed_cpumask;
0585     unsigned int        conn_rx_reset_cpumask:1;
0586     unsigned int        conn_tx_reset_cpumask:1;
0587     /* list_head of struct iscsit_cmd for this connection */
0588     struct list_head    conn_cmd_list;
0589     struct list_head    immed_queue_list;
0590     struct list_head    response_queue_list;
0591     struct iscsi_conn_ops   *conn_ops;
0592     struct iscsi_login  *conn_login;
0593     struct iscsit_transport *conn_transport;
0594     struct iscsi_param_list *param_list;
0595     /* Used for per connection auth state machine */
0596     void            *auth_protocol;
0597     void            *context;
0598     struct iscsi_login_thread_s *login_thread;
0599     struct iscsi_portal_group *tpg;
0600     struct iscsi_tpg_np *tpg_np;
0601     /* Pointer to parent session */
0602     struct iscsit_session   *sess;
0603     int         bitmap_id;
0604     int         rx_thread_active;
0605     struct task_struct  *rx_thread;
0606     struct completion   rx_login_comp;
0607     int         tx_thread_active;
0608     struct task_struct  *tx_thread;
0609     /* list_head for session connection list */
0610     struct list_head    conn_list;
0611 } ____cacheline_aligned;
0612 
0613 struct iscsi_conn_recovery {
0614     u16         cid;
0615     u32         cmd_count;
0616     u32         maxrecvdatasegmentlength;
0617     u32         maxxmitdatasegmentlength;
0618     int         ready_for_reallegiance;
0619     struct list_head    conn_recovery_cmd_list;
0620     spinlock_t      conn_recovery_cmd_lock;
0621     struct timer_list   time2retain_timer;
0622     struct iscsit_session   *sess;
0623     struct list_head    cr_list;
0624 }  ____cacheline_aligned;
0625 
0626 struct iscsit_session {
0627     u8          initiator_vendor;
0628     u8          isid[6];
0629     enum iscsi_timer_flags_table time2retain_timer_flags;
0630     u8          version_active;
0631     u16         cid_called;
0632     u16         conn_recovery_count;
0633     u16         tsih;
0634     /* state session is currently in */
0635     u32         session_state;
0636     /* session wide counter: initiator assigned task tag */
0637     itt_t           init_task_tag;
0638     /* session wide counter: target assigned task tag */
0639     u32         targ_xfer_tag;
0640     u32         cmdsn_window;
0641 
0642     /* protects cmdsn values */
0643     struct mutex        cmdsn_mutex;
0644     /* session wide counter: expected command sequence number */
0645     u32         exp_cmd_sn;
0646     /* session wide counter: maximum allowed command sequence number */
0647     atomic_t        max_cmd_sn;
0648     struct list_head    sess_ooo_cmdsn_list;
0649 
0650     /* LIO specific session ID */
0651     u32         sid;
0652     char            auth_type[8];
0653     /* unique within the target */
0654     int         session_index;
0655     /* Used for session reference counting */
0656     int         session_usage_count;
0657     int         session_waiting_on_uc;
0658     atomic_long_t       cmd_pdus;
0659     atomic_long_t       rsp_pdus;
0660     atomic_long_t       tx_data_octets;
0661     atomic_long_t       rx_data_octets;
0662     atomic_long_t       conn_digest_errors;
0663     atomic_long_t       conn_timeout_errors;
0664     u64         creation_time;
0665     /* Number of active connections */
0666     atomic_t        nconn;
0667     atomic_t        session_continuation;
0668     atomic_t        session_fall_back_to_erl0;
0669     atomic_t        session_logout;
0670     atomic_t        session_reinstatement;
0671     atomic_t        session_stop_active;
0672     atomic_t        session_close;
0673     /* connection list */
0674     struct list_head    sess_conn_list;
0675     struct list_head    cr_active_list;
0676     struct list_head    cr_inactive_list;
0677     spinlock_t      conn_lock;
0678     spinlock_t      cr_a_lock;
0679     spinlock_t      cr_i_lock;
0680     spinlock_t      session_usage_lock;
0681     spinlock_t      ttt_lock;
0682     struct completion   async_msg_comp;
0683     struct completion   reinstatement_comp;
0684     struct completion   session_wait_comp;
0685     struct completion   session_waiting_on_uc_comp;
0686     struct timer_list   time2retain_timer;
0687     struct iscsi_sess_ops   *sess_ops;
0688     struct se_session   *se_sess;
0689     struct iscsi_portal_group *tpg;
0690 } ____cacheline_aligned;
0691 
0692 struct iscsi_login {
0693     u8 auth_complete;
0694     u8 checked_for_existing;
0695     u8 current_stage;
0696     u8 leading_connection;
0697     u8 first_request;
0698     u8 version_min;
0699     u8 version_max;
0700     u8 login_complete;
0701     u8 login_failed;
0702     bool zero_tsih;
0703     char isid[6];
0704     u32 cmd_sn;
0705     itt_t init_task_tag;
0706     u32 initial_exp_statsn;
0707     u32 rsp_length;
0708     u16 cid;
0709     u16 tsih;
0710     char req[ISCSI_HDR_LEN];
0711     char rsp[ISCSI_HDR_LEN];
0712     char *req_buf;
0713     char *rsp_buf;
0714     struct iscsit_conn *conn;
0715     struct iscsi_np *np;
0716 } ____cacheline_aligned;
0717 
0718 struct iscsi_node_attrib {
0719     s32         authentication;
0720     u32         dataout_timeout;
0721     u32         dataout_timeout_retries;
0722     u32         default_erl;
0723     u32         nopin_timeout;
0724     u32         nopin_response_timeout;
0725     u32         random_datain_pdu_offsets;
0726     u32         random_datain_seq_offsets;
0727     u32         random_r2t_offsets;
0728     u32         tmr_cold_reset;
0729     u32         tmr_warm_reset;
0730     struct iscsi_node_acl *nacl;
0731 };
0732 
0733 struct se_dev_entry_s;
0734 
0735 struct iscsi_node_auth {
0736     enum naf_flags_table    naf_flags;
0737     int         authenticate_target;
0738     /* Used for iscsit_global->discovery_auth,
0739      * set to zero (auth disabled) by default */
0740     int         enforce_discovery_auth;
0741 #define MAX_USER_LEN                256
0742 #define MAX_PASS_LEN                256
0743     char            userid[MAX_USER_LEN];
0744     char            password[MAX_PASS_LEN];
0745     char            userid_mutual[MAX_USER_LEN];
0746     char            password_mutual[MAX_PASS_LEN];
0747 };
0748 
0749 #include "iscsi_target_stat.h"
0750 
0751 struct iscsi_node_stat_grps {
0752     struct config_group iscsi_sess_stats_group;
0753     struct config_group iscsi_conn_stats_group;
0754 };
0755 
0756 struct iscsi_node_acl {
0757     struct se_node_acl  se_node_acl;
0758     struct iscsi_node_attrib node_attrib;
0759     struct iscsi_node_auth  node_auth;
0760     struct iscsi_node_stat_grps node_stat_grps;
0761 };
0762 
0763 static inline struct iscsi_node_acl *
0764 to_iscsi_nacl(struct se_node_acl *se_nacl)
0765 {
0766     return container_of(se_nacl, struct iscsi_node_acl, se_node_acl);
0767 }
0768 
0769 struct iscsi_tpg_attrib {
0770     u32         authentication;
0771     u32         login_timeout;
0772     u32         netif_timeout;
0773     u32         generate_node_acls;
0774     u32         cache_dynamic_acls;
0775     u32         default_cmdsn_depth;
0776     u32         demo_mode_write_protect;
0777     u32         prod_mode_write_protect;
0778     u32         demo_mode_discovery;
0779     u32         default_erl;
0780     u8          t10_pi;
0781     u32         fabric_prot_type;
0782     u32         tpg_enabled_sendtargets;
0783     u32         login_keys_workaround;
0784     struct iscsi_portal_group *tpg;
0785 };
0786 
0787 struct iscsi_np {
0788     int         np_network_transport;
0789     int         np_ip_proto;
0790     int         np_sock_type;
0791     enum np_thread_state_table np_thread_state;
0792     bool                    enabled;
0793     atomic_t        np_reset_count;
0794     enum iscsi_timer_flags_table np_login_timer_flags;
0795     u32         np_exports;
0796     enum np_flags_table np_flags;
0797     spinlock_t      np_thread_lock;
0798     struct completion   np_restart_comp;
0799     struct socket       *np_socket;
0800     struct sockaddr_storage np_sockaddr;
0801     struct task_struct  *np_thread;
0802     struct timer_list   np_login_timer;
0803     void            *np_context;
0804     struct iscsit_transport *np_transport;
0805     struct list_head    np_list;
0806 } ____cacheline_aligned;
0807 
0808 struct iscsi_tpg_np {
0809     struct iscsi_np     *tpg_np;
0810     struct iscsi_portal_group *tpg;
0811     struct iscsi_tpg_np *tpg_np_parent;
0812     struct list_head    tpg_np_list;
0813     struct list_head    tpg_np_child_list;
0814     struct list_head    tpg_np_parent_list;
0815     struct se_tpg_np    se_tpg_np;
0816     spinlock_t      tpg_np_parent_lock;
0817     struct completion   tpg_np_comp;
0818     struct kref     tpg_np_kref;
0819 };
0820 
0821 struct iscsi_portal_group {
0822     unsigned char       tpg_chap_id;
0823     /* TPG State */
0824     enum tpg_state_table    tpg_state;
0825     /* Target Portal Group Tag */
0826     u16         tpgt;
0827     /* Id assigned to target sessions */
0828     u16         ntsih;
0829     /* Number of active sessions */
0830     u32         nsessions;
0831     /* Number of Network Portals available for this TPG */
0832     u32         num_tpg_nps;
0833     /* Per TPG LIO specific session ID. */
0834     u32         sid;
0835     /* Spinlock for adding/removing Network Portals */
0836     spinlock_t      tpg_np_lock;
0837     spinlock_t      tpg_state_lock;
0838     struct se_portal_group tpg_se_tpg;
0839     struct mutex        tpg_access_lock;
0840     struct semaphore    np_login_sem;
0841     struct iscsi_tpg_attrib tpg_attrib;
0842     struct iscsi_node_auth  tpg_demo_auth;
0843     /* Pointer to default list of iSCSI parameters for TPG */
0844     struct iscsi_param_list *param_list;
0845     struct iscsi_tiqn   *tpg_tiqn;
0846     struct list_head    tpg_gnp_list;
0847     struct list_head    tpg_list;
0848 } ____cacheline_aligned;
0849 
0850 static inline struct iscsi_portal_group *
0851 to_iscsi_tpg(struct se_portal_group *se_tpg)
0852 {
0853     return container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg);
0854 }
0855 
0856 struct iscsi_wwn_stat_grps {
0857     struct config_group iscsi_stat_group;
0858     struct config_group iscsi_instance_group;
0859     struct config_group iscsi_sess_err_group;
0860     struct config_group iscsi_tgt_attr_group;
0861     struct config_group iscsi_login_stats_group;
0862     struct config_group iscsi_logout_stats_group;
0863 };
0864 
0865 struct iscsi_tiqn {
0866     unsigned char       tiqn[ISCSI_IQN_LEN];
0867     enum tiqn_state_table   tiqn_state;
0868     int         tiqn_access_count;
0869     u32         tiqn_active_tpgs;
0870     u32         tiqn_ntpgs;
0871     u32         tiqn_num_tpg_nps;
0872     u32         tiqn_nsessions;
0873     struct list_head    tiqn_list;
0874     struct list_head    tiqn_tpg_list;
0875     spinlock_t      tiqn_state_lock;
0876     spinlock_t      tiqn_tpg_lock;
0877     struct se_wwn       tiqn_wwn;
0878     struct iscsi_wwn_stat_grps tiqn_stat_grps;
0879     int         tiqn_index;
0880     struct iscsi_sess_err_stats  sess_err_stats;
0881     struct iscsi_login_stats     login_stats;
0882     struct iscsi_logout_stats    logout_stats;
0883 } ____cacheline_aligned;
0884 
0885 struct iscsit_global {
0886     /* In core shutdown */
0887     u32         in_shutdown;
0888     u32         active_ts;
0889     /* Unique identifier used for the authentication daemon */
0890     u32         auth_id;
0891     u32         inactive_ts;
0892 #define ISCSIT_BITMAP_BITS  262144
0893     /* Thread Set bitmap pointer */
0894     unsigned long       *ts_bitmap;
0895     spinlock_t      ts_bitmap_lock;
0896     cpumask_var_t       allowed_cpumask;
0897     /* Used for iSCSI discovery session authentication */
0898     struct iscsi_node_acl   discovery_acl;
0899     struct iscsi_portal_group   *discovery_tpg;
0900 };
0901 
0902 static inline u32 session_get_next_ttt(struct iscsit_session *session)
0903 {
0904     u32 ttt;
0905 
0906     spin_lock_bh(&session->ttt_lock);
0907     ttt = session->targ_xfer_tag++;
0908     if (ttt == 0xFFFFFFFF)
0909         ttt = session->targ_xfer_tag++;
0910     spin_unlock_bh(&session->ttt_lock);
0911 
0912     return ttt;
0913 }
0914 
0915 extern struct iscsit_cmd *iscsit_find_cmd_from_itt(struct iscsit_conn *, itt_t);
0916 
0917 extern void iscsit_thread_check_cpumask(struct iscsit_conn *conn,
0918                     struct task_struct *p,
0919                     int mode);
0920 
0921 #endif /* ISCSI_TARGET_CORE_H */