162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include "iscsi_target_core.h" /* struct iscsit_cmd */
362306a36Sopenharmony_ci
462306a36Sopenharmony_cistruct sockaddr_storage;
562306a36Sopenharmony_ci
662306a36Sopenharmony_cistruct iscsit_transport {
762306a36Sopenharmony_ci#define ISCSIT_TRANSPORT_NAME	16
862306a36Sopenharmony_ci	char name[ISCSIT_TRANSPORT_NAME];
962306a36Sopenharmony_ci	int transport_type;
1062306a36Sopenharmony_ci	bool rdma_shutdown;
1162306a36Sopenharmony_ci	int priv_size;
1262306a36Sopenharmony_ci	struct module *owner;
1362306a36Sopenharmony_ci	struct list_head t_node;
1462306a36Sopenharmony_ci	int (*iscsit_setup_np)(struct iscsi_np *, struct sockaddr_storage *);
1562306a36Sopenharmony_ci	int (*iscsit_accept_np)(struct iscsi_np *, struct iscsit_conn *);
1662306a36Sopenharmony_ci	void (*iscsit_free_np)(struct iscsi_np *);
1762306a36Sopenharmony_ci	void (*iscsit_wait_conn)(struct iscsit_conn *);
1862306a36Sopenharmony_ci	void (*iscsit_free_conn)(struct iscsit_conn *);
1962306a36Sopenharmony_ci	int (*iscsit_get_login_rx)(struct iscsit_conn *, struct iscsi_login *);
2062306a36Sopenharmony_ci	int (*iscsit_put_login_tx)(struct iscsit_conn *, struct iscsi_login *, u32);
2162306a36Sopenharmony_ci	int (*iscsit_immediate_queue)(struct iscsit_conn *, struct iscsit_cmd *, int);
2262306a36Sopenharmony_ci	int (*iscsit_response_queue)(struct iscsit_conn *, struct iscsit_cmd *, int);
2362306a36Sopenharmony_ci	int (*iscsit_get_dataout)(struct iscsit_conn *, struct iscsit_cmd *, bool);
2462306a36Sopenharmony_ci	int (*iscsit_queue_data_in)(struct iscsit_conn *, struct iscsit_cmd *);
2562306a36Sopenharmony_ci	int (*iscsit_queue_status)(struct iscsit_conn *, struct iscsit_cmd *);
2662306a36Sopenharmony_ci	void (*iscsit_aborted_task)(struct iscsit_conn *, struct iscsit_cmd *);
2762306a36Sopenharmony_ci	int (*iscsit_xmit_pdu)(struct iscsit_conn *, struct iscsit_cmd *,
2862306a36Sopenharmony_ci			       struct iscsi_datain_req *, const void *, u32);
2962306a36Sopenharmony_ci	void (*iscsit_unmap_cmd)(struct iscsit_conn *, struct iscsit_cmd *);
3062306a36Sopenharmony_ci	void (*iscsit_get_rx_pdu)(struct iscsit_conn *);
3162306a36Sopenharmony_ci	int (*iscsit_validate_params)(struct iscsit_conn *);
3262306a36Sopenharmony_ci	void (*iscsit_get_r2t_ttt)(struct iscsit_conn *, struct iscsit_cmd *,
3362306a36Sopenharmony_ci				   struct iscsi_r2t *);
3462306a36Sopenharmony_ci	enum target_prot_op (*iscsit_get_sup_prot_ops)(struct iscsit_conn *);
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistatic inline void *iscsit_priv_cmd(struct iscsit_cmd *cmd)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	return (void *)(cmd + 1);
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/*
4362306a36Sopenharmony_ci * From iscsi_target_transport.c
4462306a36Sopenharmony_ci */
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciextern void iscsit_register_transport(struct iscsit_transport *);
4762306a36Sopenharmony_ciextern void iscsit_unregister_transport(struct iscsit_transport *);
4862306a36Sopenharmony_ciextern struct iscsit_transport *iscsit_get_transport(int);
4962306a36Sopenharmony_ciextern void iscsit_put_transport(struct iscsit_transport *);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/*
5262306a36Sopenharmony_ci * From iscsi_target.c
5362306a36Sopenharmony_ci */
5462306a36Sopenharmony_ciextern int iscsit_setup_scsi_cmd(struct iscsit_conn *, struct iscsit_cmd *,
5562306a36Sopenharmony_ci				unsigned char *);
5662306a36Sopenharmony_ciextern void iscsit_set_unsolicited_dataout(struct iscsit_cmd *);
5762306a36Sopenharmony_ciextern int iscsit_process_scsi_cmd(struct iscsit_conn *, struct iscsit_cmd *,
5862306a36Sopenharmony_ci				struct iscsi_scsi_req *);
5962306a36Sopenharmony_ciextern int
6062306a36Sopenharmony_ci__iscsit_check_dataout_hdr(struct iscsit_conn *, void *,
6162306a36Sopenharmony_ci			   struct iscsit_cmd *, u32, bool *);
6262306a36Sopenharmony_ciextern int
6362306a36Sopenharmony_ciiscsit_check_dataout_hdr(struct iscsit_conn *conn, void *buf,
6462306a36Sopenharmony_ci			 struct iscsit_cmd **out_cmd);
6562306a36Sopenharmony_ciextern int iscsit_check_dataout_payload(struct iscsit_cmd *, struct iscsi_data *,
6662306a36Sopenharmony_ci				bool);
6762306a36Sopenharmony_ciextern int iscsit_setup_nop_out(struct iscsit_conn *, struct iscsit_cmd *,
6862306a36Sopenharmony_ci				struct iscsi_nopout *);
6962306a36Sopenharmony_ciextern int iscsit_process_nop_out(struct iscsit_conn *, struct iscsit_cmd *,
7062306a36Sopenharmony_ci				struct iscsi_nopout *);
7162306a36Sopenharmony_ciextern int iscsit_handle_logout_cmd(struct iscsit_conn *, struct iscsit_cmd *,
7262306a36Sopenharmony_ci				unsigned char *);
7362306a36Sopenharmony_ciextern int iscsit_handle_task_mgt_cmd(struct iscsit_conn *, struct iscsit_cmd *,
7462306a36Sopenharmony_ci				unsigned char *);
7562306a36Sopenharmony_ciextern int iscsit_setup_text_cmd(struct iscsit_conn *, struct iscsit_cmd *,
7662306a36Sopenharmony_ci				 struct iscsi_text *);
7762306a36Sopenharmony_ciextern int iscsit_process_text_cmd(struct iscsit_conn *, struct iscsit_cmd *,
7862306a36Sopenharmony_ci				   struct iscsi_text *);
7962306a36Sopenharmony_ciextern void iscsit_build_rsp_pdu(struct iscsit_cmd *, struct iscsit_conn *,
8062306a36Sopenharmony_ci				bool, struct iscsi_scsi_rsp *);
8162306a36Sopenharmony_ciextern void iscsit_build_nopin_rsp(struct iscsit_cmd *, struct iscsit_conn *,
8262306a36Sopenharmony_ci				struct iscsi_nopin *, bool);
8362306a36Sopenharmony_ciextern void iscsit_build_task_mgt_rsp(struct iscsit_cmd *, struct iscsit_conn *,
8462306a36Sopenharmony_ci				struct iscsi_tm_rsp *);
8562306a36Sopenharmony_ciextern int iscsit_build_text_rsp(struct iscsit_cmd *, struct iscsit_conn *,
8662306a36Sopenharmony_ci				struct iscsi_text_rsp *,
8762306a36Sopenharmony_ci				enum iscsit_transport_type);
8862306a36Sopenharmony_ciextern void iscsit_build_reject(struct iscsit_cmd *, struct iscsit_conn *,
8962306a36Sopenharmony_ci				struct iscsi_reject *);
9062306a36Sopenharmony_ciextern int iscsit_build_logout_rsp(struct iscsit_cmd *, struct iscsit_conn *,
9162306a36Sopenharmony_ci				struct iscsi_logout_rsp *);
9262306a36Sopenharmony_ciextern int iscsit_logout_post_handler(struct iscsit_cmd *, struct iscsit_conn *);
9362306a36Sopenharmony_ciextern int iscsit_queue_rsp(struct iscsit_conn *, struct iscsit_cmd *);
9462306a36Sopenharmony_ciextern void iscsit_aborted_task(struct iscsit_conn *, struct iscsit_cmd *);
9562306a36Sopenharmony_ciextern int iscsit_add_reject(struct iscsit_conn *, u8, unsigned char *);
9662306a36Sopenharmony_ciextern int iscsit_reject_cmd(struct iscsit_cmd *, u8, unsigned char *);
9762306a36Sopenharmony_ciextern int iscsit_handle_snack(struct iscsit_conn *, unsigned char *);
9862306a36Sopenharmony_ciextern void iscsit_build_datain_pdu(struct iscsit_cmd *, struct iscsit_conn *,
9962306a36Sopenharmony_ci				    struct iscsi_datain *,
10062306a36Sopenharmony_ci				    struct iscsi_data_rsp *, bool);
10162306a36Sopenharmony_ciextern int iscsit_build_r2ts_for_cmd(struct iscsit_conn *, struct iscsit_cmd *,
10262306a36Sopenharmony_ci				     bool);
10362306a36Sopenharmony_ciextern int iscsit_immediate_queue(struct iscsit_conn *, struct iscsit_cmd *, int);
10462306a36Sopenharmony_ciextern int iscsit_response_queue(struct iscsit_conn *, struct iscsit_cmd *, int);
10562306a36Sopenharmony_ci/*
10662306a36Sopenharmony_ci * From iscsi_target_device.c
10762306a36Sopenharmony_ci */
10862306a36Sopenharmony_ciextern void iscsit_increment_maxcmdsn(struct iscsit_cmd *, struct iscsit_session *);
10962306a36Sopenharmony_ci/*
11062306a36Sopenharmony_ci * From iscsi_target_erl0.c
11162306a36Sopenharmony_ci */
11262306a36Sopenharmony_ciextern void iscsit_cause_connection_reinstatement(struct iscsit_conn *, int);
11362306a36Sopenharmony_ci/*
11462306a36Sopenharmony_ci * From iscsi_target_erl1.c
11562306a36Sopenharmony_ci */
11662306a36Sopenharmony_ciextern void iscsit_stop_dataout_timer(struct iscsit_cmd *);
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci/*
11962306a36Sopenharmony_ci * From iscsi_target_tmr.c
12062306a36Sopenharmony_ci */
12162306a36Sopenharmony_ciextern int iscsit_tmr_post_handler(struct iscsit_cmd *, struct iscsit_conn *);
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci/*
12462306a36Sopenharmony_ci * From iscsi_target_util.c
12562306a36Sopenharmony_ci */
12662306a36Sopenharmony_ciextern struct iscsit_cmd *iscsit_allocate_cmd(struct iscsit_conn *, int);
12762306a36Sopenharmony_ciextern int iscsit_sequence_cmd(struct iscsit_conn *, struct iscsit_cmd *,
12862306a36Sopenharmony_ci			       unsigned char *, __be32);
12962306a36Sopenharmony_ciextern void iscsit_release_cmd(struct iscsit_cmd *);
13062306a36Sopenharmony_ciextern void iscsit_free_cmd(struct iscsit_cmd *, bool);
13162306a36Sopenharmony_ciextern void iscsit_add_cmd_to_immediate_queue(struct iscsit_cmd *,
13262306a36Sopenharmony_ci					      struct iscsit_conn *, u8);
13362306a36Sopenharmony_ciextern struct iscsit_cmd *
13462306a36Sopenharmony_ciiscsit_find_cmd_from_itt_or_dump(struct iscsit_conn *conn,
13562306a36Sopenharmony_ci				 itt_t init_task_tag, u32 length);
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/*
13862306a36Sopenharmony_ci * From iscsi_target_nego.c
13962306a36Sopenharmony_ci */
14062306a36Sopenharmony_ciextern int iscsi_target_check_login_request(struct iscsit_conn *,
14162306a36Sopenharmony_ci					    struct iscsi_login *);
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci/*
14462306a36Sopenharmony_ci * From iscsi_target_login.c
14562306a36Sopenharmony_ci */
14662306a36Sopenharmony_ciextern __printf(2, 3) int iscsi_change_param_sprintf(
14762306a36Sopenharmony_ci	struct iscsit_conn *, const char *, ...);
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/*
15062306a36Sopenharmony_ci * From iscsi_target_parameters.c
15162306a36Sopenharmony_ci */
15262306a36Sopenharmony_ciextern struct iscsi_param *iscsi_find_param_from_key(
15362306a36Sopenharmony_ci	char *, struct iscsi_param_list *);
154