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