xref: /spdk/lib/iscsi/iscsi.c (revision b02581a89058ebaebe03bd0e16e3b58adfe406c1)
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/base64.h"
10 #include "spdk/crc32.h"
11 #include "spdk/endian.h"
12 #include "spdk/env.h"
13 #include "spdk/likely.h"
14 #include "spdk/trace.h"
15 #include "spdk/sock.h"
16 #include "spdk/string.h"
17 #include "spdk/queue.h"
18 
19 #include "iscsi/md5.h"
20 #include "iscsi/iscsi.h"
21 #include "iscsi/param.h"
22 #include "iscsi/tgt_node.h"
23 #include "iscsi/task.h"
24 #include "iscsi/conn.h"
25 #include "spdk/scsi.h"
26 #include "spdk/bdev.h"
27 #include "iscsi/portal_grp.h"
28 
29 #include "spdk/log.h"
30 
31 #include "spdk_internal/sgl.h"
32 
33 #define MAX_TMPBUF 1024
34 
35 struct spdk_iscsi_globals g_iscsi = {
36 	.mutex = PTHREAD_MUTEX_INITIALIZER,
37 	.portal_head = TAILQ_HEAD_INITIALIZER(g_iscsi.portal_head),
38 	.pg_head = TAILQ_HEAD_INITIALIZER(g_iscsi.pg_head),
39 	.ig_head = TAILQ_HEAD_INITIALIZER(g_iscsi.ig_head),
40 	.target_head = TAILQ_HEAD_INITIALIZER(g_iscsi.target_head),
41 	.auth_group_head = TAILQ_HEAD_INITIALIZER(g_iscsi.auth_group_head),
42 	.poll_group_head = TAILQ_HEAD_INITIALIZER(g_iscsi.poll_group_head),
43 };
44 
45 #define MATCH_DIGEST_WORD(BUF, CRC32C) \
46 	(    ((((uint32_t) *((uint8_t *)(BUF)+0)) << 0)		\
47 	    | (((uint32_t) *((uint8_t *)(BUF)+1)) << 8)		\
48 	    | (((uint32_t) *((uint8_t *)(BUF)+2)) << 16)	\
49 	    | (((uint32_t) *((uint8_t *)(BUF)+3)) << 24))	\
50 	    == (CRC32C))
51 
52 #ifndef SPDK_CONFIG_HAVE_ARC4RANDOM
53 static void
54 srandomdev(void)
55 {
56 	unsigned long seed;
57 	time_t now;
58 	pid_t pid;
59 
60 	pid = getpid();
61 	now = time(NULL);
62 	seed = pid ^ now;
63 	srandom(seed);
64 }
65 
66 static int g_arc4random_initialized = 0;
67 
68 static uint32_t
69 arc4random(void)
70 {
71 	uint32_t r;
72 	uint32_t r1, r2;
73 
74 	if (!g_arc4random_initialized) {
75 		srandomdev();
76 		g_arc4random_initialized = 1;
77 	}
78 	r1 = (uint32_t)(random() & 0xffff);
79 	r2 = (uint32_t)(random() & 0xffff);
80 	r = (r1 << 16) | r2;
81 	return r;
82 }
83 #endif /* SPDK_CONFIG_HAVE_ARC4RANDOM */
84 
85 static void
86 gen_random(uint8_t *buf, size_t len)
87 {
88 	uint32_t r;
89 	size_t idx;
90 
91 	for (idx = 0; idx < len; idx++) {
92 		r = arc4random();
93 		buf[idx] = (uint8_t) r;
94 	}
95 }
96 
97 static uint64_t
98 iscsi_get_isid(const uint8_t isid[6])
99 {
100 	return (uint64_t)isid[0] << 40 |
101 	       (uint64_t)isid[1] << 32 |
102 	       (uint64_t)isid[2] << 24 |
103 	       (uint64_t)isid[3] << 16 |
104 	       (uint64_t)isid[4] << 8 |
105 	       (uint64_t)isid[5];
106 }
107 
108 static int
109 bin2hex(char *buf, size_t len, const uint8_t *data, size_t data_len)
110 {
111 	const char *digits = "0123456789ABCDEF";
112 	size_t total = 0;
113 	size_t idx;
114 
115 	if (len < 3) {
116 		return -1;
117 	}
118 	buf[total] = '0';
119 	total++;
120 	buf[total] = 'x';
121 	total++;
122 	buf[total] = '\0';
123 
124 	for (idx = 0; idx < data_len; idx++) {
125 		if (total + 3 > len) {
126 			buf[total] = '\0';
127 			return - 1;
128 		}
129 		buf[total] = digits[(data[idx] >> 4) & 0x0fU];
130 		total++;
131 		buf[total] = digits[data[idx] & 0x0fU];
132 		total++;
133 	}
134 	buf[total] = '\0';
135 	return total;
136 }
137 
138 static int
139 hex2bin(uint8_t *data, size_t data_len, const char *str)
140 {
141 	const char *digits = "0123456789ABCDEF";
142 	const char *dp;
143 	const char *p;
144 	size_t total = 0;
145 	int n0, n1;
146 
147 	p = str;
148 	if (p[0] != '0' && (p[1] != 'x' && p[1] != 'X')) {
149 		return -1;
150 	}
151 	p += 2;
152 
153 	while (p[0] != '\0' && p[1] != '\0') {
154 		if (total >= data_len) {
155 			return -1;
156 		}
157 		dp = strchr(digits, toupper((int) p[0]));
158 		if (dp == NULL) {
159 			return -1;
160 		}
161 		n0 = (int)(dp - digits);
162 		dp = strchr(digits, toupper((int) p[1]));
163 		if (dp == NULL) {
164 			return -1;
165 		}
166 		n1 = (int)(dp - digits);
167 
168 		data[total] = (uint8_t)(((n0 & 0x0fU) << 4) | (n1 & 0x0fU));
169 		total++;
170 		p += 2;
171 	}
172 	return total;
173 }
174 
175 static int
176 iscsi_reject(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu,
177 	     int reason)
178 {
179 	struct spdk_iscsi_pdu *rsp_pdu;
180 	struct iscsi_bhs_reject *rsph;
181 	uint8_t *data;
182 	int total_ahs_len;
183 	int data_len;
184 	int alloc_len;
185 
186 	pdu->is_rejected = true;
187 
188 	total_ahs_len = pdu->bhs.total_ahs_len;
189 	data_len = 0;
190 	alloc_len = ISCSI_BHS_LEN + (4 * total_ahs_len);
191 
192 	if (conn->header_digest) {
193 		alloc_len += ISCSI_DIGEST_LEN;
194 	}
195 
196 	data = calloc(1, alloc_len);
197 	if (!data) {
198 		SPDK_ERRLOG("calloc() failed for data segment\n");
199 		return -ENOMEM;
200 	}
201 
202 	SPDK_DEBUGLOG(iscsi, "Reject PDU reason=%d\n", reason);
203 
204 	if (conn->sess != NULL) {
205 		SPDK_DEBUGLOG(iscsi,
206 			      "StatSN=%u, ExpCmdSN=%u, MaxCmdSN=%u\n",
207 			      conn->StatSN, conn->sess->ExpCmdSN,
208 			      conn->sess->MaxCmdSN);
209 	} else {
210 		SPDK_DEBUGLOG(iscsi, "StatSN=%u\n", conn->StatSN);
211 	}
212 
213 	memcpy(data, &pdu->bhs, ISCSI_BHS_LEN);
214 	data_len += ISCSI_BHS_LEN;
215 
216 	if (total_ahs_len != 0) {
217 		total_ahs_len = spdk_min((4 * total_ahs_len), ISCSI_AHS_LEN);
218 		memcpy(data + data_len, pdu->ahs, total_ahs_len);
219 		data_len += total_ahs_len;
220 	}
221 
222 	if (conn->header_digest) {
223 		memcpy(data + data_len, pdu->header_digest, ISCSI_DIGEST_LEN);
224 		data_len += ISCSI_DIGEST_LEN;
225 	}
226 
227 	rsp_pdu = iscsi_get_pdu(conn);
228 	if (rsp_pdu == NULL) {
229 		free(data);
230 		return -ENOMEM;
231 	}
232 
233 	rsph = (struct iscsi_bhs_reject *)&rsp_pdu->bhs;
234 	rsp_pdu->data = data;
235 	rsph->opcode = ISCSI_OP_REJECT;
236 	rsph->flags |= 0x80;	/* bit 0 is default to 1 */
237 	rsph->reason = reason;
238 	DSET24(rsph->data_segment_len, data_len);
239 
240 	rsph->ffffffff = 0xffffffffU;
241 	to_be32(&rsph->stat_sn, conn->StatSN);
242 	conn->StatSN++;
243 
244 	if (conn->sess != NULL) {
245 		to_be32(&rsph->exp_cmd_sn, conn->sess->ExpCmdSN);
246 		to_be32(&rsph->max_cmd_sn, conn->sess->MaxCmdSN);
247 	} else {
248 		to_be32(&rsph->exp_cmd_sn, 1);
249 		to_be32(&rsph->max_cmd_sn, 1);
250 	}
251 
252 	SPDK_LOGDUMP(iscsi, "PDU", (void *)&rsp_pdu->bhs, ISCSI_BHS_LEN);
253 
254 	iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_pdu_generic_complete, NULL);
255 
256 	return 0;
257 }
258 
259 uint32_t
260 iscsi_pdu_calc_header_digest(struct spdk_iscsi_pdu *pdu)
261 {
262 	uint32_t crc32c;
263 	uint32_t ahs_len_bytes = pdu->bhs.total_ahs_len * 4;
264 
265 	crc32c = SPDK_CRC32C_INITIAL;
266 	crc32c = spdk_crc32c_update(&pdu->bhs, ISCSI_BHS_LEN, crc32c);
267 
268 	if (ahs_len_bytes) {
269 		crc32c = spdk_crc32c_update(pdu->ahs, ahs_len_bytes, crc32c);
270 	}
271 
272 	/* BHS and AHS are always 4-byte multiples in length, so no padding is necessary. */
273 
274 	/* Finalize CRC by inverting all bits. */
275 	return crc32c ^ SPDK_CRC32C_XOR;
276 }
277 
278 /* Calculate CRC for each partial data segment. */
279 static void
280 iscsi_pdu_calc_partial_data_digest(struct spdk_iscsi_pdu *pdu)
281 {
282 	struct iovec iov;
283 	uint32_t num_blocks;
284 
285 	if (spdk_likely(!pdu->dif_insert_or_strip)) {
286 		pdu->crc32c = spdk_crc32c_update(pdu->data,
287 						 pdu->data_valid_bytes - pdu->data_offset,
288 						 pdu->crc32c);
289 	} else {
290 		iov.iov_base = pdu->data;
291 		iov.iov_len = pdu->data_buf_len;
292 		num_blocks = pdu->data_buf_len / pdu->dif_ctx.block_size;
293 
294 		spdk_dif_update_crc32c(&iov, 1, num_blocks, &pdu->crc32c, &pdu->dif_ctx);
295 	}
296 }
297 
298 static uint32_t
299 iscsi_pdu_calc_partial_data_digest_done(struct spdk_iscsi_pdu *pdu)
300 {
301 	uint32_t crc32c = pdu->crc32c;
302 	uint32_t mod;
303 
304 	/* Include padding bytes into CRC if any. */
305 	mod = pdu->data_valid_bytes % ISCSI_ALIGNMENT;
306 	if (mod != 0) {
307 		uint32_t pad_length = ISCSI_ALIGNMENT - mod;
308 		uint8_t pad[3] = {0, 0, 0};
309 
310 		assert(pad_length > 0);
311 		assert(pad_length <= sizeof(pad));
312 		crc32c = spdk_crc32c_update(pad, pad_length, crc32c);
313 	}
314 
315 	/* Finalize CRC by inverting all bits. */
316 	return crc32c ^ SPDK_CRC32C_XOR;
317 }
318 
319 uint32_t
320 iscsi_pdu_calc_data_digest(struct spdk_iscsi_pdu *pdu)
321 {
322 	uint32_t data_len = DGET24(pdu->bhs.data_segment_len);
323 	uint32_t crc32c;
324 	uint32_t mod;
325 	struct iovec iov;
326 	uint32_t num_blocks;
327 
328 	/* Initialize CRC. */
329 	crc32c = SPDK_CRC32C_INITIAL;
330 
331 	/* Calculate CRC for the whole data segment. */
332 	if (spdk_likely(!pdu->dif_insert_or_strip)) {
333 		crc32c = spdk_crc32c_update(pdu->data, data_len, crc32c);
334 	} else {
335 		iov.iov_base = pdu->data;
336 		iov.iov_len = pdu->data_buf_len;
337 		num_blocks = pdu->data_buf_len / pdu->dif_ctx.block_size;
338 
339 		spdk_dif_update_crc32c(&iov, 1, num_blocks, &crc32c, &pdu->dif_ctx);
340 	}
341 
342 	/* Include padding bytes into CRC if any. */
343 	mod = data_len % ISCSI_ALIGNMENT;
344 	if (mod != 0) {
345 		uint32_t pad_length = ISCSI_ALIGNMENT - mod;
346 		uint8_t pad[3] = {0, 0, 0};
347 		assert(pad_length > 0);
348 		assert(pad_length <= sizeof(pad));
349 		crc32c = spdk_crc32c_update(pad, pad_length, crc32c);
350 	}
351 
352 	/* Finalize CRC by inverting all bits. */
353 	return crc32c ^ SPDK_CRC32C_XOR;
354 }
355 
356 static int
357 iscsi_conn_read_data_segment(struct spdk_iscsi_conn *conn,
358 			     struct spdk_iscsi_pdu *pdu,
359 			     uint32_t data_offset, uint32_t data_len)
360 {
361 	struct iovec buf_iov, iovs[32];
362 	int rc, _rc;
363 
364 	if (spdk_likely(!pdu->dif_insert_or_strip)) {
365 		return iscsi_conn_read_data(conn, data_len, pdu->data + data_offset);
366 	} else {
367 		buf_iov.iov_base = pdu->data;
368 		buf_iov.iov_len = pdu->data_buf_len;
369 		rc = spdk_dif_set_md_interleave_iovs(iovs, 32, &buf_iov, 1,
370 						     data_offset, data_len, NULL,
371 						     &pdu->dif_ctx);
372 		if (rc > 0) {
373 			rc = iscsi_conn_readv_data(conn, iovs, rc);
374 			if (rc > 0) {
375 				_rc = spdk_dif_generate_stream(&buf_iov, 1, data_offset, rc,
376 							       &pdu->dif_ctx);
377 				if (_rc != 0) {
378 					SPDK_ERRLOG("DIF generate failed\n");
379 					rc = _rc;
380 				}
381 			}
382 		} else {
383 			SPDK_ERRLOG("Setup iovs for interleaved metadata failed\n");
384 		}
385 		return rc;
386 	}
387 }
388 
389 /* Build iovec array to leave metadata space for every data block
390  * when reading data segment from socket.
391  */
392 static inline bool
393 _iscsi_sgl_append_with_md(struct spdk_iov_sgl *s,
394 			  void *buf, uint32_t buf_len, uint32_t data_len,
395 			  struct spdk_dif_ctx *dif_ctx)
396 {
397 	int rc;
398 	uint32_t total_size = 0;
399 	struct iovec buf_iov;
400 
401 	if (s->iov_offset >= data_len) {
402 		s->iov_offset -= data_len;
403 	} else {
404 		buf_iov.iov_base = buf;
405 		buf_iov.iov_len = buf_len;
406 		rc = spdk_dif_set_md_interleave_iovs(s->iov, s->iovcnt, &buf_iov, 1,
407 						     s->iov_offset, data_len - s->iov_offset,
408 						     &total_size, dif_ctx);
409 		if (rc < 0) {
410 			SPDK_ERRLOG("Failed to setup iovs for DIF strip\n");
411 			return false;
412 		}
413 
414 		s->total_size += total_size;
415 		s->iov_offset = 0;
416 		assert(s->iovcnt >= rc);
417 		s->iovcnt -= rc;
418 		s->iov += rc;
419 
420 		if (s->iovcnt == 0) {
421 			return false;
422 		}
423 	}
424 
425 	return true;
426 }
427 
428 int
429 iscsi_build_iovs(struct spdk_iscsi_conn *conn, struct iovec *iovs, int iovcnt,
430 		 struct spdk_iscsi_pdu *pdu, uint32_t *_mapped_length)
431 {
432 	struct spdk_iov_sgl sgl;
433 	int enable_digest;
434 	uint32_t total_ahs_len;
435 	uint32_t data_len;
436 
437 	if (iovcnt == 0) {
438 		return 0;
439 	}
440 
441 	total_ahs_len = pdu->bhs.total_ahs_len;
442 	data_len = DGET24(pdu->bhs.data_segment_len);
443 	data_len = ISCSI_ALIGN(data_len);
444 
445 	enable_digest = 1;
446 	if (pdu->bhs.opcode == ISCSI_OP_LOGIN_RSP) {
447 		/* this PDU should be sent without digest */
448 		enable_digest = 0;
449 	}
450 
451 	spdk_iov_sgl_init(&sgl, iovs, iovcnt, pdu->writev_offset);
452 
453 	/* BHS */
454 	if (!spdk_iov_sgl_append(&sgl, (uint8_t *)&pdu->bhs, ISCSI_BHS_LEN)) {
455 		goto end;
456 	}
457 	/* AHS */
458 	if (total_ahs_len > 0) {
459 		if (!spdk_iov_sgl_append(&sgl, pdu->ahs, 4 * total_ahs_len)) {
460 			goto end;
461 		}
462 	}
463 
464 	/* Header Digest */
465 	if (enable_digest && conn->header_digest) {
466 		if (!spdk_iov_sgl_append(&sgl, pdu->header_digest, ISCSI_DIGEST_LEN)) {
467 			goto end;
468 		}
469 	}
470 
471 	/* Data Segment */
472 	if (data_len > 0) {
473 		if (!pdu->dif_insert_or_strip) {
474 			if (!spdk_iov_sgl_append(&sgl, pdu->data, data_len)) {
475 				goto end;
476 			}
477 		} else {
478 			if (!_iscsi_sgl_append_with_md(&sgl, pdu->data, pdu->data_buf_len,
479 						       data_len, &pdu->dif_ctx)) {
480 				goto end;
481 			}
482 		}
483 	}
484 
485 	/* Data Digest */
486 	if (enable_digest && conn->data_digest && data_len != 0) {
487 		spdk_iov_sgl_append(&sgl, pdu->data_digest, ISCSI_DIGEST_LEN);
488 	}
489 
490 end:
491 	if (_mapped_length != NULL) {
492 		*_mapped_length = sgl.total_size;
493 	}
494 
495 	return iovcnt - sgl.iovcnt;
496 }
497 
498 void
499 iscsi_free_sess(struct spdk_iscsi_sess *sess)
500 {
501 	if (sess == NULL) {
502 		return;
503 	}
504 
505 	sess->tag = 0;
506 	sess->target = NULL;
507 	sess->session_type = SESSION_TYPE_INVALID;
508 	iscsi_param_free(sess->params);
509 	free(sess->conns);
510 	spdk_scsi_port_free(&sess->initiator_port);
511 	spdk_mempool_put(g_iscsi.session_pool, (void *)sess);
512 }
513 
514 static int
515 create_iscsi_sess(struct spdk_iscsi_conn *conn,
516 		  struct spdk_iscsi_tgt_node *target,
517 		  enum session_type session_type)
518 {
519 	struct spdk_iscsi_sess *sess;
520 	int rc;
521 
522 	sess = spdk_mempool_get(g_iscsi.session_pool);
523 	if (!sess) {
524 		SPDK_ERRLOG("Unable to get session object\n");
525 		SPDK_ERRLOG("MaxSessions set to %d\n", g_iscsi.MaxSessions);
526 		return -ENOMEM;
527 	}
528 
529 	/* configuration values */
530 	pthread_mutex_lock(&g_iscsi.mutex);
531 
532 	sess->MaxConnections = g_iscsi.MaxConnectionsPerSession;
533 	sess->MaxOutstandingR2T = DEFAULT_MAXOUTSTANDINGR2T;
534 
535 	sess->DefaultTime2Wait = g_iscsi.DefaultTime2Wait;
536 	sess->DefaultTime2Retain = g_iscsi.DefaultTime2Retain;
537 	sess->FirstBurstLength = g_iscsi.FirstBurstLength;
538 	sess->MaxBurstLength = SPDK_ISCSI_MAX_BURST_LENGTH;
539 	sess->InitialR2T = DEFAULT_INITIALR2T;
540 	sess->ImmediateData = g_iscsi.ImmediateData;
541 	sess->DataPDUInOrder = DEFAULT_DATAPDUINORDER;
542 	sess->DataSequenceInOrder = DEFAULT_DATASEQUENCEINORDER;
543 	sess->ErrorRecoveryLevel = g_iscsi.ErrorRecoveryLevel;
544 
545 	pthread_mutex_unlock(&g_iscsi.mutex);
546 
547 	sess->tag = conn->pg_tag;
548 
549 	sess->conns = calloc(sess->MaxConnections, sizeof(*sess->conns));
550 	if (!sess->conns) {
551 		spdk_mempool_put(g_iscsi.session_pool, (void *)sess);
552 		SPDK_ERRLOG("calloc() failed for connection array\n");
553 		return -ENOMEM;
554 	}
555 
556 	sess->connections = 0;
557 
558 	sess->conns[sess->connections] = conn;
559 	sess->connections++;
560 
561 	sess->params = NULL;
562 	sess->target = target;
563 	sess->isid = 0;
564 	sess->session_type = session_type;
565 	sess->current_text_itt = 0xffffffffU;
566 
567 	/* set default params */
568 	rc = iscsi_sess_params_init(&sess->params);
569 	if (rc < 0) {
570 		SPDK_ERRLOG("iscsi_sess_params_init() failed\n");
571 		goto error_return;
572 	}
573 	/* replace with config value */
574 	rc = iscsi_param_set_int(sess->params, "MaxConnections",
575 				 sess->MaxConnections);
576 	if (rc < 0) {
577 		SPDK_ERRLOG("iscsi_param_set_int() failed\n");
578 		goto error_return;
579 	}
580 
581 	rc = iscsi_param_set_int(sess->params, "MaxOutstandingR2T",
582 				 sess->MaxOutstandingR2T);
583 	if (rc < 0) {
584 		SPDK_ERRLOG("iscsi_param_set_int() failed\n");
585 		goto error_return;
586 	}
587 
588 	rc = iscsi_param_set_int(sess->params, "DefaultTime2Wait",
589 				 sess->DefaultTime2Wait);
590 	if (rc < 0) {
591 		SPDK_ERRLOG("iscsi_param_set_int() failed\n");
592 		goto error_return;
593 	}
594 
595 	rc = iscsi_param_set_int(sess->params, "DefaultTime2Retain",
596 				 sess->DefaultTime2Retain);
597 	if (rc < 0) {
598 		SPDK_ERRLOG("iscsi_param_set_int() failed\n");
599 		goto error_return;
600 	}
601 
602 	rc = iscsi_param_set_int(sess->params, "FirstBurstLength",
603 				 sess->FirstBurstLength);
604 	if (rc < 0) {
605 		SPDK_ERRLOG("iscsi_param_set_int() failed\n");
606 		goto error_return;
607 	}
608 
609 	rc = iscsi_param_set_int(sess->params, "MaxBurstLength",
610 				 sess->MaxBurstLength);
611 	if (rc < 0) {
612 		SPDK_ERRLOG("iscsi_param_set_int() failed\n");
613 		goto error_return;
614 	}
615 
616 	rc = iscsi_param_set(sess->params, "InitialR2T",
617 			     sess->InitialR2T ? "Yes" : "No");
618 	if (rc < 0) {
619 		SPDK_ERRLOG("iscsi_param_set() failed\n");
620 		goto error_return;
621 	}
622 
623 	rc = iscsi_param_set(sess->params, "ImmediateData",
624 			     sess->ImmediateData ? "Yes" : "No");
625 	if (rc < 0) {
626 		SPDK_ERRLOG("iscsi_param_set() failed\n");
627 		goto error_return;
628 	}
629 
630 	rc = iscsi_param_set(sess->params, "DataPDUInOrder",
631 			     sess->DataPDUInOrder ? "Yes" : "No");
632 	if (rc < 0) {
633 		SPDK_ERRLOG("iscsi_param_set() failed\n");
634 		goto error_return;
635 	}
636 
637 	rc = iscsi_param_set(sess->params, "DataSequenceInOrder",
638 			     sess->DataSequenceInOrder ? "Yes" : "No");
639 	if (rc < 0) {
640 		SPDK_ERRLOG("iscsi_param_set() failed\n");
641 		goto error_return;
642 	}
643 
644 	rc = iscsi_param_set_int(sess->params, "ErrorRecoveryLevel",
645 				 sess->ErrorRecoveryLevel);
646 	if (rc < 0) {
647 		SPDK_ERRLOG("iscsi_param_set_int() failed\n");
648 		goto error_return;
649 	}
650 
651 	/* realloc buffer */
652 	rc = iscsi_param_set_int(conn->params, "MaxRecvDataSegmentLength",
653 				 conn->MaxRecvDataSegmentLength);
654 	if (rc < 0) {
655 		SPDK_ERRLOG("iscsi_param_set_int() failed\n");
656 		goto error_return;
657 	}
658 
659 	/* sess for first connection of session */
660 	conn->sess = sess;
661 	return 0;
662 
663 error_return:
664 	iscsi_free_sess(sess);
665 	conn->sess = NULL;
666 	return -1;
667 }
668 
669 static struct spdk_iscsi_sess *
670 get_iscsi_sess_by_tsih(uint16_t tsih)
671 {
672 	struct spdk_iscsi_sess *session;
673 
674 	if (tsih == 0 || tsih > g_iscsi.MaxSessions) {
675 		return NULL;
676 	}
677 
678 	session = g_iscsi.session[tsih - 1];
679 	assert(tsih == session->tsih);
680 
681 	return session;
682 }
683 
684 static uint8_t
685 append_iscsi_sess(struct spdk_iscsi_conn *conn,
686 		  const char *initiator_port_name, uint16_t tsih, uint16_t cid)
687 {
688 	struct spdk_iscsi_sess *sess;
689 
690 	SPDK_DEBUGLOG(iscsi, "append session: init port name=%s, tsih=%u, cid=%u\n",
691 		      initiator_port_name, tsih, cid);
692 
693 	sess = get_iscsi_sess_by_tsih(tsih);
694 	if (sess == NULL) {
695 		SPDK_ERRLOG("spdk_get_iscsi_sess_by_tsih failed\n");
696 		return ISCSI_LOGIN_CONN_ADD_FAIL;
697 	}
698 	if ((conn->pg_tag != sess->tag) ||
699 	    (strcasecmp(initiator_port_name, spdk_scsi_port_get_name(sess->initiator_port)) != 0) ||
700 	    (conn->target != sess->target)) {
701 		/* no match */
702 		SPDK_ERRLOG("no MCS session for init port name=%s, tsih=%d, cid=%d\n",
703 			    initiator_port_name, tsih, cid);
704 		return ISCSI_LOGIN_CONN_ADD_FAIL;
705 	}
706 
707 	if (sess->connections >= sess->MaxConnections) {
708 		/* no slot for connection */
709 		SPDK_ERRLOG("too many connections for init port name=%s, tsih=%d, cid=%d\n",
710 			    initiator_port_name, tsih, cid);
711 		return ISCSI_LOGIN_TOO_MANY_CONNECTIONS;
712 	}
713 
714 	SPDK_DEBUGLOG(iscsi, "Connections (tsih %d): %d\n", sess->tsih, sess->connections);
715 	conn->sess = sess;
716 
717 	/*
718 	 * TODO: need a mutex or other sync mechanism to protect the session's
719 	 *  connection list.
720 	 */
721 	sess->conns[sess->connections] = conn;
722 	sess->connections++;
723 
724 	return 0;
725 }
726 
727 static int
728 iscsi_append_text(const char *key, const char *val, uint8_t *data,
729 		  int alloc_len, int data_len)
730 {
731 	int total;
732 	int len;
733 
734 	total = data_len;
735 	if (alloc_len < 1) {
736 		return 0;
737 	}
738 	if (total > alloc_len) {
739 		total = alloc_len;
740 		data[total - 1] = '\0';
741 		return total;
742 	}
743 
744 	if (alloc_len - total < 1) {
745 		SPDK_ERRLOG("data space small %d\n", alloc_len);
746 		return total;
747 	}
748 	len = snprintf((char *) data + total, alloc_len - total, "%s=%s", key, val);
749 	total += len + 1;
750 
751 	return total;
752 }
753 
754 static int
755 iscsi_append_param(struct spdk_iscsi_conn *conn, const char *key,
756 		   uint8_t *data, int alloc_len, int data_len)
757 {
758 	struct iscsi_param *param;
759 
760 	param = iscsi_param_find(conn->params, key);
761 	if (param == NULL) {
762 		param = iscsi_param_find(conn->sess->params, key);
763 		if (param == NULL) {
764 			SPDK_DEBUGLOG(iscsi, "no key %.64s\n", key);
765 			return data_len;
766 		}
767 	}
768 	return iscsi_append_text(param->key, param->val, data,
769 				 alloc_len, data_len);
770 }
771 
772 static int
773 iscsi_auth_params(struct spdk_iscsi_conn *conn,
774 		  struct iscsi_param *params, const char *method, uint8_t *data,
775 		  int alloc_len, int data_len)
776 {
777 	char *in_val;
778 	char *in_next;
779 	char *new_val;
780 	const char *algorithm;
781 	const char *name;
782 	const char *response;
783 	const char *identifier;
784 	const char *challenge;
785 	int total;
786 	int rc;
787 
788 	if (conn == NULL || params == NULL || method == NULL) {
789 		return -1;
790 	}
791 	if (strcasecmp(method, "CHAP") == 0) {
792 		/* method OK */
793 	} else {
794 		SPDK_ERRLOG("unsupported AuthMethod %.64s\n", method);
795 		return -1;
796 	}
797 
798 	total = data_len;
799 	if (alloc_len < 1) {
800 		return 0;
801 	}
802 	if (total > alloc_len) {
803 		total = alloc_len;
804 		data[total - 1] = '\0';
805 		return total;
806 	}
807 
808 	/* for temporary store */
809 	in_val = malloc(ISCSI_TEXT_MAX_VAL_LEN + 1);
810 	if (!in_val) {
811 		SPDK_ERRLOG("malloc() failed for temporary store\n");
812 		return -ENOMEM;
813 	}
814 
815 	/* CHAP method (RFC1994) */
816 	if ((algorithm = iscsi_param_get_val(params, "CHAP_A")) != NULL) {
817 		if (conn->auth.chap_phase != ISCSI_CHAP_PHASE_WAIT_A) {
818 			SPDK_ERRLOG("CHAP sequence error\n");
819 			goto error_return;
820 		}
821 
822 		/* CHAP_A is LIST type */
823 		snprintf(in_val, ISCSI_TEXT_MAX_VAL_LEN + 1, "%s", algorithm);
824 		in_next = in_val;
825 		while ((new_val = spdk_strsepq(&in_next, ",")) != NULL) {
826 			if (strcasecmp(new_val, "5") == 0) {
827 				/* CHAP with MD5 */
828 				break;
829 			}
830 		}
831 		if (new_val == NULL) {
832 			snprintf(in_val, ISCSI_TEXT_MAX_VAL_LEN + 1, "%s", "Reject");
833 			new_val = in_val;
834 			iscsi_append_text("CHAP_A", new_val, data, alloc_len, total);
835 			goto error_return;
836 		}
837 		/* selected algorithm is 5 (MD5) */
838 		SPDK_DEBUGLOG(iscsi, "got CHAP_A=%s\n", new_val);
839 		total = iscsi_append_text("CHAP_A", new_val, data, alloc_len, total);
840 
841 		/* Identifier is one octet */
842 		gen_random(conn->auth.chap_id, 1);
843 		snprintf(in_val, ISCSI_TEXT_MAX_VAL_LEN, "%d",
844 			 (int) conn->auth.chap_id[0]);
845 		total = iscsi_append_text("CHAP_I", in_val, data, alloc_len, total);
846 
847 		/* Challenge Value is a variable stream of octets */
848 		/* (binary length MUST not exceed 1024 bytes) */
849 		conn->auth.chap_challenge_len = ISCSI_CHAP_CHALLENGE_LEN;
850 		gen_random(conn->auth.chap_challenge, conn->auth.chap_challenge_len);
851 		bin2hex(in_val, ISCSI_TEXT_MAX_VAL_LEN,
852 			conn->auth.chap_challenge, conn->auth.chap_challenge_len);
853 		total = iscsi_append_text("CHAP_C", in_val, data, alloc_len, total);
854 
855 		conn->auth.chap_phase = ISCSI_CHAP_PHASE_WAIT_NR;
856 	} else if ((name = iscsi_param_get_val(params, "CHAP_N")) != NULL) {
857 		uint8_t resmd5[SPDK_MD5DIGEST_LEN];
858 		uint8_t tgtmd5[SPDK_MD5DIGEST_LEN];
859 		struct spdk_md5ctx md5ctx;
860 		size_t decoded_len = 0;
861 
862 		if (conn->auth.chap_phase != ISCSI_CHAP_PHASE_WAIT_NR) {
863 			SPDK_ERRLOG("CHAP sequence error\n");
864 			goto error_return;
865 		}
866 
867 		response = iscsi_param_get_val(params, "CHAP_R");
868 		if (response == NULL) {
869 			SPDK_ERRLOG("no response\n");
870 			goto error_return;
871 		}
872 		if (response[0] == '0' &&
873 		    (response[1] == 'x' || response[1] == 'X')) {
874 			rc = hex2bin(resmd5, SPDK_MD5DIGEST_LEN, response);
875 			if (rc < 0 || rc != SPDK_MD5DIGEST_LEN) {
876 				SPDK_ERRLOG("response format error\n");
877 				goto error_return;
878 			}
879 		} else if (response[0] == '0' &&
880 			   (response[1] == 'b' || response[1] == 'B')) {
881 			response += 2;
882 			rc = spdk_base64_decode(resmd5, &decoded_len, response);
883 			if (rc < 0 || decoded_len != SPDK_MD5DIGEST_LEN) {
884 				SPDK_ERRLOG("response format error\n");
885 				goto error_return;
886 			}
887 		} else {
888 			SPDK_ERRLOG("response format error\n");
889 			goto error_return;
890 		}
891 		SPDK_DEBUGLOG(iscsi, "got CHAP_N/CHAP_R\n");
892 
893 		SPDK_DEBUGLOG(iscsi, "ag_tag=%d\n", conn->chap_group);
894 
895 		rc = iscsi_chap_get_authinfo(&conn->auth, name, conn->chap_group);
896 		if (rc < 0) {
897 			/* SPDK_ERRLOG("auth user or secret is missing\n"); */
898 			SPDK_ERRLOG("iscsi_chap_get_authinfo() failed\n");
899 			goto error_return;
900 		}
901 		if (conn->auth.user[0] == '\0' || conn->auth.secret[0] == '\0') {
902 			/* SPDK_ERRLOG("auth user or secret is missing\n"); */
903 			SPDK_ERRLOG("auth failed (name %.64s)\n", name);
904 			goto error_return;
905 		}
906 
907 		md5init(&md5ctx);
908 		/* Identifier */
909 		md5update(&md5ctx, conn->auth.chap_id, 1);
910 		/* followed by secret */
911 		md5update(&md5ctx, conn->auth.secret,
912 			  strlen(conn->auth.secret));
913 		/* followed by Challenge Value */
914 		md5update(&md5ctx, conn->auth.chap_challenge,
915 			  conn->auth.chap_challenge_len);
916 		/* tgtmd5 is expecting Response Value */
917 		md5final(tgtmd5, &md5ctx);
918 
919 		bin2hex(in_val, ISCSI_TEXT_MAX_VAL_LEN, tgtmd5, SPDK_MD5DIGEST_LEN);
920 
921 #if 0
922 		SPDK_DEBUGLOG(iscsi, "tgtmd5=%s, resmd5=%s\n", in_val, response);
923 		spdk_dump("tgtmd5", tgtmd5, SPDK_MD5DIGEST_LEN);
924 		spdk_dump("resmd5", resmd5, SPDK_MD5DIGEST_LEN);
925 #endif
926 
927 		/* compare MD5 digest */
928 		if (memcmp(tgtmd5, resmd5, SPDK_MD5DIGEST_LEN) != 0) {
929 			/* not match */
930 			/* SPDK_ERRLOG("auth user or secret is missing\n"); */
931 			SPDK_ERRLOG("auth failed (name %.64s)\n", name);
932 			goto error_return;
933 		}
934 		/* OK initiator's secret */
935 		conn->authenticated = true;
936 
937 		/* mutual CHAP? */
938 		identifier = iscsi_param_get_val(params, "CHAP_I");
939 		if (identifier != NULL) {
940 			conn->auth.chap_mid[0] = (uint8_t) strtol(identifier, NULL, 10);
941 			challenge = iscsi_param_get_val(params, "CHAP_C");
942 			if (challenge == NULL) {
943 				SPDK_ERRLOG("CHAP sequence error\n");
944 				goto error_return;
945 			}
946 			if (challenge[0] == '0' &&
947 			    (challenge[1] == 'x' || challenge[1] == 'X')) {
948 				rc = hex2bin(conn->auth.chap_mchallenge,
949 					     ISCSI_CHAP_CHALLENGE_LEN, challenge);
950 				if (rc < 0) {
951 					SPDK_ERRLOG("challenge format error\n");
952 					goto error_return;
953 				}
954 				conn->auth.chap_mchallenge_len = rc;
955 			} else if (challenge[0] == '0' &&
956 				   (challenge[1] == 'b' || challenge[1] == 'B')) {
957 				challenge += 2;
958 				rc = spdk_base64_decode(conn->auth.chap_mchallenge,
959 							&decoded_len, challenge);
960 				if (rc < 0) {
961 					SPDK_ERRLOG("challenge format error\n");
962 					goto error_return;
963 				}
964 				conn->auth.chap_mchallenge_len = decoded_len;
965 			} else {
966 				SPDK_ERRLOG("challenge format error\n");
967 				goto error_return;
968 			}
969 #if 0
970 			spdk_dump("MChallenge", conn->auth.chap_mchallenge,
971 				  conn->auth.chap_mchallenge_len);
972 #endif
973 			SPDK_DEBUGLOG(iscsi, "got CHAP_I/CHAP_C\n");
974 
975 			if (conn->auth.muser[0] == '\0' || conn->auth.msecret[0] == '\0') {
976 				/* SPDK_ERRLOG("mutual auth user or secret is missing\n"); */
977 				SPDK_ERRLOG("auth failed (name %.64s)\n", name);
978 				goto error_return;
979 			}
980 
981 			md5init(&md5ctx);
982 			/* Identifier */
983 			md5update(&md5ctx, conn->auth.chap_mid, 1);
984 			/* followed by secret */
985 			md5update(&md5ctx, conn->auth.msecret,
986 				  strlen(conn->auth.msecret));
987 			/* followed by Challenge Value */
988 			md5update(&md5ctx, conn->auth.chap_mchallenge,
989 				  conn->auth.chap_mchallenge_len);
990 			/* tgtmd5 is Response Value */
991 			md5final(tgtmd5, &md5ctx);
992 
993 			bin2hex(in_val, ISCSI_TEXT_MAX_VAL_LEN, tgtmd5, SPDK_MD5DIGEST_LEN);
994 
995 			total = iscsi_append_text("CHAP_N", conn->auth.muser, data,
996 						  alloc_len, total);
997 			total = iscsi_append_text("CHAP_R", in_val, data, alloc_len, total);
998 		} else {
999 			/* not mutual */
1000 			if (conn->mutual_chap) {
1001 				SPDK_ERRLOG("required mutual CHAP\n");
1002 				goto error_return;
1003 			}
1004 		}
1005 
1006 		conn->auth.chap_phase = ISCSI_CHAP_PHASE_END;
1007 	} else {
1008 		/* not found CHAP keys */
1009 		SPDK_DEBUGLOG(iscsi, "start CHAP\n");
1010 		conn->auth.chap_phase = ISCSI_CHAP_PHASE_WAIT_A;
1011 	}
1012 
1013 	free(in_val);
1014 	return total;
1015 
1016 error_return:
1017 	conn->auth.chap_phase = ISCSI_CHAP_PHASE_WAIT_A;
1018 	free(in_val);
1019 	return -1;
1020 }
1021 
1022 static int
1023 iscsi_check_values(struct spdk_iscsi_conn *conn)
1024 {
1025 	if (conn->sess->FirstBurstLength > conn->sess->MaxBurstLength) {
1026 		SPDK_ERRLOG("FirstBurstLength(%d) > MaxBurstLength(%d)\n",
1027 			    conn->sess->FirstBurstLength,
1028 			    conn->sess->MaxBurstLength);
1029 		return -1;
1030 	}
1031 	if (conn->sess->FirstBurstLength > g_iscsi.FirstBurstLength) {
1032 		SPDK_ERRLOG("FirstBurstLength(%d) > iSCSI target restriction(%d)\n",
1033 			    conn->sess->FirstBurstLength, g_iscsi.FirstBurstLength);
1034 		return -1;
1035 	}
1036 	if (conn->sess->MaxBurstLength > 0x00ffffff) {
1037 		SPDK_ERRLOG("MaxBurstLength(%d) > 0x00ffffff\n",
1038 			    conn->sess->MaxBurstLength);
1039 		return -1;
1040 	}
1041 
1042 	if (conn->MaxRecvDataSegmentLength < 512) {
1043 		SPDK_ERRLOG("MaxRecvDataSegmentLength(%d) < 512\n",
1044 			    conn->MaxRecvDataSegmentLength);
1045 		return -1;
1046 	}
1047 	if (conn->MaxRecvDataSegmentLength > 0x00ffffff) {
1048 		SPDK_ERRLOG("MaxRecvDataSegmentLength(%d) > 0x00ffffff\n",
1049 			    conn->MaxRecvDataSegmentLength);
1050 		return -1;
1051 	}
1052 	return 0;
1053 }
1054 
1055 static int
1056 iscsi_conn_params_update(struct spdk_iscsi_conn *conn)
1057 {
1058 	int rc;
1059 	uint32_t recv_buf_size;
1060 
1061 	/* update internal variables */
1062 	rc = iscsi_copy_param2var(conn);
1063 	if (rc < 0) {
1064 		SPDK_ERRLOG("iscsi_copy_param2var() failed\n");
1065 		if (conn->state < ISCSI_CONN_STATE_EXITING) {
1066 			conn->state = ISCSI_CONN_STATE_EXITING;
1067 		}
1068 		return rc;
1069 	}
1070 
1071 	/* check value */
1072 	rc = iscsi_check_values(conn);
1073 	if (rc < 0) {
1074 		SPDK_ERRLOG("iscsi_check_values() failed\n");
1075 		if (conn->state < ISCSI_CONN_STATE_EXITING) {
1076 			conn->state = ISCSI_CONN_STATE_EXITING;
1077 		}
1078 	}
1079 
1080 	if (conn->sock == NULL) {
1081 		SPDK_INFOLOG(iscsi, "socket is already closed.\n");
1082 		return -ENXIO;
1083 	}
1084 
1085 	/* The socket receive buffer may need to be adjusted based on the new parameters */
1086 
1087 	/* Don't allow the recv buffer to be 0 or very large. */
1088 	recv_buf_size = spdk_max(0x1000, spdk_min(0x2000, conn->sess->FirstBurstLength));
1089 
1090 	/* Add in extra space for the PDU */
1091 	recv_buf_size += ISCSI_BHS_LEN + ISCSI_AHS_LEN;
1092 
1093 	if (conn->header_digest) {
1094 		recv_buf_size += ISCSI_DIGEST_LEN;
1095 	}
1096 
1097 	if (conn->data_digest) {
1098 		recv_buf_size += ISCSI_DIGEST_LEN;
1099 	}
1100 
1101 	/* Set up to buffer up to 4 commands with immediate data at once */
1102 	if (spdk_sock_set_recvbuf(conn->sock, recv_buf_size * 4) < 0) {
1103 		/* Not fatal. */
1104 	}
1105 
1106 	return rc;
1107 }
1108 
1109 static void
1110 iscsi_conn_login_pdu_err_complete(void *arg)
1111 {
1112 	struct spdk_iscsi_conn *conn = arg;
1113 
1114 	if (conn->full_feature) {
1115 		iscsi_conn_params_update(conn);
1116 	}
1117 }
1118 
1119 static void
1120 iscsi_conn_login_pdu_success_complete(void *arg)
1121 {
1122 	struct spdk_iscsi_conn *conn = arg;
1123 
1124 
1125 	if (conn->state >= ISCSI_CONN_STATE_EXITING) {
1126 		/* Connection is being exited before this callback is executed. */
1127 		SPDK_DEBUGLOG(iscsi, "Connection is already exited.\n");
1128 		return;
1129 	}
1130 	if (conn->full_feature) {
1131 		if (iscsi_conn_params_update(conn) != 0) {
1132 			return;
1133 		}
1134 	}
1135 	if (conn->full_feature != 0) {
1136 		iscsi_conn_schedule(conn);
1137 	}
1138 }
1139 
1140 /*
1141  * The response function of spdk_iscsi_op_login
1142  */
1143 static void
1144 iscsi_op_login_response(struct spdk_iscsi_conn *conn,
1145 			struct spdk_iscsi_pdu *rsp_pdu, struct iscsi_param *params,
1146 			iscsi_conn_xfer_complete_cb cb_fn)
1147 {
1148 	struct iscsi_bhs_login_rsp *rsph;
1149 
1150 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1151 	rsph->version_max = ISCSI_VERSION;
1152 	rsph->version_act = ISCSI_VERSION;
1153 	DSET24(rsph->data_segment_len, rsp_pdu->data_segment_len);
1154 
1155 	to_be32(&rsph->stat_sn, conn->StatSN);
1156 	conn->StatSN++;
1157 
1158 	if (conn->sess != NULL) {
1159 		to_be32(&rsph->exp_cmd_sn, conn->sess->ExpCmdSN);
1160 		to_be32(&rsph->max_cmd_sn, conn->sess->MaxCmdSN);
1161 	} else {
1162 		to_be32(&rsph->exp_cmd_sn, rsp_pdu->cmd_sn);
1163 		to_be32(&rsph->max_cmd_sn, rsp_pdu->cmd_sn);
1164 	}
1165 
1166 	SPDK_LOGDUMP(iscsi, "PDU", (uint8_t *)rsph, ISCSI_BHS_LEN);
1167 	SPDK_LOGDUMP(iscsi, "DATA", rsp_pdu->data, rsp_pdu->data_segment_len);
1168 
1169 	/* Set T/CSG/NSG to reserved if login error. */
1170 	if (rsph->status_class != 0) {
1171 		rsph->flags &= ~(ISCSI_LOGIN_TRANSIT | ISCSI_LOGIN_CURRENT_STAGE_MASK |
1172 				 ISCSI_LOGIN_NEXT_STAGE_MASK);
1173 	}
1174 	iscsi_param_free(params);
1175 	iscsi_conn_write_pdu(conn, rsp_pdu, cb_fn, conn);
1176 }
1177 
1178 /*
1179  * The function which is used to initialize the internal response data
1180  * structure of iscsi login function.
1181  * return:
1182  * 0, success;
1183  * otherwise, error;
1184  */
1185 static int
1186 iscsi_op_login_rsp_init(struct spdk_iscsi_conn *conn,
1187 			struct spdk_iscsi_pdu *pdu, struct spdk_iscsi_pdu *rsp_pdu)
1188 {
1189 	struct iscsi_bhs_login_req *reqh;
1190 	struct iscsi_bhs_login_rsp *rsph;
1191 
1192 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1193 	rsph->opcode = ISCSI_OP_LOGIN_RSP;
1194 	rsph->status_class = ISCSI_CLASS_SUCCESS;
1195 	rsph->status_detail = ISCSI_LOGIN_ACCEPT;
1196 	rsp_pdu->data_segment_len = 0;
1197 
1198 	/* The default MaxRecvDataSegmentLength 8192 is used during login. - RFC3720 */
1199 	rsp_pdu->data = calloc(1, 8192);
1200 	if (!rsp_pdu->data) {
1201 		SPDK_ERRLOG("calloc() failed for data segment\n");
1202 		rsph->status_class = ISCSI_CLASS_TARGET_ERROR;
1203 		rsph->status_detail = ISCSI_LOGIN_STATUS_NO_RESOURCES;
1204 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1205 	}
1206 	rsp_pdu->data_buf_len = 8192;
1207 
1208 	reqh = (struct iscsi_bhs_login_req *)&pdu->bhs;
1209 	rsph->flags |= (reqh->flags & (ISCSI_LOGIN_TRANSIT | ISCSI_LOGIN_CONTINUE |
1210 				       ISCSI_LOGIN_CURRENT_STAGE_MASK));
1211 	if (ISCSI_BHS_LOGIN_GET_TBIT(rsph->flags)) {
1212 		rsph->flags |= (reqh->flags & ISCSI_LOGIN_NEXT_STAGE_MASK);
1213 	}
1214 
1215 	/* We don't need to convert from network byte order. Just store it */
1216 	memcpy(&rsph->isid, reqh->isid, 6);
1217 	rsph->tsih = reqh->tsih;
1218 	rsph->itt = reqh->itt;
1219 	rsp_pdu->cmd_sn = from_be32(&reqh->cmd_sn);
1220 
1221 	if (rsph->tsih) {
1222 		rsph->stat_sn = reqh->exp_stat_sn;
1223 	}
1224 
1225 	SPDK_LOGDUMP(iscsi, "PDU", (uint8_t *)&pdu->bhs, ISCSI_BHS_LEN);
1226 
1227 	SPDK_DEBUGLOG(iscsi,
1228 		      "T=%d, C=%d, CSG=%d, NSG=%d, Min=%d, Max=%d, ITT=%x\n",
1229 		      ISCSI_BHS_LOGIN_GET_TBIT(rsph->flags),
1230 		      ISCSI_BHS_LOGIN_GET_CBIT(rsph->flags),
1231 		      ISCSI_BHS_LOGIN_GET_CSG(rsph->flags),
1232 		      ISCSI_BHS_LOGIN_GET_NSG(rsph->flags),
1233 		      reqh->version_min, reqh->version_max, from_be32(&rsph->itt));
1234 
1235 	if (conn->sess != NULL) {
1236 		SPDK_DEBUGLOG(iscsi,
1237 			      "CmdSN=%u, ExpStatSN=%u, StatSN=%u, ExpCmdSN=%u,"
1238 			      "MaxCmdSN=%u\n", rsp_pdu->cmd_sn,
1239 			      from_be32(&rsph->stat_sn), conn->StatSN,
1240 			      conn->sess->ExpCmdSN,
1241 			      conn->sess->MaxCmdSN);
1242 	} else {
1243 		SPDK_DEBUGLOG(iscsi,
1244 			      "CmdSN=%u, ExpStatSN=%u, StatSN=%u\n",
1245 			      rsp_pdu->cmd_sn, from_be32(&rsph->stat_sn),
1246 			      conn->StatSN);
1247 	}
1248 
1249 	if (ISCSI_BHS_LOGIN_GET_TBIT(rsph->flags) &&
1250 	    ISCSI_BHS_LOGIN_GET_CBIT(rsph->flags)) {
1251 		SPDK_ERRLOG("transit error\n");
1252 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1253 		rsph->status_detail = ISCSI_LOGIN_INITIATOR_ERROR;
1254 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1255 	}
1256 	/* make sure reqh->version_max < ISCSI_VERSION */
1257 	if (reqh->version_min > ISCSI_VERSION) {
1258 		SPDK_ERRLOG("unsupported version min %d/max %d, expecting %d\n", reqh->version_min,
1259 			    reqh->version_max, ISCSI_VERSION);
1260 		/* Unsupported version */
1261 		/* set all reserved flag to zero */
1262 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1263 		rsph->status_detail = ISCSI_LOGIN_UNSUPPORTED_VERSION;
1264 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1265 	}
1266 
1267 	if ((ISCSI_BHS_LOGIN_GET_NSG(rsph->flags) == ISCSI_NSG_RESERVED_CODE) &&
1268 	    ISCSI_BHS_LOGIN_GET_TBIT(rsph->flags)) {
1269 		/* set NSG and other bits to zero */
1270 		rsph->flags &= ~(ISCSI_LOGIN_NEXT_STAGE_MASK | ISCSI_LOGIN_TRANSIT |
1271 				 ISCSI_LOGIN_CURRENT_STAGE_MASK);
1272 		SPDK_ERRLOG("Received reserved NSG code: %d\n", ISCSI_NSG_RESERVED_CODE);
1273 		/* Initiator error */
1274 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1275 		rsph->status_detail = ISCSI_LOGIN_INITIATOR_ERROR;
1276 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1277 	}
1278 
1279 	return 0;
1280 }
1281 
1282 static int
1283 iscsi_op_login_store_incoming_params(struct spdk_iscsi_conn *conn,
1284 				     struct spdk_iscsi_pdu *pdu, struct spdk_iscsi_pdu *rsp_pdu,
1285 				     struct iscsi_param **params)
1286 {
1287 	struct iscsi_bhs_login_req *reqh;
1288 	struct iscsi_bhs_login_rsp *rsph;
1289 	int rc;
1290 
1291 	reqh = (struct iscsi_bhs_login_req *)&pdu->bhs;
1292 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1293 
1294 	rc = iscsi_parse_params(params, pdu->data,
1295 				pdu->data_segment_len, ISCSI_BHS_LOGIN_GET_CBIT(reqh->flags),
1296 				&conn->partial_text_parameter);
1297 	if (rc < 0) {
1298 		SPDK_ERRLOG("iscsi_parse_params() failed\n");
1299 		iscsi_param_free(*params);
1300 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1301 		rsph->status_detail = ISCSI_LOGIN_INITIATOR_ERROR;
1302 		return SPDK_ISCSI_LOGIN_ERROR_PARAMETER;
1303 	}
1304 
1305 	return 0;
1306 }
1307 
1308 /*
1309  * This function is used to initialize the port info
1310  * return
1311  * 0: success
1312  * otherwise: error
1313  */
1314 static int
1315 iscsi_op_login_initialize_port(struct spdk_iscsi_conn *conn,
1316 			       struct spdk_iscsi_pdu *rsp_pdu,
1317 			       char *initiator_port_name,
1318 			       uint32_t name_length,
1319 			       struct iscsi_param *params)
1320 {
1321 	const char *val;
1322 	struct iscsi_bhs_login_rsp *rsph;
1323 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1324 
1325 	/* Initiator Name and Port */
1326 	val = iscsi_param_get_val(params, "InitiatorName");
1327 	if (val == NULL) {
1328 		SPDK_ERRLOG("InitiatorName is empty\n");
1329 		/* Missing parameter */
1330 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1331 		rsph->status_detail = ISCSI_LOGIN_MISSING_PARMS;
1332 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1333 	}
1334 	snprintf(conn->initiator_name, sizeof(conn->initiator_name), "%s", val);
1335 	snprintf(initiator_port_name, name_length,
1336 		 "%s,i,0x%12.12" PRIx64, val, iscsi_get_isid(rsph->isid));
1337 	spdk_strlwr(conn->initiator_name);
1338 	spdk_strlwr(initiator_port_name);
1339 	SPDK_DEBUGLOG(iscsi, "Initiator name: %s\n", conn->initiator_name);
1340 	SPDK_DEBUGLOG(iscsi, "Initiator port: %s\n", initiator_port_name);
1341 
1342 	return 0;
1343 }
1344 
1345 /*
1346  * This function is used to judge the session type
1347  * return
1348  * 0: success
1349  * Other value: error
1350  */
1351 static int
1352 iscsi_op_login_session_type(struct spdk_iscsi_conn *conn,
1353 			    struct spdk_iscsi_pdu *rsp_pdu,
1354 			    enum session_type *session_type,
1355 			    struct iscsi_param *params)
1356 {
1357 	const char *session_type_str;
1358 	struct iscsi_bhs_login_rsp *rsph;
1359 
1360 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1361 	session_type_str = iscsi_param_get_val(params, "SessionType");
1362 	if (session_type_str == NULL) {
1363 		if (rsph->tsih != 0) {
1364 			*session_type = SESSION_TYPE_NORMAL;
1365 		} else {
1366 			SPDK_ERRLOG("SessionType is empty\n");
1367 			/* Missing parameter */
1368 			rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1369 			rsph->status_detail = ISCSI_LOGIN_MISSING_PARMS;
1370 			return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1371 		}
1372 	} else {
1373 		if (strcasecmp(session_type_str, "Discovery") == 0) {
1374 			*session_type = SESSION_TYPE_DISCOVERY;
1375 		} else if (strcasecmp(session_type_str, "Normal") == 0) {
1376 			*session_type = SESSION_TYPE_NORMAL;
1377 		} else {
1378 			*session_type = SESSION_TYPE_INVALID;
1379 			SPDK_ERRLOG("SessionType is invalid\n");
1380 			/* Missing parameter */
1381 			rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1382 			rsph->status_detail = ISCSI_LOGIN_MISSING_PARMS;
1383 			return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1384 		}
1385 	}
1386 	SPDK_DEBUGLOG(iscsi, "Session Type: %s\n", session_type_str);
1387 
1388 	return 0;
1389 }
1390 
1391 /*
1392  * This function is used to check the target info
1393  * return:
1394  * 0: success
1395  * otherwise: error
1396  */
1397 static int
1398 iscsi_op_login_check_target(struct spdk_iscsi_conn *conn,
1399 			    struct spdk_iscsi_pdu *rsp_pdu,
1400 			    const char *target_name,
1401 			    struct spdk_iscsi_tgt_node **target)
1402 {
1403 	struct iscsi_bhs_login_rsp *rsph;
1404 	char buf[MAX_TMPBUF] = {};
1405 
1406 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1407 	*target = iscsi_find_tgt_node(target_name);
1408 	if (*target == NULL) {
1409 		SPDK_WARNLOG("target %s not found\n", target_name);
1410 		/* Not found */
1411 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1412 		rsph->status_detail = ISCSI_LOGIN_TARGET_NOT_FOUND;
1413 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1414 	}
1415 	if (iscsi_tgt_node_is_destructed(*target)) {
1416 		SPDK_ERRLOG("target %s is removed\n", target_name);
1417 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1418 		rsph->status_detail = ISCSI_LOGIN_TARGET_REMOVED;
1419 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1420 	}
1421 	if (iscsi_tgt_node_is_redirected(conn, *target, buf, MAX_TMPBUF)) {
1422 		SPDK_INFOLOG(iscsi, "target %s is redirected\n", target_name);
1423 		rsp_pdu->data_segment_len = iscsi_append_text("TargetAddress",
1424 					    buf,
1425 					    rsp_pdu->data,
1426 					    rsp_pdu->data_buf_len,
1427 					    rsp_pdu->data_segment_len);
1428 		rsph->status_class = ISCSI_CLASS_REDIRECT;
1429 		rsph->status_detail = ISCSI_LOGIN_TARGET_TEMPORARILY_MOVED;
1430 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1431 	}
1432 	if (!iscsi_tgt_node_access(conn, *target, conn->initiator_name,
1433 				   conn->initiator_addr)) {
1434 		SPDK_ERRLOG("access denied\n");
1435 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1436 		rsph->status_detail = ISCSI_LOGIN_AUTHORIZATION_FAIL;
1437 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1438 	}
1439 
1440 	return 0;
1441 }
1442 
1443 /*
1444  * This function use to check the session
1445  * return:
1446  * 0, success
1447  * otherwise: error
1448  */
1449 static int
1450 iscsi_op_login_check_session(struct spdk_iscsi_conn *conn,
1451 			     struct spdk_iscsi_pdu *rsp_pdu,
1452 			     char *initiator_port_name, int cid)
1453 
1454 {
1455 	int rc = 0;
1456 	struct iscsi_bhs_login_rsp *rsph;
1457 
1458 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1459 	/* check existing session */
1460 	SPDK_DEBUGLOG(iscsi, "isid=%"PRIx64", tsih=%u, cid=%u\n",
1461 		      iscsi_get_isid(rsph->isid), from_be16(&rsph->tsih), cid);
1462 	if (rsph->tsih != 0) {
1463 		/* multiple connections */
1464 		rc = append_iscsi_sess(conn, initiator_port_name,
1465 				       from_be16(&rsph->tsih), cid);
1466 		if (rc != 0) {
1467 			SPDK_ERRLOG("isid=%"PRIx64", tsih=%u, cid=%u:"
1468 				    "spdk_append_iscsi_sess() failed\n",
1469 				    iscsi_get_isid(rsph->isid), from_be16(&rsph->tsih),
1470 				    cid);
1471 			/* Can't include in session */
1472 			rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1473 			rsph->status_detail = rc;
1474 			return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1475 		}
1476 	} else if (!g_iscsi.AllowDuplicateIsid) {
1477 		/* new session, drop old sess by the initiator */
1478 		iscsi_drop_conns(conn, initiator_port_name, 0 /* drop old */);
1479 	}
1480 
1481 	return rc;
1482 }
1483 
1484 /*
1485  * This function is used to del the original param and update it with new
1486  * value
1487  * return:
1488  * 0: success
1489  * otherwise: error
1490  */
1491 static int
1492 iscsi_op_login_update_param(struct spdk_iscsi_conn *conn,
1493 			    const char *key, const char *value,
1494 			    const char *list)
1495 {
1496 	int rc = 0;
1497 	struct iscsi_param *new_param, *orig_param;
1498 	int index;
1499 
1500 	orig_param = iscsi_param_find(conn->params, key);
1501 	if (orig_param == NULL) {
1502 		SPDK_ERRLOG("orig_param %s not found\n", key);
1503 		return SPDK_ISCSI_LOGIN_ERROR_PARAMETER;
1504 	}
1505 
1506 	index = orig_param->state_index;
1507 	rc = iscsi_param_del(&conn->params, key);
1508 	if (rc < 0) {
1509 		SPDK_ERRLOG("iscsi_param_del(%s) failed\n", key);
1510 		return SPDK_ISCSI_LOGIN_ERROR_PARAMETER;
1511 	}
1512 	rc = iscsi_param_add(&conn->params, key, value, list, ISPT_LIST);
1513 	if (rc < 0) {
1514 		SPDK_ERRLOG("iscsi_param_add() failed\n");
1515 		return SPDK_ISCSI_LOGIN_ERROR_PARAMETER;
1516 	}
1517 	new_param = iscsi_param_find(conn->params, key);
1518 	if (new_param == NULL) {
1519 		SPDK_ERRLOG("iscsi_param_find() failed\n");
1520 		return SPDK_ISCSI_LOGIN_ERROR_PARAMETER;
1521 	}
1522 	new_param->state_index = index;
1523 	return rc;
1524 }
1525 
1526 static int
1527 iscsi_negotiate_chap_param(struct spdk_iscsi_conn *conn)
1528 {
1529 	int rc = 0;
1530 
1531 	if (conn->disable_chap) {
1532 		rc = iscsi_op_login_update_param(conn, "AuthMethod", "None", "None");
1533 	} else if (conn->require_chap) {
1534 		rc = iscsi_op_login_update_param(conn, "AuthMethod", "CHAP", "CHAP");
1535 	}
1536 
1537 	return rc;
1538 }
1539 
1540 /*
1541  * The function which is used to handle the part of session discovery
1542  * return:
1543  * 0, success;
1544  * otherwise: error;
1545  */
1546 static int
1547 iscsi_op_login_session_discovery_chap(struct spdk_iscsi_conn *conn)
1548 {
1549 	return iscsi_negotiate_chap_param(conn);
1550 }
1551 
1552 /*
1553  * This function is used to update the param related with chap
1554  * return:
1555  * 0: success
1556  * otherwise: error
1557  */
1558 static int
1559 iscsi_op_login_negotiate_chap_param(struct spdk_iscsi_conn *conn,
1560 				    struct spdk_iscsi_tgt_node *target)
1561 {
1562 	conn->disable_chap = target->disable_chap;
1563 	conn->require_chap = target->require_chap;
1564 	conn->mutual_chap = target->mutual_chap;
1565 	conn->chap_group = target->chap_group;
1566 
1567 	return iscsi_negotiate_chap_param(conn);
1568 }
1569 
1570 static int
1571 iscsi_op_login_negotiate_digest_param(struct spdk_iscsi_conn *conn,
1572 				      struct spdk_iscsi_tgt_node *target)
1573 {
1574 	int rc;
1575 
1576 	if (target->header_digest) {
1577 		/*
1578 		 * User specified header digests, so update the list of
1579 		 *  HeaderDigest values to remove "None" so that only
1580 		 *  initiators who support CRC32C can connect.
1581 		 */
1582 		rc = iscsi_op_login_update_param(conn, "HeaderDigest", "CRC32C", "CRC32C");
1583 		if (rc < 0) {
1584 			return rc;
1585 		}
1586 	}
1587 
1588 	if (target->data_digest) {
1589 		/*
1590 		 * User specified data digests, so update the list of
1591 		 *  DataDigest values to remove "None" so that only
1592 		 *  initiators who support CRC32C can connect.
1593 		 */
1594 		rc = iscsi_op_login_update_param(conn, "DataDigest", "CRC32C", "CRC32C");
1595 		if (rc < 0) {
1596 			return rc;
1597 		}
1598 	}
1599 
1600 	return 0;
1601 }
1602 
1603 /*
1604  * The function which is used to handle the part of normal login session
1605  * return:
1606  * 0, success;
1607  * SPDK_ISCSI_LOGIN_ERROR_PARAMETER, parameter error;
1608  */
1609 static int
1610 iscsi_op_login_session_normal(struct spdk_iscsi_conn *conn,
1611 			      struct spdk_iscsi_pdu *rsp_pdu,
1612 			      char *initiator_port_name,
1613 			      struct iscsi_param *params,
1614 			      int cid)
1615 {
1616 	struct spdk_iscsi_tgt_node *target = NULL;
1617 	const char *target_name;
1618 	const char *target_short_name;
1619 	struct iscsi_bhs_login_rsp *rsph;
1620 	int rc = 0;
1621 
1622 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1623 	target_name = iscsi_param_get_val(params, "TargetName");
1624 
1625 	if (target_name == NULL) {
1626 		SPDK_ERRLOG("TargetName is empty\n");
1627 		/* Missing parameter */
1628 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1629 		rsph->status_detail = ISCSI_LOGIN_MISSING_PARMS;
1630 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1631 	}
1632 
1633 	memset(conn->target_short_name, 0, MAX_TARGET_NAME);
1634 	target_short_name = strstr(target_name, ":");
1635 	if (target_short_name != NULL) {
1636 		target_short_name++; /* Advance past the ':' */
1637 		if (strlen(target_short_name) >= MAX_TARGET_NAME) {
1638 			SPDK_ERRLOG("Target Short Name (%s) is more than %u characters\n",
1639 				    target_short_name, MAX_TARGET_NAME);
1640 			/* Invalid request */
1641 			rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1642 			rsph->status_detail = ISCSI_LOGIN_INVALID_LOGIN_REQUEST;
1643 			return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1644 		}
1645 		snprintf(conn->target_short_name, MAX_TARGET_NAME, "%s",
1646 			 target_short_name);
1647 	}
1648 
1649 	pthread_mutex_lock(&g_iscsi.mutex);
1650 	rc = iscsi_op_login_check_target(conn, rsp_pdu, target_name, &target);
1651 	pthread_mutex_unlock(&g_iscsi.mutex);
1652 
1653 	if (rc < 0) {
1654 		return rc;
1655 	}
1656 
1657 	conn->target = target;
1658 	conn->dev = target->dev;
1659 	conn->target_port = spdk_scsi_dev_find_port_by_id(target->dev,
1660 			    conn->pg_tag);
1661 
1662 	rc = iscsi_op_login_check_session(conn, rsp_pdu,
1663 					  initiator_port_name, cid);
1664 	if (rc < 0) {
1665 		return rc;
1666 	}
1667 
1668 	/* force target flags */
1669 	pthread_mutex_lock(&target->mutex);
1670 	rc = iscsi_op_login_negotiate_chap_param(conn, target);
1671 	pthread_mutex_unlock(&target->mutex);
1672 
1673 	if (rc == 0) {
1674 		rc = iscsi_op_login_negotiate_digest_param(conn, target);
1675 	}
1676 
1677 	if (rc != 0) {
1678 		/* Invalid request */
1679 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1680 		rsph->status_detail = ISCSI_LOGIN_INVALID_LOGIN_REQUEST;
1681 	}
1682 
1683 	return rc;
1684 }
1685 
1686 /*
1687  * This function is used to set the info in the connection data structure
1688  * return
1689  * 0: success
1690  * otherwise: error
1691  */
1692 static int
1693 iscsi_op_login_set_conn_info(struct spdk_iscsi_conn *conn,
1694 			     struct spdk_iscsi_pdu *rsp_pdu,
1695 			     char *initiator_port_name,
1696 			     enum session_type session_type, int cid)
1697 {
1698 	int rc = 0;
1699 	struct spdk_iscsi_tgt_node *target;
1700 	struct iscsi_bhs_login_rsp *rsph;
1701 	struct spdk_scsi_port *initiator_port;
1702 
1703 	target = conn->target;
1704 
1705 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1706 	conn->authenticated = false;
1707 	conn->auth.chap_phase = ISCSI_CHAP_PHASE_WAIT_A;
1708 	conn->cid = cid;
1709 
1710 	if (conn->sess == NULL) {
1711 		/* create initiator port */
1712 		initiator_port = spdk_scsi_port_create(iscsi_get_isid(rsph->isid), 0, initiator_port_name);
1713 		if (initiator_port == NULL) {
1714 			SPDK_ERRLOG("create_port() failed\n");
1715 			rsph->status_class = ISCSI_CLASS_TARGET_ERROR;
1716 			rsph->status_detail = ISCSI_LOGIN_STATUS_NO_RESOURCES;
1717 			return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1718 		}
1719 
1720 		/* new session */
1721 		rc = create_iscsi_sess(conn, target, session_type);
1722 		if (rc < 0) {
1723 			spdk_scsi_port_free(&initiator_port);
1724 			SPDK_ERRLOG("create_sess() failed\n");
1725 			rsph->status_class = ISCSI_CLASS_TARGET_ERROR;
1726 			rsph->status_detail = ISCSI_LOGIN_STATUS_NO_RESOURCES;
1727 			return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1728 		}
1729 		/* initialize parameters */
1730 		conn->sess->initiator_port = initiator_port;
1731 		conn->StatSN = from_be32(&rsph->stat_sn);
1732 		conn->sess->isid = iscsi_get_isid(rsph->isid);
1733 
1734 		/* Initiator port TransportID */
1735 		spdk_scsi_port_set_iscsi_transport_id(conn->sess->initiator_port,
1736 						      conn->initiator_name,
1737 						      conn->sess->isid);
1738 
1739 		/* Discovery sessions will not have a target. */
1740 		if (target != NULL) {
1741 			conn->sess->queue_depth = target->queue_depth;
1742 		} else {
1743 			/*
1744 			 * Assume discovery sessions have an effective command
1745 			 *  windows size of 1.
1746 			 */
1747 			conn->sess->queue_depth = 1;
1748 		}
1749 		conn->sess->ExpCmdSN = rsp_pdu->cmd_sn;
1750 		conn->sess->MaxCmdSN = rsp_pdu->cmd_sn + conn->sess->queue_depth - 1;
1751 	}
1752 
1753 	conn->initiator_port = conn->sess->initiator_port;
1754 
1755 	return 0;
1756 }
1757 
1758 /*
1759  * This function is used to set the target info
1760  * return
1761  * 0: success
1762  * otherwise: error
1763  */
1764 static int
1765 iscsi_op_login_set_target_info(struct spdk_iscsi_conn *conn,
1766 			       struct spdk_iscsi_pdu *rsp_pdu,
1767 			       enum session_type session_type)
1768 {
1769 	char buf[MAX_TMPBUF];
1770 	const char *val;
1771 	int rc = 0;
1772 	struct spdk_iscsi_tgt_node *target = conn->target;
1773 
1774 	/* declarative parameters */
1775 	if (target != NULL) {
1776 		pthread_mutex_lock(&target->mutex);
1777 		if (target->alias[0] != '\0') {
1778 			snprintf(buf, sizeof buf, "%s", target->alias);
1779 		} else {
1780 			snprintf(buf, sizeof buf, "%s", "");
1781 		}
1782 		pthread_mutex_unlock(&target->mutex);
1783 		rc = iscsi_param_set(conn->sess->params, "TargetAlias", buf);
1784 		if (rc < 0) {
1785 			SPDK_ERRLOG("iscsi_param_set() failed\n");
1786 			return SPDK_ISCSI_LOGIN_ERROR_PARAMETER;
1787 		}
1788 	}
1789 	snprintf(buf, sizeof buf, "%s:%s,%d", conn->portal_host, conn->portal_port,
1790 		 conn->pg_tag);
1791 	rc = iscsi_param_set(conn->sess->params, "TargetAddress", buf);
1792 	if (rc < 0) {
1793 		SPDK_ERRLOG("iscsi_param_set() failed\n");
1794 		return SPDK_ISCSI_LOGIN_ERROR_PARAMETER;
1795 	}
1796 	snprintf(buf, sizeof buf, "%d", conn->pg_tag);
1797 	rc = iscsi_param_set(conn->sess->params, "TargetPortalGroupTag", buf);
1798 	if (rc < 0) {
1799 		SPDK_ERRLOG("iscsi_param_set() failed\n");
1800 		return SPDK_ISCSI_LOGIN_ERROR_PARAMETER;
1801 	}
1802 
1803 	/* write in response */
1804 	if (target != NULL) {
1805 		val = iscsi_param_get_val(conn->sess->params, "TargetAlias");
1806 		if (val != NULL && strlen(val) != 0) {
1807 			rsp_pdu->data_segment_len = iscsi_append_param(conn,
1808 						    "TargetAlias",
1809 						    rsp_pdu->data,
1810 						    rsp_pdu->data_buf_len,
1811 						    rsp_pdu->data_segment_len);
1812 		}
1813 		if (session_type == SESSION_TYPE_DISCOVERY) {
1814 			rsp_pdu->data_segment_len = iscsi_append_param(conn,
1815 						    "TargetAddress",
1816 						    rsp_pdu->data,
1817 						    rsp_pdu->data_buf_len,
1818 						    rsp_pdu->data_segment_len);
1819 		}
1820 		rsp_pdu->data_segment_len = iscsi_append_param(conn,
1821 					    "TargetPortalGroupTag",
1822 					    rsp_pdu->data,
1823 					    rsp_pdu->data_buf_len,
1824 					    rsp_pdu->data_segment_len);
1825 	}
1826 
1827 	return rc;
1828 }
1829 
1830 /*
1831  * This function is used to handle the login of iscsi initiator when there is
1832  * no session
1833  * return:
1834  * 0, success;
1835  * SPDK_ISCSI_LOGIN_ERROR_PARAMETER, parameter error;
1836  * SPDK_ISCSI_LOGIN_ERROR_RESPONSE,  used to notify the login fail.
1837  */
1838 static int
1839 iscsi_op_login_phase_none(struct spdk_iscsi_conn *conn,
1840 			  struct spdk_iscsi_pdu *rsp_pdu,
1841 			  struct iscsi_param *params, int cid)
1842 {
1843 	enum session_type session_type;
1844 	char initiator_port_name[MAX_INITIATOR_PORT_NAME];
1845 	struct iscsi_bhs_login_rsp *rsph;
1846 	int rc = 0;
1847 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1848 
1849 	conn->target = NULL;
1850 	conn->dev = NULL;
1851 
1852 	rc = iscsi_op_login_initialize_port(conn, rsp_pdu, initiator_port_name,
1853 					    MAX_INITIATOR_PORT_NAME, params);
1854 	if (rc < 0) {
1855 		return rc;
1856 	}
1857 
1858 	rc = iscsi_op_login_session_type(conn, rsp_pdu, &session_type, params);
1859 	if (rc < 0) {
1860 		return rc;
1861 	}
1862 
1863 	/* Target Name and Port */
1864 	if (session_type == SESSION_TYPE_NORMAL) {
1865 		rc = iscsi_op_login_session_normal(conn, rsp_pdu,
1866 						   initiator_port_name,
1867 						   params, cid);
1868 		if (rc < 0) {
1869 			return rc;
1870 		}
1871 
1872 	} else if (session_type == SESSION_TYPE_DISCOVERY) {
1873 		rsph->tsih = 0;
1874 
1875 		/* force target flags */
1876 		pthread_mutex_lock(&g_iscsi.mutex);
1877 		rc = iscsi_op_login_session_discovery_chap(conn);
1878 		pthread_mutex_unlock(&g_iscsi.mutex);
1879 		if (rc < 0) {
1880 			return rc;
1881 		}
1882 	} else {
1883 		SPDK_ERRLOG("unknown session type\n");
1884 		/* Missing parameter */
1885 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1886 		rsph->status_detail = ISCSI_LOGIN_MISSING_PARMS;
1887 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1888 	}
1889 
1890 	rc = iscsi_op_login_set_conn_info(conn, rsp_pdu, initiator_port_name,
1891 					  session_type, cid);
1892 	if (rc < 0) {
1893 		return rc;
1894 	}
1895 
1896 	/* limit conns on discovery session */
1897 	if (session_type == SESSION_TYPE_DISCOVERY) {
1898 		conn->sess->MaxConnections = 1;
1899 		rc = iscsi_param_set_int(conn->sess->params,
1900 					 "MaxConnections",
1901 					 conn->sess->MaxConnections);
1902 		if (rc < 0) {
1903 			SPDK_ERRLOG("iscsi_param_set_int() failed\n");
1904 			return SPDK_ISCSI_LOGIN_ERROR_PARAMETER;
1905 		}
1906 	}
1907 
1908 	return iscsi_op_login_set_target_info(conn, rsp_pdu, session_type);
1909 }
1910 
1911 /*
1912  * This function is used to set the csg bit case in rsp
1913  * return:
1914  * 0, success
1915  * otherwise: error
1916  */
1917 static int
1918 iscsi_op_login_rsp_handle_csg_bit(struct spdk_iscsi_conn *conn,
1919 				  struct spdk_iscsi_pdu *rsp_pdu,
1920 				  struct iscsi_param *params)
1921 {
1922 	const char *auth_method;
1923 	int rc;
1924 	struct iscsi_bhs_login_rsp *rsph;
1925 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
1926 
1927 	switch (ISCSI_BHS_LOGIN_GET_CSG(rsph->flags)) {
1928 	case ISCSI_SECURITY_NEGOTIATION_PHASE:
1929 		/* SecurityNegotiation */
1930 		auth_method = iscsi_param_get_val(conn->params, "AuthMethod");
1931 		if (auth_method == NULL) {
1932 			SPDK_ERRLOG("AuthMethod is empty\n");
1933 			/* Missing parameter */
1934 			rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1935 			rsph->status_detail = ISCSI_LOGIN_MISSING_PARMS;
1936 			return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1937 		}
1938 		if (strcasecmp(auth_method, "None") == 0) {
1939 			conn->authenticated = true;
1940 		} else {
1941 			rc = iscsi_auth_params(conn, params, auth_method,
1942 					       rsp_pdu->data, rsp_pdu->data_buf_len,
1943 					       rsp_pdu->data_segment_len);
1944 			if (rc < 0) {
1945 				SPDK_ERRLOG("iscsi_auth_params() failed\n");
1946 				/* Authentication failure */
1947 				rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1948 				rsph->status_detail = ISCSI_LOGIN_AUTHENT_FAIL;
1949 				return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1950 			}
1951 			rsp_pdu->data_segment_len = rc;
1952 			if (!conn->authenticated) {
1953 				/* not complete */
1954 				rsph->flags &= ~ISCSI_LOGIN_TRANSIT;
1955 			} else {
1956 				if (conn->auth.chap_phase != ISCSI_CHAP_PHASE_END) {
1957 					SPDK_DEBUGLOG(iscsi, "CHAP phase not complete");
1958 				}
1959 			}
1960 
1961 			SPDK_LOGDUMP(iscsi, "Negotiated Auth Params",
1962 				     rsp_pdu->data, rsp_pdu->data_segment_len);
1963 		}
1964 		break;
1965 
1966 	case ISCSI_OPERATIONAL_NEGOTIATION_PHASE:
1967 		/* LoginOperationalNegotiation */
1968 		if (conn->state == ISCSI_CONN_STATE_INVALID) {
1969 			if (conn->require_chap) {
1970 				/* Authentication failure */
1971 				rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1972 				rsph->status_detail = ISCSI_LOGIN_AUTHENT_FAIL;
1973 				return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1974 			} else {
1975 				/* AuthMethod=None */
1976 				conn->authenticated = true;
1977 			}
1978 		}
1979 		if (!conn->authenticated) {
1980 			SPDK_ERRLOG("authentication error\n");
1981 			/* Authentication failure */
1982 			rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1983 			rsph->status_detail = ISCSI_LOGIN_AUTHENT_FAIL;
1984 			return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1985 		}
1986 		break;
1987 
1988 	case ISCSI_FULL_FEATURE_PHASE:
1989 		/* FullFeaturePhase */
1990 		SPDK_ERRLOG("XXX Login in FullFeaturePhase\n");
1991 		/* Initiator error */
1992 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
1993 		rsph->status_detail = ISCSI_LOGIN_INITIATOR_ERROR;
1994 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
1995 
1996 	default:
1997 		SPDK_ERRLOG("unknown stage\n");
1998 		/* Initiator error */
1999 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
2000 		rsph->status_detail = ISCSI_LOGIN_INITIATOR_ERROR;
2001 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
2002 	}
2003 
2004 	return 0;
2005 }
2006 
2007 /* This function is used to notify the session info
2008  * return
2009  * 0: success
2010  * otherwise: error
2011  */
2012 static int
2013 iscsi_op_login_notify_session_info(struct spdk_iscsi_conn *conn,
2014 				   struct spdk_iscsi_pdu *rsp_pdu)
2015 {
2016 	struct iscsi_bhs_login_rsp *rsph;
2017 
2018 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
2019 	if (conn->sess->session_type == SESSION_TYPE_NORMAL) {
2020 		/* normal session */
2021 		SPDK_DEBUGLOG(iscsi, "Login from %s (%s) on %s tgt_node%d"
2022 			      " (%s:%s,%d), ISID=%"PRIx64", TSIH=%u,"
2023 			      " CID=%u, HeaderDigest=%s, DataDigest=%s\n",
2024 			      conn->initiator_name, conn->initiator_addr,
2025 			      conn->target->name, conn->target->num,
2026 			      conn->portal_host, conn->portal_port, conn->pg_tag,
2027 			      conn->sess->isid, conn->sess->tsih, conn->cid,
2028 			      (iscsi_param_eq_val(conn->params, "HeaderDigest", "CRC32C")
2029 			       ? "on" : "off"),
2030 			      (iscsi_param_eq_val(conn->params, "DataDigest", "CRC32C")
2031 			       ? "on" : "off"));
2032 	} else if (conn->sess->session_type == SESSION_TYPE_DISCOVERY) {
2033 		/* discovery session */
2034 		SPDK_DEBUGLOG(iscsi, "Login(discovery) from %s (%s) on"
2035 			      " (%s:%s,%d), ISID=%"PRIx64", TSIH=%u,"
2036 			      " CID=%u, HeaderDigest=%s, DataDigest=%s\n",
2037 			      conn->initiator_name, conn->initiator_addr,
2038 			      conn->portal_host, conn->portal_port, conn->pg_tag,
2039 			      conn->sess->isid, conn->sess->tsih, conn->cid,
2040 			      (iscsi_param_eq_val(conn->params, "HeaderDigest", "CRC32C")
2041 			       ? "on" : "off"),
2042 			      (iscsi_param_eq_val(conn->params, "DataDigest", "CRC32C")
2043 			       ? "on" : "off"));
2044 	} else {
2045 		SPDK_ERRLOG("unknown session type\n");
2046 		/* Initiator error */
2047 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
2048 		rsph->status_detail = ISCSI_LOGIN_INITIATOR_ERROR;
2049 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
2050 	}
2051 
2052 	return 0;
2053 }
2054 
2055 /*
2056  * This function is to handle the tbit cases
2057  * return
2058  * 0: success
2059  * otherwise error
2060  */
2061 static int
2062 iscsi_op_login_rsp_handle_t_bit(struct spdk_iscsi_conn *conn,
2063 				struct spdk_iscsi_pdu *rsp_pdu)
2064 {
2065 	int rc;
2066 	struct iscsi_bhs_login_rsp *rsph;
2067 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
2068 
2069 	switch (ISCSI_BHS_LOGIN_GET_NSG(rsph->flags)) {
2070 	case ISCSI_SECURITY_NEGOTIATION_PHASE:
2071 		/* SecurityNegotiation */
2072 		conn->login_phase = ISCSI_SECURITY_NEGOTIATION_PHASE;
2073 		break;
2074 
2075 	case ISCSI_OPERATIONAL_NEGOTIATION_PHASE:
2076 		/* LoginOperationalNegotiation */
2077 		conn->login_phase = ISCSI_OPERATIONAL_NEGOTIATION_PHASE;
2078 		break;
2079 
2080 	case ISCSI_FULL_FEATURE_PHASE:
2081 		/* FullFeaturePhase */
2082 		conn->login_phase = ISCSI_FULL_FEATURE_PHASE;
2083 		to_be16(&rsph->tsih, conn->sess->tsih);
2084 
2085 		rc = iscsi_op_login_notify_session_info(conn, rsp_pdu);
2086 		if (rc < 0) {
2087 			return rc;
2088 		}
2089 
2090 		conn->full_feature = 1;
2091 		break;
2092 
2093 	default:
2094 		SPDK_ERRLOG("unknown stage\n");
2095 		/* Initiator error */
2096 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
2097 		rsph->status_detail = ISCSI_LOGIN_INITIATOR_ERROR;
2098 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
2099 	}
2100 
2101 	return 0;
2102 }
2103 
2104 /*
2105  * This function is used to set the values of the internal data structure used
2106  * by spdk_iscsi_op_login function
2107  * return:
2108  * 0, used to notify the a successful login
2109  * SPDK_ISCSI_LOGIN_ERROR_RESPONSE,  used to notify a failure login.
2110  */
2111 static int
2112 iscsi_op_login_rsp_handle(struct spdk_iscsi_conn *conn,
2113 			  struct spdk_iscsi_pdu *rsp_pdu, struct iscsi_param **params)
2114 {
2115 	int rc;
2116 	struct iscsi_bhs_login_rsp *rsph;
2117 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
2118 
2119 	/* negotiate parameters */
2120 	rc = iscsi_negotiate_params(conn, params, rsp_pdu->data,
2121 				    rsp_pdu->data_buf_len,
2122 				    rsp_pdu->data_segment_len);
2123 	if (rc < 0) {
2124 		/*
2125 		 * iscsi_negotiate_params just returns -1 on failure,
2126 		 *  so translate this into meaningful response codes and
2127 		 *  return values.
2128 		 */
2129 		rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
2130 		rsph->status_detail = ISCSI_LOGIN_INITIATOR_ERROR;
2131 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
2132 	}
2133 
2134 	rsp_pdu->data_segment_len = rc;
2135 	SPDK_LOGDUMP(iscsi, "Negotiated Params", rsp_pdu->data, rc);
2136 
2137 	/* handle the CSG bit case */
2138 	rc = iscsi_op_login_rsp_handle_csg_bit(conn, rsp_pdu, *params);
2139 	if (rc < 0) {
2140 		return rc;
2141 	}
2142 
2143 	/* handle the T bit case */
2144 	if (ISCSI_BHS_LOGIN_GET_TBIT(rsph->flags)) {
2145 		rc = iscsi_op_login_rsp_handle_t_bit(conn, rsp_pdu);
2146 	}
2147 
2148 	return rc;
2149 }
2150 
2151 static int
2152 iscsi_pdu_hdr_op_login(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
2153 {
2154 	int rc;
2155 	struct iscsi_bhs_login_req *reqh;
2156 	struct spdk_iscsi_pdu *rsp_pdu;
2157 
2158 	if (conn->full_feature && conn->sess != NULL &&
2159 	    conn->sess->session_type == SESSION_TYPE_DISCOVERY) {
2160 		return SPDK_ISCSI_CONNECTION_FATAL;
2161 	}
2162 
2163 	reqh = (struct iscsi_bhs_login_req *)&pdu->bhs;
2164 	pdu->cmd_sn = from_be32(&reqh->cmd_sn);
2165 
2166 	/* During login processing, use the 8KB default FirstBurstLength as
2167 	 *  our maximum data segment length value.
2168 	 */
2169 	if (pdu->data_segment_len > SPDK_ISCSI_FIRST_BURST_LENGTH) {
2170 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
2171 	}
2172 
2173 	rsp_pdu = iscsi_get_pdu(conn);
2174 	if (rsp_pdu == NULL) {
2175 		return SPDK_ISCSI_CONNECTION_FATAL;
2176 	}
2177 	rc = iscsi_op_login_rsp_init(conn, pdu, rsp_pdu);
2178 	if (rc < 0) {
2179 		iscsi_op_login_response(conn, rsp_pdu, NULL, iscsi_conn_login_pdu_err_complete);
2180 		return 0;
2181 	}
2182 
2183 	conn->login_rsp_pdu = rsp_pdu;
2184 	return 0;
2185 }
2186 
2187 static int
2188 iscsi_pdu_payload_op_login(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
2189 {
2190 	int rc;
2191 	struct iscsi_bhs_login_req *reqh;
2192 	struct spdk_iscsi_pdu *rsp_pdu;
2193 	struct iscsi_param *params = NULL;
2194 	int cid;
2195 
2196 	if (conn->login_rsp_pdu == NULL) {
2197 		return 0;
2198 	}
2199 
2200 	spdk_poller_unregister(&conn->login_timer);
2201 	rsp_pdu = conn->login_rsp_pdu;
2202 
2203 	reqh = (struct iscsi_bhs_login_req *)&pdu->bhs;
2204 	cid = from_be16(&reqh->cid);
2205 
2206 	rc = iscsi_op_login_store_incoming_params(conn, pdu, rsp_pdu, &params);
2207 	if (rc < 0) {
2208 		iscsi_op_login_response(conn, rsp_pdu, NULL, iscsi_conn_login_pdu_err_complete);
2209 		return 0;
2210 	}
2211 
2212 	if (conn->state == ISCSI_CONN_STATE_INVALID) {
2213 		rc = iscsi_op_login_phase_none(conn, rsp_pdu, params, cid);
2214 		if (rc == SPDK_ISCSI_LOGIN_ERROR_RESPONSE || rc == SPDK_ISCSI_LOGIN_ERROR_PARAMETER) {
2215 			iscsi_op_login_response(conn, rsp_pdu, params, iscsi_conn_login_pdu_err_complete);
2216 			return 0;
2217 		}
2218 	}
2219 
2220 	rc = iscsi_op_login_rsp_handle(conn, rsp_pdu, &params);
2221 	if (rc == SPDK_ISCSI_LOGIN_ERROR_RESPONSE) {
2222 		iscsi_op_login_response(conn, rsp_pdu, params, iscsi_conn_login_pdu_err_complete);
2223 		return 0;
2224 	}
2225 
2226 	conn->state = ISCSI_CONN_STATE_RUNNING;
2227 	iscsi_op_login_response(conn, rsp_pdu, params, iscsi_conn_login_pdu_success_complete);
2228 	return 0;
2229 }
2230 
2231 static int
2232 iscsi_pdu_hdr_op_text(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
2233 {
2234 	uint32_t task_tag;
2235 	uint32_t ExpStatSN;
2236 	int F_bit, C_bit;
2237 	struct iscsi_bhs_text_req *reqh;
2238 
2239 	if (pdu->data_segment_len > iscsi_get_max_immediate_data_size()) {
2240 		SPDK_ERRLOG("data segment len(=%zu) > immediate data len(=%"PRIu32")\n",
2241 			    pdu->data_segment_len, iscsi_get_max_immediate_data_size());
2242 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
2243 	}
2244 
2245 	reqh = (struct iscsi_bhs_text_req *)&pdu->bhs;
2246 
2247 	F_bit = !!(reqh->flags & ISCSI_FLAG_FINAL);
2248 	C_bit = !!(reqh->flags & ISCSI_TEXT_CONTINUE);
2249 	task_tag = from_be32(&reqh->itt);
2250 	ExpStatSN = from_be32(&reqh->exp_stat_sn);
2251 
2252 	SPDK_DEBUGLOG(iscsi, "I=%d, F=%d, C=%d, ITT=%x, TTT=%x\n",
2253 		      reqh->immediate, F_bit, C_bit, task_tag, from_be32(&reqh->ttt));
2254 
2255 	SPDK_DEBUGLOG(iscsi,
2256 		      "CmdSN=%u, ExpStatSN=%u, StatSN=%u, ExpCmdSN=%u, MaxCmdSN=%u\n",
2257 		      pdu->cmd_sn, ExpStatSN, conn->StatSN, conn->sess->ExpCmdSN,
2258 		      conn->sess->MaxCmdSN);
2259 
2260 	if (ExpStatSN != conn->StatSN) {
2261 #if 0
2262 		SPDK_ERRLOG("StatSN(%u) error\n", ExpStatSN);
2263 		return -1;
2264 #else
2265 		/* StarPort have a bug */
2266 		SPDK_DEBUGLOG(iscsi, "StatSN(%u) rewound\n", ExpStatSN);
2267 		conn->StatSN = ExpStatSN;
2268 #endif
2269 	}
2270 
2271 	if (F_bit && C_bit) {
2272 		SPDK_ERRLOG("final and continue\n");
2273 		return -1;
2274 	}
2275 
2276 	/*
2277 	 * If this is the first text op in a sequence, save the ITT so we can
2278 	 * compare it against the ITT for subsequent ops in the same sequence.
2279 	 * If a subsequent text op in same sequence has a different ITT, reject
2280 	 * that PDU.
2281 	 */
2282 	if (conn->sess->current_text_itt == 0xffffffffU) {
2283 		conn->sess->current_text_itt = task_tag;
2284 	} else if (conn->sess->current_text_itt != task_tag) {
2285 		SPDK_ERRLOG("The correct itt is %u, and the current itt is %u...\n",
2286 			    conn->sess->current_text_itt, task_tag);
2287 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
2288 	}
2289 
2290 	return 0;
2291 }
2292 
2293 static void
2294 iscsi_conn_text_pdu_complete(void *arg)
2295 {
2296 	struct spdk_iscsi_conn *conn = arg;
2297 
2298 	iscsi_conn_params_update(conn);
2299 }
2300 
2301 static int
2302 iscsi_pdu_payload_op_text(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
2303 {
2304 	struct iscsi_param *params = NULL;
2305 	struct spdk_iscsi_pdu *rsp_pdu;
2306 	uint8_t *data;
2307 	uint64_t lun;
2308 	uint32_t task_tag;
2309 	const char *val;
2310 	int F_bit, C_bit;
2311 	int data_len;
2312 	int alloc_len;
2313 	int rc;
2314 	struct iscsi_bhs_text_req *reqh;
2315 	struct iscsi_bhs_text_resp *rsph;
2316 
2317 	data_len = 0;
2318 	alloc_len = conn->MaxRecvDataSegmentLength;
2319 
2320 	reqh = (struct iscsi_bhs_text_req *)&pdu->bhs;
2321 
2322 	F_bit = !!(reqh->flags & ISCSI_FLAG_FINAL);
2323 	C_bit = !!(reqh->flags & ISCSI_TEXT_CONTINUE);
2324 	lun = from_be64(&reqh->lun);
2325 	task_tag = from_be32(&reqh->itt);
2326 
2327 	/* store incoming parameters */
2328 	rc = iscsi_parse_params(&params, pdu->data, pdu->data_segment_len,
2329 				C_bit, &conn->partial_text_parameter);
2330 	if (rc < 0) {
2331 		SPDK_ERRLOG("iscsi_parse_params() failed\n");
2332 		iscsi_param_free(params);
2333 		return -1;
2334 	}
2335 
2336 	if (pdu->data_segment_len == 0 && params == NULL) {
2337 		params = conn->params_text;
2338 		conn->params_text = NULL;
2339 	}
2340 
2341 	data = calloc(1, alloc_len);
2342 	if (!data) {
2343 		SPDK_ERRLOG("calloc() failed for data segment\n");
2344 		iscsi_param_free(params);
2345 		return -ENOMEM;
2346 	}
2347 
2348 	/* negotiate parameters */
2349 	data_len = iscsi_negotiate_params(conn, &params,
2350 					  data, alloc_len, data_len);
2351 	if (data_len < 0) {
2352 		SPDK_ERRLOG("iscsi_negotiate_params() failed\n");
2353 		iscsi_param_free(params);
2354 		free(data);
2355 		return -1;
2356 	}
2357 
2358 	/* sendtargets is special case */
2359 	val = iscsi_param_get_val(params, "SendTargets");
2360 	if (val != NULL) {
2361 		if (iscsi_param_eq_val(conn->sess->params,
2362 				       "SessionType", "Discovery")) {
2363 			if (strcasecmp(val, "") == 0) {
2364 				val = "ALL";
2365 			}
2366 
2367 			data_len = iscsi_send_tgts(conn,
2368 						   conn->initiator_name,
2369 						   val, data, alloc_len,
2370 						   data_len);
2371 		} else {
2372 			if (strcasecmp(val, "") == 0) {
2373 				val = conn->target->name;
2374 			}
2375 
2376 			if (strcasecmp(val, "ALL") == 0) {
2377 				/* not in discovery session */
2378 				data_len = iscsi_append_text("SendTargets", "Reject",
2379 							     data, alloc_len, data_len);
2380 			} else {
2381 				data_len = iscsi_send_tgts(conn,
2382 							   conn->initiator_name,
2383 							   val, data, alloc_len,
2384 							   data_len);
2385 			}
2386 		}
2387 
2388 		if (conn->send_tgt_completed_size != 0) {
2389 			F_bit = 0;
2390 			C_bit = 1;
2391 		}
2392 	} else {
2393 		if (iscsi_param_eq_val(conn->sess->params, "SessionType", "Discovery")) {
2394 			iscsi_param_free(params);
2395 			free(data);
2396 			return SPDK_ISCSI_CONNECTION_FATAL;
2397 		}
2398 	}
2399 
2400 	if (spdk_likely(conn->send_tgt_completed_size == 0)) {
2401 		iscsi_param_free(params);
2402 	} else {
2403 		conn->params_text = params;
2404 	}
2405 	SPDK_LOGDUMP(iscsi, "Negotiated Params", data, data_len);
2406 
2407 	/* response PDU */
2408 	rsp_pdu = iscsi_get_pdu(conn);
2409 	if (rsp_pdu == NULL) {
2410 		free(data);
2411 		return SPDK_ISCSI_CONNECTION_FATAL;
2412 	}
2413 	rsph = (struct iscsi_bhs_text_resp *)&rsp_pdu->bhs;
2414 
2415 	rsp_pdu->data = data;
2416 	rsph->opcode = ISCSI_OP_TEXT_RSP;
2417 
2418 	if (F_bit) {
2419 		rsph->flags |= ISCSI_FLAG_FINAL;
2420 	}
2421 
2422 	if (C_bit) {
2423 		rsph->flags |= ISCSI_TEXT_CONTINUE;
2424 	}
2425 
2426 	DSET24(rsph->data_segment_len, data_len);
2427 	to_be64(&rsph->lun, lun);
2428 	to_be32(&rsph->itt, task_tag);
2429 
2430 	if (F_bit) {
2431 		rsph->ttt = 0xffffffffU;
2432 		conn->sess->current_text_itt = 0xffffffffU;
2433 	} else {
2434 		to_be32(&rsph->ttt, 1 + conn->id);
2435 	}
2436 
2437 	to_be32(&rsph->stat_sn, conn->StatSN);
2438 	conn->StatSN++;
2439 
2440 	if (reqh->immediate == 0) {
2441 		conn->sess->MaxCmdSN++;
2442 	}
2443 
2444 	to_be32(&rsph->exp_cmd_sn, conn->sess->ExpCmdSN);
2445 	to_be32(&rsph->max_cmd_sn, conn->sess->MaxCmdSN);
2446 
2447 	iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_text_pdu_complete, conn);
2448 	return 0;
2449 }
2450 
2451 static void
2452 iscsi_conn_logout_pdu_complete(void *arg)
2453 {
2454 	struct spdk_iscsi_conn *conn = arg;
2455 
2456 	if (conn->sess == NULL) {
2457 		/*
2458 		 * login failed but initiator still sent a logout rather than
2459 		 *  just closing the TCP connection.
2460 		 */
2461 		SPDK_DEBUGLOG(iscsi, "Logout(login failed) from %s (%s) on"
2462 			      " (%s:%s,%d)\n",
2463 			      conn->initiator_name, conn->initiator_addr,
2464 			      conn->portal_host, conn->portal_port, conn->pg_tag);
2465 	} else if (iscsi_param_eq_val(conn->sess->params, "SessionType", "Normal")) {
2466 		SPDK_DEBUGLOG(iscsi, "Logout from %s (%s) on %s tgt_node%d"
2467 			      " (%s:%s,%d), ISID=%"PRIx64", TSIH=%u,"
2468 			      " CID=%u, HeaderDigest=%s, DataDigest=%s\n",
2469 			      conn->initiator_name, conn->initiator_addr,
2470 			      conn->target->name, conn->target->num,
2471 			      conn->portal_host, conn->portal_port, conn->pg_tag,
2472 			      conn->sess->isid, conn->sess->tsih, conn->cid,
2473 			      (iscsi_param_eq_val(conn->params, "HeaderDigest", "CRC32C")
2474 			       ? "on" : "off"),
2475 			      (iscsi_param_eq_val(conn->params, "DataDigest", "CRC32C")
2476 			       ? "on" : "off"));
2477 	} else {
2478 		/* discovery session */
2479 		SPDK_DEBUGLOG(iscsi, "Logout(discovery) from %s (%s) on"
2480 			      " (%s:%s,%d), ISID=%"PRIx64", TSIH=%u,"
2481 			      " CID=%u, HeaderDigest=%s, DataDigest=%s\n",
2482 			      conn->initiator_name, conn->initiator_addr,
2483 			      conn->portal_host, conn->portal_port, conn->pg_tag,
2484 			      conn->sess->isid, conn->sess->tsih, conn->cid,
2485 			      (iscsi_param_eq_val(conn->params, "HeaderDigest", "CRC32C")
2486 			       ? "on" : "off"),
2487 			      (iscsi_param_eq_val(conn->params, "DataDigest", "CRC32C")
2488 			       ? "on" : "off"));
2489 	}
2490 }
2491 
2492 static int
2493 iscsi_pdu_hdr_op_logout(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
2494 {
2495 	struct spdk_iscsi_pdu *rsp_pdu;
2496 	uint32_t task_tag;
2497 	uint32_t ExpStatSN;
2498 	int response;
2499 	struct iscsi_bhs_logout_req *reqh;
2500 	struct iscsi_bhs_logout_resp *rsph;
2501 	uint16_t cid;
2502 
2503 	reqh = (struct iscsi_bhs_logout_req *)&pdu->bhs;
2504 
2505 	cid = from_be16(&reqh->cid);
2506 	task_tag = from_be32(&reqh->itt);
2507 	ExpStatSN = from_be32(&reqh->exp_stat_sn);
2508 
2509 	SPDK_DEBUGLOG(iscsi, "reason=%d, ITT=%x, cid=%d\n",
2510 		      reqh->reason, task_tag, cid);
2511 
2512 	if (conn->sess != NULL) {
2513 		if (conn->sess->session_type == SESSION_TYPE_DISCOVERY &&
2514 		    reqh->reason != ISCSI_LOGOUT_REASON_CLOSE_SESSION) {
2515 			SPDK_ERRLOG("Target can accept logout only with reason \"close the session\" "
2516 				    "on discovery session. %d is not acceptable reason.\n",
2517 				    reqh->reason);
2518 			return SPDK_ISCSI_CONNECTION_FATAL;
2519 		}
2520 
2521 		SPDK_DEBUGLOG(iscsi,
2522 			      "CmdSN=%u, ExpStatSN=%u, StatSN=%u, ExpCmdSN=%u, MaxCmdSN=%u\n",
2523 			      pdu->cmd_sn, ExpStatSN, conn->StatSN,
2524 			      conn->sess->ExpCmdSN, conn->sess->MaxCmdSN);
2525 
2526 		if (pdu->cmd_sn != conn->sess->ExpCmdSN) {
2527 			SPDK_DEBUGLOG(iscsi, "CmdSN(%u) might have dropped\n", pdu->cmd_sn);
2528 			/* ignore error */
2529 		}
2530 	} else {
2531 		SPDK_DEBUGLOG(iscsi, "CmdSN=%u, ExpStatSN=%u, StatSN=%u\n",
2532 			      pdu->cmd_sn, ExpStatSN, conn->StatSN);
2533 	}
2534 
2535 	if (ExpStatSN != conn->StatSN) {
2536 		SPDK_DEBUGLOG(iscsi, "StatSN(%u/%u) might have dropped\n",
2537 			      ExpStatSN, conn->StatSN);
2538 		/* ignore error */
2539 	}
2540 
2541 	if (conn->cid == cid) {
2542 		/* connection or session closed successfully */
2543 		response = 0;
2544 		iscsi_conn_logout(conn);
2545 	} else {
2546 		response = 1;
2547 	}
2548 
2549 	/* response PDU */
2550 	rsp_pdu = iscsi_get_pdu(conn);
2551 	if (rsp_pdu == NULL) {
2552 		return SPDK_ISCSI_CONNECTION_FATAL;
2553 	}
2554 	rsph = (struct iscsi_bhs_logout_resp *)&rsp_pdu->bhs;
2555 	rsp_pdu->data = NULL;
2556 	rsph->opcode = ISCSI_OP_LOGOUT_RSP;
2557 	rsph->flags |= 0x80; /* bit 0 must be 1 */
2558 	rsph->response = response;
2559 	DSET24(rsph->data_segment_len, 0);
2560 	to_be32(&rsph->itt, task_tag);
2561 
2562 	if (conn->sess != NULL) {
2563 		to_be32(&rsph->stat_sn, conn->StatSN);
2564 		conn->StatSN++;
2565 
2566 		if (conn->sess->connections == 1) {
2567 			conn->sess->MaxCmdSN++;
2568 		}
2569 
2570 		to_be32(&rsph->exp_cmd_sn, conn->sess->ExpCmdSN);
2571 		to_be32(&rsph->max_cmd_sn, conn->sess->MaxCmdSN);
2572 	} else {
2573 		to_be32(&rsph->stat_sn, conn->StatSN);
2574 		conn->StatSN++;
2575 		to_be32(&rsph->exp_cmd_sn, pdu->cmd_sn);
2576 		to_be32(&rsph->max_cmd_sn, pdu->cmd_sn);
2577 	}
2578 
2579 	rsph->time_2_wait = 0;
2580 	rsph->time_2_retain = 0;
2581 
2582 	iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_logout_pdu_complete, conn);
2583 
2584 	return 0;
2585 }
2586 
2587 static int
2588 iscsi_send_r2t(struct spdk_iscsi_conn *conn,
2589 	       struct spdk_iscsi_task *task, int offset,
2590 	       int len, uint32_t transfer_tag, uint32_t *R2TSN)
2591 {
2592 	struct spdk_iscsi_pdu *rsp_pdu;
2593 	struct iscsi_bhs_r2t *rsph;
2594 	uint64_t fmt_lun;
2595 
2596 	/* R2T PDU */
2597 	rsp_pdu = iscsi_get_pdu(conn);
2598 	if (rsp_pdu == NULL) {
2599 		return SPDK_ISCSI_CONNECTION_FATAL;
2600 	}
2601 	rsph = (struct iscsi_bhs_r2t *)&rsp_pdu->bhs;
2602 	rsp_pdu->data = NULL;
2603 	rsph->opcode = ISCSI_OP_R2T;
2604 	rsph->flags |= 0x80; /* bit 0 is default to 1 */
2605 	fmt_lun = spdk_scsi_lun_id_int_to_fmt(task->lun_id);
2606 	to_be64(&rsph->lun, fmt_lun);
2607 	to_be32(&rsph->itt, task->tag);
2608 	to_be32(&rsph->ttt, transfer_tag);
2609 
2610 	to_be32(&rsph->stat_sn, conn->StatSN);
2611 	to_be32(&rsph->exp_cmd_sn, conn->sess->ExpCmdSN);
2612 	to_be32(&rsph->max_cmd_sn, conn->sess->MaxCmdSN);
2613 
2614 	to_be32(&rsph->r2t_sn, *R2TSN);
2615 	*R2TSN += 1;
2616 
2617 	task->r2t_datasn = 0; /* next expected datasn to ack */
2618 
2619 	to_be32(&rsph->buffer_offset, (uint32_t)offset);
2620 	to_be32(&rsph->desired_xfer_len, (uint32_t)len);
2621 	task->desired_data_transfer_length = (size_t)len;
2622 
2623 	/* we need to hold onto this task/cmd because until the PDU has been
2624 	 * written out */
2625 	rsp_pdu->task = task;
2626 	task->scsi.ref++;
2627 
2628 	iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_pdu_generic_complete, NULL);
2629 
2630 	return 0;
2631 }
2632 
2633 /* This function is used to remove the r2t pdu from snack_pdu_list by < task, r2t_sn> info */
2634 static struct spdk_iscsi_pdu *
2635 iscsi_remove_r2t_pdu_from_snack_list(struct spdk_iscsi_conn *conn,
2636 				     struct spdk_iscsi_task *task,
2637 				     uint32_t r2t_sn)
2638 {
2639 	struct spdk_iscsi_pdu *pdu;
2640 	struct iscsi_bhs_r2t *r2t_header;
2641 
2642 	TAILQ_FOREACH(pdu, &conn->snack_pdu_list, tailq) {
2643 		if (pdu->bhs.opcode == ISCSI_OP_R2T) {
2644 			r2t_header = (struct iscsi_bhs_r2t *)&pdu->bhs;
2645 			if (pdu->task == task &&
2646 			    from_be32(&r2t_header->r2t_sn) == r2t_sn) {
2647 				TAILQ_REMOVE(&conn->snack_pdu_list, pdu, tailq);
2648 				return pdu;
2649 			}
2650 		}
2651 	}
2652 
2653 	return NULL;
2654 }
2655 
2656 /* This function is used re-send the r2t packet */
2657 static int
2658 iscsi_send_r2t_recovery(struct spdk_iscsi_conn *conn,
2659 			struct spdk_iscsi_task *task, uint32_t r2t_sn,
2660 			bool send_new_r2tsn)
2661 {
2662 	struct spdk_iscsi_pdu *pdu;
2663 	struct iscsi_bhs_r2t *rsph;
2664 	uint32_t transfer_len;
2665 	uint32_t len;
2666 	int rc;
2667 
2668 	/* remove the r2t pdu from the snack_list */
2669 	pdu = iscsi_remove_r2t_pdu_from_snack_list(conn, task, r2t_sn);
2670 	if (!pdu) {
2671 		SPDK_DEBUGLOG(iscsi, "No pdu is found\n");
2672 		return -1;
2673 	}
2674 
2675 	/* flag
2676 	 * false: only need to re-send the old r2t with changing statsn
2677 	 * true: we send a r2t with new r2tsn
2678 	 */
2679 	if (!send_new_r2tsn) {
2680 		to_be32(&pdu->bhs.stat_sn, conn->StatSN);
2681 		iscsi_conn_write_pdu(conn, pdu, iscsi_conn_pdu_generic_complete, NULL);
2682 	} else {
2683 		rsph = (struct iscsi_bhs_r2t *)&pdu->bhs;
2684 		transfer_len = from_be32(&rsph->desired_xfer_len);
2685 
2686 		/* still need to increase the acked r2tsn */
2687 		task->acked_r2tsn++;
2688 		len = spdk_min(conn->sess->MaxBurstLength,
2689 			       (transfer_len - task->next_expected_r2t_offset));
2690 
2691 		/* remove the old_r2t_pdu */
2692 		iscsi_conn_free_pdu(conn, pdu);
2693 
2694 		/* re-send a new r2t pdu */
2695 		rc = iscsi_send_r2t(conn, task, task->next_expected_r2t_offset,
2696 				    len, task->ttt, &task->R2TSN);
2697 		if (rc < 0) {
2698 			return SPDK_ISCSI_CONNECTION_FATAL;
2699 		}
2700 	}
2701 
2702 	return 0;
2703 }
2704 
2705 static int
2706 add_transfer_task(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task)
2707 {
2708 	uint32_t transfer_len;
2709 	size_t max_burst_len;
2710 	size_t segment_len;
2711 	size_t data_len;
2712 	int len;
2713 	int rc;
2714 	int data_out_req;
2715 
2716 	transfer_len = task->scsi.transfer_len;
2717 	data_len = iscsi_task_get_pdu(task)->data_segment_len;
2718 	max_burst_len = conn->sess->MaxBurstLength;
2719 	segment_len = SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH;
2720 	data_out_req = 1 + (transfer_len - data_len - 1) / segment_len;
2721 	task->data_out_cnt = data_out_req;
2722 
2723 	/*
2724 	 * If we already have too many tasks using R2T, then queue this task
2725 	 *  and start sending R2T for it after some of the tasks using R2T/data
2726 	 *  out buffers complete.
2727 	 */
2728 	if (conn->pending_r2t >= g_iscsi.MaxR2TPerConnection) {
2729 		TAILQ_INSERT_TAIL(&conn->queued_r2t_tasks, task, link);
2730 		return 0;
2731 	}
2732 
2733 	conn->data_out_cnt += data_out_req;
2734 	conn->pending_r2t++;
2735 
2736 	task->next_expected_r2t_offset = data_len;
2737 	task->current_r2t_length = 0;
2738 	task->R2TSN = 0;
2739 	/* According to RFC3720 10.8.5, 0xffffffff is
2740 	 * reserved for TTT in R2T.
2741 	 */
2742 	if (++conn->ttt == 0xffffffffu) {
2743 		conn->ttt = 0;
2744 	}
2745 	task->ttt = conn->ttt;
2746 
2747 	while (data_len != transfer_len) {
2748 		len = spdk_min(max_burst_len, (transfer_len - data_len));
2749 		rc = iscsi_send_r2t(conn, task, data_len, len,
2750 				    task->ttt, &task->R2TSN);
2751 		if (rc < 0) {
2752 			SPDK_ERRLOG("iscsi_send_r2t() failed\n");
2753 			return rc;
2754 		}
2755 		data_len += len;
2756 		task->next_r2t_offset = data_len;
2757 		task->outstanding_r2t++;
2758 		if (conn->sess->MaxOutstandingR2T == task->outstanding_r2t) {
2759 			break;
2760 		}
2761 	}
2762 
2763 	TAILQ_INSERT_TAIL(&conn->active_r2t_tasks, task, link);
2764 	task->is_r2t_active = true;
2765 	return 0;
2766 }
2767 
2768 /* If there are additional large writes queued for R2Ts, start them now.
2769  *  This is called when a large write is just completed or when multiple LUNs
2770  *  are attached and large write tasks for the specific LUN are cleared.
2771  */
2772 static void
2773 start_queued_transfer_tasks(struct spdk_iscsi_conn *conn)
2774 {
2775 	struct spdk_iscsi_task *task, *tmp;
2776 
2777 	TAILQ_FOREACH_SAFE(task, &conn->queued_r2t_tasks, link, tmp) {
2778 		if (conn->pending_r2t < g_iscsi.MaxR2TPerConnection) {
2779 			TAILQ_REMOVE(&conn->queued_r2t_tasks, task, link);
2780 			add_transfer_task(conn, task);
2781 		} else {
2782 			break;
2783 		}
2784 	}
2785 }
2786 
2787 bool
2788 iscsi_del_transfer_task(struct spdk_iscsi_conn *conn, uint32_t task_tag)
2789 {
2790 	struct spdk_iscsi_task *task, *tmp;
2791 
2792 	TAILQ_FOREACH_SAFE(task, &conn->active_r2t_tasks, link, tmp) {
2793 		if (task->tag == task_tag) {
2794 			assert(conn->data_out_cnt >= task->data_out_cnt);
2795 			conn->data_out_cnt -= task->data_out_cnt;
2796 
2797 			assert(conn->pending_r2t > 0);
2798 			conn->pending_r2t--;
2799 
2800 			assert(task->is_r2t_active == true);
2801 			TAILQ_REMOVE(&conn->active_r2t_tasks, task, link);
2802 			task->is_r2t_active = false;
2803 			iscsi_task_put(task);
2804 
2805 			start_queued_transfer_tasks(conn);
2806 			return true;
2807 		}
2808 	}
2809 	return false;
2810 }
2811 
2812 void
2813 iscsi_clear_all_transfer_task(struct spdk_iscsi_conn *conn,
2814 			      struct spdk_scsi_lun *lun,
2815 			      struct spdk_iscsi_pdu *pdu)
2816 {
2817 	struct spdk_iscsi_task *task, *task_tmp;
2818 	struct spdk_iscsi_pdu *pdu_tmp;
2819 
2820 	TAILQ_FOREACH_SAFE(task, &conn->active_r2t_tasks, link, task_tmp) {
2821 		pdu_tmp = iscsi_task_get_pdu(task);
2822 		if ((lun == NULL || lun == task->scsi.lun) &&
2823 		    (pdu == NULL || spdk_sn32_lt(pdu_tmp->cmd_sn, pdu->cmd_sn))) {
2824 			task->outstanding_r2t = 0;
2825 			task->next_r2t_offset = 0;
2826 			task->next_expected_r2t_offset = 0;
2827 			task->current_data_offset = 0;
2828 			assert(conn->data_out_cnt >= task->data_out_cnt);
2829 			conn->data_out_cnt -= task->data_out_cnt;
2830 			assert(conn->pending_r2t > 0);
2831 			conn->pending_r2t--;
2832 
2833 			TAILQ_REMOVE(&conn->active_r2t_tasks, task, link);
2834 			task->is_r2t_active = false;
2835 			if (lun != NULL && spdk_scsi_lun_is_removing(lun)) {
2836 				spdk_scsi_task_process_null_lun(&task->scsi);
2837 				iscsi_task_response(conn, task);
2838 			}
2839 			iscsi_task_put(task);
2840 		}
2841 	}
2842 
2843 	TAILQ_FOREACH_SAFE(task, &conn->queued_r2t_tasks, link, task_tmp) {
2844 		pdu_tmp = iscsi_task_get_pdu(task);
2845 		if ((lun == NULL || lun == task->scsi.lun) &&
2846 		    (pdu == NULL || spdk_sn32_lt(pdu_tmp->cmd_sn, pdu->cmd_sn))) {
2847 			TAILQ_REMOVE(&conn->queued_r2t_tasks, task, link);
2848 			task->is_r2t_active = false;
2849 			if (lun != NULL && spdk_scsi_lun_is_removing(lun)) {
2850 				spdk_scsi_task_process_null_lun(&task->scsi);
2851 				iscsi_task_response(conn, task);
2852 			}
2853 			iscsi_task_put(task);
2854 		}
2855 	}
2856 
2857 	start_queued_transfer_tasks(conn);
2858 }
2859 
2860 static struct spdk_iscsi_task *
2861 get_transfer_task(struct spdk_iscsi_conn *conn, uint32_t transfer_tag)
2862 {
2863 	struct spdk_iscsi_task *task;
2864 
2865 	TAILQ_FOREACH(task, &conn->active_r2t_tasks, link) {
2866 		if (task->ttt == transfer_tag) {
2867 			return task;
2868 		}
2869 	}
2870 
2871 	return NULL;
2872 }
2873 
2874 static void
2875 iscsi_conn_datain_pdu_complete(void *arg)
2876 {
2877 	struct spdk_iscsi_conn *conn = arg;
2878 
2879 	iscsi_conn_handle_queued_datain_tasks(conn);
2880 }
2881 
2882 static int
2883 iscsi_send_datain(struct spdk_iscsi_conn *conn,
2884 		  struct spdk_iscsi_task *task, int datain_flag,
2885 		  int residual_len, int offset, int DataSN, int len)
2886 {
2887 	struct spdk_iscsi_pdu *rsp_pdu;
2888 	struct iscsi_bhs_data_in *rsph;
2889 	uint32_t task_tag;
2890 	uint32_t transfer_tag;
2891 	int F_bit, U_bit, O_bit, S_bit;
2892 	struct spdk_iscsi_task *primary;
2893 	struct spdk_scsi_lun *lun_dev;
2894 
2895 	primary = iscsi_task_get_primary(task);
2896 
2897 	/* DATA PDU */
2898 	rsp_pdu = iscsi_get_pdu(conn);
2899 	rsph = (struct iscsi_bhs_data_in *)&rsp_pdu->bhs;
2900 	rsp_pdu->data = task->scsi.iovs[0].iov_base + offset;
2901 	rsp_pdu->data_buf_len = task->scsi.iovs[0].iov_len - offset;
2902 	rsp_pdu->data_valid_bytes = len;
2903 	rsp_pdu->data_from_mempool = true;
2904 
2905 	task_tag = task->tag;
2906 	transfer_tag = 0xffffffffU;
2907 
2908 	F_bit = datain_flag & ISCSI_FLAG_FINAL;
2909 	O_bit = datain_flag & ISCSI_DATAIN_OVERFLOW;
2910 	U_bit = datain_flag & ISCSI_DATAIN_UNDERFLOW;
2911 	S_bit = datain_flag & ISCSI_DATAIN_STATUS;
2912 
2913 	/*
2914 	 * we need to hold onto this task/cmd because until the
2915 	 * PDU has been written out
2916 	 */
2917 	rsp_pdu->task = task;
2918 	task->scsi.ref++;
2919 
2920 	rsph->opcode = ISCSI_OP_SCSI_DATAIN;
2921 
2922 	if (F_bit) {
2923 		rsph->flags |= ISCSI_FLAG_FINAL;
2924 	}
2925 
2926 	/* we leave the A_bit clear */
2927 
2928 	if (F_bit && S_bit)  {
2929 		if (O_bit) {
2930 			rsph->flags |= ISCSI_DATAIN_OVERFLOW;
2931 		}
2932 
2933 		if (U_bit) {
2934 			rsph->flags |= ISCSI_DATAIN_UNDERFLOW;
2935 		}
2936 	}
2937 
2938 	if (S_bit) {
2939 		rsph->flags |= ISCSI_DATAIN_STATUS;
2940 		rsph->status = task->scsi.status;
2941 	}
2942 
2943 	DSET24(rsph->data_segment_len, len);
2944 
2945 	to_be32(&rsph->itt, task_tag);
2946 	to_be32(&rsph->ttt, transfer_tag);
2947 
2948 	if (S_bit) {
2949 		to_be32(&rsph->stat_sn, conn->StatSN);
2950 		conn->StatSN++;
2951 	}
2952 
2953 	if (F_bit && S_bit && !iscsi_task_is_immediate(primary)) {
2954 		conn->sess->MaxCmdSN++;
2955 	}
2956 
2957 	to_be32(&rsph->exp_cmd_sn, conn->sess->ExpCmdSN);
2958 	to_be32(&rsph->max_cmd_sn, conn->sess->MaxCmdSN);
2959 
2960 	to_be32(&rsph->data_sn, DataSN);
2961 
2962 	if (conn->sess->ErrorRecoveryLevel >= 1) {
2963 		primary->datain_datasn = DataSN;
2964 	}
2965 	DataSN++;
2966 
2967 	offset += task->scsi.offset;
2968 	to_be32(&rsph->buffer_offset, (uint32_t)offset);
2969 
2970 	if (F_bit && S_bit) {
2971 		to_be32(&rsph->res_cnt, residual_len);
2972 	}
2973 
2974 	lun_dev = spdk_scsi_dev_get_lun(conn->dev, task->lun_id);
2975 	if (spdk_likely(lun_dev != NULL)) {
2976 		if (spdk_unlikely(spdk_scsi_lun_get_dif_ctx(lun_dev, &task->scsi,
2977 				  &rsp_pdu->dif_ctx))) {
2978 			rsp_pdu->dif_insert_or_strip = true;
2979 		}
2980 	}
2981 
2982 	iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_datain_pdu_complete, conn);
2983 
2984 	return DataSN;
2985 }
2986 
2987 static int
2988 iscsi_transfer_in(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task)
2989 {
2990 	uint32_t DataSN;
2991 	uint32_t transfer_len;
2992 	uint32_t data_len;
2993 	uint32_t segment_len;
2994 	uint32_t offset;
2995 	uint32_t residual_len = 0;
2996 	int sent_status;
2997 	uint32_t len;
2998 	int datain_flag = 0;
2999 	int datain_seq_cnt;
3000 	int i;
3001 	uint32_t sequence_end;
3002 	struct spdk_iscsi_task *primary;
3003 
3004 	primary = iscsi_task_get_primary(task);
3005 	segment_len = conn->MaxRecvDataSegmentLength;
3006 	data_len = task->scsi.data_transferred;
3007 	transfer_len = task->scsi.length;
3008 
3009 	if (task->scsi.status != SPDK_SCSI_STATUS_GOOD) {
3010 		return 0;
3011 	}
3012 
3013 	if (data_len < transfer_len) {
3014 		/* underflow */
3015 		SPDK_DEBUGLOG(iscsi, "Underflow %u/%u\n", data_len, transfer_len);
3016 		residual_len = transfer_len - data_len;
3017 		transfer_len = data_len;
3018 		datain_flag |= ISCSI_DATAIN_UNDERFLOW;
3019 	} else if (data_len > transfer_len) {
3020 		/* overflow */
3021 		SPDK_DEBUGLOG(iscsi, "Overflow %u/%u\n", data_len, transfer_len);
3022 		residual_len = data_len - transfer_len;
3023 		datain_flag |= ISCSI_DATAIN_OVERFLOW;
3024 	} else {
3025 		SPDK_DEBUGLOG(iscsi, "Transfer %u\n", transfer_len);
3026 		residual_len = 0;
3027 	}
3028 
3029 	DataSN = primary->datain_datasn;
3030 	sent_status = 0;
3031 
3032 	/* calculate the number of sequences for all data-in pdus */
3033 	datain_seq_cnt = 1 + ((transfer_len - 1) / (int)conn->sess->MaxBurstLength);
3034 	for (i = 0; i < datain_seq_cnt; i++) {
3035 		offset = i * conn->sess->MaxBurstLength;
3036 		sequence_end = spdk_min(((i + 1) * conn->sess->MaxBurstLength),
3037 					transfer_len);
3038 
3039 		/* send data split by segment_len */
3040 		for (; offset < sequence_end; offset += segment_len) {
3041 			len = spdk_min(segment_len, (sequence_end - offset));
3042 
3043 			datain_flag &= ~(ISCSI_FLAG_FINAL | ISCSI_DATAIN_STATUS);
3044 
3045 			if (offset + len == sequence_end) {
3046 				/* last PDU in a sequence */
3047 				datain_flag |= ISCSI_FLAG_FINAL;
3048 				if (task->scsi.sense_data_len == 0) {
3049 					/* The last pdu in all data-in pdus */
3050 					if ((offset + len) == transfer_len &&
3051 					    (primary->bytes_completed == primary->scsi.transfer_len)) {
3052 						datain_flag |= ISCSI_DATAIN_STATUS;
3053 						sent_status = 1;
3054 					}
3055 				}
3056 			}
3057 
3058 			SPDK_DEBUGLOG(iscsi, "Transfer=%d, Offset=%d, Len=%d\n",
3059 				      sequence_end, offset, len);
3060 			SPDK_DEBUGLOG(iscsi, "StatSN=%u, DataSN=%u, Offset=%u, Len=%d\n",
3061 				      conn->StatSN, DataSN, offset, len);
3062 
3063 			DataSN = iscsi_send_datain(conn, task, datain_flag, residual_len,
3064 						   offset, DataSN, len);
3065 		}
3066 	}
3067 
3068 	if (task != primary) {
3069 		primary->scsi.data_transferred += task->scsi.data_transferred;
3070 	}
3071 	primary->datain_datasn = DataSN;
3072 
3073 	return sent_status;
3074 }
3075 
3076 void
3077 iscsi_task_response(struct spdk_iscsi_conn *conn,
3078 		    struct spdk_iscsi_task *task)
3079 {
3080 	struct spdk_iscsi_pdu *rsp_pdu;
3081 	struct iscsi_bhs_scsi_resp *rsph;
3082 	uint32_t task_tag;
3083 	uint32_t transfer_len;
3084 	size_t residual_len;
3085 	size_t data_len;
3086 	int O_bit, U_bit;
3087 	int rc;
3088 	struct spdk_iscsi_task *primary;
3089 
3090 	primary = iscsi_task_get_primary(task);
3091 
3092 	transfer_len = primary->scsi.transfer_len;
3093 	task_tag = task->tag;
3094 
3095 	/* transfer data from logical unit */
3096 	/* (direction is view of initiator side) */
3097 	if (iscsi_task_is_read(primary)) {
3098 		rc = iscsi_transfer_in(conn, task);
3099 		if (rc > 0) {
3100 			/* sent status by last DATAIN PDU */
3101 			return;
3102 		}
3103 
3104 		if (primary->bytes_completed != primary->scsi.transfer_len) {
3105 			return;
3106 		}
3107 	}
3108 
3109 	O_bit = U_bit = 0;
3110 	residual_len = 0;
3111 	data_len = primary->scsi.data_transferred;
3112 
3113 	if ((transfer_len != 0) &&
3114 	    (task->scsi.status == SPDK_SCSI_STATUS_GOOD)) {
3115 		if (data_len < transfer_len) {
3116 			/* underflow */
3117 			SPDK_DEBUGLOG(iscsi, "Underflow %zu/%u\n", data_len, transfer_len);
3118 			residual_len = transfer_len - data_len;
3119 			U_bit = 1;
3120 		} else if (data_len > transfer_len) {
3121 			/* overflow */
3122 			SPDK_DEBUGLOG(iscsi, "Overflow %zu/%u\n", data_len, transfer_len);
3123 			residual_len = data_len - transfer_len;
3124 			O_bit = 1;
3125 		} else {
3126 			SPDK_DEBUGLOG(iscsi, "Transfer %u\n", transfer_len);
3127 		}
3128 	}
3129 
3130 	/* response PDU */
3131 	rsp_pdu = iscsi_get_pdu(conn);
3132 	assert(rsp_pdu != NULL);
3133 	rsph = (struct iscsi_bhs_scsi_resp *)&rsp_pdu->bhs;
3134 	assert(task->scsi.sense_data_len <= sizeof(rsp_pdu->sense.data));
3135 	memcpy(rsp_pdu->sense.data, task->scsi.sense_data, task->scsi.sense_data_len);
3136 	to_be16(&rsp_pdu->sense.length, task->scsi.sense_data_len);
3137 	rsp_pdu->data = (uint8_t *)&rsp_pdu->sense;
3138 	rsp_pdu->data_from_mempool = true;
3139 
3140 	/*
3141 	 * we need to hold onto this task/cmd because until the
3142 	 * PDU has been written out
3143 	 */
3144 	rsp_pdu->task = task;
3145 	task->scsi.ref++;
3146 
3147 	rsph->opcode = ISCSI_OP_SCSI_RSP;
3148 	rsph->flags |= 0x80; /* bit 0 is default to 1 */
3149 
3150 	if (O_bit) {
3151 		rsph->flags |= ISCSI_SCSI_OVERFLOW;
3152 	}
3153 
3154 	if (U_bit) {
3155 		rsph->flags |= ISCSI_SCSI_UNDERFLOW;
3156 	}
3157 
3158 	rsph->status = task->scsi.status;
3159 	if (task->scsi.sense_data_len) {
3160 		/* SenseLength (2 bytes) + SenseData  */
3161 		DSET24(rsph->data_segment_len, 2 + task->scsi.sense_data_len);
3162 	}
3163 	to_be32(&rsph->itt, task_tag);
3164 
3165 	to_be32(&rsph->stat_sn, conn->StatSN);
3166 	conn->StatSN++;
3167 
3168 	if (!iscsi_task_is_immediate(primary)) {
3169 		conn->sess->MaxCmdSN++;
3170 	}
3171 
3172 	to_be32(&rsph->exp_cmd_sn, conn->sess->ExpCmdSN);
3173 	to_be32(&rsph->max_cmd_sn, conn->sess->MaxCmdSN);
3174 
3175 	to_be32(&rsph->bi_read_res_cnt, 0);
3176 	to_be32(&rsph->res_cnt, residual_len);
3177 
3178 	iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_pdu_generic_complete, NULL);
3179 }
3180 
3181 /*
3182  *  This function compare the input pdu's bhs with the pdu's bhs associated by
3183  *  active_r2t_tasks and queued_r2t_tasks in a connection
3184  */
3185 static bool
3186 iscsi_compare_pdu_bhs_within_existed_r2t_tasks(struct spdk_iscsi_conn *conn,
3187 		struct spdk_iscsi_pdu *pdu)
3188 {
3189 	struct spdk_iscsi_task	*task;
3190 
3191 	TAILQ_FOREACH(task, &conn->active_r2t_tasks, link) {
3192 		if (!memcmp(&pdu->bhs, iscsi_task_get_bhs(task), ISCSI_BHS_LEN)) {
3193 			return true;
3194 		}
3195 	}
3196 
3197 	TAILQ_FOREACH(task, &conn->queued_r2t_tasks, link) {
3198 		if (!memcmp(&pdu->bhs, iscsi_task_get_bhs(task), ISCSI_BHS_LEN)) {
3199 			return true;
3200 		}
3201 	}
3202 
3203 	return false;
3204 }
3205 
3206 void
3207 iscsi_queue_task(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task)
3208 {
3209 	spdk_trace_record(TRACE_ISCSI_TASK_QUEUE, conn->id, task->scsi.length,
3210 			  (uintptr_t)task, (uintptr_t)task->pdu);
3211 	task->is_queued = true;
3212 	spdk_scsi_dev_queue_task(conn->dev, &task->scsi);
3213 }
3214 
3215 static int
3216 iscsi_pdu_payload_op_scsi_read(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task)
3217 {
3218 	if (task->scsi.transfer_len <= SPDK_BDEV_LARGE_BUF_MAX_SIZE) {
3219 		task->parent = NULL;
3220 		task->scsi.offset = 0;
3221 		task->scsi.length = task->scsi.transfer_len;
3222 		spdk_scsi_task_set_data(&task->scsi, NULL, 0);
3223 
3224 		iscsi_queue_task(conn, task);
3225 		return 0;
3226 	} else {
3227 		TAILQ_INIT(&task->subtask_list);
3228 		task->current_data_offset = 0;
3229 		TAILQ_INSERT_TAIL(&conn->queued_datain_tasks, task, link);
3230 
3231 		return iscsi_conn_handle_queued_datain_tasks(conn);
3232 	}
3233 }
3234 
3235 static int
3236 iscsi_submit_write_subtask(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task,
3237 			   struct spdk_iscsi_pdu *pdu, struct spdk_mobj *mobj)
3238 {
3239 	struct spdk_iscsi_task *subtask;
3240 
3241 	subtask = iscsi_task_get(conn, task, iscsi_task_cpl);
3242 	if (subtask == NULL) {
3243 		SPDK_ERRLOG("Unable to acquire subtask\n");
3244 		return SPDK_ISCSI_CONNECTION_FATAL;
3245 	}
3246 	subtask->scsi.offset = task->current_data_offset;
3247 	subtask->scsi.length = mobj->data_len;
3248 	iscsi_task_associate_pdu(subtask, pdu);
3249 
3250 	task->current_data_offset += mobj->data_len;
3251 
3252 	if (spdk_likely(!pdu->dif_insert_or_strip)) {
3253 		spdk_scsi_task_set_data(&subtask->scsi, mobj->buf, mobj->data_len);
3254 	} else {
3255 		spdk_scsi_task_set_data(&subtask->scsi, mobj->buf, pdu->data_buf_len);
3256 	}
3257 
3258 	iscsi_queue_task(conn, subtask);
3259 	return 0;
3260 }
3261 
3262 static int
3263 iscsi_pdu_payload_op_scsi_write(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task)
3264 {
3265 	struct spdk_iscsi_pdu *pdu;
3266 	struct iscsi_bhs_scsi_req *reqh;
3267 	uint32_t transfer_len;
3268 	struct spdk_mobj *mobj;
3269 	int rc;
3270 
3271 	pdu = iscsi_task_get_pdu(task);
3272 	reqh = (struct iscsi_bhs_scsi_req *)&pdu->bhs;
3273 
3274 	transfer_len = task->scsi.transfer_len;
3275 
3276 	if (reqh->final_bit &&
3277 	    pdu->data_segment_len < transfer_len) {
3278 		/* needs R2T */
3279 		rc = add_transfer_task(conn, task);
3280 		if (rc < 0) {
3281 			SPDK_ERRLOG("add_transfer_task() failed\n");
3282 			iscsi_task_put(task);
3283 			return SPDK_ISCSI_CONNECTION_FATAL;
3284 		}
3285 
3286 		/* immediate writes */
3287 		if (pdu->data_segment_len != 0) {
3288 			mobj = pdu->mobj[0];
3289 			assert(mobj != NULL);
3290 
3291 			if (!pdu->dif_insert_or_strip &&
3292 			    mobj->data_len < SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH) {
3293 				/* continue aggregation until the first data buffer is full. */
3294 				iscsi_task_set_mobj(task, mobj);
3295 				pdu->mobj[0] = NULL;
3296 			} else {
3297 				/* we are doing the first partial write task */
3298 				rc = iscsi_submit_write_subtask(conn, task, pdu, mobj);
3299 				if (rc < 0) {
3300 					iscsi_task_put(task);
3301 					return SPDK_ISCSI_CONNECTION_FATAL;
3302 				}
3303 			}
3304 		}
3305 		return 0;
3306 	}
3307 
3308 	if (pdu->data_segment_len == transfer_len) {
3309 		/* we are doing small writes with no R2T */
3310 		if (spdk_likely(!pdu->dif_insert_or_strip)) {
3311 			spdk_scsi_task_set_data(&task->scsi, pdu->data, pdu->data_segment_len);
3312 		} else {
3313 			spdk_scsi_task_set_data(&task->scsi, pdu->data, pdu->data_buf_len);
3314 		}
3315 		task->scsi.length = transfer_len;
3316 	}
3317 
3318 	iscsi_queue_task(conn, task);
3319 	return 0;
3320 }
3321 
3322 static int
3323 iscsi_pdu_hdr_op_scsi(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
3324 {
3325 	struct spdk_iscsi_task	*task;
3326 	struct spdk_scsi_dev	*dev;
3327 	uint8_t *cdb;
3328 	uint64_t lun;
3329 	uint32_t task_tag;
3330 	uint32_t transfer_len;
3331 	int R_bit, W_bit;
3332 	int lun_i;
3333 	struct iscsi_bhs_scsi_req *reqh;
3334 
3335 	if (conn->sess->session_type != SESSION_TYPE_NORMAL) {
3336 		SPDK_ERRLOG("ISCSI_OP_SCSI not allowed in discovery and invalid session\n");
3337 		return SPDK_ISCSI_CONNECTION_FATAL;
3338 	}
3339 
3340 	reqh = (struct iscsi_bhs_scsi_req *)&pdu->bhs;
3341 
3342 	R_bit = reqh->read_bit;
3343 	W_bit = reqh->write_bit;
3344 	lun = from_be64(&reqh->lun);
3345 	task_tag = from_be32(&reqh->itt);
3346 	transfer_len = from_be32(&reqh->expected_data_xfer_len);
3347 	cdb = reqh->cdb;
3348 
3349 	SPDK_LOGDUMP(iscsi, "CDB", cdb, 16);
3350 
3351 	task = iscsi_task_get(conn, NULL, iscsi_task_cpl);
3352 	if (!task) {
3353 		SPDK_ERRLOG("Unable to acquire task\n");
3354 		return SPDK_ISCSI_CONNECTION_FATAL;
3355 	}
3356 
3357 	iscsi_task_associate_pdu(task, pdu);
3358 	lun_i = spdk_scsi_lun_id_fmt_to_int(lun);
3359 	task->lun_id = lun_i;
3360 	dev = conn->dev;
3361 	task->scsi.lun = spdk_scsi_dev_get_lun(dev, lun_i);
3362 
3363 	if ((R_bit != 0) && (W_bit != 0)) {
3364 		SPDK_ERRLOG("Bidirectional CDB is not supported\n");
3365 		iscsi_task_put(task);
3366 		return SPDK_ISCSI_CONNECTION_FATAL;
3367 	}
3368 
3369 	task->scsi.cdb = cdb;
3370 	task->tag = task_tag;
3371 	task->scsi.transfer_len = transfer_len;
3372 	task->scsi.target_port = conn->target_port;
3373 	task->scsi.initiator_port = conn->initiator_port;
3374 	task->parent = NULL;
3375 	task->scsi.status = SPDK_SCSI_STATUS_GOOD;
3376 
3377 	if (task->scsi.lun == NULL) {
3378 		spdk_scsi_task_process_null_lun(&task->scsi);
3379 		iscsi_task_cpl(&task->scsi);
3380 		return 0;
3381 	}
3382 
3383 	/* no bi-directional support */
3384 	if (R_bit) {
3385 		task->scsi.dxfer_dir = SPDK_SCSI_DIR_FROM_DEV;
3386 	} else if (W_bit) {
3387 		task->scsi.dxfer_dir = SPDK_SCSI_DIR_TO_DEV;
3388 
3389 		if ((conn->sess->ErrorRecoveryLevel >= 1) &&
3390 		    (iscsi_compare_pdu_bhs_within_existed_r2t_tasks(conn, pdu))) {
3391 			iscsi_task_response(conn, task);
3392 			iscsi_task_put(task);
3393 			return 0;
3394 		}
3395 
3396 		if (pdu->data_segment_len > iscsi_get_max_immediate_data_size()) {
3397 			SPDK_ERRLOG("data segment len(=%zu) > immediate data len(=%"PRIu32")\n",
3398 				    pdu->data_segment_len, iscsi_get_max_immediate_data_size());
3399 			iscsi_task_put(task);
3400 			return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
3401 		}
3402 
3403 		if (pdu->data_segment_len > transfer_len) {
3404 			SPDK_ERRLOG("data segment len(=%zu) > task transfer len(=%d)\n",
3405 				    pdu->data_segment_len, transfer_len);
3406 			iscsi_task_put(task);
3407 			return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
3408 		}
3409 
3410 		/* check the ImmediateData and also pdu->data_segment_len */
3411 		if ((!conn->sess->ImmediateData && (pdu->data_segment_len > 0)) ||
3412 		    (pdu->data_segment_len > conn->sess->FirstBurstLength)) {
3413 			iscsi_task_put(task);
3414 			return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
3415 		}
3416 
3417 		if (spdk_unlikely(spdk_scsi_lun_get_dif_ctx(task->scsi.lun, &task->scsi, &pdu->dif_ctx))) {
3418 			pdu->dif_insert_or_strip = true;
3419 		} else if (reqh->final_bit && pdu->data_segment_len < transfer_len) {
3420 			pdu->data_buf_len = spdk_min(transfer_len,
3421 						     SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH);
3422 		}
3423 	} else {
3424 		/* neither R nor W bit set */
3425 		task->scsi.dxfer_dir = SPDK_SCSI_DIR_NONE;
3426 		if (transfer_len > 0) {
3427 			iscsi_task_put(task);
3428 			SPDK_ERRLOG("Reject scsi cmd with EDTL > 0 but (R | W) == 0\n");
3429 			return iscsi_reject(conn, pdu, ISCSI_REASON_INVALID_PDU_FIELD);
3430 		}
3431 	}
3432 
3433 	pdu->task = task;
3434 	return 0;
3435 }
3436 
3437 static int
3438 iscsi_pdu_payload_op_scsi(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
3439 {
3440 	struct spdk_iscsi_task *task;
3441 
3442 	if (pdu->task == NULL) {
3443 		return 0;
3444 	}
3445 
3446 	task = pdu->task;
3447 
3448 	if (spdk_scsi_dev_get_lun(conn->dev, task->lun_id) == NULL) {
3449 		spdk_scsi_task_process_null_lun(&task->scsi);
3450 		iscsi_task_cpl(&task->scsi);
3451 		return 0;
3452 	}
3453 
3454 	switch (task->scsi.dxfer_dir) {
3455 	case SPDK_SCSI_DIR_FROM_DEV:
3456 		return iscsi_pdu_payload_op_scsi_read(conn, task);
3457 	case SPDK_SCSI_DIR_TO_DEV:
3458 		return iscsi_pdu_payload_op_scsi_write(conn, task);
3459 	case SPDK_SCSI_DIR_NONE:
3460 		iscsi_queue_task(conn, task);
3461 		return 0;
3462 	default:
3463 		assert(false);
3464 		iscsi_task_put(task);
3465 		break;
3466 	}
3467 
3468 	return SPDK_ISCSI_CONNECTION_FATAL;
3469 }
3470 
3471 void
3472 iscsi_task_mgmt_response(struct spdk_iscsi_conn *conn,
3473 			 struct spdk_iscsi_task *task)
3474 {
3475 	struct spdk_iscsi_pdu *rsp_pdu;
3476 	struct iscsi_bhs_task_req *reqh;
3477 	struct iscsi_bhs_task_resp *rsph;
3478 
3479 	if (task->pdu == NULL) {
3480 		/*
3481 		 * This was an internally generated task management command,
3482 		 *  usually from LUN cleanup when a connection closes.
3483 		 */
3484 		return;
3485 	}
3486 
3487 	reqh = (struct iscsi_bhs_task_req *)&task->pdu->bhs;
3488 	/* response PDU */
3489 	rsp_pdu = iscsi_get_pdu(conn);
3490 	rsph = (struct iscsi_bhs_task_resp *)&rsp_pdu->bhs;
3491 	rsph->opcode = ISCSI_OP_TASK_RSP;
3492 	rsph->flags |= 0x80; /* bit 0 default to 1 */
3493 	switch (task->scsi.response) {
3494 	case SPDK_SCSI_TASK_MGMT_RESP_COMPLETE:
3495 		rsph->response = ISCSI_TASK_FUNC_RESP_COMPLETE;
3496 		break;
3497 	case SPDK_SCSI_TASK_MGMT_RESP_SUCCESS:
3498 		rsph->response = ISCSI_TASK_FUNC_RESP_COMPLETE;
3499 		break;
3500 	case SPDK_SCSI_TASK_MGMT_RESP_REJECT:
3501 		rsph->response = ISCSI_TASK_FUNC_REJECTED;
3502 		break;
3503 	case SPDK_SCSI_TASK_MGMT_RESP_INVALID_LUN:
3504 		rsph->response = ISCSI_TASK_FUNC_RESP_LUN_NOT_EXIST;
3505 		break;
3506 	case SPDK_SCSI_TASK_MGMT_RESP_TARGET_FAILURE:
3507 		rsph->response = ISCSI_TASK_FUNC_REJECTED;
3508 		break;
3509 	case SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED:
3510 		rsph->response = ISCSI_TASK_FUNC_RESP_FUNC_NOT_SUPPORTED;
3511 		break;
3512 	}
3513 	rsph->itt = reqh->itt;
3514 
3515 	to_be32(&rsph->stat_sn, conn->StatSN);
3516 	conn->StatSN++;
3517 
3518 	if (reqh->immediate == 0) {
3519 		conn->sess->MaxCmdSN++;
3520 	}
3521 
3522 	to_be32(&rsph->exp_cmd_sn, conn->sess->ExpCmdSN);
3523 	to_be32(&rsph->max_cmd_sn, conn->sess->MaxCmdSN);
3524 
3525 	iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_pdu_generic_complete, NULL);
3526 }
3527 
3528 static void
3529 iscsi_queue_mgmt_task(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task)
3530 {
3531 	struct spdk_scsi_lun *lun;
3532 
3533 	lun = spdk_scsi_dev_get_lun(conn->dev, task->lun_id);
3534 	if (lun == NULL) {
3535 		task->scsi.response = SPDK_SCSI_TASK_MGMT_RESP_INVALID_LUN;
3536 		iscsi_task_mgmt_response(conn, task);
3537 		iscsi_task_put(task);
3538 		return;
3539 	}
3540 
3541 	spdk_scsi_dev_queue_mgmt_task(conn->dev, &task->scsi);
3542 }
3543 
3544 static int
3545 _iscsi_op_abort_task(void *arg)
3546 {
3547 	struct spdk_iscsi_task *task = arg;
3548 	int rc;
3549 
3550 	rc = iscsi_conn_abort_queued_datain_task(task->conn, task->scsi.abort_id);
3551 	if (rc != 0) {
3552 		return SPDK_POLLER_BUSY;
3553 	}
3554 
3555 	spdk_poller_unregister(&task->mgmt_poller);
3556 	iscsi_queue_mgmt_task(task->conn, task);
3557 	return SPDK_POLLER_BUSY;
3558 }
3559 
3560 static void
3561 iscsi_op_abort_task(struct spdk_iscsi_task *task, uint32_t ref_task_tag)
3562 {
3563 	task->scsi.abort_id = ref_task_tag;
3564 	task->scsi.function = SPDK_SCSI_TASK_FUNC_ABORT_TASK;
3565 	task->mgmt_poller = SPDK_POLLER_REGISTER(_iscsi_op_abort_task, task, 10);
3566 }
3567 
3568 static int
3569 _iscsi_op_abort_task_set(void *arg)
3570 {
3571 	struct spdk_iscsi_task *task = arg;
3572 	int rc;
3573 
3574 	rc = iscsi_conn_abort_queued_datain_tasks(task->conn, task->scsi.lun,
3575 			task->pdu);
3576 	if (rc != 0) {
3577 		return SPDK_POLLER_BUSY;
3578 	}
3579 
3580 	spdk_poller_unregister(&task->mgmt_poller);
3581 	iscsi_queue_mgmt_task(task->conn, task);
3582 	return SPDK_POLLER_BUSY;
3583 }
3584 
3585 void
3586 iscsi_op_abort_task_set(struct spdk_iscsi_task *task, uint8_t function)
3587 {
3588 	task->scsi.function = function;
3589 	task->mgmt_poller = SPDK_POLLER_REGISTER(_iscsi_op_abort_task_set, task, 10);
3590 }
3591 
3592 static int
3593 iscsi_pdu_hdr_op_task(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
3594 {
3595 	struct iscsi_bhs_task_req *reqh;
3596 	uint64_t lun;
3597 	uint32_t task_tag;
3598 	uint32_t ref_task_tag;
3599 	uint8_t function;
3600 	int lun_i;
3601 	struct spdk_iscsi_task *task;
3602 	struct spdk_scsi_dev *dev;
3603 
3604 	if (conn->sess->session_type != SESSION_TYPE_NORMAL) {
3605 		SPDK_ERRLOG("ISCSI_OP_TASK not allowed in discovery and invalid session\n");
3606 		return SPDK_ISCSI_CONNECTION_FATAL;
3607 	}
3608 
3609 	reqh = (struct iscsi_bhs_task_req *)&pdu->bhs;
3610 	function = reqh->flags & ISCSI_TASK_FUNCTION_MASK;
3611 	lun = from_be64(&reqh->lun);
3612 	task_tag = from_be32(&reqh->itt);
3613 	ref_task_tag = from_be32(&reqh->ref_task_tag);
3614 
3615 	SPDK_DEBUGLOG(iscsi, "I=%d, func=%d, ITT=%x, ref TT=%x, LUN=0x%16.16"PRIx64"\n",
3616 		      reqh->immediate, function, task_tag, ref_task_tag, lun);
3617 
3618 	SPDK_DEBUGLOG(iscsi, "StatSN=%u, ExpCmdSN=%u, MaxCmdSN=%u\n",
3619 		      conn->StatSN, conn->sess->ExpCmdSN, conn->sess->MaxCmdSN);
3620 
3621 	lun_i = spdk_scsi_lun_id_fmt_to_int(lun);
3622 	dev = conn->dev;
3623 
3624 	task = iscsi_task_get(conn, NULL, iscsi_task_mgmt_cpl);
3625 	if (!task) {
3626 		SPDK_ERRLOG("Unable to acquire task\n");
3627 		return SPDK_ISCSI_CONNECTION_FATAL;
3628 	}
3629 
3630 	iscsi_task_associate_pdu(task, pdu);
3631 	task->scsi.target_port = conn->target_port;
3632 	task->scsi.initiator_port = conn->initiator_port;
3633 	task->tag = task_tag;
3634 	task->scsi.lun = spdk_scsi_dev_get_lun(dev, lun_i);
3635 	task->lun_id = lun_i;
3636 
3637 	if (task->scsi.lun == NULL) {
3638 		task->scsi.response = SPDK_SCSI_TASK_MGMT_RESP_INVALID_LUN;
3639 		iscsi_task_mgmt_response(conn, task);
3640 		iscsi_task_put(task);
3641 		return 0;
3642 	}
3643 
3644 	switch (function) {
3645 	/* abort task identified by Referenced Task Tag field */
3646 	case ISCSI_TASK_FUNC_ABORT_TASK:
3647 		SPDK_NOTICELOG("ABORT_TASK\n");
3648 
3649 		iscsi_del_transfer_task(conn, ref_task_tag);
3650 		iscsi_op_abort_task(task, ref_task_tag);
3651 		return 0;
3652 
3653 	/* abort all tasks issued via this session on the LUN */
3654 	case ISCSI_TASK_FUNC_ABORT_TASK_SET:
3655 		SPDK_NOTICELOG("ABORT_TASK_SET\n");
3656 
3657 		iscsi_clear_all_transfer_task(conn, task->scsi.lun, pdu);
3658 		iscsi_op_abort_task_set(task, SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET);
3659 		return 0;
3660 
3661 	case ISCSI_TASK_FUNC_CLEAR_TASK_SET:
3662 		task->scsi.response = SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED;
3663 		SPDK_NOTICELOG("CLEAR_TASK_SET (Unsupported)\n");
3664 		break;
3665 
3666 	case ISCSI_TASK_FUNC_CLEAR_ACA:
3667 		task->scsi.response = SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED;
3668 		SPDK_NOTICELOG("CLEAR_ACA (Unsupported)\n");
3669 		break;
3670 
3671 	case ISCSI_TASK_FUNC_LOGICAL_UNIT_RESET:
3672 		SPDK_NOTICELOG("LOGICAL_UNIT_RESET\n");
3673 
3674 		iscsi_clear_all_transfer_task(conn, task->scsi.lun, pdu);
3675 		iscsi_op_abort_task_set(task, SPDK_SCSI_TASK_FUNC_LUN_RESET);
3676 		return 0;
3677 
3678 	case ISCSI_TASK_FUNC_TARGET_WARM_RESET:
3679 		SPDK_NOTICELOG("TARGET_WARM_RESET (Unsupported)\n");
3680 		task->scsi.response = SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED;
3681 		break;
3682 
3683 	case ISCSI_TASK_FUNC_TARGET_COLD_RESET:
3684 		SPDK_NOTICELOG("TARGET_COLD_RESET (Unsupported)\n");
3685 		task->scsi.response = SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED;
3686 		break;
3687 
3688 	case ISCSI_TASK_FUNC_TASK_REASSIGN:
3689 		SPDK_NOTICELOG("TASK_REASSIGN (Unsupported)\n");
3690 		task->scsi.response = SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED;
3691 		break;
3692 
3693 	default:
3694 		SPDK_ERRLOG("unsupported function %d\n", function);
3695 		task->scsi.response = SPDK_SCSI_TASK_MGMT_RESP_REJECT;
3696 		break;
3697 	}
3698 
3699 	iscsi_task_mgmt_response(conn, task);
3700 	iscsi_task_put(task);
3701 	return 0;
3702 }
3703 
3704 static int
3705 iscsi_pdu_hdr_op_nopout(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
3706 {
3707 	struct iscsi_bhs_nop_out *reqh;
3708 	uint32_t task_tag;
3709 	uint32_t transfer_tag;
3710 	int I_bit;
3711 
3712 	if (conn->sess->session_type == SESSION_TYPE_DISCOVERY) {
3713 		SPDK_ERRLOG("ISCSI_OP_NOPOUT not allowed in discovery session\n");
3714 		return SPDK_ISCSI_CONNECTION_FATAL;
3715 	}
3716 
3717 	reqh = (struct iscsi_bhs_nop_out *)&pdu->bhs;
3718 	I_bit = reqh->immediate;
3719 
3720 	if (pdu->data_segment_len > SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH) {
3721 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
3722 	}
3723 
3724 	task_tag = from_be32(&reqh->itt);
3725 	transfer_tag = from_be32(&reqh->ttt);
3726 
3727 	SPDK_DEBUGLOG(iscsi, "I=%d, ITT=%x, TTT=%x\n",
3728 		      I_bit, task_tag, transfer_tag);
3729 
3730 	SPDK_DEBUGLOG(iscsi, "CmdSN=%u, StatSN=%u, ExpCmdSN=%u, MaxCmdSN=%u\n",
3731 		      pdu->cmd_sn, conn->StatSN, conn->sess->ExpCmdSN,
3732 		      conn->sess->MaxCmdSN);
3733 
3734 	if (transfer_tag != 0xFFFFFFFF && transfer_tag != (uint32_t)conn->id) {
3735 		SPDK_ERRLOG("invalid transfer tag 0x%x\n", transfer_tag);
3736 		/*
3737 		 * Technically we should probably fail the connection here, but for now
3738 		 *  just print the error message and continue.
3739 		 */
3740 	}
3741 
3742 	if (task_tag == 0xffffffffU && I_bit == 0) {
3743 		SPDK_ERRLOG("got NOPOUT ITT=0xffffffff, I=0\n");
3744 		return SPDK_ISCSI_CONNECTION_FATAL;
3745 	}
3746 
3747 	return 0;
3748 }
3749 
3750 static int
3751 iscsi_pdu_payload_op_nopout(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
3752 {
3753 	struct spdk_iscsi_pdu *rsp_pdu;
3754 	struct iscsi_bhs_nop_out *reqh;
3755 	struct iscsi_bhs_nop_in *rsph;
3756 	uint8_t *data;
3757 	uint64_t lun;
3758 	uint32_t task_tag;
3759 	int I_bit;
3760 	int data_len;
3761 
3762 	reqh = (struct iscsi_bhs_nop_out *)&pdu->bhs;
3763 	I_bit = reqh->immediate;
3764 
3765 	data_len = pdu->data_segment_len;
3766 	if (data_len > conn->MaxRecvDataSegmentLength) {
3767 		data_len = conn->MaxRecvDataSegmentLength;
3768 	}
3769 
3770 	lun = from_be64(&reqh->lun);
3771 	task_tag = from_be32(&reqh->itt);
3772 
3773 	/*
3774 	 * We don't actually check to see if this is a response to the NOP-In
3775 	 * that we sent.  Our goal is to just verify that the initiator is
3776 	 * alive and responding to commands, not to verify that it tags
3777 	 * NOP-Outs correctly
3778 	 */
3779 	conn->nop_outstanding = false;
3780 
3781 	if (task_tag == 0xffffffffU) {
3782 		assert(I_bit == 1);
3783 		SPDK_DEBUGLOG(iscsi, "got NOPOUT ITT=0xffffffff\n");
3784 		return 0;
3785 	}
3786 
3787 	data = calloc(1, data_len);
3788 	if (!data) {
3789 		SPDK_ERRLOG("calloc() failed for ping data\n");
3790 		return SPDK_ISCSI_CONNECTION_FATAL;
3791 	}
3792 
3793 	/* response of NOPOUT */
3794 	if (data_len > 0) {
3795 		/* copy ping data */
3796 		memcpy(data, pdu->data, data_len);
3797 	}
3798 
3799 	/* response PDU */
3800 	rsp_pdu = iscsi_get_pdu(conn);
3801 	assert(rsp_pdu != NULL);
3802 
3803 	rsph = (struct iscsi_bhs_nop_in *)&rsp_pdu->bhs;
3804 	rsp_pdu->data = data;
3805 	rsph->opcode = ISCSI_OP_NOPIN;
3806 	rsph->flags |= 0x80; /* bit 0 default to 1 */
3807 	DSET24(rsph->data_segment_len, data_len);
3808 	to_be64(&rsph->lun, lun);
3809 	to_be32(&rsph->itt, task_tag);
3810 	to_be32(&rsph->ttt, 0xffffffffU);
3811 
3812 	to_be32(&rsph->stat_sn, conn->StatSN);
3813 	conn->StatSN++;
3814 
3815 	if (I_bit == 0) {
3816 		conn->sess->MaxCmdSN++;
3817 	}
3818 
3819 	to_be32(&rsph->exp_cmd_sn, conn->sess->ExpCmdSN);
3820 	to_be32(&rsph->max_cmd_sn, conn->sess->MaxCmdSN);
3821 
3822 	iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_pdu_generic_complete, NULL);
3823 	conn->last_nopin = spdk_get_ticks();
3824 
3825 	return 0;
3826 }
3827 
3828 /* This function returns the spdk_scsi_task by searching the snack list via
3829  * task transfertag and the pdu's opcode
3830  */
3831 static struct spdk_iscsi_task *
3832 get_scsi_task_from_ttt(struct spdk_iscsi_conn *conn, uint32_t transfer_tag)
3833 {
3834 	struct spdk_iscsi_pdu *pdu;
3835 	struct iscsi_bhs_data_in *datain_bhs;
3836 
3837 	TAILQ_FOREACH(pdu, &conn->snack_pdu_list, tailq) {
3838 		if (pdu->bhs.opcode == ISCSI_OP_SCSI_DATAIN) {
3839 			datain_bhs = (struct iscsi_bhs_data_in *)&pdu->bhs;
3840 			if (from_be32(&datain_bhs->ttt) == transfer_tag) {
3841 				return pdu->task;
3842 			}
3843 		}
3844 	}
3845 
3846 	return NULL;
3847 }
3848 
3849 /* This function returns the spdk_scsi_task by searching the snack list via
3850  * initiator task tag and the pdu's opcode
3851  */
3852 static struct spdk_iscsi_task *
3853 get_scsi_task_from_itt(struct spdk_iscsi_conn *conn,
3854 		       uint32_t task_tag, enum iscsi_op opcode)
3855 {
3856 	struct spdk_iscsi_pdu *pdu;
3857 
3858 	TAILQ_FOREACH(pdu, &conn->snack_pdu_list, tailq) {
3859 		if (pdu->bhs.opcode == opcode &&
3860 		    pdu->task != NULL &&
3861 		    pdu->task->tag == task_tag) {
3862 			return pdu->task;
3863 		}
3864 	}
3865 
3866 	return NULL;
3867 }
3868 
3869 /* This function is used to handle the r2t snack */
3870 static int
3871 iscsi_handle_r2t_snack(struct spdk_iscsi_conn *conn,
3872 		       struct spdk_iscsi_task *task,
3873 		       struct spdk_iscsi_pdu *pdu, uint32_t beg_run,
3874 		       uint32_t run_length, int32_t task_tag)
3875 {
3876 	int32_t last_r2tsn;
3877 	int i;
3878 
3879 	if (beg_run < task->acked_r2tsn) {
3880 		SPDK_ERRLOG("ITT: 0x%08x, R2T SNACK requests retransmission of"
3881 			    "R2TSN: from 0x%08x to 0x%08x. But it has already"
3882 			    "ack to R2TSN:0x%08x, protocol error.\n",
3883 			    task_tag, beg_run, (beg_run + run_length),
3884 			    (task->acked_r2tsn - 1));
3885 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
3886 	}
3887 
3888 	if (run_length) {
3889 		if ((beg_run + run_length) > task->R2TSN) {
3890 			SPDK_ERRLOG("ITT: 0x%08x, received R2T SNACK with"
3891 				    "BegRun: 0x%08x, RunLength: 0x%08x, exceeds"
3892 				    "current R2TSN: 0x%08x, protocol error.\n",
3893 				    task_tag, beg_run, run_length,
3894 				    task->R2TSN);
3895 
3896 			return iscsi_reject(conn, pdu, ISCSI_REASON_INVALID_PDU_FIELD);
3897 		}
3898 		last_r2tsn = (beg_run + run_length);
3899 	} else {
3900 		last_r2tsn = task->R2TSN;
3901 	}
3902 
3903 	for (i = beg_run; i < last_r2tsn; i++) {
3904 		if (iscsi_send_r2t_recovery(conn, task, i, false) < 0) {
3905 			SPDK_ERRLOG("The r2t_sn=%d of r2t_task=%p is not sent\n", i, task);
3906 		}
3907 	}
3908 	return 0;
3909 }
3910 
3911 /* This function is used to recover the data in packet */
3912 static int
3913 iscsi_handle_recovery_datain(struct spdk_iscsi_conn *conn,
3914 			     struct spdk_iscsi_task *task,
3915 			     struct spdk_iscsi_pdu *pdu, uint32_t beg_run,
3916 			     uint32_t run_length, uint32_t task_tag)
3917 {
3918 	struct spdk_iscsi_pdu *old_pdu, *pdu_temp;
3919 	uint32_t i;
3920 	struct iscsi_bhs_data_in *datain_header;
3921 	uint32_t last_statsn;
3922 
3923 	task = iscsi_task_get_primary(task);
3924 
3925 	SPDK_DEBUGLOG(iscsi, "iscsi_handle_recovery_datain\n");
3926 
3927 	if (beg_run < task->acked_data_sn) {
3928 		SPDK_ERRLOG("ITT: 0x%08x, DATA IN SNACK requests retransmission of"
3929 			    "DATASN: from 0x%08x to 0x%08x but already acked to "
3930 			    "DATASN: 0x%08x protocol error\n",
3931 			    task_tag, beg_run,
3932 			    (beg_run + run_length), (task->acked_data_sn - 1));
3933 
3934 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
3935 	}
3936 
3937 	if (run_length == 0) {
3938 		/* as the DataSN begins at 0 */
3939 		run_length = task->datain_datasn + 1;
3940 	}
3941 
3942 	if ((beg_run + run_length - 1) > task->datain_datasn) {
3943 		SPDK_ERRLOG("Initiator requests BegRun: 0x%08x, RunLength:"
3944 			    "0x%08x greater than maximum DataSN: 0x%08x.\n",
3945 			    beg_run, run_length, task->datain_datasn);
3946 
3947 		return -1;
3948 	} else {
3949 		last_statsn = beg_run + run_length - 1;
3950 	}
3951 
3952 	for (i = beg_run; i <= last_statsn; i++) {
3953 		TAILQ_FOREACH_SAFE(old_pdu, &conn->snack_pdu_list, tailq, pdu_temp) {
3954 			if (old_pdu->bhs.opcode == ISCSI_OP_SCSI_DATAIN) {
3955 				datain_header = (struct iscsi_bhs_data_in *)&old_pdu->bhs;
3956 				if (from_be32(&datain_header->itt) == task_tag &&
3957 				    from_be32(&datain_header->data_sn) == i) {
3958 					TAILQ_REMOVE(&conn->snack_pdu_list, old_pdu, tailq);
3959 					iscsi_conn_write_pdu(conn, old_pdu, old_pdu->cb_fn, old_pdu->cb_arg);
3960 					break;
3961 				}
3962 			}
3963 		}
3964 	}
3965 	return 0;
3966 }
3967 
3968 /* This function is used to handle the status snack */
3969 static int
3970 iscsi_handle_status_snack(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
3971 {
3972 	uint32_t beg_run;
3973 	uint32_t run_length;
3974 	struct iscsi_bhs_snack_req *reqh;
3975 	uint32_t i;
3976 	uint32_t last_statsn;
3977 	bool found_pdu;
3978 	struct spdk_iscsi_pdu *old_pdu;
3979 
3980 	reqh = (struct iscsi_bhs_snack_req *)&pdu->bhs;
3981 	beg_run = from_be32(&reqh->beg_run);
3982 	run_length = from_be32(&reqh->run_len);
3983 
3984 	SPDK_DEBUGLOG(iscsi, "beg_run=%d, run_length=%d, conn->StatSN="
3985 		      "%d, conn->exp_statsn=%d\n", beg_run, run_length,
3986 		      conn->StatSN, conn->exp_statsn);
3987 
3988 	if (!beg_run) {
3989 		beg_run = conn->exp_statsn;
3990 	} else if (beg_run < conn->exp_statsn) {
3991 		SPDK_ERRLOG("Got Status SNACK Begrun: 0x%08x, RunLength: 0x%08x "
3992 			    "but already got ExpStatSN: 0x%08x on CID:%hu.\n",
3993 			    beg_run, run_length, conn->StatSN, conn->cid);
3994 
3995 		return iscsi_reject(conn, pdu, ISCSI_REASON_INVALID_PDU_FIELD);
3996 	}
3997 
3998 	last_statsn = (!run_length) ? conn->StatSN : (beg_run + run_length);
3999 
4000 	for (i = beg_run; i < last_statsn; i++) {
4001 		found_pdu = false;
4002 		TAILQ_FOREACH(old_pdu, &conn->snack_pdu_list, tailq) {
4003 			if (from_be32(&old_pdu->bhs.stat_sn) == i) {
4004 				found_pdu = true;
4005 				break;
4006 			}
4007 		}
4008 
4009 		if (!found_pdu) {
4010 			SPDK_ERRLOG("Unable to find StatSN: 0x%08x. For a Status"
4011 				    "SNACK, assuming this is a proactive SNACK "
4012 				    "for an untransmitted StatSN, ignoring.\n",
4013 				    beg_run);
4014 		} else {
4015 			TAILQ_REMOVE(&conn->snack_pdu_list, old_pdu, tailq);
4016 			iscsi_conn_write_pdu(conn, old_pdu, old_pdu->cb_fn, old_pdu->cb_arg);
4017 		}
4018 	}
4019 
4020 	return 0;
4021 }
4022 
4023 /* This function is used to handle the data ack snack */
4024 static int
4025 iscsi_handle_data_ack(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
4026 {
4027 	uint32_t transfer_tag;
4028 	uint32_t beg_run;
4029 	uint32_t run_length;
4030 	struct spdk_iscsi_pdu *old_pdu;
4031 	uint32_t old_datasn;
4032 	struct iscsi_bhs_snack_req *reqh;
4033 	struct spdk_iscsi_task *task;
4034 	struct iscsi_bhs_data_in *datain_header;
4035 	struct spdk_iscsi_task *primary;
4036 
4037 	reqh = (struct iscsi_bhs_snack_req *)&pdu->bhs;
4038 	transfer_tag = from_be32(&reqh->ttt);
4039 	beg_run = from_be32(&reqh->beg_run);
4040 	run_length = from_be32(&reqh->run_len);
4041 	task = NULL;
4042 	datain_header = NULL;
4043 
4044 	SPDK_DEBUGLOG(iscsi, "beg_run=%d,transfer_tag=%d,run_len=%d\n",
4045 		      beg_run, transfer_tag, run_length);
4046 
4047 	task = get_scsi_task_from_ttt(conn, transfer_tag);
4048 	if (!task) {
4049 		SPDK_ERRLOG("Data ACK SNACK for TTT: 0x%08x is invalid.\n",
4050 			    transfer_tag);
4051 		goto reject_return;
4052 	}
4053 
4054 	primary = iscsi_task_get_primary(task);
4055 	if ((run_length != 0) || (beg_run < primary->acked_data_sn)) {
4056 		SPDK_ERRLOG("TTT: 0x%08x Data ACK SNACK BegRUN: %d is less than "
4057 			    "the next expected acked DataSN: %d\n",
4058 			    transfer_tag, beg_run, primary->acked_data_sn);
4059 		goto reject_return;
4060 	}
4061 
4062 	primary->acked_data_sn = beg_run;
4063 
4064 	/* To free the pdu */
4065 	TAILQ_FOREACH(old_pdu, &conn->snack_pdu_list, tailq) {
4066 		if (old_pdu->bhs.opcode == ISCSI_OP_SCSI_DATAIN) {
4067 			datain_header = (struct iscsi_bhs_data_in *) &old_pdu->bhs;
4068 			old_datasn = from_be32(&datain_header->data_sn);
4069 			if ((from_be32(&datain_header->ttt) == transfer_tag) &&
4070 			    (old_datasn == beg_run - 1)) {
4071 				TAILQ_REMOVE(&conn->snack_pdu_list, old_pdu, tailq);
4072 				iscsi_conn_free_pdu(conn, old_pdu);
4073 				break;
4074 			}
4075 		}
4076 	}
4077 
4078 	SPDK_DEBUGLOG(iscsi, "Received Data ACK SNACK for TTT: 0x%08x,"
4079 		      " updated acked DataSN to 0x%08x.\n", transfer_tag,
4080 		      (task->acked_data_sn - 1));
4081 
4082 	return 0;
4083 
4084 reject_return:
4085 	return iscsi_reject(conn, pdu, ISCSI_REASON_INVALID_SNACK);
4086 }
4087 
4088 /* This function is used to handle the snack request from the initiator */
4089 static int
4090 iscsi_pdu_hdr_op_snack(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
4091 {
4092 	struct iscsi_bhs_snack_req *reqh;
4093 	struct spdk_iscsi_task *task;
4094 	int type;
4095 	uint32_t task_tag;
4096 	uint32_t beg_run;
4097 	uint32_t run_length;
4098 	int rc;
4099 
4100 	if (conn->sess->session_type == SESSION_TYPE_DISCOVERY) {
4101 		SPDK_ERRLOG("ISCSI_OP_SNACK not allowed in  discovery session\n");
4102 		return SPDK_ISCSI_CONNECTION_FATAL;
4103 	}
4104 
4105 	reqh = (struct iscsi_bhs_snack_req *)&pdu->bhs;
4106 	if (!conn->sess->ErrorRecoveryLevel) {
4107 		SPDK_ERRLOG("Got a SNACK request in ErrorRecoveryLevel=0\n");
4108 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
4109 	}
4110 
4111 	type = reqh->flags & ISCSI_FLAG_SNACK_TYPE_MASK;
4112 	SPDK_DEBUGLOG(iscsi, "The value of type is %d\n", type);
4113 
4114 	switch (type) {
4115 	case 0:
4116 		reqh = (struct iscsi_bhs_snack_req *)&pdu->bhs;
4117 		task_tag = from_be32(&reqh->itt);
4118 		beg_run = from_be32(&reqh->beg_run);
4119 		run_length = from_be32(&reqh->run_len);
4120 
4121 		SPDK_DEBUGLOG(iscsi, "beg_run=%d, run_length=%d, "
4122 			      "task_tag=%x, transfer_tag=%u\n", beg_run,
4123 			      run_length, task_tag, from_be32(&reqh->ttt));
4124 
4125 		task = get_scsi_task_from_itt(conn, task_tag,
4126 					      ISCSI_OP_SCSI_DATAIN);
4127 		if (task) {
4128 			return iscsi_handle_recovery_datain(conn, task, pdu,
4129 							    beg_run, run_length, task_tag);
4130 		}
4131 		task = get_scsi_task_from_itt(conn, task_tag, ISCSI_OP_R2T);
4132 		if (task) {
4133 			return iscsi_handle_r2t_snack(conn, task, pdu, beg_run,
4134 						      run_length, task_tag);
4135 		}
4136 		SPDK_ERRLOG("It is Neither datain nor r2t recovery request\n");
4137 		rc = -1;
4138 		break;
4139 	case ISCSI_FLAG_SNACK_TYPE_STATUS:
4140 		rc = iscsi_handle_status_snack(conn, pdu);
4141 		break;
4142 	case ISCSI_FLAG_SNACK_TYPE_DATA_ACK:
4143 		rc = iscsi_handle_data_ack(conn, pdu);
4144 		break;
4145 	case ISCSI_FLAG_SNACK_TYPE_RDATA:
4146 		SPDK_ERRLOG("R-Data SNACK is Not Supported int spdk\n");
4147 		rc = iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
4148 		break;
4149 	default:
4150 		SPDK_ERRLOG("Unknown SNACK type %d, protocol error\n", type);
4151 		rc = iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
4152 		break;
4153 	}
4154 
4155 	return rc;
4156 }
4157 
4158 static inline uint32_t
4159 iscsi_get_mobj_max_data_len(struct spdk_mobj *mobj)
4160 {
4161 	if (mobj->mp == g_iscsi.pdu_immediate_data_pool) {
4162 		return iscsi_get_max_immediate_data_size();
4163 	} else {
4164 		return SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH;
4165 	}
4166 }
4167 
4168 static int
4169 iscsi_pdu_hdr_op_data(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
4170 {
4171 	struct spdk_iscsi_task	*task;
4172 	struct iscsi_bhs_data_out *reqh;
4173 	struct spdk_scsi_lun	*lun_dev;
4174 	struct spdk_mobj	*mobj;
4175 	uint32_t transfer_tag;
4176 	uint32_t task_tag;
4177 	uint32_t transfer_len;
4178 	uint32_t DataSN;
4179 	uint32_t buffer_offset;
4180 	uint32_t len;
4181 	uint32_t current_desired_data_transfer_length;
4182 	int F_bit;
4183 	int rc;
4184 
4185 	if (conn->sess->session_type == SESSION_TYPE_DISCOVERY) {
4186 		SPDK_ERRLOG("ISCSI_OP_SCSI_DATAOUT not allowed in discovery session\n");
4187 		return SPDK_ISCSI_CONNECTION_FATAL;
4188 	}
4189 
4190 	reqh = (struct iscsi_bhs_data_out *)&pdu->bhs;
4191 	F_bit = !!(reqh->flags & ISCSI_FLAG_FINAL);
4192 	transfer_tag = from_be32(&reqh->ttt);
4193 	task_tag = from_be32(&reqh->itt);
4194 	DataSN = from_be32(&reqh->data_sn);
4195 	buffer_offset = from_be32(&reqh->buffer_offset);
4196 
4197 	if (pdu->data_segment_len > SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH) {
4198 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
4199 	}
4200 
4201 	task = get_transfer_task(conn, transfer_tag);
4202 	if (task == NULL) {
4203 		SPDK_ERRLOG("Not found task for transfer_tag=%x\n", transfer_tag);
4204 		return iscsi_reject(conn, pdu, ISCSI_REASON_INVALID_PDU_FIELD);
4205 	}
4206 
4207 	lun_dev = spdk_scsi_dev_get_lun(conn->dev, task->lun_id);
4208 	current_desired_data_transfer_length = task->desired_data_transfer_length;
4209 
4210 	if (pdu->data_segment_len > task->desired_data_transfer_length) {
4211 		SPDK_ERRLOG("the dataout pdu data length is larger than the value sent by R2T PDU\n");
4212 		return SPDK_ISCSI_CONNECTION_FATAL;
4213 	}
4214 
4215 	if (task->tag != task_tag) {
4216 		SPDK_ERRLOG("The r2t task tag is %u, and the dataout task tag is %u\n",
4217 			    task->tag, task_tag);
4218 		return iscsi_reject(conn, pdu, ISCSI_REASON_INVALID_PDU_FIELD);
4219 	}
4220 
4221 	if (DataSN != task->r2t_datasn) {
4222 		SPDK_ERRLOG("DataSN(%u) exp=%d error\n", DataSN, task->r2t_datasn);
4223 		if (conn->sess->ErrorRecoveryLevel >= 1) {
4224 			rc = iscsi_send_r2t_recovery(conn, task, task->acked_r2tsn, true);
4225 			if (rc == 0) {
4226 				return 0;
4227 			}
4228 		}
4229 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
4230 	}
4231 
4232 	if (buffer_offset != task->next_expected_r2t_offset) {
4233 		SPDK_ERRLOG("offset(%u) error\n", buffer_offset);
4234 		return SPDK_ISCSI_CONNECTION_FATAL;
4235 	}
4236 
4237 	transfer_len = task->scsi.transfer_len;
4238 	task->current_r2t_length += pdu->data_segment_len;
4239 	task->next_expected_r2t_offset += pdu->data_segment_len;
4240 	task->r2t_datasn++;
4241 
4242 	if (task->current_r2t_length > conn->sess->MaxBurstLength) {
4243 		SPDK_ERRLOG("R2T burst(%u) > MaxBurstLength(%u)\n",
4244 			    task->current_r2t_length,
4245 			    conn->sess->MaxBurstLength);
4246 		return SPDK_ISCSI_CONNECTION_FATAL;
4247 	}
4248 
4249 	if (F_bit) {
4250 		/*
4251 		 * This R2T burst is done. Clear the length before we
4252 		 *  receive a PDU for the next R2t burst.
4253 		 */
4254 		task->current_r2t_length = 0;
4255 	}
4256 
4257 	if (task->next_expected_r2t_offset == transfer_len) {
4258 		task->acked_r2tsn++;
4259 	} else if (F_bit && (task->next_r2t_offset < transfer_len)) {
4260 		task->acked_r2tsn++;
4261 		len = spdk_min(conn->sess->MaxBurstLength,
4262 			       (transfer_len - task->next_r2t_offset));
4263 		rc = iscsi_send_r2t(conn, task, task->next_r2t_offset, len,
4264 				    task->ttt, &task->R2TSN);
4265 		if (rc < 0) {
4266 			SPDK_ERRLOG("iscsi_send_r2t() failed\n");
4267 		}
4268 		task->next_r2t_offset += len;
4269 	}
4270 
4271 	if (lun_dev == NULL) {
4272 		SPDK_DEBUGLOG(iscsi, "LUN %d is removed, reject this PDU.\n",
4273 			      task->lun_id);
4274 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
4275 	} else if (spdk_unlikely(spdk_scsi_lun_get_dif_ctx(lun_dev, &task->scsi, &pdu->dif_ctx))) {
4276 		pdu->dif_insert_or_strip = true;
4277 	}
4278 
4279 	mobj = iscsi_task_get_mobj(task);
4280 	if (mobj == NULL) {
4281 		if (!pdu->dif_insert_or_strip) {
4282 			/* More Data-OUT PDUs may follow. Increase the buffer size up to
4283 			 * SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH to merge them into a
4284 			 * single subtask.
4285 			 */
4286 			pdu->data_buf_len = spdk_min(current_desired_data_transfer_length,
4287 						     SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH);
4288 		}
4289 	} else {
4290 		/* Set up the data buffer from the one saved by the primary task. */
4291 		pdu->mobj[0] = mobj;
4292 		pdu->data = (void *)((uint64_t)mobj->buf + mobj->data_len);
4293 		pdu->data_from_mempool = true;
4294 		pdu->data_buf_len = SPDK_BDEV_BUF_SIZE_WITH_MD(iscsi_get_mobj_max_data_len(mobj));
4295 
4296 		iscsi_task_set_mobj(task, NULL);
4297 	}
4298 
4299 	return 0;
4300 }
4301 
4302 static int
4303 iscsi_pdu_payload_op_data(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
4304 {
4305 	struct spdk_iscsi_task *task;
4306 	struct iscsi_bhs_data_out *reqh;
4307 	struct spdk_mobj *mobj;
4308 	uint32_t transfer_tag;
4309 	int F_bit;
4310 	int rc;
4311 
4312 	reqh = (struct iscsi_bhs_data_out *)&pdu->bhs;
4313 	F_bit = !!(reqh->flags & ISCSI_FLAG_FINAL);
4314 	transfer_tag = from_be32(&reqh->ttt);
4315 
4316 	task = get_transfer_task(conn, transfer_tag);
4317 	if (spdk_unlikely(task == NULL)) {
4318 		SPDK_ERRLOG("Not found for transfer_tag=%x\n", transfer_tag);
4319 		return iscsi_reject(conn, pdu, ISCSI_REASON_INVALID_PDU_FIELD);
4320 	}
4321 
4322 	if (spdk_scsi_dev_get_lun(conn->dev, task->lun_id) == NULL) {
4323 		SPDK_DEBUGLOG(iscsi, "LUN %d is removed, reject this PDU.\n",
4324 			      task->lun_id);
4325 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
4326 	}
4327 
4328 	/* If current PDU is final in a sequence, submit all received data,
4329 	 * otherwise, continue aggregation until the first data buffer is full.
4330 	 * We do not use SGL and instead create a subtask per data buffer. Hence further
4331 	 * aggregation does not improve any performance.
4332 	 */
4333 	mobj = pdu->mobj[0];
4334 	assert(mobj != NULL);
4335 
4336 	if (F_bit || mobj->data_len >= SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH ||
4337 	    pdu->dif_insert_or_strip) {
4338 		rc = iscsi_submit_write_subtask(conn, task, pdu, mobj);
4339 		if (rc != 0) {
4340 			return rc;
4341 		}
4342 	} else {
4343 		assert(pdu->mobj[1] == NULL);
4344 		iscsi_task_set_mobj(task, mobj);
4345 		pdu->mobj[0] = NULL;
4346 		return 0;
4347 	}
4348 
4349 	mobj = pdu->mobj[1];
4350 	if (mobj == NULL) {
4351 		return 0;
4352 	}
4353 
4354 	assert(pdu->dif_insert_or_strip == false);
4355 	assert(mobj->data_len < SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH);
4356 
4357 	if (F_bit) {
4358 		return iscsi_submit_write_subtask(conn, task, pdu, mobj);
4359 	} else {
4360 		iscsi_task_set_mobj(task, mobj);
4361 		pdu->mobj[1] = NULL;
4362 		return 0;
4363 	}
4364 }
4365 
4366 static void
4367 init_login_reject_response(struct spdk_iscsi_pdu *pdu, struct spdk_iscsi_pdu *rsp_pdu)
4368 {
4369 	struct iscsi_bhs_login_rsp *rsph;
4370 
4371 	memset(rsp_pdu, 0, sizeof(struct spdk_iscsi_pdu));
4372 	rsph = (struct iscsi_bhs_login_rsp *)&rsp_pdu->bhs;
4373 	rsph->version_max = ISCSI_VERSION;
4374 	rsph->version_act = ISCSI_VERSION;
4375 	rsph->opcode = ISCSI_OP_LOGIN_RSP;
4376 	rsph->status_class = ISCSI_CLASS_INITIATOR_ERROR;
4377 	rsph->status_detail = ISCSI_LOGIN_INVALID_LOGIN_REQUEST;
4378 	rsph->itt = pdu->bhs.itt;
4379 }
4380 
4381 static void
4382 iscsi_pdu_dump(struct spdk_iscsi_pdu *pdu)
4383 {
4384 	spdk_log_dump(stderr, "PDU", (uint8_t *)&pdu->bhs, ISCSI_BHS_LEN);
4385 }
4386 
4387 /* This function is used to refree the pdu when it is acknowledged */
4388 static void
4389 remove_acked_pdu(struct spdk_iscsi_conn *conn, uint32_t ExpStatSN)
4390 {
4391 	struct spdk_iscsi_pdu *pdu, *pdu_temp;
4392 	uint32_t stat_sn;
4393 
4394 	conn->exp_statsn = spdk_min(ExpStatSN, conn->StatSN);
4395 	TAILQ_FOREACH_SAFE(pdu, &conn->snack_pdu_list, tailq, pdu_temp) {
4396 		stat_sn = from_be32(&pdu->bhs.stat_sn);
4397 		if (spdk_sn32_lt(stat_sn, conn->exp_statsn)) {
4398 			TAILQ_REMOVE(&conn->snack_pdu_list, pdu, tailq);
4399 			iscsi_conn_free_pdu(conn, pdu);
4400 		}
4401 	}
4402 }
4403 
4404 static int
4405 iscsi_update_cmdsn(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
4406 {
4407 	int opcode;
4408 	uint32_t ExpStatSN;
4409 	int I_bit;
4410 	struct spdk_iscsi_sess *sess;
4411 	struct iscsi_bhs_scsi_req *reqh;
4412 
4413 	sess = conn->sess;
4414 	if (!sess) {
4415 		SPDK_ERRLOG("Connection has no associated session!\n");
4416 		return SPDK_ISCSI_CONNECTION_FATAL;
4417 	}
4418 
4419 	opcode = pdu->bhs.opcode;
4420 	reqh = (struct iscsi_bhs_scsi_req *)&pdu->bhs;
4421 
4422 	pdu->cmd_sn = from_be32(&reqh->cmd_sn);
4423 
4424 	I_bit = reqh->immediate;
4425 	if (I_bit == 0) {
4426 		if (spdk_sn32_lt(pdu->cmd_sn, sess->ExpCmdSN) ||
4427 		    spdk_sn32_gt(pdu->cmd_sn, sess->MaxCmdSN)) {
4428 			if (sess->session_type == SESSION_TYPE_NORMAL &&
4429 			    opcode != ISCSI_OP_SCSI_DATAOUT) {
4430 				SPDK_ERRLOG("CmdSN(%u) ignore (ExpCmdSN=%u, MaxCmdSN=%u)\n",
4431 					    pdu->cmd_sn, sess->ExpCmdSN, sess->MaxCmdSN);
4432 
4433 				if (sess->ErrorRecoveryLevel >= 1) {
4434 					SPDK_DEBUGLOG(iscsi, "Skip the error in ERL 1 and 2\n");
4435 				} else {
4436 					return SPDK_PDU_FATAL;
4437 				}
4438 			}
4439 		}
4440 	} else if (pdu->cmd_sn != sess->ExpCmdSN) {
4441 		SPDK_ERRLOG("CmdSN(%u) error ExpCmdSN=%u\n", pdu->cmd_sn, sess->ExpCmdSN);
4442 
4443 		if (sess->ErrorRecoveryLevel >= 1) {
4444 			SPDK_DEBUGLOG(iscsi, "Skip the error in ERL 1 and 2\n");
4445 		} else if (opcode != ISCSI_OP_NOPOUT) {
4446 			/*
4447 			 * The Linux initiator does not send valid CmdSNs for
4448 			 *  nopout under heavy load, so do not close the
4449 			 *  connection in that case.
4450 			 */
4451 			return SPDK_ISCSI_CONNECTION_FATAL;
4452 		}
4453 	}
4454 
4455 	ExpStatSN = from_be32(&reqh->exp_stat_sn);
4456 	if (spdk_sn32_gt(ExpStatSN, conn->StatSN)) {
4457 		SPDK_DEBUGLOG(iscsi, "StatSN(%u) advanced\n", ExpStatSN);
4458 		ExpStatSN = conn->StatSN;
4459 	}
4460 
4461 	if (sess->ErrorRecoveryLevel >= 1) {
4462 		remove_acked_pdu(conn, ExpStatSN);
4463 	}
4464 
4465 	if (!I_bit && opcode != ISCSI_OP_SCSI_DATAOUT) {
4466 		sess->ExpCmdSN++;
4467 	}
4468 
4469 	return 0;
4470 }
4471 
4472 static int
4473 iscsi_pdu_hdr_handle(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
4474 {
4475 	int opcode;
4476 	int rc;
4477 	struct spdk_iscsi_pdu *rsp_pdu = NULL;
4478 
4479 	if (pdu == NULL) {
4480 		return -1;
4481 	}
4482 
4483 	opcode = pdu->bhs.opcode;
4484 
4485 	SPDK_DEBUGLOG(iscsi, "opcode %x\n", opcode);
4486 
4487 	if (opcode == ISCSI_OP_LOGIN) {
4488 		return iscsi_pdu_hdr_op_login(conn, pdu);
4489 	}
4490 
4491 	/* connection in login phase but receive non-login opcode
4492 	 * return response code 0x020b to initiator.
4493 	 * */
4494 	if (!conn->full_feature && conn->state == ISCSI_CONN_STATE_RUNNING) {
4495 		rsp_pdu = iscsi_get_pdu(conn);
4496 		if (rsp_pdu == NULL) {
4497 			return SPDK_ISCSI_CONNECTION_FATAL;
4498 		}
4499 		init_login_reject_response(pdu, rsp_pdu);
4500 		iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_pdu_generic_complete, NULL);
4501 		SPDK_ERRLOG("Received opcode %d in login phase\n", opcode);
4502 		return SPDK_ISCSI_LOGIN_ERROR_RESPONSE;
4503 	} else if (conn->state == ISCSI_CONN_STATE_INVALID) {
4504 		SPDK_ERRLOG("before Full Feature\n");
4505 		iscsi_pdu_dump(pdu);
4506 		return SPDK_ISCSI_CONNECTION_FATAL;
4507 	}
4508 
4509 	rc = iscsi_update_cmdsn(conn, pdu);
4510 	if (rc != 0) {
4511 		return rc;
4512 	}
4513 
4514 	switch (opcode) {
4515 	case ISCSI_OP_NOPOUT:
4516 		rc = iscsi_pdu_hdr_op_nopout(conn, pdu);
4517 		break;
4518 
4519 	case ISCSI_OP_SCSI:
4520 		rc = iscsi_pdu_hdr_op_scsi(conn, pdu);
4521 		break;
4522 	case ISCSI_OP_TASK:
4523 		rc = iscsi_pdu_hdr_op_task(conn, pdu);
4524 		break;
4525 
4526 	case ISCSI_OP_TEXT:
4527 		rc = iscsi_pdu_hdr_op_text(conn, pdu);
4528 		break;
4529 
4530 	case ISCSI_OP_LOGOUT:
4531 		rc = iscsi_pdu_hdr_op_logout(conn, pdu);
4532 		break;
4533 
4534 	case ISCSI_OP_SCSI_DATAOUT:
4535 		rc = iscsi_pdu_hdr_op_data(conn, pdu);
4536 		break;
4537 
4538 	case ISCSI_OP_SNACK:
4539 		rc = iscsi_pdu_hdr_op_snack(conn, pdu);
4540 		break;
4541 
4542 	default:
4543 		SPDK_ERRLOG("unsupported opcode %x\n", opcode);
4544 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
4545 	}
4546 
4547 	if (rc < 0) {
4548 		SPDK_ERRLOG("processing PDU header (opcode=%x) failed on %s(%s)\n",
4549 			    opcode,
4550 			    conn->target_port != NULL ? spdk_scsi_port_get_name(conn->target_port) : "NULL",
4551 			    conn->initiator_port != NULL ? spdk_scsi_port_get_name(conn->initiator_port) : "NULL");
4552 	}
4553 
4554 	return rc;
4555 }
4556 
4557 static int
4558 iscsi_pdu_payload_handle(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
4559 {
4560 	int opcode;
4561 	int rc = 0;
4562 
4563 	opcode = pdu->bhs.opcode;
4564 
4565 	SPDK_DEBUGLOG(iscsi, "opcode %x\n", opcode);
4566 
4567 	switch (opcode) {
4568 	case ISCSI_OP_LOGIN:
4569 		rc = iscsi_pdu_payload_op_login(conn, pdu);
4570 		break;
4571 	case ISCSI_OP_NOPOUT:
4572 		rc = iscsi_pdu_payload_op_nopout(conn, pdu);
4573 		break;
4574 	case ISCSI_OP_SCSI:
4575 		rc = iscsi_pdu_payload_op_scsi(conn, pdu);
4576 		break;
4577 	case ISCSI_OP_TASK:
4578 		break;
4579 	case ISCSI_OP_TEXT:
4580 		rc = iscsi_pdu_payload_op_text(conn, pdu);
4581 		break;
4582 	case ISCSI_OP_LOGOUT:
4583 		break;
4584 	case ISCSI_OP_SCSI_DATAOUT:
4585 		rc = iscsi_pdu_payload_op_data(conn, pdu);
4586 		break;
4587 	case ISCSI_OP_SNACK:
4588 		break;
4589 	default:
4590 		SPDK_ERRLOG("unsupported opcode %x\n", opcode);
4591 		return iscsi_reject(conn, pdu, ISCSI_REASON_PROTOCOL_ERROR);
4592 	}
4593 
4594 	if (rc < 0) {
4595 		SPDK_ERRLOG("processing PDU payload (opcode=%x) failed on %s(%s)\n",
4596 			    opcode,
4597 			    conn->target_port != NULL ? spdk_scsi_port_get_name(conn->target_port) : "NULL",
4598 			    conn->initiator_port != NULL ? spdk_scsi_port_get_name(conn->initiator_port) : "NULL");
4599 	}
4600 
4601 	return rc;
4602 }
4603 
4604 /* Return zero if completed to read payload, positive number if still in progress,
4605  * or negative number if any error.
4606  */
4607 static int
4608 iscsi_pdu_payload_read(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
4609 {
4610 	struct spdk_mempool *pool;
4611 	struct spdk_mobj *mobj;
4612 	uint32_t data_len;
4613 	uint32_t read_len;
4614 	uint32_t crc32c;
4615 	int rc;
4616 	uint32_t data_buf_len;
4617 
4618 	data_len = pdu->data_segment_len;
4619 	read_len = data_len - pdu->data_valid_bytes;
4620 	data_buf_len = pdu->data_buf_len;
4621 
4622 	mobj = pdu->mobj[0];
4623 	if (mobj == NULL) {
4624 		if (data_buf_len <= iscsi_get_max_immediate_data_size()) {
4625 			pool = g_iscsi.pdu_immediate_data_pool;
4626 			data_buf_len = SPDK_BDEV_BUF_SIZE_WITH_MD(iscsi_get_max_immediate_data_size());
4627 		} else if (data_buf_len <= SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH) {
4628 			pool = g_iscsi.pdu_data_out_pool;
4629 			data_buf_len = SPDK_BDEV_BUF_SIZE_WITH_MD(SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH);
4630 		} else {
4631 			SPDK_ERRLOG("Data(%d) > MaxSegment(%d)\n",
4632 				    data_len, SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH);
4633 			return -1;
4634 		}
4635 		mobj = iscsi_datapool_get(pool);
4636 		if (mobj == NULL) {
4637 			return 1;
4638 		}
4639 
4640 		pdu->data_buf_len = data_buf_len;
4641 
4642 		pdu->mobj[0] = mobj;
4643 		pdu->data = mobj->buf;
4644 		pdu->data_from_mempool = true;
4645 	} else if (mobj->data_len == iscsi_get_mobj_max_data_len(mobj) && read_len > 0) {
4646 		mobj = pdu->mobj[1];
4647 		if (mobj == NULL) {
4648 			/* The first data buffer just ran out. Allocate the second data buffer and
4649 			 * continue reading the data segment.
4650 			 */
4651 			assert(pdu->data_from_mempool == true);
4652 			assert(!pdu->dif_insert_or_strip);
4653 
4654 			if (conn->data_digest) {
4655 				iscsi_pdu_calc_partial_data_digest(pdu);
4656 			}
4657 			mobj = iscsi_datapool_get(g_iscsi.pdu_data_out_pool);
4658 			if (mobj == NULL) {
4659 				return 1;
4660 			}
4661 			pdu->mobj[1] = mobj;
4662 			pdu->data = mobj->buf;
4663 			pdu->data_offset = pdu->data_valid_bytes;
4664 			pdu->data_buf_len = SPDK_BDEV_BUF_SIZE_WITH_MD(SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH);
4665 		}
4666 	}
4667 
4668 	/* copy the actual data into local buffer */
4669 	read_len = spdk_min(read_len, iscsi_get_mobj_max_data_len(mobj) - mobj->data_len);
4670 
4671 	if (read_len > 0) {
4672 		rc = iscsi_conn_read_data_segment(conn,
4673 						  pdu,
4674 						  pdu->data_valid_bytes - pdu->data_offset,
4675 						  read_len);
4676 		if (rc < 0) {
4677 			return rc;
4678 		}
4679 
4680 		mobj->data_len += rc;
4681 		pdu->data_valid_bytes += rc;
4682 		if (pdu->data_valid_bytes < data_len) {
4683 			return 1;
4684 		}
4685 	}
4686 
4687 	/* copy out the data digest */
4688 	if (conn->data_digest &&
4689 	    pdu->ddigest_valid_bytes < ISCSI_DIGEST_LEN) {
4690 		rc = iscsi_conn_read_data(conn,
4691 					  ISCSI_DIGEST_LEN - pdu->ddigest_valid_bytes,
4692 					  pdu->data_digest + pdu->ddigest_valid_bytes);
4693 		if (rc < 0) {
4694 			return rc;
4695 		}
4696 
4697 		pdu->ddigest_valid_bytes += rc;
4698 		if (pdu->ddigest_valid_bytes < ISCSI_DIGEST_LEN) {
4699 			return 1;
4700 		}
4701 	}
4702 
4703 	/* check data digest */
4704 	if (conn->data_digest) {
4705 		iscsi_pdu_calc_partial_data_digest(pdu);
4706 		crc32c = iscsi_pdu_calc_partial_data_digest_done(pdu);
4707 
4708 		rc = MATCH_DIGEST_WORD(pdu->data_digest, crc32c);
4709 		if (rc == 0) {
4710 			SPDK_ERRLOG("data digest error (%s)\n", conn->initiator_name);
4711 			return -1;
4712 		}
4713 	}
4714 
4715 	return 0;
4716 }
4717 
4718 static int
4719 iscsi_read_pdu(struct spdk_iscsi_conn *conn)
4720 {
4721 	enum iscsi_pdu_recv_state prev_state;
4722 	struct spdk_iscsi_pdu *pdu;
4723 	uint32_t crc32c;
4724 	int ahs_len;
4725 	int rc;
4726 
4727 	do {
4728 		prev_state = conn->pdu_recv_state;
4729 		pdu = conn->pdu_in_progress;
4730 
4731 		switch (conn->pdu_recv_state) {
4732 		case ISCSI_PDU_RECV_STATE_AWAIT_PDU_READY:
4733 			assert(conn->pdu_in_progress == NULL);
4734 
4735 			conn->pdu_in_progress = iscsi_get_pdu(conn);
4736 			if (conn->pdu_in_progress == NULL) {
4737 				return SPDK_ISCSI_CONNECTION_FATAL;
4738 			}
4739 			conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_AWAIT_PDU_HDR;
4740 			break;
4741 		case ISCSI_PDU_RECV_STATE_AWAIT_PDU_HDR:
4742 			if (pdu->bhs_valid_bytes < ISCSI_BHS_LEN) {
4743 				rc = iscsi_conn_read_data(conn,
4744 							  ISCSI_BHS_LEN - pdu->bhs_valid_bytes,
4745 							  (uint8_t *)&pdu->bhs + pdu->bhs_valid_bytes);
4746 				if (rc < 0) {
4747 					conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_ERROR;
4748 					break;
4749 				}
4750 				pdu->bhs_valid_bytes += rc;
4751 				if (pdu->bhs_valid_bytes < ISCSI_BHS_LEN) {
4752 					return 0;
4753 				}
4754 			}
4755 
4756 			/* conn->is_logged_out must be checked after completing to process
4757 			 * logout request, i.e., before processing PDU header in this state
4758 			 * machine, otherwise logout response may not be sent to initiator
4759 			 * and initiator may get logout timeout.
4760 			 */
4761 			if (spdk_unlikely(conn->is_logged_out)) {
4762 				SPDK_DEBUGLOG(iscsi, "pdu received after logout\n");
4763 				conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_ERROR;
4764 				break;
4765 			}
4766 
4767 			pdu->data_segment_len = ISCSI_ALIGN(DGET24(pdu->bhs.data_segment_len));
4768 			pdu->data_buf_len = pdu->data_segment_len;
4769 
4770 			/* AHS */
4771 			ahs_len = pdu->bhs.total_ahs_len * 4;
4772 			if (ahs_len > ISCSI_AHS_LEN) {
4773 				SPDK_DEBUGLOG(iscsi, "pdu ahs length %d is invalid\n", ahs_len);
4774 				conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_ERROR;
4775 				break;
4776 			}
4777 
4778 			if (pdu->ahs_valid_bytes < ahs_len) {
4779 				rc = iscsi_conn_read_data(conn,
4780 							  ahs_len - pdu->ahs_valid_bytes,
4781 							  pdu->ahs + pdu->ahs_valid_bytes);
4782 				if (rc < 0) {
4783 					conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_ERROR;
4784 					break;
4785 				}
4786 
4787 				pdu->ahs_valid_bytes += rc;
4788 				if (pdu->ahs_valid_bytes < ahs_len) {
4789 					return 0;
4790 				}
4791 			}
4792 
4793 			/* Header Digest */
4794 			if (conn->header_digest &&
4795 			    pdu->hdigest_valid_bytes < ISCSI_DIGEST_LEN) {
4796 				rc = iscsi_conn_read_data(conn,
4797 							  ISCSI_DIGEST_LEN - pdu->hdigest_valid_bytes,
4798 							  pdu->header_digest + pdu->hdigest_valid_bytes);
4799 				if (rc < 0) {
4800 					conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_ERROR;
4801 					break;
4802 				}
4803 
4804 				pdu->hdigest_valid_bytes += rc;
4805 				if (pdu->hdigest_valid_bytes < ISCSI_DIGEST_LEN) {
4806 					return 0;
4807 				}
4808 			}
4809 
4810 			if (conn->header_digest) {
4811 				crc32c = iscsi_pdu_calc_header_digest(pdu);
4812 				rc = MATCH_DIGEST_WORD(pdu->header_digest, crc32c);
4813 				if (rc == 0) {
4814 					SPDK_ERRLOG("header digest error (%s)\n", conn->initiator_name);
4815 					conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_ERROR;
4816 					break;
4817 				}
4818 			}
4819 
4820 			rc = iscsi_pdu_hdr_handle(conn, pdu);
4821 			if (rc < 0) {
4822 				SPDK_ERRLOG("Critical error is detected. Close the connection\n");
4823 				conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_ERROR;
4824 				break;
4825 			}
4826 
4827 			conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_AWAIT_PDU_PAYLOAD;
4828 			break;
4829 		case ISCSI_PDU_RECV_STATE_AWAIT_PDU_PAYLOAD:
4830 			if (pdu->data_segment_len != 0) {
4831 				rc = iscsi_pdu_payload_read(conn, pdu);
4832 				if (rc > 0) {
4833 					return 0;
4834 				} else if (rc < 0) {
4835 					conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_ERROR;
4836 					break;
4837 				}
4838 			}
4839 
4840 			/* All data for this PDU has now been read from the socket. */
4841 			spdk_trace_record(TRACE_ISCSI_READ_PDU, conn->id, pdu->data_valid_bytes,
4842 					  (uintptr_t)pdu, pdu->bhs.opcode);
4843 
4844 			if (!pdu->is_rejected) {
4845 				rc = iscsi_pdu_payload_handle(conn, pdu);
4846 			} else {
4847 				rc = 0;
4848 			}
4849 			if (rc == 0) {
4850 				spdk_trace_record(TRACE_ISCSI_TASK_EXECUTED, 0, 0, (uintptr_t)pdu);
4851 				iscsi_put_pdu(pdu);
4852 				conn->pdu_in_progress = NULL;
4853 				conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_AWAIT_PDU_READY;
4854 				return 1;
4855 			} else {
4856 				conn->pdu_recv_state = ISCSI_PDU_RECV_STATE_ERROR;
4857 			}
4858 			break;
4859 		case ISCSI_PDU_RECV_STATE_ERROR:
4860 			return SPDK_ISCSI_CONNECTION_FATAL;
4861 		default:
4862 			assert(false);
4863 			SPDK_ERRLOG("code should not come here\n");
4864 			break;
4865 		}
4866 	} while (prev_state != conn->pdu_recv_state);
4867 
4868 	return 0;
4869 }
4870 
4871 #define GET_PDU_LOOP_COUNT	16
4872 
4873 int
4874 iscsi_handle_incoming_pdus(struct spdk_iscsi_conn *conn)
4875 {
4876 	int i, rc;
4877 
4878 	/* Read new PDUs from network */
4879 	for (i = 0; i < GET_PDU_LOOP_COUNT; i++) {
4880 		rc = iscsi_read_pdu(conn);
4881 		if (rc == 0) {
4882 			break;
4883 		} else if (rc < 0) {
4884 			return rc;
4885 		}
4886 
4887 		if (conn->is_stopped) {
4888 			break;
4889 		}
4890 	}
4891 
4892 	return i;
4893 }
4894