xref: /spdk/lib/iscsi/conn.c (revision 83ba9086796471697a4975a58f60e2392bccd08c)
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 #include "spdk/stdinc.h"
8 
9 #include "spdk/endian.h"
10 #include "spdk/env.h"
11 #include "spdk/likely.h"
12 #include "spdk/thread.h"
13 #include "spdk/queue.h"
14 #include "spdk/trace.h"
15 #include "spdk/sock.h"
16 #include "spdk/string.h"
17 
18 #include "spdk/log.h"
19 
20 #include "iscsi/task.h"
21 #include "iscsi/conn.h"
22 #include "iscsi/tgt_node.h"
23 #include "iscsi/portal_grp.h"
24 
25 #define MAKE_DIGEST_WORD(BUF, CRC32C) \
26         (   ((*((uint8_t *)(BUF)+0)) = (uint8_t)((uint32_t)(CRC32C) >> 0)), \
27             ((*((uint8_t *)(BUF)+1)) = (uint8_t)((uint32_t)(CRC32C) >> 8)), \
28             ((*((uint8_t *)(BUF)+2)) = (uint8_t)((uint32_t)(CRC32C) >> 16)), \
29             ((*((uint8_t *)(BUF)+3)) = (uint8_t)((uint32_t)(CRC32C) >> 24)))
30 
31 #define SPDK_ISCSI_CONNECTION_MEMSET(conn)		\
32 	memset(&(conn)->portal, 0, sizeof(*(conn)) -	\
33 		offsetof(struct spdk_iscsi_conn, portal));
34 
35 #define SPDK_ISCSI_CONNECTION_STATUS(status, rnstr) case(status): return(rnstr)
36 
37 static struct spdk_iscsi_conn *g_conns_array = NULL;
38 
39 static TAILQ_HEAD(, spdk_iscsi_conn) g_free_conns = TAILQ_HEAD_INITIALIZER(g_free_conns);
40 static TAILQ_HEAD(, spdk_iscsi_conn) g_active_conns = TAILQ_HEAD_INITIALIZER(g_active_conns);
41 
42 static pthread_mutex_t g_conns_mutex = PTHREAD_MUTEX_INITIALIZER;
43 
44 static struct spdk_poller *g_shutdown_timer = NULL;
45 
46 static void iscsi_conn_sock_cb(void *arg, struct spdk_sock_group *group,
47 			       struct spdk_sock *sock);
48 
49 static struct spdk_iscsi_conn *
50 allocate_conn(void)
51 {
52 	struct spdk_iscsi_conn	*conn;
53 
54 	pthread_mutex_lock(&g_conns_mutex);
55 	conn = TAILQ_FIRST(&g_free_conns);
56 	if (conn != NULL) {
57 		assert(!conn->is_valid);
58 		TAILQ_REMOVE(&g_free_conns, conn, conn_link);
59 		SPDK_ISCSI_CONNECTION_MEMSET(conn);
60 		conn->is_valid = 1;
61 
62 		TAILQ_INSERT_TAIL(&g_active_conns, conn, conn_link);
63 	}
64 	pthread_mutex_unlock(&g_conns_mutex);
65 
66 	return conn;
67 }
68 
69 static void
70 _free_conn(struct spdk_iscsi_conn *conn)
71 {
72 	TAILQ_REMOVE(&g_active_conns, conn, conn_link);
73 
74 	memset(conn->portal_host, 0, sizeof(conn->portal_host));
75 	memset(conn->portal_port, 0, sizeof(conn->portal_port));
76 	conn->is_valid = 0;
77 
78 	TAILQ_INSERT_TAIL(&g_free_conns, conn, conn_link);
79 }
80 
81 static void
82 free_conn(struct spdk_iscsi_conn *conn)
83 {
84 	pthread_mutex_lock(&g_conns_mutex);
85 	_free_conn(conn);
86 	pthread_mutex_unlock(&g_conns_mutex);
87 }
88 
89 static void
90 _iscsi_conns_cleanup(void)
91 {
92 	free(g_conns_array);
93 }
94 
95 int
96 initialize_iscsi_conns(void)
97 {
98 	uint32_t i;
99 
100 	SPDK_DEBUGLOG(iscsi, "spdk_iscsi_init\n");
101 
102 	g_conns_array = calloc(MAX_ISCSI_CONNECTIONS, sizeof(struct spdk_iscsi_conn));
103 	if (g_conns_array == NULL) {
104 		return -ENOMEM;
105 	}
106 
107 	for (i = 0; i < MAX_ISCSI_CONNECTIONS; i++) {
108 		g_conns_array[i].id = i;
109 		TAILQ_INSERT_TAIL(&g_free_conns, &g_conns_array[i], conn_link);
110 	}
111 
112 	return 0;
113 }
114 
115 static void
116 iscsi_poll_group_add_conn(struct spdk_iscsi_poll_group *pg, struct spdk_iscsi_conn *conn)
117 {
118 	int rc;
119 
120 	rc = spdk_sock_group_add_sock(pg->sock_group, conn->sock, iscsi_conn_sock_cb, conn);
121 	if (rc < 0) {
122 		SPDK_ERRLOG("Failed to add sock=%p of conn=%p\n", conn->sock, conn);
123 		return;
124 	}
125 
126 	conn->is_stopped = false;
127 	STAILQ_INSERT_TAIL(&pg->connections, conn, pg_link);
128 }
129 
130 static void
131 iscsi_poll_group_remove_conn(struct spdk_iscsi_poll_group *pg, struct spdk_iscsi_conn *conn)
132 {
133 	int rc;
134 
135 	assert(conn->sock != NULL);
136 	rc = spdk_sock_group_remove_sock(pg->sock_group, conn->sock);
137 	if (rc < 0) {
138 		SPDK_ERRLOG("Failed to remove sock=%p of conn=%p\n", conn->sock, conn);
139 	}
140 
141 	conn->is_stopped = true;
142 	STAILQ_REMOVE(&pg->connections, conn, spdk_iscsi_conn, pg_link);
143 }
144 
145 static int
146 login_timeout(void *arg)
147 {
148 	struct spdk_iscsi_conn *conn = arg;
149 
150 	if (conn->state < ISCSI_CONN_STATE_EXITING) {
151 		conn->state = ISCSI_CONN_STATE_EXITING;
152 	}
153 	spdk_poller_unregister(&conn->login_timer);
154 
155 	return SPDK_POLLER_BUSY;
156 }
157 
158 static void
159 iscsi_conn_start(void *ctx)
160 {
161 	struct spdk_iscsi_conn *conn = ctx;
162 
163 	iscsi_poll_group_add_conn(conn->pg, conn);
164 
165 	conn->login_timer = SPDK_POLLER_REGISTER(login_timeout, conn, ISCSI_LOGIN_TIMEOUT * 1000000);
166 }
167 
168 int
169 iscsi_conn_construct(struct spdk_iscsi_portal *portal,
170 		     struct spdk_sock *sock)
171 {
172 	struct spdk_iscsi_poll_group *pg;
173 	struct spdk_iscsi_conn *conn;
174 	int i, rc;
175 
176 	conn = allocate_conn();
177 	if (conn == NULL) {
178 		SPDK_ERRLOG("Could not allocate connection.\n");
179 		return -1;
180 	}
181 
182 	pthread_mutex_lock(&g_iscsi.mutex);
183 	conn->timeout = g_iscsi.timeout * spdk_get_ticks_hz(); /* seconds to TSC */
184 	conn->nopininterval = g_iscsi.nopininterval;
185 	conn->nopininterval *= spdk_get_ticks_hz(); /* seconds to TSC */
186 	conn->last_nopin = spdk_get_ticks();
187 	conn->nop_outstanding = false;
188 	conn->data_out_cnt = 0;
189 	conn->data_in_cnt = 0;
190 	conn->disable_chap = portal->group->disable_chap;
191 	conn->require_chap = portal->group->require_chap;
192 	conn->mutual_chap = portal->group->mutual_chap;
193 	conn->chap_group = portal->group->chap_group;
194 	pthread_mutex_unlock(&g_iscsi.mutex);
195 	conn->MaxRecvDataSegmentLength = 8192; /* RFC3720(12.12) */
196 
197 	conn->portal = portal;
198 	conn->pg_tag = portal->group->tag;
199 	memcpy(conn->portal_host, portal->host, strlen(portal->host));
200 	memcpy(conn->portal_port, portal->port, strlen(portal->port));
201 	conn->sock = sock;
202 
203 	conn->state = ISCSI_CONN_STATE_INVALID;
204 	conn->login_phase = ISCSI_SECURITY_NEGOTIATION_PHASE;
205 	conn->ttt = 0;
206 
207 	conn->partial_text_parameter = NULL;
208 
209 	for (i = 0; i < MAX_CONNECTION_PARAMS; i++) {
210 		conn->conn_param_state_negotiated[i] = false;
211 	}
212 
213 	for (i = 0; i < MAX_SESSION_PARAMS; i++) {
214 		conn->sess_param_state_negotiated[i] = false;
215 	}
216 
217 	conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_AWAIT_PDU_READY;
218 
219 	TAILQ_INIT(&conn->write_pdu_list);
220 	TAILQ_INIT(&conn->snack_pdu_list);
221 	TAILQ_INIT(&conn->queued_r2t_tasks);
222 	TAILQ_INIT(&conn->active_r2t_tasks);
223 	TAILQ_INIT(&conn->queued_datain_tasks);
224 	TAILQ_INIT(&conn->luns);
225 
226 	rc = spdk_sock_getaddr(sock, conn->target_addr, sizeof conn->target_addr, NULL,
227 			       conn->initiator_addr, sizeof conn->initiator_addr, NULL);
228 	if (rc < 0) {
229 		SPDK_ERRLOG("spdk_sock_getaddr() failed\n");
230 		goto error_return;
231 	}
232 
233 	/* set low water mark */
234 	rc = spdk_sock_set_recvlowat(conn->sock, 1);
235 	if (rc != 0) {
236 		SPDK_ERRLOG("spdk_sock_set_recvlowat() failed\n");
237 		goto error_return;
238 	}
239 
240 	/* set default params */
241 	rc = iscsi_conn_params_init(&conn->params);
242 	if (rc < 0) {
243 		SPDK_ERRLOG("iscsi_conn_params_init() failed\n");
244 		goto error_return;
245 	}
246 	conn->logout_request_timer = NULL;
247 	conn->logout_timer = NULL;
248 	conn->shutdown_timer = NULL;
249 	SPDK_DEBUGLOG(iscsi, "Launching connection on acceptor thread\n");
250 	conn->pending_task_cnt = 0;
251 
252 	/* Get the first poll group. */
253 	pg = TAILQ_FIRST(&g_iscsi.poll_group_head);
254 	if (pg == NULL) {
255 		SPDK_ERRLOG("There is no poll group.\n");
256 		assert(false);
257 		goto error_return;
258 	}
259 
260 	conn->pg = pg;
261 	conn->trace_id = spdk_trace_register_owner(OWNER_TYPE_ISCSI_CONN, conn->initiator_addr);
262 	spdk_thread_send_msg(spdk_io_channel_get_thread(spdk_io_channel_from_ctx(pg)),
263 			     iscsi_conn_start, conn);
264 	return 0;
265 
266 error_return:
267 	iscsi_param_free(conn->params);
268 	free_conn(conn);
269 	return -1;
270 }
271 
272 void
273 iscsi_conn_free_pdu(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
274 {
275 	iscsi_conn_xfer_complete_cb cb_fn;
276 	void *cb_arg;
277 
278 	cb_fn = pdu->cb_fn;
279 	cb_arg = pdu->cb_arg;
280 
281 	assert(cb_fn != NULL);
282 	pdu->cb_fn = NULL;
283 
284 	if (pdu->task) {
285 		iscsi_task_put(pdu->task);
286 	}
287 	iscsi_put_pdu(pdu);
288 
289 	cb_fn(cb_arg);
290 }
291 
292 static int
293 iscsi_conn_free_tasks(struct spdk_iscsi_conn *conn)
294 {
295 	struct spdk_iscsi_pdu *pdu, *tmp_pdu;
296 	struct spdk_iscsi_task *iscsi_task, *tmp_iscsi_task;
297 
298 	TAILQ_FOREACH_SAFE(pdu, &conn->snack_pdu_list, tailq, tmp_pdu) {
299 		TAILQ_REMOVE(&conn->snack_pdu_list, pdu, tailq);
300 		iscsi_conn_free_pdu(conn, pdu);
301 	}
302 
303 	TAILQ_FOREACH_SAFE(iscsi_task, &conn->queued_datain_tasks, link, tmp_iscsi_task) {
304 		if (!iscsi_task->is_queued) {
305 			TAILQ_REMOVE(&conn->queued_datain_tasks, iscsi_task, link);
306 			iscsi_task_put(iscsi_task);
307 		}
308 	}
309 
310 	/* We have to parse conn->write_pdu_list in the end.  In iscsi_conn_free_pdu(),
311 	 *  iscsi_conn_handle_queued_datain_tasks() may be called, and
312 	 *  iscsi_conn_handle_queued_datain_tasks() will parse conn->queued_datain_tasks
313 	 *  and may stack some PDUs to conn->write_pdu_list.  Hence when we come here, we
314 	 *  have to ensure there is no associated task in conn->queued_datain_tasks.
315 	 */
316 	TAILQ_FOREACH_SAFE(pdu, &conn->write_pdu_list, tailq, tmp_pdu) {
317 		TAILQ_REMOVE(&conn->write_pdu_list, pdu, tailq);
318 		iscsi_conn_free_pdu(conn, pdu);
319 	}
320 
321 	if (conn->pending_task_cnt) {
322 		return -1;
323 	}
324 
325 	return 0;
326 }
327 
328 static void
329 iscsi_conn_cleanup_backend(struct spdk_iscsi_conn *conn)
330 {
331 	int rc;
332 	struct spdk_iscsi_tgt_node *target;
333 
334 	if (conn->sess->connections > 1) {
335 		/* connection specific cleanup */
336 	} else if (!g_iscsi.AllowDuplicateIsid) {
337 		/*
338 		 * a> a target is connected by a single initiator, cleanup backend cancels inflight
339 		 *    IOs and the resources (of this initiator) are reclaimed as soon as possible.
340 		 * b> a target is connected by multiple initiators, one of these initiators
341 		 *    disconnects with inflight IOs, resetting backend bdev leads all the inflight
342 		 *    IOs (of multiple initiators) aborted. In this scenario, drain inflight IOs of
343 		 *    the disconnected initiator instead.
344 		 */
345 		target = conn->sess->target;
346 		if (target != NULL && iscsi_get_active_conns(target) == 1) {
347 			rc = iscsi_tgt_node_cleanup_luns(conn, target);
348 			if (rc < 0) {
349 				SPDK_ERRLOG("target abort failed\n");
350 			}
351 		}
352 	}
353 }
354 
355 static void
356 iscsi_conn_free(struct spdk_iscsi_conn *conn)
357 {
358 	struct spdk_iscsi_sess *sess;
359 	int idx;
360 	uint32_t i;
361 
362 	pthread_mutex_lock(&g_conns_mutex);
363 
364 	if (conn->sess == NULL) {
365 		goto end;
366 	}
367 
368 	idx = -1;
369 	sess = conn->sess;
370 	conn->sess = NULL;
371 
372 	for (i = 0; i < sess->connections; i++) {
373 		if (sess->conns[i] == conn) {
374 			idx = i;
375 			break;
376 		}
377 	}
378 
379 	if (idx < 0) {
380 		SPDK_ERRLOG("remove conn not found\n");
381 	} else {
382 		for (i = idx; i < sess->connections - 1; i++) {
383 			sess->conns[i] = sess->conns[i + 1];
384 		}
385 		sess->conns[sess->connections - 1] = NULL;
386 		sess->connections--;
387 
388 		if (sess->connections == 0) {
389 			/* cleanup last connection */
390 			SPDK_DEBUGLOG(iscsi,
391 				      "cleanup last conn free sess\n");
392 			iscsi_free_sess(sess);
393 		}
394 	}
395 
396 	SPDK_DEBUGLOG(iscsi, "Terminating connections(tsih %d): %d\n",
397 		      sess->tsih, sess->connections);
398 
399 end:
400 	SPDK_DEBUGLOG(iscsi, "cleanup free conn\n");
401 	iscsi_param_free(conn->params);
402 	_free_conn(conn);
403 
404 	pthread_mutex_unlock(&g_conns_mutex);
405 }
406 
407 static void
408 iscsi_conn_close_lun(struct spdk_iscsi_conn *conn,
409 		     struct spdk_iscsi_lun *iscsi_lun)
410 {
411 	if (iscsi_lun == NULL) {
412 		return;
413 	}
414 
415 	spdk_scsi_lun_free_io_channel(iscsi_lun->desc);
416 	spdk_scsi_lun_close(iscsi_lun->desc);
417 	spdk_poller_unregister(&iscsi_lun->remove_poller);
418 
419 	TAILQ_REMOVE(&conn->luns, iscsi_lun, tailq);
420 
421 	free(iscsi_lun);
422 
423 }
424 
425 static void
426 iscsi_conn_close_luns(struct spdk_iscsi_conn *conn)
427 {
428 	struct spdk_iscsi_lun *iscsi_lun, *tmp;
429 
430 	TAILQ_FOREACH_SAFE(iscsi_lun, &conn->luns, tailq, tmp) {
431 		iscsi_conn_close_lun(conn, iscsi_lun);
432 	}
433 }
434 
435 static bool
436 iscsi_conn_check_tasks_for_lun(struct spdk_iscsi_conn *conn,
437 			       struct spdk_scsi_lun *lun)
438 {
439 	struct spdk_iscsi_pdu *pdu, *tmp_pdu;
440 	struct spdk_iscsi_task *task;
441 
442 	assert(lun != NULL);
443 
444 	/* We can remove deferred PDUs safely because they are already flushed. */
445 	TAILQ_FOREACH_SAFE(pdu, &conn->snack_pdu_list, tailq, tmp_pdu) {
446 		if (lun == pdu->task->scsi.lun) {
447 			TAILQ_REMOVE(&conn->snack_pdu_list, pdu, tailq);
448 			iscsi_conn_free_pdu(conn, pdu);
449 		}
450 	}
451 
452 	TAILQ_FOREACH(task, &conn->queued_datain_tasks, link) {
453 		if (lun == task->scsi.lun) {
454 			return false;
455 		}
456 	}
457 
458 	/* This check loop works even when connection exits in the middle of LUN hotplug
459 	 *  because all PDUs in write_pdu_list are removed in iscsi_conn_free_tasks().
460 	 */
461 	TAILQ_FOREACH(pdu, &conn->write_pdu_list, tailq) {
462 		if (pdu->task && lun == pdu->task->scsi.lun) {
463 			return false;
464 		}
465 	}
466 
467 	return true;
468 }
469 
470 static int
471 iscsi_conn_remove_lun(void *ctx)
472 {
473 	struct spdk_iscsi_lun *iscsi_lun = ctx;
474 	struct spdk_iscsi_conn *conn = iscsi_lun->conn;
475 	struct spdk_scsi_lun *lun = iscsi_lun->lun;
476 
477 	if (!iscsi_conn_check_tasks_for_lun(conn, lun)) {
478 		return SPDK_POLLER_BUSY;
479 	}
480 	iscsi_conn_close_lun(conn, iscsi_lun);
481 	return SPDK_POLLER_BUSY;
482 }
483 
484 static void
485 _iscsi_conn_hotremove_lun(void *ctx)
486 {
487 	struct spdk_iscsi_lun *iscsi_lun = ctx;
488 	struct spdk_iscsi_conn *conn = iscsi_lun->conn;
489 	struct spdk_scsi_lun *lun = iscsi_lun->lun;
490 
491 	assert(spdk_io_channel_get_thread(spdk_io_channel_from_ctx(conn->pg)) ==
492 	       spdk_get_thread());
493 
494 	/* If a connection is already in stating status, just return */
495 	if (conn->state >= ISCSI_CONN_STATE_EXITING) {
496 		return;
497 	}
498 
499 	iscsi_clear_all_transfer_task(conn, lun, NULL);
500 
501 	iscsi_lun->remove_poller = SPDK_POLLER_REGISTER(iscsi_conn_remove_lun, iscsi_lun,
502 				   1000);
503 }
504 
505 static void
506 iscsi_conn_hotremove_lun(struct spdk_scsi_lun *lun, void *remove_ctx)
507 {
508 	struct spdk_iscsi_lun *iscsi_lun = remove_ctx;
509 	struct spdk_iscsi_conn *conn = iscsi_lun->conn;
510 
511 	spdk_thread_send_msg(spdk_io_channel_get_thread(spdk_io_channel_from_ctx(conn->pg)),
512 			     _iscsi_conn_hotremove_lun, iscsi_lun);
513 }
514 
515 static int
516 iscsi_conn_open_lun(struct spdk_iscsi_conn *conn, struct spdk_scsi_lun *lun)
517 {
518 	int rc;
519 	struct spdk_iscsi_lun *iscsi_lun;
520 
521 	iscsi_lun = calloc(1, sizeof(*iscsi_lun));
522 	if (iscsi_lun == NULL) {
523 		return -ENOMEM;
524 	}
525 
526 	iscsi_lun->conn = conn;
527 	iscsi_lun->lun = lun;
528 
529 	rc = spdk_scsi_lun_open(lun, iscsi_conn_hotremove_lun, iscsi_lun, &iscsi_lun->desc);
530 	if (rc != 0) {
531 		free(iscsi_lun);
532 		return rc;
533 	}
534 
535 	rc = spdk_scsi_lun_allocate_io_channel(iscsi_lun->desc);
536 	if (rc != 0) {
537 		spdk_scsi_lun_close(iscsi_lun->desc);
538 		free(iscsi_lun);
539 		return rc;
540 	}
541 
542 	TAILQ_INSERT_TAIL(&conn->luns, iscsi_lun, tailq);
543 
544 	return 0;
545 }
546 
547 static int
548 iscsi_conn_open_luns(struct spdk_iscsi_conn *conn)
549 {
550 	int rc;
551 	struct spdk_scsi_lun *lun;
552 
553 	for (lun = spdk_scsi_dev_get_first_lun(conn->dev); lun != NULL;
554 	     lun = spdk_scsi_dev_get_next_lun(lun)) {
555 		rc = iscsi_conn_open_lun(conn, lun);
556 		if (rc != 0) {
557 			goto error;
558 		}
559 	}
560 
561 	return 0;
562 
563 error:
564 	iscsi_conn_close_luns(conn);
565 	return -1;
566 }
567 
568 /**
569  *  This function will stop executing the specified connection.
570  */
571 static void
572 iscsi_conn_stop(struct spdk_iscsi_conn *conn)
573 {
574 	struct spdk_iscsi_tgt_node *target;
575 
576 	assert(conn->state == ISCSI_CONN_STATE_EXITED);
577 	assert(conn->data_in_cnt == 0);
578 	assert(conn->data_out_cnt == 0);
579 
580 	if (conn->sess != NULL &&
581 	    conn->sess->session_type == SESSION_TYPE_NORMAL &&
582 	    conn->full_feature) {
583 		target = conn->sess->target;
584 
585 		pthread_mutex_lock(&g_iscsi.mutex);
586 		pthread_mutex_lock(&target->mutex);
587 		if (conn->scheduled != 0) {
588 			target->num_active_conns--;
589 			if (target->num_active_conns == 0) {
590 				assert(target->pg != NULL);
591 				target->pg->num_active_targets--;
592 			}
593 		}
594 		pthread_mutex_unlock(&target->mutex);
595 		pthread_mutex_unlock(&g_iscsi.mutex);
596 
597 		iscsi_conn_close_luns(conn);
598 	}
599 
600 	assert(spdk_io_channel_get_thread(spdk_io_channel_from_ctx(conn->pg)) ==
601 	       spdk_get_thread());
602 }
603 
604 static int
605 _iscsi_conn_check_shutdown(void *arg)
606 {
607 	struct spdk_iscsi_conn *conn = arg;
608 	int rc;
609 
610 	rc = iscsi_conn_free_tasks(conn);
611 	if (rc < 0) {
612 		return SPDK_POLLER_BUSY;
613 	}
614 
615 	spdk_poller_unregister(&conn->shutdown_timer);
616 
617 	iscsi_conn_stop(conn);
618 	iscsi_conn_free(conn);
619 
620 	return SPDK_POLLER_BUSY;
621 }
622 
623 static void
624 _iscsi_conn_destruct(struct spdk_iscsi_conn *conn)
625 {
626 	int rc;
627 
628 	iscsi_poll_group_remove_conn(conn->pg, conn);
629 	spdk_sock_close(&conn->sock);
630 	iscsi_clear_all_transfer_task(conn, NULL, NULL);
631 	spdk_poller_unregister(&conn->logout_request_timer);
632 	spdk_poller_unregister(&conn->logout_timer);
633 	spdk_poller_unregister(&conn->login_timer);
634 
635 	rc = iscsi_conn_free_tasks(conn);
636 	if (rc < 0) {
637 		/* The connection cannot be freed yet. Check back later. */
638 		conn->shutdown_timer = SPDK_POLLER_REGISTER(_iscsi_conn_check_shutdown, conn, 1000);
639 	} else {
640 		iscsi_conn_stop(conn);
641 		iscsi_conn_free(conn);
642 	}
643 }
644 
645 static int
646 _iscsi_conn_check_pending_tasks(void *arg)
647 {
648 	struct spdk_iscsi_conn *conn = arg;
649 
650 	if (conn->dev != NULL &&
651 	    spdk_scsi_dev_has_pending_tasks(conn->dev, conn->initiator_port)) {
652 		return SPDK_POLLER_BUSY;
653 	}
654 
655 	spdk_poller_unregister(&conn->shutdown_timer);
656 
657 	_iscsi_conn_destruct(conn);
658 
659 	return SPDK_POLLER_BUSY;
660 }
661 
662 void
663 iscsi_conn_destruct(struct spdk_iscsi_conn *conn)
664 {
665 	struct spdk_iscsi_pdu *pdu;
666 	struct spdk_iscsi_task *task;
667 	int opcode;
668 
669 	/* If a connection is already in exited status, just return */
670 	if (conn->state >= ISCSI_CONN_STATE_EXITED) {
671 		return;
672 	}
673 
674 	conn->state = ISCSI_CONN_STATE_EXITED;
675 
676 	/*
677 	 * Each connection pre-allocates its next PDU - make sure these get
678 	 *  freed here.
679 	 */
680 	pdu = conn->pdu_in_progress;
681 	if (pdu) {
682 		/* remove the task left in the PDU too. */
683 		task = pdu->task;
684 		if (task) {
685 			opcode = pdu->bhs.opcode;
686 			switch (opcode) {
687 			case ISCSI_OP_SCSI:
688 			case ISCSI_OP_SCSI_DATAOUT:
689 				spdk_scsi_task_process_abort(&task->scsi);
690 				iscsi_task_cpl(&task->scsi);
691 				break;
692 			default:
693 				SPDK_ERRLOG("unexpected opcode %x\n", opcode);
694 				iscsi_task_put(task);
695 				break;
696 			}
697 		}
698 		iscsi_put_pdu(pdu);
699 		conn->pdu_in_progress = NULL;
700 	}
701 
702 	if (conn->sess != NULL && conn->pending_task_cnt > 0) {
703 		iscsi_conn_cleanup_backend(conn);
704 	}
705 
706 	if (conn->dev != NULL &&
707 	    spdk_scsi_dev_has_pending_tasks(conn->dev, conn->initiator_port)) {
708 		conn->shutdown_timer = SPDK_POLLER_REGISTER(_iscsi_conn_check_pending_tasks, conn, 1000);
709 	} else {
710 		_iscsi_conn_destruct(conn);
711 	}
712 }
713 
714 int
715 iscsi_get_active_conns(struct spdk_iscsi_tgt_node *target)
716 {
717 	struct spdk_iscsi_conn *conn;
718 	int num = 0;
719 
720 	if (g_conns_array == MAP_FAILED) {
721 		return 0;
722 	}
723 
724 	pthread_mutex_lock(&g_conns_mutex);
725 	TAILQ_FOREACH(conn, &g_active_conns, conn_link) {
726 		if (target == NULL || conn->target == target) {
727 			num++;
728 		}
729 	}
730 	pthread_mutex_unlock(&g_conns_mutex);
731 	return num;
732 }
733 
734 static void
735 iscsi_conn_check_shutdown_cb(void *arg1)
736 {
737 	_iscsi_conns_cleanup();
738 	shutdown_iscsi_conns_done();
739 }
740 
741 static int
742 iscsi_conn_check_shutdown(void *arg)
743 {
744 	if (iscsi_get_active_conns(NULL) != 0) {
745 		return SPDK_POLLER_BUSY;
746 	}
747 
748 	spdk_poller_unregister(&g_shutdown_timer);
749 
750 	spdk_thread_send_msg(spdk_get_thread(), iscsi_conn_check_shutdown_cb, NULL);
751 
752 	return SPDK_POLLER_BUSY;
753 }
754 
755 static void
756 iscsi_send_logout_request(struct spdk_iscsi_conn *conn)
757 {
758 	struct spdk_iscsi_pdu *rsp_pdu;
759 	struct iscsi_bhs_async *rsph;
760 
761 	rsp_pdu = iscsi_get_pdu(conn);
762 	assert(rsp_pdu != NULL);
763 
764 	rsph = (struct iscsi_bhs_async *)&rsp_pdu->bhs;
765 	rsp_pdu->data = NULL;
766 
767 	rsph->opcode = ISCSI_OP_ASYNC;
768 	to_be32(&rsph->ffffffff, 0xFFFFFFFF);
769 	rsph->async_event = 1;
770 	to_be16(&rsph->param3, ISCSI_LOGOUT_REQUEST_TIMEOUT);
771 
772 	to_be32(&rsph->stat_sn, conn->StatSN);
773 	conn->StatSN++;
774 	to_be32(&rsph->exp_cmd_sn, conn->sess->ExpCmdSN);
775 	to_be32(&rsph->max_cmd_sn, conn->sess->MaxCmdSN);
776 
777 	iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_pdu_generic_complete, NULL);
778 }
779 
780 static int
781 logout_request_timeout(void *arg)
782 {
783 	struct spdk_iscsi_conn *conn = arg;
784 
785 	if (conn->state < ISCSI_CONN_STATE_EXITING) {
786 		conn->state = ISCSI_CONN_STATE_EXITING;
787 	}
788 
789 	spdk_poller_unregister(&conn->logout_request_timer);
790 
791 	return SPDK_POLLER_BUSY;
792 }
793 
794 /* If the connection is running and logout is not requested yet, request logout
795  * to initiator and wait for the logout process to start.
796  */
797 static void
798 _iscsi_conn_request_logout(void *ctx)
799 {
800 	struct spdk_iscsi_conn *conn = ctx;
801 
802 	if (conn->state > ISCSI_CONN_STATE_RUNNING ||
803 	    conn->logout_request_timer != NULL) {
804 		return;
805 	}
806 
807 	iscsi_send_logout_request(conn);
808 
809 	conn->logout_request_timer = SPDK_POLLER_REGISTER(logout_request_timeout,
810 				     conn, ISCSI_LOGOUT_REQUEST_TIMEOUT * 1000000);
811 }
812 
813 static void
814 iscsi_conn_request_logout(struct spdk_iscsi_conn *conn)
815 {
816 	struct spdk_thread *thread;
817 
818 	if (conn->state == ISCSI_CONN_STATE_INVALID) {
819 		/* Move it to EXITING state if the connection is in login. */
820 		conn->state = ISCSI_CONN_STATE_EXITING;
821 		spdk_poller_unregister(&conn->login_timer);
822 	} else if (conn->state == ISCSI_CONN_STATE_RUNNING &&
823 		   conn->logout_request_timer == NULL) {
824 		thread = spdk_io_channel_get_thread(spdk_io_channel_from_ctx(conn->pg));
825 		spdk_thread_send_msg(thread, _iscsi_conn_request_logout, conn);
826 	}
827 }
828 
829 void
830 iscsi_conns_request_logout(struct spdk_iscsi_tgt_node *target, int pg_tag)
831 {
832 	struct spdk_iscsi_conn	*conn;
833 
834 	if (g_conns_array == MAP_FAILED) {
835 		return;
836 	}
837 
838 	pthread_mutex_lock(&g_conns_mutex);
839 	TAILQ_FOREACH(conn, &g_active_conns, conn_link) {
840 		if ((target == NULL) ||
841 		    (conn->target == target && (pg_tag < 0 || conn->pg_tag == pg_tag))) {
842 			iscsi_conn_request_logout(conn);
843 		}
844 	}
845 	pthread_mutex_unlock(&g_conns_mutex);
846 }
847 
848 void
849 shutdown_iscsi_conns(void)
850 {
851 	iscsi_conns_request_logout(NULL, -1);
852 
853 	g_shutdown_timer = SPDK_POLLER_REGISTER(iscsi_conn_check_shutdown, NULL, 1000);
854 }
855 
856 /* Do not set conn->state if the connection has already started exiting.
857  *  This ensures we do not move a connection from EXITED state back to EXITING.
858  */
859 static void
860 _iscsi_conn_drop(void *ctx)
861 {
862 	struct spdk_iscsi_conn *conn = ctx;
863 
864 	if (conn->state < ISCSI_CONN_STATE_EXITING) {
865 		conn->state = ISCSI_CONN_STATE_EXITING;
866 	}
867 }
868 
869 int
870 iscsi_drop_conns(struct spdk_iscsi_conn *conn, const char *conn_match,
871 		 int drop_all)
872 {
873 	struct spdk_iscsi_conn	*xconn;
874 	const char		*xconn_match;
875 	struct spdk_thread	*thread;
876 	int			num;
877 
878 	SPDK_DEBUGLOG(iscsi, "iscsi_drop_conns\n");
879 
880 	num = 0;
881 	pthread_mutex_lock(&g_conns_mutex);
882 	if (g_conns_array == MAP_FAILED) {
883 		goto exit;
884 	}
885 
886 	TAILQ_FOREACH(xconn, &g_active_conns, conn_link) {
887 		if (xconn == conn) {
888 			continue;
889 		}
890 
891 		if (!drop_all && xconn->initiator_port == NULL) {
892 			continue;
893 		}
894 
895 		xconn_match =
896 			drop_all ? xconn->initiator_name : spdk_scsi_port_get_name(xconn->initiator_port);
897 
898 		if (!strcasecmp(conn_match, xconn_match) &&
899 		    conn->target == xconn->target) {
900 
901 			if (num == 0) {
902 				/*
903 				 * Only print this message before we report the
904 				 *  first dropped connection.
905 				 */
906 				SPDK_ERRLOG("drop old connections %s by %s\n",
907 					    conn->target->name, conn_match);
908 			}
909 
910 			SPDK_ERRLOG("exiting conn by %s (%s)\n",
911 				    xconn_match, xconn->initiator_addr);
912 			if (xconn->sess != NULL) {
913 				SPDK_DEBUGLOG(iscsi, "TSIH=%u\n", xconn->sess->tsih);
914 			} else {
915 				SPDK_DEBUGLOG(iscsi, "TSIH=xx\n");
916 			}
917 
918 			SPDK_DEBUGLOG(iscsi, "CID=%u\n", xconn->cid);
919 
920 			thread = spdk_io_channel_get_thread(spdk_io_channel_from_ctx(xconn->pg));
921 			spdk_thread_send_msg(thread, _iscsi_conn_drop, xconn);
922 
923 			num++;
924 		}
925 	}
926 
927 exit:
928 	pthread_mutex_unlock(&g_conns_mutex);
929 
930 	if (num != 0) {
931 		SPDK_ERRLOG("exiting %d conns\n", num);
932 	}
933 
934 	return 0;
935 }
936 
937 static int
938 _iscsi_conn_abort_queued_datain_task(struct spdk_iscsi_conn *conn,
939 				     struct spdk_iscsi_task *task)
940 {
941 	struct spdk_iscsi_task *subtask;
942 	uint32_t remaining_size;
943 
944 	if (conn->data_in_cnt >= g_iscsi.MaxLargeDataInPerConnection) {
945 		return -1;
946 	}
947 
948 	assert(task->current_data_offset <= task->scsi.transfer_len);
949 	/* Stop split and abort read I/O for remaining data. */
950 	if (task->current_data_offset < task->scsi.transfer_len) {
951 		remaining_size = task->scsi.transfer_len - task->current_data_offset;
952 		subtask = iscsi_task_get(conn, task, iscsi_task_cpl);
953 		assert(subtask != NULL);
954 		subtask->scsi.offset = task->current_data_offset;
955 		subtask->scsi.length = remaining_size;
956 		spdk_scsi_task_set_data(&subtask->scsi, NULL, 0);
957 		task->current_data_offset += subtask->scsi.length;
958 
959 		subtask->scsi.transfer_len = subtask->scsi.length;
960 		spdk_scsi_task_process_abort(&subtask->scsi);
961 		iscsi_task_cpl(&subtask->scsi);
962 	}
963 
964 	/* Remove the primary task from the list because all subtasks are submitted
965 	 *  or aborted.
966 	 */
967 	assert(task->current_data_offset == task->scsi.transfer_len);
968 	TAILQ_REMOVE(&conn->queued_datain_tasks, task, link);
969 	return 0;
970 }
971 
972 int
973 iscsi_conn_abort_queued_datain_task(struct spdk_iscsi_conn *conn,
974 				    uint32_t ref_task_tag)
975 {
976 	struct spdk_iscsi_task *task;
977 
978 	TAILQ_FOREACH(task, &conn->queued_datain_tasks, link) {
979 		if (task->tag == ref_task_tag) {
980 			return _iscsi_conn_abort_queued_datain_task(conn, task);
981 		}
982 	}
983 
984 	return 0;
985 }
986 
987 int
988 iscsi_conn_abort_queued_datain_tasks(struct spdk_iscsi_conn *conn,
989 				     struct spdk_scsi_lun *lun,
990 				     struct spdk_iscsi_pdu *pdu)
991 {
992 	struct spdk_iscsi_task *task, *task_tmp;
993 	struct spdk_iscsi_pdu *pdu_tmp;
994 	int rc;
995 
996 	TAILQ_FOREACH_SAFE(task, &conn->queued_datain_tasks, link, task_tmp) {
997 		pdu_tmp = iscsi_task_get_pdu(task);
998 		if ((lun == NULL || lun == task->scsi.lun) &&
999 		    (pdu == NULL || (spdk_sn32_lt(pdu_tmp->cmd_sn, pdu->cmd_sn)))) {
1000 			rc = _iscsi_conn_abort_queued_datain_task(conn, task);
1001 			if (rc != 0) {
1002 				return rc;
1003 			}
1004 		}
1005 	}
1006 
1007 	return 0;
1008 }
1009 
1010 int
1011 iscsi_conn_handle_queued_datain_tasks(struct spdk_iscsi_conn *conn)
1012 {
1013 	struct spdk_iscsi_task *task;
1014 
1015 	while (!TAILQ_EMPTY(&conn->queued_datain_tasks) &&
1016 	       conn->data_in_cnt < g_iscsi.MaxLargeDataInPerConnection) {
1017 		task = TAILQ_FIRST(&conn->queued_datain_tasks);
1018 		assert(task->current_data_offset <= task->scsi.transfer_len);
1019 		if (task->current_data_offset < task->scsi.transfer_len) {
1020 			struct spdk_iscsi_task *subtask;
1021 			uint32_t remaining_size = 0;
1022 
1023 			remaining_size = task->scsi.transfer_len - task->current_data_offset;
1024 			subtask = iscsi_task_get(conn, task, iscsi_task_cpl);
1025 			assert(subtask != NULL);
1026 			subtask->scsi.offset = task->current_data_offset;
1027 			spdk_scsi_task_set_data(&subtask->scsi, NULL, 0);
1028 
1029 			if (spdk_scsi_dev_get_lun(conn->dev, task->lun_id) == NULL) {
1030 				/* Stop submitting split read I/Os for remaining data. */
1031 				TAILQ_REMOVE(&conn->queued_datain_tasks, task, link);
1032 				task->current_data_offset += remaining_size;
1033 				assert(task->current_data_offset == task->scsi.transfer_len);
1034 				subtask->scsi.transfer_len = remaining_size;
1035 				spdk_scsi_task_process_null_lun(&subtask->scsi);
1036 				iscsi_task_cpl(&subtask->scsi);
1037 				return 0;
1038 			}
1039 
1040 			subtask->scsi.length = spdk_min(SPDK_BDEV_LARGE_BUF_MAX_SIZE, remaining_size);
1041 			task->current_data_offset += subtask->scsi.length;
1042 			iscsi_queue_task(conn, subtask);
1043 		}
1044 		if (task->current_data_offset == task->scsi.transfer_len) {
1045 			TAILQ_REMOVE(&conn->queued_datain_tasks, task, link);
1046 		}
1047 	}
1048 	return 0;
1049 }
1050 
1051 void
1052 iscsi_task_mgmt_cpl(struct spdk_scsi_task *scsi_task)
1053 {
1054 	struct spdk_iscsi_task *task = iscsi_task_from_scsi_task(scsi_task);
1055 
1056 	iscsi_task_mgmt_response(task->conn, task);
1057 	iscsi_task_put(task);
1058 }
1059 
1060 static void
1061 process_completed_read_subtask_list_in_order(struct spdk_iscsi_conn *conn,
1062 		struct spdk_iscsi_task *primary)
1063 {
1064 	struct spdk_iscsi_task *subtask, *tmp;
1065 
1066 	TAILQ_FOREACH_SAFE(subtask, &primary->subtask_list, subtask_link, tmp) {
1067 		if (subtask->scsi.offset == primary->bytes_completed) {
1068 			TAILQ_REMOVE(&primary->subtask_list, subtask, subtask_link);
1069 			primary->bytes_completed += subtask->scsi.length;
1070 			if (primary->bytes_completed == primary->scsi.transfer_len) {
1071 				iscsi_task_put(primary);
1072 			}
1073 			iscsi_task_response(conn, subtask);
1074 			iscsi_task_put(subtask);
1075 		} else {
1076 			break;
1077 		}
1078 	}
1079 }
1080 
1081 static void
1082 process_read_task_completion(struct spdk_iscsi_conn *conn,
1083 			     struct spdk_iscsi_task *task,
1084 			     struct spdk_iscsi_task *primary)
1085 {
1086 	struct spdk_iscsi_task *tmp;
1087 
1088 	if (task->scsi.status != SPDK_SCSI_STATUS_GOOD) {
1089 		if (primary->scsi.status == SPDK_SCSI_STATUS_GOOD) {
1090 			/* If the status of the completed subtask, task, is the
1091 			 * first failure, copy it to out-of-order subtasks, and
1092 			 * remember it as the status of the SCSI Read Command.
1093 			 */
1094 			TAILQ_FOREACH(tmp, &primary->subtask_list, subtask_link) {
1095 				spdk_scsi_task_copy_status(&tmp->scsi, &task->scsi);
1096 			}
1097 			spdk_scsi_task_copy_status(&primary->scsi, &task->scsi);
1098 		}
1099 	} else if (primary->scsi.status != SPDK_SCSI_STATUS_GOOD) {
1100 		/* Even if the status of the completed subtask is success,
1101 		 * if there are any failed subtask ever, copy the first failed
1102 		 * status to it.
1103 		 */
1104 		spdk_scsi_task_copy_status(&task->scsi, &primary->scsi);
1105 	}
1106 
1107 	if (task == primary) {
1108 		/* If read I/O size is not larger than SPDK_BDEV_LARGE_BUF_MAX_SIZE,
1109 		 * the primary task which processes the SCSI Read Command PDU is
1110 		 * submitted directly. Hence send SCSI Response PDU for the primary
1111 		 * task simply.
1112 		 */
1113 		primary->bytes_completed = task->scsi.length;
1114 		assert(primary->bytes_completed == task->scsi.transfer_len);
1115 		iscsi_task_response(conn, task);
1116 		iscsi_task_put(task);
1117 	} else if (!conn->sess->DataSequenceInOrder) {
1118 		/* If DataSequenceInOrder is No, send SCSI Response PDU for the completed
1119 		 * subtask without any deferral.
1120 		 */
1121 		primary->bytes_completed += task->scsi.length;
1122 		if (primary->bytes_completed == primary->scsi.transfer_len) {
1123 			iscsi_task_put(primary);
1124 		}
1125 		iscsi_task_response(conn, task);
1126 		iscsi_task_put(task);
1127 	} else {
1128 		/* If DataSequenceInOrder is Yes, if the completed subtask is out-of-order,
1129 		 * it is deferred until all preceding subtasks send SCSI Response PDU.
1130 		 */
1131 		if (task->scsi.offset != primary->bytes_completed) {
1132 			TAILQ_FOREACH(tmp, &primary->subtask_list, subtask_link) {
1133 				if (task->scsi.offset < tmp->scsi.offset) {
1134 					TAILQ_INSERT_BEFORE(tmp, task, subtask_link);
1135 					return;
1136 				}
1137 			}
1138 
1139 			TAILQ_INSERT_TAIL(&primary->subtask_list, task, subtask_link);
1140 		} else {
1141 			TAILQ_INSERT_HEAD(&primary->subtask_list, task, subtask_link);
1142 			process_completed_read_subtask_list_in_order(conn, primary);
1143 		}
1144 	}
1145 }
1146 
1147 static void
1148 process_non_read_task_completion(struct spdk_iscsi_conn *conn,
1149 				 struct spdk_iscsi_task *task,
1150 				 struct spdk_iscsi_task *primary)
1151 {
1152 	primary->bytes_completed += task->scsi.length;
1153 
1154 	if (task == primary) {
1155 		/* This was a small write with no R2T. */
1156 		iscsi_task_response(conn, task);
1157 		iscsi_task_put(task);
1158 		return;
1159 	}
1160 
1161 	if (task->scsi.status == SPDK_SCSI_STATUS_GOOD) {
1162 		primary->scsi.data_transferred += task->scsi.data_transferred;
1163 	} else if (primary->scsi.status == SPDK_SCSI_STATUS_GOOD) {
1164 		/* If the status of this subtask is the first failure, copy it to
1165 		 * the primary task.
1166 		 */
1167 		spdk_scsi_task_copy_status(&primary->scsi, &task->scsi);
1168 	}
1169 
1170 	if (primary->bytes_completed == primary->scsi.transfer_len) {
1171 		/* If LUN is removed in the middle of the iSCSI write sequence,
1172 		 *  primary might complete the write to the initiator because it is not
1173 		 *  ensured that the initiator will send all data requested by R2Ts.
1174 		 *
1175 		 * We check it and skip the following if primary is completed. (see
1176 		 *  iscsi_clear_all_transfer_task() in iscsi.c.)
1177 		 */
1178 		if (primary->is_r2t_active) {
1179 			iscsi_task_response(conn, primary);
1180 			iscsi_del_transfer_task(conn, primary->tag);
1181 		} else {
1182 			iscsi_task_response(conn, task);
1183 		}
1184 	}
1185 	iscsi_task_put(task);
1186 }
1187 
1188 void
1189 iscsi_task_cpl(struct spdk_scsi_task *scsi_task)
1190 {
1191 	struct spdk_iscsi_task *primary;
1192 	struct spdk_iscsi_task *task = iscsi_task_from_scsi_task(scsi_task);
1193 	struct spdk_iscsi_conn *conn = task->conn;
1194 	struct spdk_iscsi_pdu *pdu = task->pdu;
1195 
1196 	spdk_trace_record(TRACE_ISCSI_TASK_DONE, conn->trace_id, 0, (uintptr_t)task);
1197 
1198 	task->is_queued = false;
1199 	primary = iscsi_task_get_primary(task);
1200 
1201 	if (iscsi_task_is_read(primary)) {
1202 		process_read_task_completion(conn, task, primary);
1203 	} else {
1204 		process_non_read_task_completion(conn, task, primary);
1205 	}
1206 	if (!task->parent) {
1207 		spdk_trace_record(TRACE_ISCSI_PDU_COMPLETED, conn->trace_id, 0, (uintptr_t)pdu);
1208 	}
1209 }
1210 
1211 static void
1212 iscsi_conn_send_nopin(struct spdk_iscsi_conn *conn)
1213 {
1214 	struct spdk_iscsi_pdu *rsp_pdu;
1215 	struct iscsi_bhs_nop_in *rsp;
1216 	/* Only send nopin if we have logged in and are in a normal session. */
1217 	if (conn->sess == NULL ||
1218 	    !conn->full_feature ||
1219 	    !iscsi_param_eq_val(conn->sess->params, "SessionType", "Normal")) {
1220 		return;
1221 	}
1222 	SPDK_DEBUGLOG(iscsi, "send NOPIN isid=%"PRIx64", tsih=%u, cid=%u\n",
1223 		      conn->sess->isid, conn->sess->tsih, conn->cid);
1224 	SPDK_DEBUGLOG(iscsi, "StatSN=%u, ExpCmdSN=%u, MaxCmdSN=%u\n",
1225 		      conn->StatSN, conn->sess->ExpCmdSN,
1226 		      conn->sess->MaxCmdSN);
1227 	rsp_pdu = iscsi_get_pdu(conn);
1228 	rsp = (struct iscsi_bhs_nop_in *) &rsp_pdu->bhs;
1229 	rsp_pdu->data = NULL;
1230 	/*
1231 	 * iscsi_get_pdu() memset's the PDU for us, so only fill out the needed
1232 	 *  fields.
1233 	 */
1234 	rsp->opcode = ISCSI_OP_NOPIN;
1235 	rsp->flags = 0x80;
1236 	/*
1237 	 * Technically the to_be32() is not needed here, since
1238 	 *  to_be32(0xFFFFFFFU) returns 0xFFFFFFFFU.
1239 	 */
1240 	to_be32(&rsp->itt, 0xFFFFFFFFU);
1241 	to_be32(&rsp->ttt, conn->id);
1242 	to_be32(&rsp->stat_sn, conn->StatSN);
1243 	to_be32(&rsp->exp_cmd_sn, conn->sess->ExpCmdSN);
1244 	to_be32(&rsp->max_cmd_sn, conn->sess->MaxCmdSN);
1245 	iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_pdu_generic_complete, NULL);
1246 	conn->last_nopin = spdk_get_ticks();
1247 	conn->nop_outstanding = true;
1248 }
1249 
1250 void
1251 iscsi_conn_handle_nop(struct spdk_iscsi_conn *conn)
1252 {
1253 	uint64_t	tsc;
1254 
1255 	/**
1256 	  * This function will be executed by nop_poller of iSCSI polling group, so
1257 	  * we need to check the connection state first, then do the nop interval
1258 	  * expiration check work.
1259 	  */
1260 	if ((conn->state == ISCSI_CONN_STATE_EXITED) ||
1261 	    (conn->state == ISCSI_CONN_STATE_EXITING)) {
1262 		return;
1263 	}
1264 
1265 	/* Check for nop interval expiration */
1266 	tsc = spdk_get_ticks();
1267 	if (conn->nop_outstanding) {
1268 		if ((tsc - conn->last_nopin) > conn->timeout) {
1269 			SPDK_ERRLOG("Timed out waiting for NOP-Out response from initiator\n");
1270 			SPDK_ERRLOG("  tsc=0x%" PRIx64 ", last_nopin=0x%" PRIx64 "\n", tsc, conn->last_nopin);
1271 			SPDK_ERRLOG("  initiator=%s, target=%s\n", conn->initiator_name,
1272 				    conn->target_short_name);
1273 			conn->state = ISCSI_CONN_STATE_EXITING;
1274 		}
1275 	} else if (tsc - conn->last_nopin > conn->nopininterval) {
1276 		iscsi_conn_send_nopin(conn);
1277 	}
1278 }
1279 
1280 /**
1281  * \brief Reads data for the specified iSCSI connection from its TCP socket.
1282  *
1283  * The TCP socket is marked as non-blocking, so this function may not read
1284  * all data requested.
1285  *
1286  * Returns SPDK_ISCSI_CONNECTION_FATAL if the recv() operation indicates a fatal
1287  * error with the TCP connection (including if the TCP connection was closed
1288  * unexpectedly.
1289  *
1290  * Otherwise returns the number of bytes successfully read.
1291  */
1292 int
1293 iscsi_conn_read_data(struct spdk_iscsi_conn *conn, int bytes,
1294 		     void *buf)
1295 {
1296 	int ret;
1297 
1298 	if (bytes == 0) {
1299 		return 0;
1300 	}
1301 
1302 	ret = spdk_sock_recv(conn->sock, buf, bytes);
1303 
1304 	if (ret > 0) {
1305 		spdk_trace_record(TRACE_ISCSI_READ_FROM_SOCKET_DONE, conn->trace_id, ret, 0);
1306 		return ret;
1307 	}
1308 
1309 	if (ret < 0) {
1310 		if (errno == EAGAIN || errno == EWOULDBLOCK) {
1311 			return 0;
1312 		}
1313 
1314 		/* For connect reset issue, do not output error log */
1315 		if (errno == ECONNRESET) {
1316 			SPDK_DEBUGLOG(iscsi, "spdk_sock_recv() failed, errno %d: %s\n",
1317 				      errno, spdk_strerror(errno));
1318 		} else {
1319 			SPDK_ERRLOG("spdk_sock_recv() failed, errno %d: %s\n",
1320 				    errno, spdk_strerror(errno));
1321 		}
1322 	}
1323 
1324 	/* connection closed */
1325 	return SPDK_ISCSI_CONNECTION_FATAL;
1326 }
1327 
1328 int
1329 iscsi_conn_readv_data(struct spdk_iscsi_conn *conn,
1330 		      struct iovec *iov, int iovcnt)
1331 {
1332 	int ret;
1333 
1334 	if (iov == NULL || iovcnt == 0) {
1335 		return 0;
1336 	}
1337 
1338 	if (iovcnt == 1) {
1339 		return iscsi_conn_read_data(conn, iov[0].iov_len,
1340 					    iov[0].iov_base);
1341 	}
1342 
1343 	ret = spdk_sock_readv(conn->sock, iov, iovcnt);
1344 
1345 	if (ret > 0) {
1346 		spdk_trace_record(TRACE_ISCSI_READ_FROM_SOCKET_DONE, conn->trace_id, ret, 0);
1347 		return ret;
1348 	}
1349 
1350 	if (ret < 0) {
1351 		if (errno == EAGAIN || errno == EWOULDBLOCK) {
1352 			return 0;
1353 		}
1354 
1355 		/* For connect reset issue, do not output error log */
1356 		if (errno == ECONNRESET) {
1357 			SPDK_DEBUGLOG(iscsi, "spdk_sock_readv() failed, errno %d: %s\n",
1358 				      errno, spdk_strerror(errno));
1359 		} else {
1360 			SPDK_ERRLOG("spdk_sock_readv() failed, errno %d: %s\n",
1361 				    errno, spdk_strerror(errno));
1362 		}
1363 	}
1364 
1365 	/* connection closed */
1366 	return SPDK_ISCSI_CONNECTION_FATAL;
1367 }
1368 
1369 static bool
1370 iscsi_is_free_pdu_deferred(struct spdk_iscsi_pdu *pdu)
1371 {
1372 	if (pdu == NULL) {
1373 		return false;
1374 	}
1375 
1376 	if (pdu->bhs.opcode == ISCSI_OP_R2T ||
1377 	    pdu->bhs.opcode == ISCSI_OP_SCSI_DATAIN) {
1378 		return true;
1379 	}
1380 
1381 	return false;
1382 }
1383 
1384 static int
1385 iscsi_dif_verify(struct spdk_iscsi_pdu *pdu, struct spdk_dif_ctx *dif_ctx)
1386 {
1387 	struct iovec iov;
1388 	struct spdk_dif_error err_blk = {};
1389 	uint32_t num_blocks;
1390 	int rc;
1391 
1392 	iov.iov_base = pdu->data;
1393 	iov.iov_len = pdu->data_buf_len;
1394 	num_blocks = pdu->data_buf_len / dif_ctx->block_size;
1395 
1396 	rc = spdk_dif_verify(&iov, 1, num_blocks, dif_ctx, &err_blk);
1397 	if (rc != 0) {
1398 		SPDK_ERRLOG("DIF error detected. type=%d, offset=%" PRIu32 "\n",
1399 			    err_blk.err_type, err_blk.err_offset);
1400 	}
1401 
1402 	return rc;
1403 }
1404 
1405 static void
1406 _iscsi_conn_pdu_write_done(void *cb_arg, int err)
1407 {
1408 	struct spdk_iscsi_pdu *pdu = cb_arg;
1409 	struct spdk_iscsi_conn *conn = pdu->conn;
1410 
1411 	assert(conn != NULL);
1412 
1413 	if (spdk_unlikely(conn->state >= ISCSI_CONN_STATE_EXITING)) {
1414 		/* The other policy will recycle the resource */
1415 		return;
1416 	}
1417 
1418 	TAILQ_REMOVE(&conn->write_pdu_list, pdu, tailq);
1419 
1420 	if (err != 0) {
1421 		conn->state = ISCSI_CONN_STATE_EXITING;
1422 	}
1423 
1424 	if ((conn->full_feature) &&
1425 	    (conn->sess->ErrorRecoveryLevel >= 1) &&
1426 	    iscsi_is_free_pdu_deferred(pdu)) {
1427 		SPDK_DEBUGLOG(iscsi, "stat_sn=%d\n",
1428 			      from_be32(&pdu->bhs.stat_sn));
1429 		TAILQ_INSERT_TAIL(&conn->snack_pdu_list, pdu,
1430 				  tailq);
1431 	} else {
1432 		iscsi_conn_free_pdu(conn, pdu);
1433 	}
1434 }
1435 
1436 void
1437 iscsi_conn_pdu_generic_complete(void *cb_arg)
1438 {
1439 }
1440 
1441 void
1442 iscsi_conn_write_pdu(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu,
1443 		     iscsi_conn_xfer_complete_cb cb_fn,
1444 		     void *cb_arg)
1445 {
1446 	uint32_t crc32c;
1447 	ssize_t rc;
1448 
1449 	if (spdk_unlikely(pdu->dif_insert_or_strip)) {
1450 		rc = iscsi_dif_verify(pdu, &pdu->dif_ctx);
1451 		if (rc != 0) {
1452 			iscsi_conn_free_pdu(conn, pdu);
1453 			conn->state = ISCSI_CONN_STATE_EXITING;
1454 			return;
1455 		}
1456 	}
1457 
1458 	if (pdu->bhs.opcode != ISCSI_OP_LOGIN_RSP) {
1459 		/* Header Digest */
1460 		if (conn->header_digest) {
1461 			crc32c = iscsi_pdu_calc_header_digest(pdu);
1462 			MAKE_DIGEST_WORD(pdu->header_digest, crc32c);
1463 		}
1464 
1465 		/* Data Digest */
1466 		if (conn->data_digest && DGET24(pdu->bhs.data_segment_len) != 0) {
1467 			crc32c = iscsi_pdu_calc_data_digest(pdu);
1468 			MAKE_DIGEST_WORD(pdu->data_digest, crc32c);
1469 		}
1470 	}
1471 
1472 	pdu->cb_fn = cb_fn;
1473 	pdu->cb_arg = cb_arg;
1474 	TAILQ_INSERT_TAIL(&conn->write_pdu_list, pdu, tailq);
1475 
1476 	if (spdk_unlikely(conn->state >= ISCSI_CONN_STATE_EXITING)) {
1477 		return;
1478 	}
1479 	pdu->sock_req.iovcnt = iscsi_build_iovs(conn, pdu->iov, SPDK_COUNTOF(pdu->iov), pdu,
1480 						&pdu->mapped_length);
1481 	pdu->sock_req.cb_fn = _iscsi_conn_pdu_write_done;
1482 	pdu->sock_req.cb_arg = pdu;
1483 
1484 	spdk_sock_writev_async(conn->sock, &pdu->sock_req);
1485 }
1486 
1487 static void
1488 iscsi_conn_sock_cb(void *arg, struct spdk_sock_group *group, struct spdk_sock *sock)
1489 {
1490 	struct spdk_iscsi_conn *conn = arg;
1491 	int rc;
1492 
1493 	assert(conn != NULL);
1494 
1495 	if ((conn->state == ISCSI_CONN_STATE_EXITED) ||
1496 	    (conn->state == ISCSI_CONN_STATE_EXITING)) {
1497 		return;
1498 	}
1499 
1500 	/* Handle incoming PDUs */
1501 	rc = iscsi_handle_incoming_pdus(conn);
1502 	if (rc < 0) {
1503 		conn->state = ISCSI_CONN_STATE_EXITING;
1504 	}
1505 }
1506 
1507 static void
1508 iscsi_conn_full_feature_migrate(void *arg)
1509 {
1510 	struct spdk_iscsi_conn *conn = arg;
1511 	int rc;
1512 
1513 	assert(conn->state != ISCSI_CONN_STATE_EXITED);
1514 
1515 	/* Note: it is possible that connection could have moved to EXITING
1516 	 * state after this message was sent. We will still add it to the
1517 	 * poll group in this case.  When the poll group is polled
1518 	 * again, it will call iscsi_conn_destruct() on it.
1519 	 */
1520 
1521 	if (conn->sess->session_type == SESSION_TYPE_NORMAL) {
1522 		rc = iscsi_conn_open_luns(conn);
1523 		if (rc != 0) {
1524 			/* If opening LUNs failed, it is a fatal error. At the first poll in the
1525 			 * assigned poll group, this connection will be destructed.
1526 			 */
1527 			conn->state = ISCSI_CONN_STATE_EXITING;
1528 		}
1529 	}
1530 
1531 	/* Add this connection to the assigned poll group. */
1532 	iscsi_poll_group_add_conn(conn->pg, conn);
1533 }
1534 
1535 static struct spdk_iscsi_poll_group *
1536 iscsi_get_idlest_poll_group(void)
1537 {
1538 	struct spdk_iscsi_poll_group *pg, *idle_pg = NULL;
1539 	uint32_t min_num_targets = UINT32_MAX;
1540 
1541 	TAILQ_FOREACH(pg, &g_iscsi.poll_group_head, link) {
1542 		if (pg->num_active_targets == 0) {
1543 			return pg;
1544 		} else if (pg->num_active_targets < min_num_targets) {
1545 			min_num_targets = pg->num_active_targets;
1546 			idle_pg = pg;
1547 		}
1548 	}
1549 
1550 	return idle_pg;
1551 }
1552 
1553 void
1554 iscsi_conn_schedule(struct spdk_iscsi_conn *conn)
1555 {
1556 	struct spdk_iscsi_poll_group	*pg;
1557 	struct spdk_iscsi_tgt_node	*target;
1558 
1559 	if (conn->sess->session_type != SESSION_TYPE_NORMAL) {
1560 		/* Leave all non-normal sessions on the acceptor
1561 		 * thread. */
1562 		return;
1563 	}
1564 	pthread_mutex_lock(&g_iscsi.mutex);
1565 
1566 	target = conn->sess->target;
1567 	pthread_mutex_lock(&target->mutex);
1568 	target->num_active_conns++;
1569 	if (target->num_active_conns == 1) {
1570 		/**
1571 		 * This is the only active connection for this target node.
1572 		 *  Pick the idlest poll group.
1573 		 */
1574 		pg = iscsi_get_idlest_poll_group();
1575 		assert(pg != NULL);
1576 
1577 		pg->num_active_targets++;
1578 
1579 		/* Save the pg in the target node so it can be used for any other connections to this target node. */
1580 		target->pg = pg;
1581 	} else {
1582 		/**
1583 		 * There are other active connections for this target node.
1584 		 */
1585 		pg = target->pg;
1586 	}
1587 
1588 	pthread_mutex_unlock(&target->mutex);
1589 	pthread_mutex_unlock(&g_iscsi.mutex);
1590 
1591 	assert(spdk_io_channel_get_thread(spdk_io_channel_from_ctx(conn->pg)) ==
1592 	       spdk_get_thread());
1593 
1594 	/* Remove this connection from the previous poll group */
1595 	iscsi_poll_group_remove_conn(conn->pg, conn);
1596 
1597 	conn->pg = pg;
1598 	conn->scheduled = 1;
1599 
1600 	spdk_thread_send_msg(spdk_io_channel_get_thread(spdk_io_channel_from_ctx(pg)),
1601 			     iscsi_conn_full_feature_migrate, conn);
1602 }
1603 
1604 static int
1605 logout_timeout(void *arg)
1606 {
1607 	struct spdk_iscsi_conn *conn = arg;
1608 
1609 	if (conn->state < ISCSI_CONN_STATE_EXITING) {
1610 		conn->state = ISCSI_CONN_STATE_EXITING;
1611 	}
1612 
1613 	spdk_poller_unregister(&conn->logout_timer);
1614 
1615 	return SPDK_POLLER_BUSY;
1616 }
1617 
1618 void
1619 iscsi_conn_logout(struct spdk_iscsi_conn *conn)
1620 {
1621 	conn->is_logged_out = true;
1622 	conn->logout_timer = SPDK_POLLER_REGISTER(logout_timeout, conn, ISCSI_LOGOUT_TIMEOUT * 1000000);
1623 }
1624 
1625 static const char *
1626 iscsi_conn_get_state(struct spdk_iscsi_conn *conn)
1627 {
1628 	switch (conn->state) {
1629 		SPDK_ISCSI_CONNECTION_STATUS(ISCSI_CONN_STATE_INVALID, "invalid");
1630 		SPDK_ISCSI_CONNECTION_STATUS(ISCSI_CONN_STATE_RUNNING, "running");
1631 		SPDK_ISCSI_CONNECTION_STATUS(ISCSI_CONN_STATE_EXITING, "exiting");
1632 		SPDK_ISCSI_CONNECTION_STATUS(ISCSI_CONN_STATE_EXITED, "exited");
1633 	}
1634 	return "unknown";
1635 }
1636 
1637 static const char *
1638 iscsi_conn_get_login_phase(struct spdk_iscsi_conn *conn)
1639 {
1640 	switch (conn->login_phase) {
1641 		SPDK_ISCSI_CONNECTION_STATUS(ISCSI_SECURITY_NEGOTIATION_PHASE, "security_negotiation_phase");
1642 		SPDK_ISCSI_CONNECTION_STATUS(ISCSI_OPERATIONAL_NEGOTIATION_PHASE, "operational_negotiation_phase");
1643 		SPDK_ISCSI_CONNECTION_STATUS(ISCSI_FULL_FEATURE_PHASE, "full_feature_phase");
1644 	}
1645 	return "not_started";
1646 }
1647 
1648 static void
1649 iscsi_conn_trace(void)
1650 {
1651 	spdk_trace_register_owner_type(OWNER_TYPE_ISCSI_CONN, 'c');
1652 	spdk_trace_register_object(OBJECT_ISCSI_PDU, 'p');
1653 	spdk_trace_register_description("ISCSI_READ_DONE", TRACE_ISCSI_READ_FROM_SOCKET_DONE,
1654 					OWNER_TYPE_ISCSI_CONN, OBJECT_NONE, 0,
1655 					SPDK_TRACE_ARG_TYPE_INT, "");
1656 	spdk_trace_register_description("ISCSI_READ_PDU", TRACE_ISCSI_READ_PDU,
1657 					OWNER_TYPE_ISCSI_CONN, OBJECT_ISCSI_PDU, 1,
1658 					SPDK_TRACE_ARG_TYPE_INT, "opc");
1659 	spdk_trace_register_description("ISCSI_TASK_DONE", TRACE_ISCSI_TASK_DONE,
1660 					OWNER_TYPE_ISCSI_CONN, OBJECT_SCSI_TASK, 0,
1661 					SPDK_TRACE_ARG_TYPE_INT, "");
1662 	spdk_trace_register_description("ISCSI_TASK_QUEUE", TRACE_ISCSI_TASK_QUEUE,
1663 					OWNER_TYPE_ISCSI_CONN, OBJECT_SCSI_TASK, 1,
1664 					SPDK_TRACE_ARG_TYPE_PTR, "pdu");
1665 	spdk_trace_register_description("ISCSI_TASK_EXECUTED", TRACE_ISCSI_TASK_EXECUTED,
1666 					OWNER_TYPE_ISCSI_CONN, OBJECT_ISCSI_PDU, 0,
1667 					SPDK_TRACE_ARG_TYPE_INT, "");
1668 	spdk_trace_register_description("ISCSI_PDU_COMPLETED", TRACE_ISCSI_PDU_COMPLETED,
1669 					OWNER_TYPE_ISCSI_CONN, OBJECT_ISCSI_PDU, 0,
1670 					SPDK_TRACE_ARG_TYPE_INT, "");
1671 	spdk_trace_tpoint_register_relation(TRACE_SOCK_REQ_QUEUE, OBJECT_ISCSI_PDU, 0);
1672 	spdk_trace_tpoint_register_relation(TRACE_SOCK_REQ_PEND, OBJECT_ISCSI_PDU, 0);
1673 	spdk_trace_tpoint_register_relation(TRACE_SOCK_REQ_COMPLETE, OBJECT_ISCSI_PDU, 0);
1674 }
1675 SPDK_TRACE_REGISTER_FN(iscsi_conn_trace, "iscsi_conn", TRACE_GROUP_ISCSI)
1676 
1677 void
1678 iscsi_conn_info_json(struct spdk_json_write_ctx *w, struct spdk_iscsi_conn *conn)
1679 {
1680 	uint16_t tsih;
1681 
1682 	if (!conn->is_valid) {
1683 		return;
1684 	}
1685 
1686 	spdk_json_write_object_begin(w);
1687 
1688 	spdk_json_write_named_int32(w, "id", conn->id);
1689 
1690 	spdk_json_write_named_int32(w, "cid", conn->cid);
1691 
1692 	/*
1693 	 * If we try to return data for a connection that has not
1694 	 *  logged in yet, the session will not be set.  So in this
1695 	 *  case, return -1 for the tsih rather than segfaulting
1696 	 *  on the null conn->sess.
1697 	 */
1698 	if (conn->sess == NULL) {
1699 		tsih = -1;
1700 	} else {
1701 		tsih = conn->sess->tsih;
1702 	}
1703 	spdk_json_write_named_int32(w, "tsih", tsih);
1704 
1705 	spdk_json_write_named_string(w, "state", iscsi_conn_get_state(conn));
1706 
1707 	spdk_json_write_named_string(w, "login_phase", iscsi_conn_get_login_phase(conn));
1708 
1709 	spdk_json_write_named_string(w, "initiator_addr", conn->initiator_addr);
1710 
1711 	spdk_json_write_named_string(w, "target_addr", conn->target_addr);
1712 
1713 	spdk_json_write_named_string(w, "target_node_name", conn->target_short_name);
1714 
1715 	spdk_json_write_named_string(w, "thread_name",
1716 				     spdk_thread_get_name(spdk_get_thread()));
1717 
1718 	spdk_json_write_object_end(w);
1719 }
1720