xref: /spdk/lib/iscsi/conn.h (revision 8d8e7cd0e4832d3f916995304f5d369e1dab5f14)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2008-2012 Daisuke Aoyama <aoyama@peach.ne.jp>.
3  *   Copyright (C) 2016 Intel Corporation.
4  *   All rights reserved.
5  */
6 
7 #ifndef SPDK_ISCSI_CONN_H
8 #define SPDK_ISCSI_CONN_H
9 
10 #include "spdk/stdinc.h"
11 
12 #include "iscsi/iscsi.h"
13 #include "spdk/queue.h"
14 #include "spdk/cpuset.h"
15 #include "spdk/scsi.h"
16 
17 #include "spdk_internal/trace_defs.h"
18 
19 /*
20  * MAX_CONNECTION_PARAMS: The numbers of the params in conn_param_table
21  * MAX_SESSION_PARAMS: The numbers of the params in sess_param_table
22  */
23 #define MAX_CONNECTION_PARAMS 14
24 #define MAX_SESSION_PARAMS 19
25 
26 #define MAX_ADDRBUF 64
27 #define MAX_INITIATOR_ADDR (MAX_ADDRBUF)
28 #define MAX_TARGET_ADDR (MAX_ADDRBUF)
29 
30 enum iscsi_pdu_recv_state {
31 	/* Ready to wait for PDU */
32 	ISCSI_PDU_RECV_STATE_AWAIT_PDU_READY,
33 
34 	/* Active connection waiting for any PDU header */
35 	ISCSI_PDU_RECV_STATE_AWAIT_PDU_HDR,
36 
37 	/* Active connection waiting for payload */
38 	ISCSI_PDU_RECV_STATE_AWAIT_PDU_PAYLOAD,
39 
40 	/* Active connection does not wait for payload */
41 	ISCSI_PDU_RECV_STATE_ERROR,
42 };
43 
44 struct spdk_poller;
45 struct spdk_iscsi_conn;
46 
47 struct spdk_iscsi_lun {
48 	struct spdk_iscsi_conn		*conn;
49 	struct spdk_scsi_lun		*lun;
50 	struct spdk_scsi_lun_desc	*desc;
51 	struct spdk_poller		*remove_poller;
52 	TAILQ_ENTRY(spdk_iscsi_lun)	tailq;
53 };
54 
55 struct spdk_iscsi_conn {
56 	int				id;
57 	int				is_valid;
58 	/*
59 	 * All fields below this point are reinitialized each time the
60 	 *  connection object is allocated.  Make sure to update the
61 	 *  SPDK_ISCSI_CONNECTION_MEMSET() macro if changing which fields
62 	 *  are initialized when allocated.
63 	 */
64 	struct spdk_iscsi_portal	*portal;
65 	int				pg_tag;
66 	char				portal_host[MAX_PORTAL_ADDR + 1];
67 	char				portal_port[MAX_PORTAL_ADDR + 1];
68 	struct spdk_iscsi_poll_group	*pg;
69 	struct spdk_sock		*sock;
70 	struct spdk_iscsi_sess		*sess;
71 
72 	enum iscsi_connection_state	state;
73 	int				login_phase;
74 	bool				is_logged_out;
75 	struct spdk_iscsi_pdu		*login_rsp_pdu;
76 	uint16_t			trace_id;
77 
78 	uint64_t	last_flush;
79 	uint64_t	last_fill;
80 	uint64_t	last_nopin;
81 
82 	/* Timer used to destroy connection after requesting logout if
83 	 *  initiator does not send logout request.
84 	 */
85 	struct spdk_poller *logout_request_timer;
86 
87 	/* Timer used to destroy connection after logout if initiator does
88 	 *  not close the connection.
89 	 */
90 	struct spdk_poller *logout_timer;
91 
92 	/* Timer used to wait for connection to close
93 	 */
94 	struct spdk_poller *shutdown_timer;
95 
96 	/* Timer used to destroy connection after creating this connection
97 	 *  if login process does not complete.
98 	 */
99 	struct spdk_poller *login_timer;
100 
101 	struct spdk_iscsi_pdu *pdu_in_progress;
102 	enum iscsi_pdu_recv_state pdu_recv_state;
103 
104 	TAILQ_HEAD(, spdk_iscsi_pdu) write_pdu_list;
105 	TAILQ_HEAD(, spdk_iscsi_pdu) snack_pdu_list;
106 
107 	uint32_t pending_r2t;
108 
109 	uint16_t cid;
110 
111 	/* IP address */
112 	char initiator_addr[MAX_INITIATOR_ADDR];
113 	char target_addr[MAX_TARGET_ADDR];
114 
115 	/* Initiator/Target port binds */
116 	char				initiator_name[MAX_INITIATOR_NAME];
117 	struct spdk_scsi_port		*initiator_port;
118 	char				target_short_name[MAX_TARGET_NAME];
119 	struct spdk_scsi_port		*target_port;
120 	struct spdk_iscsi_tgt_node	*target;
121 	struct spdk_scsi_dev		*dev;
122 
123 	/* To handle the case that SendTargets response is split into
124 	 * multiple PDUs due to very small MaxRecvDataSegmentLength.
125 	 */
126 	uint32_t			send_tgt_completed_size;
127 	struct iscsi_param		*params_text;
128 
129 	/* for fast access */
130 	int header_digest;
131 	int data_digest;
132 	int full_feature;
133 	int scheduled;
134 
135 	struct iscsi_param *params;
136 	bool sess_param_state_negotiated[MAX_SESSION_PARAMS];
137 	bool conn_param_state_negotiated[MAX_CONNECTION_PARAMS];
138 	struct iscsi_chap_auth auth;
139 	bool authenticated;
140 	bool disable_chap;
141 	bool require_chap;
142 	bool mutual_chap;
143 	int32_t chap_group;
144 	uint32_t pending_task_cnt;
145 	uint32_t data_out_cnt;
146 	uint32_t data_in_cnt;
147 
148 	uint64_t timeout;
149 	uint64_t nopininterval;
150 	bool nop_outstanding;
151 
152 	/*
153 	 * This is the maximum data segment length that iscsi target can send
154 	 *  to the initiator on this connection.  Not to be confused with the
155 	 *  maximum data segment length that initiators can send to iscsi target, which
156 	 *  is statically defined as SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH.
157 	 */
158 	int MaxRecvDataSegmentLength;
159 
160 	uint32_t StatSN;
161 	uint32_t exp_statsn;
162 	uint32_t ttt; /* target transfer tag */
163 	char *partial_text_parameter;
164 
165 	STAILQ_ENTRY(spdk_iscsi_conn) pg_link;
166 	bool			is_stopped;  /* Set true when connection is stopped for migration */
167 	TAILQ_HEAD(queued_r2t_tasks, spdk_iscsi_task)	queued_r2t_tasks;
168 	TAILQ_HEAD(active_r2t_tasks, spdk_iscsi_task)	active_r2t_tasks;
169 	TAILQ_HEAD(queued_datain_tasks, spdk_iscsi_task)	queued_datain_tasks;
170 
171 	TAILQ_HEAD(, spdk_iscsi_lun)	luns;
172 
173 	TAILQ_ENTRY(spdk_iscsi_conn)	conn_link;
174 };
175 
176 void iscsi_task_cpl(struct spdk_scsi_task *scsi_task);
177 void iscsi_task_mgmt_cpl(struct spdk_scsi_task *scsi_task);
178 
179 int initialize_iscsi_conns(void);
180 void shutdown_iscsi_conns(void);
181 void iscsi_conns_request_logout(struct spdk_iscsi_tgt_node *target, int pg_tag);
182 int iscsi_get_active_conns(struct spdk_iscsi_tgt_node *target);
183 
184 int iscsi_conn_construct(struct spdk_iscsi_portal *portal, struct spdk_sock *sock);
185 void iscsi_conn_destruct(struct spdk_iscsi_conn *conn);
186 void iscsi_conn_handle_nop(struct spdk_iscsi_conn *conn);
187 void iscsi_conn_schedule(struct spdk_iscsi_conn *conn);
188 void iscsi_conn_logout(struct spdk_iscsi_conn *conn);
189 int iscsi_drop_conns(struct spdk_iscsi_conn *conn,
190 		     const char *conn_match, int drop_all);
191 int iscsi_conn_handle_queued_datain_tasks(struct spdk_iscsi_conn *conn);
192 int iscsi_conn_abort_queued_datain_task(struct spdk_iscsi_conn *conn,
193 					uint32_t ref_task_tag);
194 int iscsi_conn_abort_queued_datain_tasks(struct spdk_iscsi_conn *conn,
195 		struct spdk_scsi_lun *lun,
196 		struct spdk_iscsi_pdu *pdu);
197 
198 int iscsi_conn_read_data(struct spdk_iscsi_conn *conn, int len, void *buf);
199 int iscsi_conn_readv_data(struct spdk_iscsi_conn *conn,
200 			  struct iovec *iov, int iovcnt);
201 void iscsi_conn_write_pdu(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu,
202 			  iscsi_conn_xfer_complete_cb cb_fn,
203 			  void *cb_arg);
204 
205 void iscsi_conn_free_pdu(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu);
206 
207 void iscsi_conn_info_json(struct spdk_json_write_ctx *w, struct spdk_iscsi_conn *conn);
208 void iscsi_conn_pdu_generic_complete(void *cb_arg);
209 #endif /* SPDK_ISCSI_CONN_H */
210