18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#include "iscsi_target_core.h" /* struct iscsi_cmd */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_cistruct sockaddr_storage;
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_cistruct iscsit_transport {
78c2ecf20Sopenharmony_ci#define ISCSIT_TRANSPORT_NAME	16
88c2ecf20Sopenharmony_ci	char name[ISCSIT_TRANSPORT_NAME];
98c2ecf20Sopenharmony_ci	int transport_type;
108c2ecf20Sopenharmony_ci	bool rdma_shutdown;
118c2ecf20Sopenharmony_ci	int priv_size;
128c2ecf20Sopenharmony_ci	struct module *owner;
138c2ecf20Sopenharmony_ci	struct list_head t_node;
148c2ecf20Sopenharmony_ci	int (*iscsit_setup_np)(struct iscsi_np *, struct sockaddr_storage *);
158c2ecf20Sopenharmony_ci	int (*iscsit_accept_np)(struct iscsi_np *, struct iscsi_conn *);
168c2ecf20Sopenharmony_ci	void (*iscsit_free_np)(struct iscsi_np *);
178c2ecf20Sopenharmony_ci	void (*iscsit_wait_conn)(struct iscsi_conn *);
188c2ecf20Sopenharmony_ci	void (*iscsit_free_conn)(struct iscsi_conn *);
198c2ecf20Sopenharmony_ci	int (*iscsit_get_login_rx)(struct iscsi_conn *, struct iscsi_login *);
208c2ecf20Sopenharmony_ci	int (*iscsit_put_login_tx)(struct iscsi_conn *, struct iscsi_login *, u32);
218c2ecf20Sopenharmony_ci	int (*iscsit_immediate_queue)(struct iscsi_conn *, struct iscsi_cmd *, int);
228c2ecf20Sopenharmony_ci	int (*iscsit_response_queue)(struct iscsi_conn *, struct iscsi_cmd *, int);
238c2ecf20Sopenharmony_ci	int (*iscsit_get_dataout)(struct iscsi_conn *, struct iscsi_cmd *, bool);
248c2ecf20Sopenharmony_ci	int (*iscsit_queue_data_in)(struct iscsi_conn *, struct iscsi_cmd *);
258c2ecf20Sopenharmony_ci	int (*iscsit_queue_status)(struct iscsi_conn *, struct iscsi_cmd *);
268c2ecf20Sopenharmony_ci	void (*iscsit_aborted_task)(struct iscsi_conn *, struct iscsi_cmd *);
278c2ecf20Sopenharmony_ci	int (*iscsit_xmit_pdu)(struct iscsi_conn *, struct iscsi_cmd *,
288c2ecf20Sopenharmony_ci			       struct iscsi_datain_req *, const void *, u32);
298c2ecf20Sopenharmony_ci	void (*iscsit_unmap_cmd)(struct iscsi_conn *, struct iscsi_cmd *);
308c2ecf20Sopenharmony_ci	void (*iscsit_get_rx_pdu)(struct iscsi_conn *);
318c2ecf20Sopenharmony_ci	int (*iscsit_validate_params)(struct iscsi_conn *);
328c2ecf20Sopenharmony_ci	void (*iscsit_get_r2t_ttt)(struct iscsi_conn *, struct iscsi_cmd *,
338c2ecf20Sopenharmony_ci				   struct iscsi_r2t *);
348c2ecf20Sopenharmony_ci	enum target_prot_op (*iscsit_get_sup_prot_ops)(struct iscsi_conn *);
358c2ecf20Sopenharmony_ci};
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cistatic inline void *iscsit_priv_cmd(struct iscsi_cmd *cmd)
388c2ecf20Sopenharmony_ci{
398c2ecf20Sopenharmony_ci	return (void *)(cmd + 1);
408c2ecf20Sopenharmony_ci}
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci/*
438c2ecf20Sopenharmony_ci * From iscsi_target_transport.c
448c2ecf20Sopenharmony_ci */
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ciextern void iscsit_register_transport(struct iscsit_transport *);
478c2ecf20Sopenharmony_ciextern void iscsit_unregister_transport(struct iscsit_transport *);
488c2ecf20Sopenharmony_ciextern struct iscsit_transport *iscsit_get_transport(int);
498c2ecf20Sopenharmony_ciextern void iscsit_put_transport(struct iscsit_transport *);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci/*
528c2ecf20Sopenharmony_ci * From iscsi_target.c
538c2ecf20Sopenharmony_ci */
548c2ecf20Sopenharmony_ciextern int iscsit_setup_scsi_cmd(struct iscsi_conn *, struct iscsi_cmd *,
558c2ecf20Sopenharmony_ci				unsigned char *);
568c2ecf20Sopenharmony_ciextern void iscsit_set_unsolicited_dataout(struct iscsi_cmd *);
578c2ecf20Sopenharmony_ciextern int iscsit_process_scsi_cmd(struct iscsi_conn *, struct iscsi_cmd *,
588c2ecf20Sopenharmony_ci				struct iscsi_scsi_req *);
598c2ecf20Sopenharmony_ciextern int
608c2ecf20Sopenharmony_ci__iscsit_check_dataout_hdr(struct iscsi_conn *, void *,
618c2ecf20Sopenharmony_ci			   struct iscsi_cmd *, u32, bool *);
628c2ecf20Sopenharmony_ciextern int
638c2ecf20Sopenharmony_ciiscsit_check_dataout_hdr(struct iscsi_conn *conn, void *buf,
648c2ecf20Sopenharmony_ci			 struct iscsi_cmd **out_cmd);
658c2ecf20Sopenharmony_ciextern int iscsit_check_dataout_payload(struct iscsi_cmd *, struct iscsi_data *,
668c2ecf20Sopenharmony_ci				bool);
678c2ecf20Sopenharmony_ciextern int iscsit_setup_nop_out(struct iscsi_conn *, struct iscsi_cmd *,
688c2ecf20Sopenharmony_ci				struct iscsi_nopout *);
698c2ecf20Sopenharmony_ciextern int iscsit_process_nop_out(struct iscsi_conn *, struct iscsi_cmd *,
708c2ecf20Sopenharmony_ci				struct iscsi_nopout *);
718c2ecf20Sopenharmony_ciextern int iscsit_handle_logout_cmd(struct iscsi_conn *, struct iscsi_cmd *,
728c2ecf20Sopenharmony_ci				unsigned char *);
738c2ecf20Sopenharmony_ciextern int iscsit_handle_task_mgt_cmd(struct iscsi_conn *, struct iscsi_cmd *,
748c2ecf20Sopenharmony_ci				unsigned char *);
758c2ecf20Sopenharmony_ciextern int iscsit_setup_text_cmd(struct iscsi_conn *, struct iscsi_cmd *,
768c2ecf20Sopenharmony_ci				 struct iscsi_text *);
778c2ecf20Sopenharmony_ciextern int iscsit_process_text_cmd(struct iscsi_conn *, struct iscsi_cmd *,
788c2ecf20Sopenharmony_ci				   struct iscsi_text *);
798c2ecf20Sopenharmony_ciextern void iscsit_build_rsp_pdu(struct iscsi_cmd *, struct iscsi_conn *,
808c2ecf20Sopenharmony_ci				bool, struct iscsi_scsi_rsp *);
818c2ecf20Sopenharmony_ciextern void iscsit_build_nopin_rsp(struct iscsi_cmd *, struct iscsi_conn *,
828c2ecf20Sopenharmony_ci				struct iscsi_nopin *, bool);
838c2ecf20Sopenharmony_ciextern void iscsit_build_task_mgt_rsp(struct iscsi_cmd *, struct iscsi_conn *,
848c2ecf20Sopenharmony_ci				struct iscsi_tm_rsp *);
858c2ecf20Sopenharmony_ciextern int iscsit_build_text_rsp(struct iscsi_cmd *, struct iscsi_conn *,
868c2ecf20Sopenharmony_ci				struct iscsi_text_rsp *,
878c2ecf20Sopenharmony_ci				enum iscsit_transport_type);
888c2ecf20Sopenharmony_ciextern void iscsit_build_reject(struct iscsi_cmd *, struct iscsi_conn *,
898c2ecf20Sopenharmony_ci				struct iscsi_reject *);
908c2ecf20Sopenharmony_ciextern int iscsit_build_logout_rsp(struct iscsi_cmd *, struct iscsi_conn *,
918c2ecf20Sopenharmony_ci				struct iscsi_logout_rsp *);
928c2ecf20Sopenharmony_ciextern int iscsit_logout_post_handler(struct iscsi_cmd *, struct iscsi_conn *);
938c2ecf20Sopenharmony_ciextern int iscsit_queue_rsp(struct iscsi_conn *, struct iscsi_cmd *);
948c2ecf20Sopenharmony_ciextern void iscsit_aborted_task(struct iscsi_conn *, struct iscsi_cmd *);
958c2ecf20Sopenharmony_ciextern int iscsit_add_reject(struct iscsi_conn *, u8, unsigned char *);
968c2ecf20Sopenharmony_ciextern int iscsit_reject_cmd(struct iscsi_cmd *, u8, unsigned char *);
978c2ecf20Sopenharmony_ciextern int iscsit_handle_snack(struct iscsi_conn *, unsigned char *);
988c2ecf20Sopenharmony_ciextern void iscsit_build_datain_pdu(struct iscsi_cmd *, struct iscsi_conn *,
998c2ecf20Sopenharmony_ci				    struct iscsi_datain *,
1008c2ecf20Sopenharmony_ci				    struct iscsi_data_rsp *, bool);
1018c2ecf20Sopenharmony_ciextern int iscsit_build_r2ts_for_cmd(struct iscsi_conn *, struct iscsi_cmd *,
1028c2ecf20Sopenharmony_ci				     bool);
1038c2ecf20Sopenharmony_ciextern int iscsit_immediate_queue(struct iscsi_conn *, struct iscsi_cmd *, int);
1048c2ecf20Sopenharmony_ciextern int iscsit_response_queue(struct iscsi_conn *, struct iscsi_cmd *, int);
1058c2ecf20Sopenharmony_ci/*
1068c2ecf20Sopenharmony_ci * From iscsi_target_device.c
1078c2ecf20Sopenharmony_ci */
1088c2ecf20Sopenharmony_ciextern void iscsit_increment_maxcmdsn(struct iscsi_cmd *, struct iscsi_session *);
1098c2ecf20Sopenharmony_ci/*
1108c2ecf20Sopenharmony_ci * From iscsi_target_erl0.c
1118c2ecf20Sopenharmony_ci */
1128c2ecf20Sopenharmony_ciextern void iscsit_cause_connection_reinstatement(struct iscsi_conn *, int);
1138c2ecf20Sopenharmony_ci/*
1148c2ecf20Sopenharmony_ci * From iscsi_target_erl1.c
1158c2ecf20Sopenharmony_ci */
1168c2ecf20Sopenharmony_ciextern void iscsit_stop_dataout_timer(struct iscsi_cmd *);
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci/*
1198c2ecf20Sopenharmony_ci * From iscsi_target_tmr.c
1208c2ecf20Sopenharmony_ci */
1218c2ecf20Sopenharmony_ciextern int iscsit_tmr_post_handler(struct iscsi_cmd *, struct iscsi_conn *);
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci/*
1248c2ecf20Sopenharmony_ci * From iscsi_target_util.c
1258c2ecf20Sopenharmony_ci */
1268c2ecf20Sopenharmony_ciextern struct iscsi_cmd *iscsit_allocate_cmd(struct iscsi_conn *, int);
1278c2ecf20Sopenharmony_ciextern int iscsit_sequence_cmd(struct iscsi_conn *, struct iscsi_cmd *,
1288c2ecf20Sopenharmony_ci			       unsigned char *, __be32);
1298c2ecf20Sopenharmony_ciextern void iscsit_release_cmd(struct iscsi_cmd *);
1308c2ecf20Sopenharmony_ciextern void iscsit_free_cmd(struct iscsi_cmd *, bool);
1318c2ecf20Sopenharmony_ciextern void iscsit_add_cmd_to_immediate_queue(struct iscsi_cmd *,
1328c2ecf20Sopenharmony_ci					      struct iscsi_conn *, u8);
1338c2ecf20Sopenharmony_ciextern struct iscsi_cmd *
1348c2ecf20Sopenharmony_ciiscsit_find_cmd_from_itt_or_dump(struct iscsi_conn *conn,
1358c2ecf20Sopenharmony_ci				 itt_t init_task_tag, u32 length);
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci/*
1388c2ecf20Sopenharmony_ci * From iscsi_target_nego.c
1398c2ecf20Sopenharmony_ci */
1408c2ecf20Sopenharmony_ciextern int iscsi_target_check_login_request(struct iscsi_conn *,
1418c2ecf20Sopenharmony_ci					    struct iscsi_login *);
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci/*
1448c2ecf20Sopenharmony_ci * From iscsi_target_login.c
1458c2ecf20Sopenharmony_ci */
1468c2ecf20Sopenharmony_ciextern __printf(2, 3) int iscsi_change_param_sprintf(
1478c2ecf20Sopenharmony_ci	struct iscsi_conn *, const char *, ...);
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci/*
1508c2ecf20Sopenharmony_ci * From iscsi_target_parameters.c
1518c2ecf20Sopenharmony_ci */
1528c2ecf20Sopenharmony_ciextern struct iscsi_param *iscsi_find_param_from_key(
1538c2ecf20Sopenharmony_ci	char *, struct iscsi_param_list *);
154