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 } else if (conn->state == ISCSI_CONN_STATE_RUNNING && 822 conn->logout_request_timer == NULL) { 823 thread = spdk_io_channel_get_thread(spdk_io_channel_from_ctx(conn->pg)); 824 spdk_thread_send_msg(thread, _iscsi_conn_request_logout, conn); 825 } 826 } 827 828 void 829 iscsi_conns_request_logout(struct spdk_iscsi_tgt_node *target, int pg_tag) 830 { 831 struct spdk_iscsi_conn *conn; 832 833 if (g_conns_array == MAP_FAILED) { 834 return; 835 } 836 837 pthread_mutex_lock(&g_conns_mutex); 838 TAILQ_FOREACH(conn, &g_active_conns, conn_link) { 839 if ((target == NULL) || 840 (conn->target == target && (pg_tag < 0 || conn->pg_tag == pg_tag))) { 841 iscsi_conn_request_logout(conn); 842 } 843 } 844 pthread_mutex_unlock(&g_conns_mutex); 845 } 846 847 void 848 shutdown_iscsi_conns(void) 849 { 850 iscsi_conns_request_logout(NULL, -1); 851 852 g_shutdown_timer = SPDK_POLLER_REGISTER(iscsi_conn_check_shutdown, NULL, 1000); 853 } 854 855 /* Do not set conn->state if the connection has already started exiting. 856 * This ensures we do not move a connection from EXITED state back to EXITING. 857 */ 858 static void 859 _iscsi_conn_drop(void *ctx) 860 { 861 struct spdk_iscsi_conn *conn = ctx; 862 863 if (conn->state < ISCSI_CONN_STATE_EXITING) { 864 conn->state = ISCSI_CONN_STATE_EXITING; 865 } 866 } 867 868 int 869 iscsi_drop_conns(struct spdk_iscsi_conn *conn, const char *conn_match, 870 int drop_all) 871 { 872 struct spdk_iscsi_conn *xconn; 873 const char *xconn_match; 874 struct spdk_thread *thread; 875 int num; 876 877 SPDK_DEBUGLOG(iscsi, "iscsi_drop_conns\n"); 878 879 num = 0; 880 pthread_mutex_lock(&g_conns_mutex); 881 if (g_conns_array == MAP_FAILED) { 882 goto exit; 883 } 884 885 TAILQ_FOREACH(xconn, &g_active_conns, conn_link) { 886 if (xconn == conn) { 887 continue; 888 } 889 890 if (!drop_all && xconn->initiator_port == NULL) { 891 continue; 892 } 893 894 xconn_match = 895 drop_all ? xconn->initiator_name : spdk_scsi_port_get_name(xconn->initiator_port); 896 897 if (!strcasecmp(conn_match, xconn_match) && 898 conn->target == xconn->target) { 899 900 if (num == 0) { 901 /* 902 * Only print this message before we report the 903 * first dropped connection. 904 */ 905 SPDK_ERRLOG("drop old connections %s by %s\n", 906 conn->target->name, conn_match); 907 } 908 909 SPDK_ERRLOG("exiting conn by %s (%s)\n", 910 xconn_match, xconn->initiator_addr); 911 if (xconn->sess != NULL) { 912 SPDK_DEBUGLOG(iscsi, "TSIH=%u\n", xconn->sess->tsih); 913 } else { 914 SPDK_DEBUGLOG(iscsi, "TSIH=xx\n"); 915 } 916 917 SPDK_DEBUGLOG(iscsi, "CID=%u\n", xconn->cid); 918 919 thread = spdk_io_channel_get_thread(spdk_io_channel_from_ctx(xconn->pg)); 920 spdk_thread_send_msg(thread, _iscsi_conn_drop, xconn); 921 922 num++; 923 } 924 } 925 926 exit: 927 pthread_mutex_unlock(&g_conns_mutex); 928 929 if (num != 0) { 930 SPDK_ERRLOG("exiting %d conns\n", num); 931 } 932 933 return 0; 934 } 935 936 static int 937 _iscsi_conn_abort_queued_datain_task(struct spdk_iscsi_conn *conn, 938 struct spdk_iscsi_task *task) 939 { 940 struct spdk_iscsi_task *subtask; 941 uint32_t remaining_size; 942 943 if (conn->data_in_cnt >= g_iscsi.MaxLargeDataInPerConnection) { 944 return -1; 945 } 946 947 assert(task->current_data_offset <= task->scsi.transfer_len); 948 /* Stop split and abort read I/O for remaining data. */ 949 if (task->current_data_offset < task->scsi.transfer_len) { 950 remaining_size = task->scsi.transfer_len - task->current_data_offset; 951 subtask = iscsi_task_get(conn, task, iscsi_task_cpl); 952 assert(subtask != NULL); 953 subtask->scsi.offset = task->current_data_offset; 954 subtask->scsi.length = remaining_size; 955 spdk_scsi_task_set_data(&subtask->scsi, NULL, 0); 956 task->current_data_offset += subtask->scsi.length; 957 958 subtask->scsi.transfer_len = subtask->scsi.length; 959 spdk_scsi_task_process_abort(&subtask->scsi); 960 iscsi_task_cpl(&subtask->scsi); 961 } 962 963 /* Remove the primary task from the list because all subtasks are submitted 964 * or aborted. 965 */ 966 assert(task->current_data_offset == task->scsi.transfer_len); 967 TAILQ_REMOVE(&conn->queued_datain_tasks, task, link); 968 return 0; 969 } 970 971 int 972 iscsi_conn_abort_queued_datain_task(struct spdk_iscsi_conn *conn, 973 uint32_t ref_task_tag) 974 { 975 struct spdk_iscsi_task *task; 976 977 TAILQ_FOREACH(task, &conn->queued_datain_tasks, link) { 978 if (task->tag == ref_task_tag) { 979 return _iscsi_conn_abort_queued_datain_task(conn, task); 980 } 981 } 982 983 return 0; 984 } 985 986 int 987 iscsi_conn_abort_queued_datain_tasks(struct spdk_iscsi_conn *conn, 988 struct spdk_scsi_lun *lun, 989 struct spdk_iscsi_pdu *pdu) 990 { 991 struct spdk_iscsi_task *task, *task_tmp; 992 struct spdk_iscsi_pdu *pdu_tmp; 993 int rc; 994 995 TAILQ_FOREACH_SAFE(task, &conn->queued_datain_tasks, link, task_tmp) { 996 pdu_tmp = iscsi_task_get_pdu(task); 997 if ((lun == NULL || lun == task->scsi.lun) && 998 (pdu == NULL || (spdk_sn32_lt(pdu_tmp->cmd_sn, pdu->cmd_sn)))) { 999 rc = _iscsi_conn_abort_queued_datain_task(conn, task); 1000 if (rc != 0) { 1001 return rc; 1002 } 1003 } 1004 } 1005 1006 return 0; 1007 } 1008 1009 int 1010 iscsi_conn_handle_queued_datain_tasks(struct spdk_iscsi_conn *conn) 1011 { 1012 struct spdk_iscsi_task *task; 1013 1014 while (!TAILQ_EMPTY(&conn->queued_datain_tasks) && 1015 conn->data_in_cnt < g_iscsi.MaxLargeDataInPerConnection) { 1016 task = TAILQ_FIRST(&conn->queued_datain_tasks); 1017 assert(task->current_data_offset <= task->scsi.transfer_len); 1018 if (task->current_data_offset < task->scsi.transfer_len) { 1019 struct spdk_iscsi_task *subtask; 1020 uint32_t remaining_size = 0; 1021 1022 remaining_size = task->scsi.transfer_len - task->current_data_offset; 1023 subtask = iscsi_task_get(conn, task, iscsi_task_cpl); 1024 assert(subtask != NULL); 1025 subtask->scsi.offset = task->current_data_offset; 1026 spdk_scsi_task_set_data(&subtask->scsi, NULL, 0); 1027 1028 if (spdk_scsi_dev_get_lun(conn->dev, task->lun_id) == NULL) { 1029 /* Stop submitting split read I/Os for remaining data. */ 1030 TAILQ_REMOVE(&conn->queued_datain_tasks, task, link); 1031 task->current_data_offset += remaining_size; 1032 assert(task->current_data_offset == task->scsi.transfer_len); 1033 subtask->scsi.transfer_len = remaining_size; 1034 spdk_scsi_task_process_null_lun(&subtask->scsi); 1035 iscsi_task_cpl(&subtask->scsi); 1036 return 0; 1037 } 1038 1039 subtask->scsi.length = spdk_min(SPDK_BDEV_LARGE_BUF_MAX_SIZE, remaining_size); 1040 task->current_data_offset += subtask->scsi.length; 1041 iscsi_queue_task(conn, subtask); 1042 } 1043 if (task->current_data_offset == task->scsi.transfer_len) { 1044 TAILQ_REMOVE(&conn->queued_datain_tasks, task, link); 1045 } 1046 } 1047 return 0; 1048 } 1049 1050 void 1051 iscsi_task_mgmt_cpl(struct spdk_scsi_task *scsi_task) 1052 { 1053 struct spdk_iscsi_task *task = iscsi_task_from_scsi_task(scsi_task); 1054 1055 iscsi_task_mgmt_response(task->conn, task); 1056 iscsi_task_put(task); 1057 } 1058 1059 static void 1060 process_completed_read_subtask_list_in_order(struct spdk_iscsi_conn *conn, 1061 struct spdk_iscsi_task *primary) 1062 { 1063 struct spdk_iscsi_task *subtask, *tmp; 1064 1065 TAILQ_FOREACH_SAFE(subtask, &primary->subtask_list, subtask_link, tmp) { 1066 if (subtask->scsi.offset == primary->bytes_completed) { 1067 TAILQ_REMOVE(&primary->subtask_list, subtask, subtask_link); 1068 primary->bytes_completed += subtask->scsi.length; 1069 if (primary->bytes_completed == primary->scsi.transfer_len) { 1070 iscsi_task_put(primary); 1071 } 1072 iscsi_task_response(conn, subtask); 1073 iscsi_task_put(subtask); 1074 } else { 1075 break; 1076 } 1077 } 1078 } 1079 1080 static void 1081 process_read_task_completion(struct spdk_iscsi_conn *conn, 1082 struct spdk_iscsi_task *task, 1083 struct spdk_iscsi_task *primary) 1084 { 1085 struct spdk_iscsi_task *tmp; 1086 1087 if (task->scsi.status != SPDK_SCSI_STATUS_GOOD) { 1088 if (primary->scsi.status == SPDK_SCSI_STATUS_GOOD) { 1089 /* If the status of the completed subtask, task, is the 1090 * first failure, copy it to out-of-order subtasks, and 1091 * remember it as the status of the SCSI Read Command. 1092 */ 1093 TAILQ_FOREACH(tmp, &primary->subtask_list, subtask_link) { 1094 spdk_scsi_task_copy_status(&tmp->scsi, &task->scsi); 1095 } 1096 spdk_scsi_task_copy_status(&primary->scsi, &task->scsi); 1097 } 1098 } else if (primary->scsi.status != SPDK_SCSI_STATUS_GOOD) { 1099 /* Even if the status of the completed subtask is success, 1100 * if there are any failed subtask ever, copy the first failed 1101 * status to it. 1102 */ 1103 spdk_scsi_task_copy_status(&task->scsi, &primary->scsi); 1104 } 1105 1106 if (task == primary) { 1107 /* If read I/O size is not larger than SPDK_BDEV_LARGE_BUF_MAX_SIZE, 1108 * the primary task which processes the SCSI Read Command PDU is 1109 * submitted directly. Hence send SCSI Response PDU for the primary 1110 * task simply. 1111 */ 1112 primary->bytes_completed = task->scsi.length; 1113 assert(primary->bytes_completed == task->scsi.transfer_len); 1114 iscsi_task_response(conn, task); 1115 iscsi_task_put(task); 1116 } else if (!conn->sess->DataSequenceInOrder) { 1117 /* If DataSequenceInOrder is No, send SCSI Response PDU for the completed 1118 * subtask without any deferral. 1119 */ 1120 primary->bytes_completed += task->scsi.length; 1121 if (primary->bytes_completed == primary->scsi.transfer_len) { 1122 iscsi_task_put(primary); 1123 } 1124 iscsi_task_response(conn, task); 1125 iscsi_task_put(task); 1126 } else { 1127 /* If DataSequenceInOrder is Yes, if the completed subtask is out-of-order, 1128 * it is deferred until all preceding subtasks send SCSI Response PDU. 1129 */ 1130 if (task->scsi.offset != primary->bytes_completed) { 1131 TAILQ_FOREACH(tmp, &primary->subtask_list, subtask_link) { 1132 if (task->scsi.offset < tmp->scsi.offset) { 1133 TAILQ_INSERT_BEFORE(tmp, task, subtask_link); 1134 return; 1135 } 1136 } 1137 1138 TAILQ_INSERT_TAIL(&primary->subtask_list, task, subtask_link); 1139 } else { 1140 TAILQ_INSERT_HEAD(&primary->subtask_list, task, subtask_link); 1141 process_completed_read_subtask_list_in_order(conn, primary); 1142 } 1143 } 1144 } 1145 1146 static void 1147 process_non_read_task_completion(struct spdk_iscsi_conn *conn, 1148 struct spdk_iscsi_task *task, 1149 struct spdk_iscsi_task *primary) 1150 { 1151 primary->bytes_completed += task->scsi.length; 1152 1153 if (task == primary) { 1154 /* This was a small write with no R2T. */ 1155 iscsi_task_response(conn, task); 1156 iscsi_task_put(task); 1157 return; 1158 } 1159 1160 if (task->scsi.status == SPDK_SCSI_STATUS_GOOD) { 1161 primary->scsi.data_transferred += task->scsi.data_transferred; 1162 } else if (primary->scsi.status == SPDK_SCSI_STATUS_GOOD) { 1163 /* If the status of this subtask is the first failure, copy it to 1164 * the primary task. 1165 */ 1166 spdk_scsi_task_copy_status(&primary->scsi, &task->scsi); 1167 } 1168 1169 if (primary->bytes_completed == primary->scsi.transfer_len) { 1170 /* If LUN is removed in the middle of the iSCSI write sequence, 1171 * primary might complete the write to the initiator because it is not 1172 * ensured that the initiator will send all data requested by R2Ts. 1173 * 1174 * We check it and skip the following if primary is completed. (see 1175 * iscsi_clear_all_transfer_task() in iscsi.c.) 1176 */ 1177 if (primary->is_r2t_active) { 1178 iscsi_task_response(conn, primary); 1179 iscsi_del_transfer_task(conn, primary->tag); 1180 } else { 1181 iscsi_task_response(conn, task); 1182 } 1183 } 1184 iscsi_task_put(task); 1185 } 1186 1187 void 1188 iscsi_task_cpl(struct spdk_scsi_task *scsi_task) 1189 { 1190 struct spdk_iscsi_task *primary; 1191 struct spdk_iscsi_task *task = iscsi_task_from_scsi_task(scsi_task); 1192 struct spdk_iscsi_conn *conn = task->conn; 1193 struct spdk_iscsi_pdu *pdu = task->pdu; 1194 1195 spdk_trace_record(TRACE_ISCSI_TASK_DONE, conn->trace_id, 0, (uintptr_t)task); 1196 1197 task->is_queued = false; 1198 primary = iscsi_task_get_primary(task); 1199 1200 if (iscsi_task_is_read(primary)) { 1201 process_read_task_completion(conn, task, primary); 1202 } else { 1203 process_non_read_task_completion(conn, task, primary); 1204 } 1205 if (!task->parent) { 1206 spdk_trace_record(TRACE_ISCSI_PDU_COMPLETED, conn->trace_id, 0, (uintptr_t)pdu); 1207 } 1208 } 1209 1210 static void 1211 iscsi_conn_send_nopin(struct spdk_iscsi_conn *conn) 1212 { 1213 struct spdk_iscsi_pdu *rsp_pdu; 1214 struct iscsi_bhs_nop_in *rsp; 1215 /* Only send nopin if we have logged in and are in a normal session. */ 1216 if (conn->sess == NULL || 1217 !conn->full_feature || 1218 !iscsi_param_eq_val(conn->sess->params, "SessionType", "Normal")) { 1219 return; 1220 } 1221 SPDK_DEBUGLOG(iscsi, "send NOPIN isid=%"PRIx64", tsih=%u, cid=%u\n", 1222 conn->sess->isid, conn->sess->tsih, conn->cid); 1223 SPDK_DEBUGLOG(iscsi, "StatSN=%u, ExpCmdSN=%u, MaxCmdSN=%u\n", 1224 conn->StatSN, conn->sess->ExpCmdSN, 1225 conn->sess->MaxCmdSN); 1226 rsp_pdu = iscsi_get_pdu(conn); 1227 rsp = (struct iscsi_bhs_nop_in *) &rsp_pdu->bhs; 1228 rsp_pdu->data = NULL; 1229 /* 1230 * iscsi_get_pdu() memset's the PDU for us, so only fill out the needed 1231 * fields. 1232 */ 1233 rsp->opcode = ISCSI_OP_NOPIN; 1234 rsp->flags = 0x80; 1235 /* 1236 * Technically the to_be32() is not needed here, since 1237 * to_be32(0xFFFFFFFU) returns 0xFFFFFFFFU. 1238 */ 1239 to_be32(&rsp->itt, 0xFFFFFFFFU); 1240 to_be32(&rsp->ttt, conn->id); 1241 to_be32(&rsp->stat_sn, conn->StatSN); 1242 to_be32(&rsp->exp_cmd_sn, conn->sess->ExpCmdSN); 1243 to_be32(&rsp->max_cmd_sn, conn->sess->MaxCmdSN); 1244 iscsi_conn_write_pdu(conn, rsp_pdu, iscsi_conn_pdu_generic_complete, NULL); 1245 conn->last_nopin = spdk_get_ticks(); 1246 conn->nop_outstanding = true; 1247 } 1248 1249 void 1250 iscsi_conn_handle_nop(struct spdk_iscsi_conn *conn) 1251 { 1252 uint64_t tsc; 1253 1254 /** 1255 * This function will be executed by nop_poller of iSCSI polling group, so 1256 * we need to check the connection state first, then do the nop interval 1257 * expiration check work. 1258 */ 1259 if ((conn->state == ISCSI_CONN_STATE_EXITED) || 1260 (conn->state == ISCSI_CONN_STATE_EXITING)) { 1261 return; 1262 } 1263 1264 /* Check for nop interval expiration */ 1265 tsc = spdk_get_ticks(); 1266 if (conn->nop_outstanding) { 1267 if ((tsc - conn->last_nopin) > conn->timeout) { 1268 SPDK_ERRLOG("Timed out waiting for NOP-Out response from initiator\n"); 1269 SPDK_ERRLOG(" tsc=0x%" PRIx64 ", last_nopin=0x%" PRIx64 "\n", tsc, conn->last_nopin); 1270 SPDK_ERRLOG(" initiator=%s, target=%s\n", conn->initiator_name, 1271 conn->target_short_name); 1272 conn->state = ISCSI_CONN_STATE_EXITING; 1273 } 1274 } else if (tsc - conn->last_nopin > conn->nopininterval) { 1275 iscsi_conn_send_nopin(conn); 1276 } 1277 } 1278 1279 /** 1280 * \brief Reads data for the specified iSCSI connection from its TCP socket. 1281 * 1282 * The TCP socket is marked as non-blocking, so this function may not read 1283 * all data requested. 1284 * 1285 * Returns SPDK_ISCSI_CONNECTION_FATAL if the recv() operation indicates a fatal 1286 * error with the TCP connection (including if the TCP connection was closed 1287 * unexpectedly. 1288 * 1289 * Otherwise returns the number of bytes successfully read. 1290 */ 1291 int 1292 iscsi_conn_read_data(struct spdk_iscsi_conn *conn, int bytes, 1293 void *buf) 1294 { 1295 int ret; 1296 1297 if (bytes == 0) { 1298 return 0; 1299 } 1300 1301 ret = spdk_sock_recv(conn->sock, buf, bytes); 1302 1303 if (ret > 0) { 1304 spdk_trace_record(TRACE_ISCSI_READ_FROM_SOCKET_DONE, conn->trace_id, ret, 0); 1305 return ret; 1306 } 1307 1308 if (ret < 0) { 1309 if (errno == EAGAIN || errno == EWOULDBLOCK) { 1310 return 0; 1311 } 1312 1313 /* For connect reset issue, do not output error log */ 1314 if (errno == ECONNRESET) { 1315 SPDK_DEBUGLOG(iscsi, "spdk_sock_recv() failed, errno %d: %s\n", 1316 errno, spdk_strerror(errno)); 1317 } else { 1318 SPDK_ERRLOG("spdk_sock_recv() failed, errno %d: %s\n", 1319 errno, spdk_strerror(errno)); 1320 } 1321 } 1322 1323 /* connection closed */ 1324 return SPDK_ISCSI_CONNECTION_FATAL; 1325 } 1326 1327 int 1328 iscsi_conn_readv_data(struct spdk_iscsi_conn *conn, 1329 struct iovec *iov, int iovcnt) 1330 { 1331 int ret; 1332 1333 if (iov == NULL || iovcnt == 0) { 1334 return 0; 1335 } 1336 1337 if (iovcnt == 1) { 1338 return iscsi_conn_read_data(conn, iov[0].iov_len, 1339 iov[0].iov_base); 1340 } 1341 1342 ret = spdk_sock_readv(conn->sock, iov, iovcnt); 1343 1344 if (ret > 0) { 1345 spdk_trace_record(TRACE_ISCSI_READ_FROM_SOCKET_DONE, conn->trace_id, ret, 0); 1346 return ret; 1347 } 1348 1349 if (ret < 0) { 1350 if (errno == EAGAIN || errno == EWOULDBLOCK) { 1351 return 0; 1352 } 1353 1354 /* For connect reset issue, do not output error log */ 1355 if (errno == ECONNRESET) { 1356 SPDK_DEBUGLOG(iscsi, "spdk_sock_readv() failed, errno %d: %s\n", 1357 errno, spdk_strerror(errno)); 1358 } else { 1359 SPDK_ERRLOG("spdk_sock_readv() failed, errno %d: %s\n", 1360 errno, spdk_strerror(errno)); 1361 } 1362 } 1363 1364 /* connection closed */ 1365 return SPDK_ISCSI_CONNECTION_FATAL; 1366 } 1367 1368 static bool 1369 iscsi_is_free_pdu_deferred(struct spdk_iscsi_pdu *pdu) 1370 { 1371 if (pdu == NULL) { 1372 return false; 1373 } 1374 1375 if (pdu->bhs.opcode == ISCSI_OP_R2T || 1376 pdu->bhs.opcode == ISCSI_OP_SCSI_DATAIN) { 1377 return true; 1378 } 1379 1380 return false; 1381 } 1382 1383 static int 1384 iscsi_dif_verify(struct spdk_iscsi_pdu *pdu, struct spdk_dif_ctx *dif_ctx) 1385 { 1386 struct iovec iov; 1387 struct spdk_dif_error err_blk = {}; 1388 uint32_t num_blocks; 1389 int rc; 1390 1391 iov.iov_base = pdu->data; 1392 iov.iov_len = pdu->data_buf_len; 1393 num_blocks = pdu->data_buf_len / dif_ctx->block_size; 1394 1395 rc = spdk_dif_verify(&iov, 1, num_blocks, dif_ctx, &err_blk); 1396 if (rc != 0) { 1397 SPDK_ERRLOG("DIF error detected. type=%d, offset=%" PRIu32 "\n", 1398 err_blk.err_type, err_blk.err_offset); 1399 } 1400 1401 return rc; 1402 } 1403 1404 static void 1405 _iscsi_conn_pdu_write_done(void *cb_arg, int err) 1406 { 1407 struct spdk_iscsi_pdu *pdu = cb_arg; 1408 struct spdk_iscsi_conn *conn = pdu->conn; 1409 1410 assert(conn != NULL); 1411 1412 if (spdk_unlikely(conn->state >= ISCSI_CONN_STATE_EXITING)) { 1413 /* The other policy will recycle the resource */ 1414 return; 1415 } 1416 1417 TAILQ_REMOVE(&conn->write_pdu_list, pdu, tailq); 1418 1419 if (err != 0) { 1420 conn->state = ISCSI_CONN_STATE_EXITING; 1421 } 1422 1423 if ((conn->full_feature) && 1424 (conn->sess->ErrorRecoveryLevel >= 1) && 1425 iscsi_is_free_pdu_deferred(pdu)) { 1426 SPDK_DEBUGLOG(iscsi, "stat_sn=%d\n", 1427 from_be32(&pdu->bhs.stat_sn)); 1428 TAILQ_INSERT_TAIL(&conn->snack_pdu_list, pdu, 1429 tailq); 1430 } else { 1431 iscsi_conn_free_pdu(conn, pdu); 1432 } 1433 } 1434 1435 void 1436 iscsi_conn_pdu_generic_complete(void *cb_arg) 1437 { 1438 } 1439 1440 void 1441 iscsi_conn_write_pdu(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu, 1442 iscsi_conn_xfer_complete_cb cb_fn, 1443 void *cb_arg) 1444 { 1445 uint32_t crc32c; 1446 ssize_t rc; 1447 1448 if (spdk_unlikely(pdu->dif_insert_or_strip)) { 1449 rc = iscsi_dif_verify(pdu, &pdu->dif_ctx); 1450 if (rc != 0) { 1451 iscsi_conn_free_pdu(conn, pdu); 1452 conn->state = ISCSI_CONN_STATE_EXITING; 1453 return; 1454 } 1455 } 1456 1457 if (pdu->bhs.opcode != ISCSI_OP_LOGIN_RSP) { 1458 /* Header Digest */ 1459 if (conn->header_digest) { 1460 crc32c = iscsi_pdu_calc_header_digest(pdu); 1461 MAKE_DIGEST_WORD(pdu->header_digest, crc32c); 1462 } 1463 1464 /* Data Digest */ 1465 if (conn->data_digest && DGET24(pdu->bhs.data_segment_len) != 0) { 1466 crc32c = iscsi_pdu_calc_data_digest(pdu); 1467 MAKE_DIGEST_WORD(pdu->data_digest, crc32c); 1468 } 1469 } 1470 1471 pdu->cb_fn = cb_fn; 1472 pdu->cb_arg = cb_arg; 1473 TAILQ_INSERT_TAIL(&conn->write_pdu_list, pdu, tailq); 1474 1475 if (spdk_unlikely(conn->state >= ISCSI_CONN_STATE_EXITING)) { 1476 return; 1477 } 1478 pdu->sock_req.iovcnt = iscsi_build_iovs(conn, pdu->iov, SPDK_COUNTOF(pdu->iov), pdu, 1479 &pdu->mapped_length); 1480 pdu->sock_req.cb_fn = _iscsi_conn_pdu_write_done; 1481 pdu->sock_req.cb_arg = pdu; 1482 1483 spdk_sock_writev_async(conn->sock, &pdu->sock_req); 1484 } 1485 1486 static void 1487 iscsi_conn_sock_cb(void *arg, struct spdk_sock_group *group, struct spdk_sock *sock) 1488 { 1489 struct spdk_iscsi_conn *conn = arg; 1490 int rc; 1491 1492 assert(conn != NULL); 1493 1494 if ((conn->state == ISCSI_CONN_STATE_EXITED) || 1495 (conn->state == ISCSI_CONN_STATE_EXITING)) { 1496 return; 1497 } 1498 1499 /* Handle incoming PDUs */ 1500 rc = iscsi_handle_incoming_pdus(conn); 1501 if (rc < 0) { 1502 conn->state = ISCSI_CONN_STATE_EXITING; 1503 } 1504 } 1505 1506 static void 1507 iscsi_conn_full_feature_migrate(void *arg) 1508 { 1509 struct spdk_iscsi_conn *conn = arg; 1510 int rc; 1511 1512 assert(conn->state != ISCSI_CONN_STATE_EXITED); 1513 1514 /* Note: it is possible that connection could have moved to EXITING 1515 * state after this message was sent. We will still add it to the 1516 * poll group in this case. When the poll group is polled 1517 * again, it will call iscsi_conn_destruct() on it. 1518 */ 1519 1520 if (conn->sess->session_type == SESSION_TYPE_NORMAL) { 1521 rc = iscsi_conn_open_luns(conn); 1522 if (rc != 0) { 1523 /* If opening LUNs failed, it is a fatal error. At the first poll in the 1524 * assigned poll group, this connection will be destructed. 1525 */ 1526 conn->state = ISCSI_CONN_STATE_EXITING; 1527 } 1528 } 1529 1530 /* Add this connection to the assigned poll group. */ 1531 iscsi_poll_group_add_conn(conn->pg, conn); 1532 } 1533 1534 static struct spdk_iscsi_poll_group * 1535 iscsi_get_idlest_poll_group(void) 1536 { 1537 struct spdk_iscsi_poll_group *pg, *idle_pg = NULL; 1538 uint32_t min_num_targets = UINT32_MAX; 1539 1540 TAILQ_FOREACH(pg, &g_iscsi.poll_group_head, link) { 1541 if (pg->num_active_targets == 0) { 1542 return pg; 1543 } else if (pg->num_active_targets < min_num_targets) { 1544 min_num_targets = pg->num_active_targets; 1545 idle_pg = pg; 1546 } 1547 } 1548 1549 return idle_pg; 1550 } 1551 1552 void 1553 iscsi_conn_schedule(struct spdk_iscsi_conn *conn) 1554 { 1555 struct spdk_iscsi_poll_group *pg; 1556 struct spdk_iscsi_tgt_node *target; 1557 1558 if (conn->sess->session_type != SESSION_TYPE_NORMAL) { 1559 /* Leave all non-normal sessions on the acceptor 1560 * thread. */ 1561 return; 1562 } 1563 pthread_mutex_lock(&g_iscsi.mutex); 1564 1565 target = conn->sess->target; 1566 pthread_mutex_lock(&target->mutex); 1567 target->num_active_conns++; 1568 if (target->num_active_conns == 1) { 1569 /** 1570 * This is the only active connection for this target node. 1571 * Pick the idlest poll group. 1572 */ 1573 pg = iscsi_get_idlest_poll_group(); 1574 assert(pg != NULL); 1575 1576 pg->num_active_targets++; 1577 1578 /* Save the pg in the target node so it can be used for any other connections to this target node. */ 1579 target->pg = pg; 1580 } else { 1581 /** 1582 * There are other active connections for this target node. 1583 */ 1584 pg = target->pg; 1585 } 1586 1587 pthread_mutex_unlock(&target->mutex); 1588 pthread_mutex_unlock(&g_iscsi.mutex); 1589 1590 assert(spdk_io_channel_get_thread(spdk_io_channel_from_ctx(conn->pg)) == 1591 spdk_get_thread()); 1592 1593 /* Remove this connection from the previous poll group */ 1594 iscsi_poll_group_remove_conn(conn->pg, conn); 1595 1596 conn->pg = pg; 1597 conn->scheduled = 1; 1598 1599 spdk_thread_send_msg(spdk_io_channel_get_thread(spdk_io_channel_from_ctx(pg)), 1600 iscsi_conn_full_feature_migrate, conn); 1601 } 1602 1603 static int 1604 logout_timeout(void *arg) 1605 { 1606 struct spdk_iscsi_conn *conn = arg; 1607 1608 if (conn->state < ISCSI_CONN_STATE_EXITING) { 1609 conn->state = ISCSI_CONN_STATE_EXITING; 1610 } 1611 1612 spdk_poller_unregister(&conn->logout_timer); 1613 1614 return SPDK_POLLER_BUSY; 1615 } 1616 1617 void 1618 iscsi_conn_logout(struct spdk_iscsi_conn *conn) 1619 { 1620 conn->is_logged_out = true; 1621 conn->logout_timer = SPDK_POLLER_REGISTER(logout_timeout, conn, ISCSI_LOGOUT_TIMEOUT * 1000000); 1622 } 1623 1624 static const char * 1625 iscsi_conn_get_state(struct spdk_iscsi_conn *conn) 1626 { 1627 switch (conn->state) { 1628 SPDK_ISCSI_CONNECTION_STATUS(ISCSI_CONN_STATE_INVALID, "invalid"); 1629 SPDK_ISCSI_CONNECTION_STATUS(ISCSI_CONN_STATE_RUNNING, "running"); 1630 SPDK_ISCSI_CONNECTION_STATUS(ISCSI_CONN_STATE_EXITING, "exiting"); 1631 SPDK_ISCSI_CONNECTION_STATUS(ISCSI_CONN_STATE_EXITED, "exited"); 1632 } 1633 return "unknown"; 1634 } 1635 1636 static const char * 1637 iscsi_conn_get_login_phase(struct spdk_iscsi_conn *conn) 1638 { 1639 switch (conn->login_phase) { 1640 SPDK_ISCSI_CONNECTION_STATUS(ISCSI_SECURITY_NEGOTIATION_PHASE, "security_negotiation_phase"); 1641 SPDK_ISCSI_CONNECTION_STATUS(ISCSI_OPERATIONAL_NEGOTIATION_PHASE, "operational_negotiation_phase"); 1642 SPDK_ISCSI_CONNECTION_STATUS(ISCSI_FULL_FEATURE_PHASE, "full_feature_phase"); 1643 } 1644 return "not_started"; 1645 } 1646 1647 static void 1648 iscsi_conn_trace(void) 1649 { 1650 spdk_trace_register_owner_type(OWNER_TYPE_ISCSI_CONN, 'c'); 1651 spdk_trace_register_object(OBJECT_ISCSI_PDU, 'p'); 1652 spdk_trace_register_description("ISCSI_READ_DONE", TRACE_ISCSI_READ_FROM_SOCKET_DONE, 1653 OWNER_TYPE_ISCSI_CONN, OBJECT_NONE, 0, 1654 SPDK_TRACE_ARG_TYPE_INT, ""); 1655 spdk_trace_register_description("ISCSI_READ_PDU", TRACE_ISCSI_READ_PDU, 1656 OWNER_TYPE_ISCSI_CONN, OBJECT_ISCSI_PDU, 1, 1657 SPDK_TRACE_ARG_TYPE_INT, "opc"); 1658 spdk_trace_register_description("ISCSI_TASK_DONE", TRACE_ISCSI_TASK_DONE, 1659 OWNER_TYPE_ISCSI_CONN, OBJECT_SCSI_TASK, 0, 1660 SPDK_TRACE_ARG_TYPE_INT, ""); 1661 spdk_trace_register_description("ISCSI_TASK_QUEUE", TRACE_ISCSI_TASK_QUEUE, 1662 OWNER_TYPE_ISCSI_CONN, OBJECT_SCSI_TASK, 1, 1663 SPDK_TRACE_ARG_TYPE_PTR, "pdu"); 1664 spdk_trace_register_description("ISCSI_TASK_EXECUTED", TRACE_ISCSI_TASK_EXECUTED, 1665 OWNER_TYPE_ISCSI_CONN, OBJECT_ISCSI_PDU, 0, 1666 SPDK_TRACE_ARG_TYPE_INT, ""); 1667 spdk_trace_register_description("ISCSI_PDU_COMPLETED", TRACE_ISCSI_PDU_COMPLETED, 1668 OWNER_TYPE_ISCSI_CONN, OBJECT_ISCSI_PDU, 0, 1669 SPDK_TRACE_ARG_TYPE_INT, ""); 1670 spdk_trace_tpoint_register_relation(TRACE_SOCK_REQ_QUEUE, OBJECT_ISCSI_PDU, 0); 1671 spdk_trace_tpoint_register_relation(TRACE_SOCK_REQ_PEND, OBJECT_ISCSI_PDU, 0); 1672 spdk_trace_tpoint_register_relation(TRACE_SOCK_REQ_COMPLETE, OBJECT_ISCSI_PDU, 0); 1673 } 1674 SPDK_TRACE_REGISTER_FN(iscsi_conn_trace, "iscsi_conn", TRACE_GROUP_ISCSI) 1675 1676 void 1677 iscsi_conn_info_json(struct spdk_json_write_ctx *w, struct spdk_iscsi_conn *conn) 1678 { 1679 uint16_t tsih; 1680 1681 if (!conn->is_valid) { 1682 return; 1683 } 1684 1685 spdk_json_write_object_begin(w); 1686 1687 spdk_json_write_named_int32(w, "id", conn->id); 1688 1689 spdk_json_write_named_int32(w, "cid", conn->cid); 1690 1691 /* 1692 * If we try to return data for a connection that has not 1693 * logged in yet, the session will not be set. So in this 1694 * case, return -1 for the tsih rather than segfaulting 1695 * on the null conn->sess. 1696 */ 1697 if (conn->sess == NULL) { 1698 tsih = -1; 1699 } else { 1700 tsih = conn->sess->tsih; 1701 } 1702 spdk_json_write_named_int32(w, "tsih", tsih); 1703 1704 spdk_json_write_named_string(w, "state", iscsi_conn_get_state(conn)); 1705 1706 spdk_json_write_named_string(w, "login_phase", iscsi_conn_get_login_phase(conn)); 1707 1708 spdk_json_write_named_string(w, "initiator_addr", conn->initiator_addr); 1709 1710 spdk_json_write_named_string(w, "target_addr", conn->target_addr); 1711 1712 spdk_json_write_named_string(w, "target_node_name", conn->target_short_name); 1713 1714 spdk_json_write_named_string(w, "thread_name", 1715 spdk_thread_get_name(spdk_get_thread())); 1716 1717 spdk_json_write_object_end(w); 1718 } 1719