Lines Matching +full:freebsd13 +full:- +full:5 +full:s

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
107 static int ping_timeout = 5;
109 0, "Timeout for ping (NOP-Out) requests, in seconds");
129 #define CONN_SESSION(X) ((struct iscsi_session *)X->ic_prv0)
130 #define PDU_SESSION(X) (CONN_SESSION(X->ip_conn))
135 printf("%s: " X "\n", __func__, ## __VA_ARGS__);\
141 printf("WARNING: %s: " X "\n", \
146 #define ISCSI_SESSION_DEBUG(S, X, ...) \ argument
149 printf("%s: %s (%s): " X "\n", \
150 __func__, S->is_conf.isc_target_addr, \
151 S->is_conf.isc_target, ## __VA_ARGS__); \
155 #define ISCSI_SESSION_WARN(S, X, ...) \ argument
158 printf("WARNING: %s (%s): " X "\n", \
159 S->is_conf.isc_target_addr, \
160 S->is_conf.isc_target, ## __VA_ARGS__); \
164 #define ISCSI_SESSION_LOCK(X) mtx_lock(&X->is_lock)
165 #define ISCSI_SESSION_UNLOCK(X) mtx_unlock(&X->is_lock)
166 #define ISCSI_SESSION_LOCK_ASSERT(X) mtx_assert(&X->is_lock, MA_OWNED)
167 #define ISCSI_SESSION_LOCK_ASSERT_NOT(X) mtx_assert(&X->is_lock, MA_NOTOWNED)
212 * (initiator -> target) PDUs. in iscsi_pdu_prepare()
214 bhssc = (struct iscsi_bhs_scsi_command *)request->ip_bhs; in iscsi_pdu_prepare()
217 * Data-Out PDU does not contain CmdSN. in iscsi_pdu_prepare()
219 if (bhssc->bhssc_opcode != ISCSI_BHS_OPCODE_SCSI_DATA_OUT) { in iscsi_pdu_prepare()
220 if (ISCSI_SNGT(is->is_cmdsn, is->is_maxcmdsn) && in iscsi_pdu_prepare()
221 (bhssc->bhssc_opcode & ISCSI_BHS_OPCODE_IMMEDIATE) == 0) { in iscsi_pdu_prepare()
231 is->is_cmdsn, is->is_expcmdsn, is->is_maxcmdsn, in iscsi_pdu_prepare()
232 bhssc->bhssc_opcode); in iscsi_pdu_prepare()
236 bhssc->bhssc_cmdsn = htonl(is->is_cmdsn); in iscsi_pdu_prepare()
237 if ((bhssc->bhssc_opcode & ISCSI_BHS_OPCODE_IMMEDIATE) == 0) in iscsi_pdu_prepare()
238 is->is_cmdsn++; in iscsi_pdu_prepare()
240 bhssc->bhssc_expstatsn = htonl(is->is_statsn + 1); in iscsi_pdu_prepare()
253 if (STAILQ_EMPTY(&is->is_postponed)) in iscsi_session_send_postponed()
255 while ((request = STAILQ_FIRST(&is->is_postponed)) != NULL) { in iscsi_session_send_postponed()
259 STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next); in iscsi_session_send_postponed()
262 xpt_release_simq(is->is_sim, 1); in iscsi_session_send_postponed()
276 if (STAILQ_EMPTY(&is->is_postponed)) in iscsi_pdu_queue_locked()
277 xpt_freeze_simq(is->is_sim, 1); in iscsi_pdu_queue_locked()
278 STAILQ_INSERT_TAIL(&is->is_postponed, request, ip_next); in iscsi_pdu_queue_locked()
301 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_session_logout()
305 bhslr = (struct iscsi_bhs_logout_request *)request->ip_bhs; in iscsi_session_logout()
306 bhslr->bhslr_opcode = ISCSI_BHS_OPCODE_LOGOUT_REQUEST; in iscsi_session_logout()
307 bhslr->bhslr_reason = BHSLR_REASON_CLOSE_SESSION; in iscsi_session_logout()
318 if (io->io_ccb != NULL) { in iscsi_session_terminate_task()
319 io->io_ccb->ccb_h.status &= ~(CAM_SIM_QUEUED | CAM_STATUS_MASK); in iscsi_session_terminate_task()
320 io->io_ccb->ccb_h.status |= status; in iscsi_session_terminate_task()
321 if ((io->io_ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in iscsi_session_terminate_task()
322 io->io_ccb->ccb_h.status |= CAM_DEV_QFRZN; in iscsi_session_terminate_task()
323 xpt_freeze_devq(io->io_ccb->ccb_h.path, 1); in iscsi_session_terminate_task()
326 xpt_done(io->io_ccb); in iscsi_session_terminate_task()
338 TAILQ_FOREACH_SAFE(io, &is->is_outstanding, io_next, tmp) { in iscsi_session_terminate_tasks()
353 if (is->is_sim != NULL && is->is_simq_frozen == false) { in iscsi_session_cleanup()
355 xpt_freeze_simq(is->is_sim, 1); in iscsi_session_cleanup()
356 is->is_simq_frozen = true; in iscsi_session_cleanup()
362 if (!STAILQ_EMPTY(&is->is_postponed)) in iscsi_session_cleanup()
363 xpt_release_simq(is->is_sim, 1); in iscsi_session_cleanup()
364 while ((pdu = STAILQ_FIRST(&is->is_postponed)) != NULL) { in iscsi_session_cleanup()
365 STAILQ_REMOVE_HEAD(&is->is_postponed, ip_next); in iscsi_session_cleanup()
379 if (is->is_sim == NULL) in iscsi_session_cleanup()
383 xpt_async(AC_LOST_DEVICE, is->is_path, NULL); in iscsi_session_cleanup()
385 if (is->is_simq_frozen) { in iscsi_session_cleanup()
386 is->is_simq_frozen = false; in iscsi_session_cleanup()
387 xpt_release_simq(is->is_sim, 1); in iscsi_session_cleanup()
390 xpt_free_path(is->is_path); in iscsi_session_cleanup()
391 is->is_path = NULL; in iscsi_session_cleanup()
392 xpt_bus_deregister(cam_sim_path(is->is_sim)); in iscsi_session_cleanup()
393 cam_sim_free(is->is_sim, TRUE /*free_devq*/); in iscsi_session_cleanup()
394 is->is_sim = NULL; in iscsi_session_cleanup()
395 is->is_devq = NULL; in iscsi_session_cleanup()
408 so = is->is_conn->ic_socket; in iscsi_maintenance_thread_reconnect()
417 sl.l_onoff = 1; /* non-zero value enables linger option in kernel */ in iscsi_maintenance_thread_reconnect()
419 sosetopt(is->is_conn->ic_socket, &sopt); in iscsi_maintenance_thread_reconnect()
422 icl_conn_close(is->is_conn); in iscsi_maintenance_thread_reconnect()
426 is->is_connected = false; in iscsi_maintenance_thread_reconnect()
427 is->is_reconnecting = false; in iscsi_maintenance_thread_reconnect()
428 is->is_login_phase = false; in iscsi_maintenance_thread_reconnect()
431 if (is->is_login_pdu != NULL) { in iscsi_maintenance_thread_reconnect()
432 icl_pdu_free(is->is_login_pdu); in iscsi_maintenance_thread_reconnect()
433 is->is_login_pdu = NULL; in iscsi_maintenance_thread_reconnect()
435 cv_signal(&is->is_login_cv); in iscsi_maintenance_thread_reconnect()
445 KASSERT(TAILQ_EMPTY(&is->is_outstanding), in iscsi_maintenance_thread_reconnect()
447 KASSERT(STAILQ_EMPTY(&is->is_postponed), in iscsi_maintenance_thread_reconnect()
450 if (is->is_conf.isc_enable == 0 && is->is_conf.isc_discovery == 0) { in iscsi_maintenance_thread_reconnect()
459 is->is_waiting_for_iscsid = true; in iscsi_maintenance_thread_reconnect()
460 strlcpy(is->is_reason, "Waiting for iscsid(8)", sizeof(is->is_reason)); in iscsi_maintenance_thread_reconnect()
461 is->is_timeout = 0; in iscsi_maintenance_thread_reconnect()
463 cv_signal(&is->is_softc->sc_cv); in iscsi_maintenance_thread_reconnect()
471 sc = is->is_softc; in iscsi_maintenance_thread_terminate()
472 sx_xlock(&sc->sc_lock); in iscsi_maintenance_thread_terminate()
473 TAILQ_REMOVE(&sc->sc_sessions, is, is_next); in iscsi_maintenance_thread_terminate()
474 sx_xunlock(&sc->sc_lock); in iscsi_maintenance_thread_terminate()
476 icl_conn_close(is->is_conn); in iscsi_maintenance_thread_terminate()
477 callout_drain(&is->is_callout); in iscsi_maintenance_thread_terminate()
481 KASSERT(is->is_terminating, ("is_terminating == false")); in iscsi_maintenance_thread_terminate()
484 if (is->is_login_pdu != NULL) { in iscsi_maintenance_thread_terminate()
485 icl_pdu_free(is->is_login_pdu); in iscsi_maintenance_thread_terminate()
486 is->is_login_pdu = NULL; in iscsi_maintenance_thread_terminate()
488 cv_signal(&is->is_login_cv); in iscsi_maintenance_thread_terminate()
493 KASSERT(TAILQ_EMPTY(&is->is_outstanding), in iscsi_maintenance_thread_terminate()
495 KASSERT(STAILQ_EMPTY(&is->is_postponed), in iscsi_maintenance_thread_terminate()
500 icl_conn_free(is->is_conn); in iscsi_maintenance_thread_terminate()
501 mtx_destroy(&is->is_lock); in iscsi_maintenance_thread_terminate()
502 cv_destroy(&is->is_maintenance_cv); in iscsi_maintenance_thread_terminate()
504 cv_destroy(&is->is_login_cv); in iscsi_maintenance_thread_terminate()
513 cv_signal(&sc->sc_cv); in iscsi_maintenance_thread_terminate()
523 if (is->is_reconnecting == false && in iscsi_maintenance_thread()
524 is->is_terminating == false && in iscsi_maintenance_thread()
525 (STAILQ_EMPTY(&is->is_postponed) || in iscsi_maintenance_thread()
526 ISCSI_SNGT(is->is_cmdsn, is->is_maxcmdsn))) in iscsi_maintenance_thread()
527 cv_wait(&is->is_maintenance_cv, &is->is_lock); in iscsi_maintenance_thread()
530 if (is->is_terminating) { in iscsi_maintenance_thread()
537 if (is->is_reconnecting) { in iscsi_maintenance_thread()
555 * it's being called from various contexts. in iscsi_session_reconnect()
558 if (is->is_reconnecting) in iscsi_session_reconnect()
561 is->is_reconnecting = true; in iscsi_session_reconnect()
562 cv_signal(&is->is_maintenance_cv); in iscsi_session_reconnect()
569 if (is->is_terminating) in iscsi_session_terminate()
572 is->is_terminating = true; in iscsi_session_terminate()
577 cv_signal(&is->is_maintenance_cv); in iscsi_session_terminate()
592 if (is->is_terminating) { in iscsi_callout()
599 callout_schedule_sbt(&is->is_callout, sbt, pr, 0); in iscsi_callout()
601 if (is->is_conf.isc_enable == 0) in iscsi_callout()
604 is->is_timeout++; in iscsi_callout()
606 if (is->is_waiting_for_iscsid) { in iscsi_callout()
607 if (iscsid_timeout > 0 && is->is_timeout > iscsid_timeout) { in iscsi_callout()
610 is->is_timeout); in iscsi_callout()
616 if (is->is_login_phase) { in iscsi_callout()
617 if (is->is_login_timeout > 0 && is->is_timeout > is->is_login_timeout) { in iscsi_callout()
619 "reconnecting", is->is_timeout); in iscsi_callout()
625 if (is->is_ping_timeout <= 0) { in iscsi_callout()
627 * Pings are disabled. Don't send NOP-Out in this case. in iscsi_callout()
631 is->is_timeout = 0; in iscsi_callout()
635 if (is->is_timeout >= is->is_ping_timeout) { in iscsi_callout()
636 ISCSI_SESSION_WARN(is, "no ping reply (NOP-In) after %d seconds; " in iscsi_callout()
637 "reconnecting", is->is_ping_timeout); in iscsi_callout()
645 * If the ping was reset less than one second ago - which means in iscsi_callout()
646 * that we've received some PDU during the last second - assume in iscsi_callout()
647 * the traffic flows correctly and don't bother sending a NOP-Out. in iscsi_callout()
649 * (It's 2 - one for one second, and one for incrementing is_timeout in iscsi_callout()
652 if (is->is_timeout < 2) in iscsi_callout()
655 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_callout()
660 bhsno = (struct iscsi_bhs_nop_out *)request->ip_bhs; in iscsi_callout()
661 bhsno->bhsno_opcode = ISCSI_BHS_OPCODE_NOP_OUT | in iscsi_callout()
663 bhsno->bhsno_flags = 0x80; in iscsi_callout()
664 bhsno->bhsno_target_transfer_tag = 0xffffffff; in iscsi_callout()
669 if (is->is_terminating) { in iscsi_callout()
693 * (target -> initiator) PDUs. in iscsi_pdu_update_statsn()
695 bhsdi = (const struct iscsi_bhs_data_in *)response->ip_bhs; in iscsi_pdu_update_statsn()
697 * Ok, I lied. In case of Data-In, "The fields StatSN, Status, in iscsi_pdu_update_statsn()
698 * and Residual Count only have meaningful content if the S bit in iscsi_pdu_update_statsn()
700 * Data-In PDU. in iscsi_pdu_update_statsn()
702 if (bhsdi->bhsdi_opcode != ISCSI_BHS_OPCODE_SCSI_DATA_IN || in iscsi_pdu_update_statsn()
703 (bhsdi->bhsdi_flags & BHSDI_FLAGS_S) != 0) { in iscsi_pdu_update_statsn()
704 statsn = ntohl(bhsdi->bhsdi_statsn); in iscsi_pdu_update_statsn()
705 if (statsn != is->is_statsn && statsn != (is->is_statsn + 1)) { in iscsi_pdu_update_statsn()
709 bhsdi->bhsdi_opcode, statsn, is->is_statsn); in iscsi_pdu_update_statsn()
712 if (ISCSI_SNGT(statsn, is->is_statsn)) in iscsi_pdu_update_statsn()
713 is->is_statsn = statsn; in iscsi_pdu_update_statsn()
716 expcmdsn = ntohl(bhsdi->bhsdi_expcmdsn); in iscsi_pdu_update_statsn()
717 maxcmdsn = ntohl(bhsdi->bhsdi_maxcmdsn); in iscsi_pdu_update_statsn()
724 if (ISCSI_SNGT(maxcmdsn, is->is_maxcmdsn)) { in iscsi_pdu_update_statsn()
725 is->is_maxcmdsn = maxcmdsn; in iscsi_pdu_update_statsn()
731 if (!STAILQ_EMPTY(&is->is_postponed)) in iscsi_pdu_update_statsn()
732 cv_signal(&is->is_maintenance_cv); in iscsi_pdu_update_statsn()
733 } else if (ISCSI_SNLT(maxcmdsn, is->is_maxcmdsn)) { in iscsi_pdu_update_statsn()
737 maxcmdsn, is->is_maxcmdsn); in iscsi_pdu_update_statsn()
740 if (ISCSI_SNGT(expcmdsn, is->is_expcmdsn)) { in iscsi_pdu_update_statsn()
741 is->is_expcmdsn = expcmdsn; in iscsi_pdu_update_statsn()
742 } else if (ISCSI_SNLT(expcmdsn, is->is_expcmdsn)) { in iscsi_pdu_update_statsn()
746 expcmdsn, is->is_expcmdsn); in iscsi_pdu_update_statsn()
751 * Every incoming PDU - not just NOP-In - resets the ping timer. in iscsi_pdu_update_statsn()
753 * we don't want this to happen when NOP-In or NOP-Out ends up delayed in iscsi_pdu_update_statsn()
756 is->is_timeout = 0; in iscsi_pdu_update_statsn()
771 if (is->is_login_phase) { in iscsi_receive_callback()
772 if (is->is_login_pdu == NULL) in iscsi_receive_callback()
773 is->is_login_pdu = response; in iscsi_receive_callback()
777 cv_signal(&is->is_login_cv); in iscsi_receive_callback()
784 * when it's no longer needed. in iscsi_receive_callback()
786 switch (response->ip_bhs->bhs_opcode) { in iscsi_receive_callback()
824 response->ip_bhs->bhs_opcode); in iscsi_receive_callback()
854 bhsni = (struct iscsi_bhs_nop_in *)response->ip_bhs; in iscsi_pdu_handle_nop_in()
856 if (bhsni->bhsni_target_transfer_tag == 0xffffffff) { in iscsi_pdu_handle_nop_in()
878 request = icl_pdu_new(response->ip_conn, M_NOWAIT); in iscsi_pdu_handle_nop_in()
887 bhsno = (struct iscsi_bhs_nop_out *)request->ip_bhs; in iscsi_pdu_handle_nop_in()
888 bhsno->bhsno_opcode = ISCSI_BHS_OPCODE_NOP_OUT | in iscsi_pdu_handle_nop_in()
890 bhsno->bhsno_flags = 0x80; in iscsi_pdu_handle_nop_in()
891 bhsno->bhsno_initiator_task_tag = 0xffffffff; in iscsi_pdu_handle_nop_in()
892 bhsno->bhsno_target_transfer_tag = bhsni->bhsni_target_transfer_tag; in iscsi_pdu_handle_nop_in()
925 bhssr = (struct iscsi_bhs_scsi_response *)response->ip_bhs; in iscsi_pdu_handle_scsi_response()
926 io = iscsi_outstanding_find(is, bhssr->bhssr_initiator_task_tag); in iscsi_pdu_handle_scsi_response()
927 if (io == NULL || io->io_ccb == NULL) { in iscsi_pdu_handle_scsi_response()
928 ISCSI_SESSION_WARN(is, "bad itt 0x%x", bhssr->bhssr_initiator_task_tag); in iscsi_pdu_handle_scsi_response()
935 ccb = io->io_ccb; in iscsi_pdu_handle_scsi_response()
936 if (bhssr->bhssr_response == BHSSR_RESPONSE_COMMAND_COMPLETED) { in iscsi_pdu_handle_scsi_response()
937 if (ntohl(bhssr->bhssr_expdatasn) != io->io_datasn) { in iscsi_pdu_handle_scsi_response()
940 ntohl(bhssr->bhssr_expdatasn), io->io_datasn); in iscsi_pdu_handle_scsi_response()
948 if (bhssr->bhssr_status != 0 && in iscsi_pdu_handle_scsi_response()
949 bhssr->bhssr_expdatasn == htonl(0)) in iscsi_pdu_handle_scsi_response()
958 if (bhssr->bhssr_expdatasn != htonl(0)) { in iscsi_pdu_handle_scsi_response()
961 ntohl(bhssr->bhssr_expdatasn)); in iscsi_pdu_handle_scsi_response()
974 if (is->is_conn->ic_iser) { in iscsi_pdu_handle_scsi_response()
975 resid = ntohl(bhssr->bhssr_residual_count); in iscsi_pdu_handle_scsi_response()
976 if (bhssr->bhssr_flags & BHSSR_FLAGS_RESIDUAL_UNDERFLOW) { in iscsi_pdu_handle_scsi_response()
977 io->io_received = ccb->csio.dxfer_len - resid; in iscsi_pdu_handle_scsi_response()
978 } else if (bhssr->bhssr_flags & BHSSR_FLAGS_RESIDUAL_OVERFLOW) { in iscsi_pdu_handle_scsi_response()
981 io->io_received = ccb->csio.dxfer_len; in iscsi_pdu_handle_scsi_response()
985 received = io->io_received; in iscsi_pdu_handle_scsi_response()
989 if (bhssr->bhssr_response != BHSSR_RESPONSE_COMMAND_COMPLETED) { in iscsi_pdu_handle_scsi_response()
990 ISCSI_SESSION_WARN(is, "service response 0x%x", bhssr->bhssr_response); in iscsi_pdu_handle_scsi_response()
991 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in iscsi_pdu_handle_scsi_response()
992 xpt_freeze_devq(ccb->ccb_h.path, 1); in iscsi_pdu_handle_scsi_response()
995 ccb->ccb_h.status = CAM_REQ_CMP_ERR | CAM_DEV_QFRZN; in iscsi_pdu_handle_scsi_response()
996 } else if (bhssr->bhssr_status == 0) { in iscsi_pdu_handle_scsi_response()
997 ccb->ccb_h.status = CAM_REQ_CMP; in iscsi_pdu_handle_scsi_response()
999 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in iscsi_pdu_handle_scsi_response()
1000 xpt_freeze_devq(ccb->ccb_h.path, 1); in iscsi_pdu_handle_scsi_response()
1003 ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_DEV_QFRZN; in iscsi_pdu_handle_scsi_response()
1004 ccb->csio.scsi_status = bhssr->bhssr_status; in iscsi_pdu_handle_scsi_response()
1007 csio = &ccb->csio; in iscsi_pdu_handle_scsi_response()
1013 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in iscsi_pdu_handle_scsi_response()
1014 xpt_freeze_devq(ccb->ccb_h.path, 1); in iscsi_pdu_handle_scsi_response()
1017 ccb->ccb_h.status = CAM_REQ_CMP_ERR | CAM_DEV_QFRZN; in iscsi_pdu_handle_scsi_response()
1030 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in iscsi_pdu_handle_scsi_response()
1031 xpt_freeze_devq(ccb->ccb_h.path, 1); in iscsi_pdu_handle_scsi_response()
1034 ccb->ccb_h.status = CAM_REQ_CMP_ERR | CAM_DEV_QFRZN; in iscsi_pdu_handle_scsi_response()
1040 if (sense_len > csio->sense_len) { in iscsi_pdu_handle_scsi_response()
1042 sense_len, csio->sense_len); in iscsi_pdu_handle_scsi_response()
1043 sense_len = csio->sense_len; in iscsi_pdu_handle_scsi_response()
1045 icl_pdu_get_data(response, sizeof(sense_len), &csio->sense_data, sense_len); in iscsi_pdu_handle_scsi_response()
1046 csio->sense_resid = csio->sense_len - sense_len; in iscsi_pdu_handle_scsi_response()
1047 ccb->ccb_h.status |= CAM_AUTOSNS_VALID; in iscsi_pdu_handle_scsi_response()
1051 if (bhssr->bhssr_flags & BHSSR_FLAGS_RESIDUAL_UNDERFLOW) in iscsi_pdu_handle_scsi_response()
1052 csio->resid = ntohl(bhssr->bhssr_residual_count); in iscsi_pdu_handle_scsi_response()
1054 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { in iscsi_pdu_handle_scsi_response()
1055 KASSERT(received <= csio->dxfer_len, in iscsi_pdu_handle_scsi_response()
1056 ("received > csio->dxfer_len")); in iscsi_pdu_handle_scsi_response()
1057 if (received < csio->dxfer_len) { in iscsi_pdu_handle_scsi_response()
1058 if (csio->resid != csio->dxfer_len - received) { in iscsi_pdu_handle_scsi_response()
1061 csio->resid, csio->dxfer_len - received); in iscsi_pdu_handle_scsi_response()
1063 csio->resid = csio->dxfer_len - received; in iscsi_pdu_handle_scsi_response()
1080 bhstmr = (struct iscsi_bhs_task_management_response *)response->ip_bhs; in iscsi_pdu_handle_task_response()
1081 io = iscsi_outstanding_find(is, bhstmr->bhstmr_initiator_task_tag); in iscsi_pdu_handle_task_response()
1082 if (io == NULL || io->io_ccb != NULL) { in iscsi_pdu_handle_task_response()
1084 bhstmr->bhstmr_initiator_task_tag); in iscsi_pdu_handle_task_response()
1090 if (bhstmr->bhstmr_response != BHSTMR_RESPONSE_FUNCTION_COMPLETE) { in iscsi_pdu_handle_task_response()
1092 bhstmr->bhstmr_response); in iscsi_pdu_handle_task_response()
1094 aio = iscsi_outstanding_find(is, io->io_referenced_task_tag); in iscsi_pdu_handle_task_response()
1095 if (aio != NULL && aio->io_ccb != NULL) in iscsi_pdu_handle_task_response()
1107 switch (csio->ccb_h.flags & CAM_DATA_MASK) { in iscsi_pdu_get_data_csio()
1110 (struct bio *)csio->data_ptr, oreceived, data_segment_len); in iscsi_pdu_get_data_csio()
1114 csio->data_ptr + oreceived, data_segment_len); in iscsi_pdu_get_data_csio()
1132 bhsdi = (struct iscsi_bhs_data_in *)response->ip_bhs; in iscsi_pdu_handle_data_in()
1133 io = iscsi_outstanding_find(is, bhsdi->bhsdi_initiator_task_tag); in iscsi_pdu_handle_data_in()
1134 if (io == NULL || io->io_ccb == NULL) { in iscsi_pdu_handle_data_in()
1135 ISCSI_SESSION_WARN(is, "bad itt 0x%x", bhsdi->bhsdi_initiator_task_tag); in iscsi_pdu_handle_data_in()
1142 if (io->io_datasn != ntohl(bhsdi->bhsdi_datasn)) { in iscsi_pdu_handle_data_in()
1143 ISCSI_SESSION_WARN(is, "received Data-In PDU with " in iscsi_pdu_handle_data_in()
1145 ntohl(bhsdi->bhsdi_datasn), io->io_datasn); in iscsi_pdu_handle_data_in()
1151 io->io_datasn += response->ip_additional_pdus + 1; in iscsi_pdu_handle_data_in()
1166 * We need to track this for security reasons - without it, malicious target in iscsi_pdu_handle_data_in()
1167 * could respond to SCSI READ without sending Data-In PDUs, which would result in iscsi_pdu_handle_data_in()
1170 if (ntohl(bhsdi->bhsdi_buffer_offset) != io->io_received) { in iscsi_pdu_handle_data_in()
1172 io->io_received, (size_t)ntohl(bhsdi->bhsdi_buffer_offset)); in iscsi_pdu_handle_data_in()
1179 ccb = io->io_ccb; in iscsi_pdu_handle_data_in()
1180 csio = &ccb->csio; in iscsi_pdu_handle_data_in()
1182 if (io->io_received + data_segment_len > csio->dxfer_len) { in iscsi_pdu_handle_data_in()
1185 data_segment_len, io->io_received, csio->dxfer_len); in iscsi_pdu_handle_data_in()
1192 oreceived = io->io_received; in iscsi_pdu_handle_data_in()
1193 io->io_received += data_segment_len; in iscsi_pdu_handle_data_in()
1194 received = io->io_received; in iscsi_pdu_handle_data_in()
1195 if ((bhsdi->bhsdi_flags & BHSDI_FLAGS_S) != 0) in iscsi_pdu_handle_data_in()
1204 if ((bhsdi->bhsdi_flags & BHSDI_FLAGS_S) == 0) { in iscsi_pdu_handle_data_in()
1212 //ISCSI_SESSION_DEBUG(is, "got S flag; status 0x%x", bhsdi->bhsdi_status); in iscsi_pdu_handle_data_in()
1213 if (bhsdi->bhsdi_status == 0) { in iscsi_pdu_handle_data_in()
1214 ccb->ccb_h.status = CAM_REQ_CMP; in iscsi_pdu_handle_data_in()
1216 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in iscsi_pdu_handle_data_in()
1217 xpt_freeze_devq(ccb->ccb_h.path, 1); in iscsi_pdu_handle_data_in()
1220 ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_DEV_QFRZN; in iscsi_pdu_handle_data_in()
1221 csio->scsi_status = bhsdi->bhsdi_status; in iscsi_pdu_handle_data_in()
1224 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { in iscsi_pdu_handle_data_in()
1225 KASSERT(received <= csio->dxfer_len, in iscsi_pdu_handle_data_in()
1226 ("received > csio->dxfer_len")); in iscsi_pdu_handle_data_in()
1227 if (received < csio->dxfer_len) { in iscsi_pdu_handle_data_in()
1228 csio->resid = ntohl(bhsdi->bhsdi_residual_count); in iscsi_pdu_handle_data_in()
1229 if (csio->resid != csio->dxfer_len - received) { in iscsi_pdu_handle_data_in()
1232 csio->resid, csio->dxfer_len - received); in iscsi_pdu_handle_data_in()
1234 csio->resid = csio->dxfer_len - received; in iscsi_pdu_handle_data_in()
1254 switch (csio->ccb_h.flags & CAM_DATA_MASK) { in iscsi_pdu_append_data_csio()
1257 (struct bio *)csio->data_ptr, off, len, how)); in iscsi_pdu_append_data_csio()
1259 return (icl_pdu_append_data(request, csio->data_ptr + off, len, in iscsi_pdu_append_data_csio()
1281 bhsr2t = (struct iscsi_bhs_r2t *)response->ip_bhs; in iscsi_pdu_handle_r2t()
1282 io = iscsi_outstanding_find(is, bhsr2t->bhsr2t_initiator_task_tag); in iscsi_pdu_handle_r2t()
1283 if (io == NULL || io->io_ccb == NULL) { in iscsi_pdu_handle_r2t()
1285 bhsr2t->bhsr2t_initiator_task_tag); in iscsi_pdu_handle_r2t()
1291 csio = &io->io_ccb->csio; in iscsi_pdu_handle_r2t()
1293 if ((csio->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_OUT) { in iscsi_pdu_handle_r2t()
1304 off = ntohl(bhsr2t->bhsr2t_buffer_offset); in iscsi_pdu_handle_r2t()
1305 if (off > csio->dxfer_len) { in iscsi_pdu_handle_r2t()
1307 "%zd, buffer is %d; reconnecting", off, csio->dxfer_len); in iscsi_pdu_handle_r2t()
1313 total_len = ntohl(bhsr2t->bhsr2t_desired_data_transfer_length); in iscsi_pdu_handle_r2t()
1314 if (total_len == 0 || total_len > csio->dxfer_len) { in iscsi_pdu_handle_r2t()
1316 "%zd, buffer is %d; reconnecting", total_len, csio->dxfer_len); in iscsi_pdu_handle_r2t()
1324 if (is->is_conn->ic_hw_isomax != 0) in iscsi_pdu_handle_r2t()
1325 max_send_data_segment_length = is->is_conn->ic_hw_isomax; in iscsi_pdu_handle_r2t()
1328 is->is_conn->ic_max_send_data_segment_length; in iscsi_pdu_handle_r2t()
1335 if (off + len > csio->dxfer_len) { in iscsi_pdu_handle_r2t()
1338 off + len, csio->dxfer_len); in iscsi_pdu_handle_r2t()
1344 request = icl_pdu_new(response->ip_conn, M_NOWAIT); in iscsi_pdu_handle_r2t()
1351 bhsdo = (struct iscsi_bhs_data_out *)request->ip_bhs; in iscsi_pdu_handle_r2t()
1352 bhsdo->bhsdo_opcode = ISCSI_BHS_OPCODE_SCSI_DATA_OUT; in iscsi_pdu_handle_r2t()
1353 bhsdo->bhsdo_lun = bhsr2t->bhsr2t_lun; in iscsi_pdu_handle_r2t()
1354 bhsdo->bhsdo_initiator_task_tag = in iscsi_pdu_handle_r2t()
1355 bhsr2t->bhsr2t_initiator_task_tag; in iscsi_pdu_handle_r2t()
1356 bhsdo->bhsdo_target_transfer_tag = in iscsi_pdu_handle_r2t()
1357 bhsr2t->bhsr2t_target_transfer_tag; in iscsi_pdu_handle_r2t()
1358 bhsdo->bhsdo_datasn = htonl(datasn); in iscsi_pdu_handle_r2t()
1359 bhsdo->bhsdo_buffer_offset = htonl(off); in iscsi_pdu_handle_r2t()
1372 is->is_conn->ic_max_send_data_segment_length); in iscsi_pdu_handle_r2t()
1374 total_len -= len; in iscsi_pdu_handle_r2t()
1377 bhsdo->bhsdo_flags |= BHSDO_FLAGS_F; in iscsi_pdu_handle_r2t()
1399 bhsam = (struct iscsi_bhs_asynchronous_message *)response->ip_bhs; in iscsi_pdu_handle_async_message()
1400 switch (bhsam->bhsam_async_event) { in iscsi_pdu_handle_async_message()
1417 ISCSI_SESSION_WARN(is, "ignoring AsyncEvent %d", bhsam->bhsam_async_event); in iscsi_pdu_handle_async_message()
1431 bhsr = (struct iscsi_bhs_reject *)response->ip_bhs; in iscsi_pdu_handle_reject()
1433 bhsr->bhsr_reason); in iscsi_pdu_handle_reject()
1440 struct iscsi_daemon_request *request, bool freebsd13) in iscsi_ioctl_daemon_wait() argument
1445 sx_slock(&sc->sc_lock); in iscsi_ioctl_daemon_wait()
1447 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_wait()
1449 if (is->is_conf.isc_enable == 0 && in iscsi_ioctl_daemon_wait()
1450 is->is_conf.isc_discovery == 0) { in iscsi_ioctl_daemon_wait()
1454 if (is->is_waiting_for_iscsid) in iscsi_ioctl_daemon_wait()
1460 if (sc->sc_unloading) { in iscsi_ioctl_daemon_wait()
1461 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_wait()
1468 error = cv_wait_sig(&sc->sc_cv, &sc->sc_lock); in iscsi_ioctl_daemon_wait()
1470 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_wait()
1476 is->is_waiting_for_iscsid = false; in iscsi_ioctl_daemon_wait()
1477 is->is_login_phase = true; in iscsi_ioctl_daemon_wait()
1478 is->is_reason[0] = '\0'; in iscsi_ioctl_daemon_wait()
1481 request->idr_session_id = is->is_id; in iscsi_ioctl_daemon_wait()
1482 memcpy(&request->idr_isid, &is->is_isid, in iscsi_ioctl_daemon_wait()
1483 sizeof(request->idr_isid)); in iscsi_ioctl_daemon_wait()
1484 request->idr_tsih = 0; /* New or reinstated session. */ in iscsi_ioctl_daemon_wait()
1485 memcpy(&request->idr_conf, &is->is_conf, in iscsi_ioctl_daemon_wait()
1486 sizeof(request->idr_conf)); in iscsi_ioctl_daemon_wait()
1489 if (freebsd13) { in iscsi_ioctl_daemon_wait()
1493 error = icl_limits(is->is_conf.isc_offload, in iscsi_ioctl_daemon_wait()
1494 is->is_conf.isc_iser, 0, &idl); in iscsi_ioctl_daemon_wait()
1497 "offload \"%s\" failed with error %d", in iscsi_ioctl_daemon_wait()
1498 is->is_conf.isc_offload, error); in iscsi_ioctl_daemon_wait()
1499 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_wait()
1503 request13->idr_limits.isl_max_recv_data_segment_length = in iscsi_ioctl_daemon_wait()
1505 request13->idr_limits.isl_max_send_data_segment_length = in iscsi_ioctl_daemon_wait()
1507 request13->idr_limits.isl_max_burst_length = in iscsi_ioctl_daemon_wait()
1509 request13->idr_limits.isl_first_burst_length = in iscsi_ioctl_daemon_wait()
1513 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_wait()
1526 sx_slock(&sc->sc_lock); in iscsi_ioctl_daemon_limits()
1531 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_limits()
1532 if (is->is_id == limits->idl_session_id) in iscsi_ioctl_daemon_limits()
1536 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_limits()
1540 error = icl_limits(is->is_conf.isc_offload, is->is_conf.isc_iser, in iscsi_ioctl_daemon_limits()
1541 limits->idl_socket, &idl); in iscsi_ioctl_daemon_limits()
1542 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_limits()
1544 ISCSI_SESSION_WARN(is, "icl_limits for offload \"%s\" " in iscsi_ioctl_daemon_limits()
1545 "failed with error %d", is->is_conf.isc_offload, error); in iscsi_ioctl_daemon_limits()
1548 limits->idl_limits.isl_max_recv_data_segment_length = in iscsi_ioctl_daemon_limits()
1550 limits->idl_limits.isl_max_send_data_segment_length = in iscsi_ioctl_daemon_limits()
1552 limits->idl_limits.isl_max_burst_length = in iscsi_ioctl_daemon_limits()
1554 limits->idl_limits.isl_first_burst_length = in iscsi_ioctl_daemon_limits()
1568 sx_slock(&sc->sc_lock); in iscsi_ioctl_daemon_handoff()
1573 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_handoff()
1574 if (is->is_id == handoff->idh_session_id) in iscsi_ioctl_daemon_handoff()
1578 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_handoff()
1582 ic = is->is_conn; in iscsi_ioctl_daemon_handoff()
1583 if (is->is_conf.isc_discovery || is->is_terminating) { in iscsi_ioctl_daemon_handoff()
1585 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_handoff()
1588 if (is->is_connected) { in iscsi_ioctl_daemon_handoff()
1597 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_handoff()
1601 strlcpy(is->is_target_alias, handoff->idh_target_alias, in iscsi_ioctl_daemon_handoff()
1602 sizeof(is->is_target_alias)); in iscsi_ioctl_daemon_handoff()
1603 is->is_tsih = handoff->idh_tsih; in iscsi_ioctl_daemon_handoff()
1604 is->is_statsn = handoff->idh_statsn; in iscsi_ioctl_daemon_handoff()
1605 is->is_protocol_level = handoff->idh_protocol_level; in iscsi_ioctl_daemon_handoff()
1606 is->is_initial_r2t = handoff->idh_initial_r2t; in iscsi_ioctl_daemon_handoff()
1607 is->is_immediate_data = handoff->idh_immediate_data; in iscsi_ioctl_daemon_handoff()
1609 ic->ic_max_recv_data_segment_length = in iscsi_ioctl_daemon_handoff()
1610 handoff->idh_max_recv_data_segment_length; in iscsi_ioctl_daemon_handoff()
1611 ic->ic_max_send_data_segment_length = in iscsi_ioctl_daemon_handoff()
1612 handoff->idh_max_send_data_segment_length; in iscsi_ioctl_daemon_handoff()
1613 is->is_max_burst_length = handoff->idh_max_burst_length; in iscsi_ioctl_daemon_handoff()
1614 is->is_first_burst_length = handoff->idh_first_burst_length; in iscsi_ioctl_daemon_handoff()
1616 if (handoff->idh_header_digest == ISCSI_DIGEST_CRC32C) in iscsi_ioctl_daemon_handoff()
1617 ic->ic_header_crc32c = true; in iscsi_ioctl_daemon_handoff()
1619 ic->ic_header_crc32c = false; in iscsi_ioctl_daemon_handoff()
1620 if (handoff->idh_data_digest == ISCSI_DIGEST_CRC32C) in iscsi_ioctl_daemon_handoff()
1621 ic->ic_data_crc32c = true; in iscsi_ioctl_daemon_handoff()
1623 ic->ic_data_crc32c = false; in iscsi_ioctl_daemon_handoff()
1624 ic->ic_maxtags = maxtags; in iscsi_ioctl_daemon_handoff()
1626 is->is_cmdsn = 0; in iscsi_ioctl_daemon_handoff()
1627 is->is_expcmdsn = 0; in iscsi_ioctl_daemon_handoff()
1628 is->is_maxcmdsn = 0; in iscsi_ioctl_daemon_handoff()
1629 is->is_waiting_for_iscsid = false; in iscsi_ioctl_daemon_handoff()
1630 is->is_login_phase = false; in iscsi_ioctl_daemon_handoff()
1631 is->is_timeout = 0; in iscsi_ioctl_daemon_handoff()
1632 is->is_ping_timeout = is->is_conf.isc_ping_timeout; in iscsi_ioctl_daemon_handoff()
1633 if (is->is_ping_timeout < 0) in iscsi_ioctl_daemon_handoff()
1634 is->is_ping_timeout = ping_timeout; in iscsi_ioctl_daemon_handoff()
1635 is->is_login_timeout = is->is_conf.isc_login_timeout; in iscsi_ioctl_daemon_handoff()
1636 if (is->is_login_timeout < 0) in iscsi_ioctl_daemon_handoff()
1637 is->is_login_timeout = login_timeout; in iscsi_ioctl_daemon_handoff()
1638 is->is_connected = true; in iscsi_ioctl_daemon_handoff()
1639 is->is_reason[0] = '\0'; in iscsi_ioctl_daemon_handoff()
1646 * use it to determine it's no longer in the Login phase. in iscsi_ioctl_daemon_handoff()
1648 error = icl_conn_handoff(ic, handoff->idh_socket); in iscsi_ioctl_daemon_handoff()
1650 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_handoff()
1655 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_handoff()
1657 if (is->is_sim != NULL) { in iscsi_ioctl_daemon_handoff()
1661 KASSERT(is->is_simq_frozen, ("reconnect without frozen simq")); in iscsi_ioctl_daemon_handoff()
1664 is->is_simq_frozen = false; in iscsi_ioctl_daemon_handoff()
1665 xpt_release_simq(is->is_sim, 1); in iscsi_ioctl_daemon_handoff()
1670 is->is_devq = cam_simq_alloc(ic->ic_maxtags); in iscsi_ioctl_daemon_handoff()
1671 if (is->is_devq == NULL) { in iscsi_ioctl_daemon_handoff()
1678 is->is_sim = cam_sim_alloc(iscsi_action, NULL, "iscsi", in iscsi_ioctl_daemon_handoff()
1679 is, is->is_id /* unit */, &is->is_lock, in iscsi_ioctl_daemon_handoff()
1680 1, ic->ic_maxtags, is->is_devq); in iscsi_ioctl_daemon_handoff()
1681 if (is->is_sim == NULL) { in iscsi_ioctl_daemon_handoff()
1684 cam_simq_free(is->is_devq); in iscsi_ioctl_daemon_handoff()
1689 if (xpt_bus_register(is->is_sim, NULL, 0) != 0) { in iscsi_ioctl_daemon_handoff()
1696 error = xpt_create_path(&is->is_path, /*periph*/NULL, in iscsi_ioctl_daemon_handoff()
1697 cam_sim_path(is->is_sim), CAM_TARGET_WILDCARD, in iscsi_ioctl_daemon_handoff()
1717 sx_slock(&sc->sc_lock); in iscsi_ioctl_daemon_fail()
1719 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_fail()
1720 if (is->is_id == fail->idf_session_id) in iscsi_ioctl_daemon_fail()
1724 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_fail()
1728 ISCSI_SESSION_DEBUG(is, "iscsid(8) failed: %s", in iscsi_ioctl_daemon_fail()
1729 fail->idf_reason); in iscsi_ioctl_daemon_fail()
1730 strlcpy(is->is_reason, fail->idf_reason, sizeof(is->is_reason)); in iscsi_ioctl_daemon_fail()
1731 //is->is_waiting_for_iscsid = false; in iscsi_ioctl_daemon_fail()
1732 //is->is_login_phase = true; in iscsi_ioctl_daemon_fail()
1735 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_fail()
1749 sx_slock(&sc->sc_lock); in iscsi_ioctl_daemon_connect()
1750 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_connect()
1751 if (is->is_id == idc->idc_session_id) in iscsi_ioctl_daemon_connect()
1755 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_connect()
1758 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_connect()
1760 if (idc->idc_from_addrlen > 0) { in iscsi_ioctl_daemon_connect()
1761 error = getsockaddr(&from_sa, (void *)idc->idc_from_addr, idc->idc_from_addrlen); in iscsi_ioctl_daemon_connect()
1770 error = getsockaddr(&to_sa, (void *)idc->idc_to_addr, idc->idc_to_addrlen); in iscsi_ioctl_daemon_connect()
1779 is->is_statsn = 0; in iscsi_ioctl_daemon_connect()
1780 is->is_cmdsn = 0; in iscsi_ioctl_daemon_connect()
1781 is->is_expcmdsn = 0; in iscsi_ioctl_daemon_connect()
1782 is->is_maxcmdsn = 0; in iscsi_ioctl_daemon_connect()
1783 is->is_waiting_for_iscsid = false; in iscsi_ioctl_daemon_connect()
1784 is->is_login_phase = true; in iscsi_ioctl_daemon_connect()
1785 is->is_timeout = 0; in iscsi_ioctl_daemon_connect()
1788 error = icl_conn_connect(is->is_conn, idc->idc_domain, in iscsi_ioctl_daemon_connect()
1789 idc->idc_socktype, idc->idc_protocol, from_sa, to_sa); in iscsi_ioctl_daemon_connect()
1796 is->is_conn->ic_header_crc32c = false; in iscsi_ioctl_daemon_connect()
1797 is->is_conn->ic_data_crc32c = false; in iscsi_ioctl_daemon_connect()
1812 sx_slock(&sc->sc_lock); in iscsi_ioctl_daemon_send()
1813 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_send()
1814 if (is->is_id == ids->ids_session_id) in iscsi_ioctl_daemon_send()
1818 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_send()
1821 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_send()
1823 if (is->is_login_phase == false) in iscsi_ioctl_daemon_send()
1826 if (is->is_terminating || is->is_reconnecting) in iscsi_ioctl_daemon_send()
1829 datalen = ids->ids_data_segment_len; in iscsi_ioctl_daemon_send()
1830 if (datalen > is->is_conn->ic_max_send_data_segment_length) in iscsi_ioctl_daemon_send()
1834 error = copyin(ids->ids_data_segment, data, datalen); in iscsi_ioctl_daemon_send()
1841 ip = icl_pdu_new(is->is_conn, M_WAITOK); in iscsi_ioctl_daemon_send()
1842 memcpy(ip->ip_bhs, ids->ids_bhs, sizeof(*ip->ip_bhs)); in iscsi_ioctl_daemon_send()
1862 sx_slock(&sc->sc_lock); in iscsi_ioctl_daemon_receive()
1863 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_daemon_receive()
1864 if (is->is_id == idr->idr_session_id) in iscsi_ioctl_daemon_receive()
1868 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_receive()
1871 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_daemon_receive()
1873 if (is->is_login_phase == false) in iscsi_ioctl_daemon_receive()
1877 while (is->is_login_pdu == NULL && in iscsi_ioctl_daemon_receive()
1878 is->is_terminating == false && in iscsi_ioctl_daemon_receive()
1879 is->is_reconnecting == false) { in iscsi_ioctl_daemon_receive()
1880 error = cv_wait_sig(&is->is_login_cv, &is->is_lock); in iscsi_ioctl_daemon_receive()
1886 if (is->is_terminating || is->is_reconnecting) { in iscsi_ioctl_daemon_receive()
1890 ip = is->is_login_pdu; in iscsi_ioctl_daemon_receive()
1891 is->is_login_pdu = NULL; in iscsi_ioctl_daemon_receive()
1894 if (ip->ip_data_len > idr->idr_data_segment_len) { in iscsi_ioctl_daemon_receive()
1899 error = copyout(ip->ip_bhs, idr->idr_bhs, sizeof(*ip->ip_bhs)); in iscsi_ioctl_daemon_receive()
1900 if (error == 0 && ip->ip_data_len > 0) { in iscsi_ioctl_daemon_receive()
1901 data = malloc(ip->ip_data_len, M_ISCSI, M_WAITOK); in iscsi_ioctl_daemon_receive()
1902 icl_pdu_get_data(ip, 0, data, ip->ip_data_len); in iscsi_ioctl_daemon_receive()
1903 error = copyout(data, idr->idr_data_segment, ip->ip_data_len); in iscsi_ioctl_daemon_receive()
1917 * Just make sure all the fields are null-terminated. in iscsi_sanitize_session_conf()
1923 isc->isc_initiator[ISCSI_NAME_LEN - 1] = '\0'; in iscsi_sanitize_session_conf()
1924 isc->isc_initiator_addr[ISCSI_ADDR_LEN - 1] = '\0'; in iscsi_sanitize_session_conf()
1925 isc->isc_initiator_alias[ISCSI_ALIAS_LEN - 1] = '\0'; in iscsi_sanitize_session_conf()
1926 isc->isc_target[ISCSI_NAME_LEN - 1] = '\0'; in iscsi_sanitize_session_conf()
1927 isc->isc_target_addr[ISCSI_ADDR_LEN - 1] = '\0'; in iscsi_sanitize_session_conf()
1928 isc->isc_user[ISCSI_NAME_LEN - 1] = '\0'; in iscsi_sanitize_session_conf()
1929 isc->isc_secret[ISCSI_SECRET_LEN - 1] = '\0'; in iscsi_sanitize_session_conf()
1930 isc->isc_mutual_user[ISCSI_NAME_LEN - 1] = '\0'; in iscsi_sanitize_session_conf()
1931 isc->isc_mutual_secret[ISCSI_SECRET_LEN - 1] = '\0'; in iscsi_sanitize_session_conf()
1938 if (isc->isc_initiator[0] == '\0') { in iscsi_valid_session_conf()
1943 if (isc->isc_target_addr[0] == '\0') { in iscsi_valid_session_conf()
1948 if (isc->isc_discovery != 0 && isc->isc_target[0] != 0) { in iscsi_valid_session_conf()
1949 ISCSI_DEBUG("non-empty isc_target for discovery session"); in iscsi_valid_session_conf()
1953 if (isc->isc_discovery == 0 && isc->isc_target[0] == 0) { in iscsi_valid_session_conf()
1954 ISCSI_DEBUG("empty isc_target for non-discovery session"); in iscsi_valid_session_conf()
1969 iscsi_sanitize_session_conf(&isa->isa_conf); in iscsi_ioctl_session_add()
1970 if (iscsi_valid_session_conf(&isa->isa_conf) == false) in iscsi_ioctl_session_add()
1974 memcpy(&is->is_conf, &isa->isa_conf, sizeof(is->is_conf)); in iscsi_ioctl_session_add()
1976 sx_xlock(&sc->sc_lock); in iscsi_ioctl_session_add()
1981 TAILQ_FOREACH(is2, &sc->sc_sessions, is_next) { in iscsi_ioctl_session_add()
1982 if (!!is->is_conf.isc_discovery != in iscsi_ioctl_session_add()
1983 !!is2->is_conf.isc_discovery) in iscsi_ioctl_session_add()
1986 if (strcmp(is->is_conf.isc_target_addr, in iscsi_ioctl_session_add()
1987 is2->is_conf.isc_target_addr) != 0) in iscsi_ioctl_session_add()
1990 if (is->is_conf.isc_discovery == 0 && in iscsi_ioctl_session_add()
1991 strcmp(is->is_conf.isc_target, in iscsi_ioctl_session_add()
1992 is2->is_conf.isc_target) != 0) in iscsi_ioctl_session_add()
1995 sx_xunlock(&sc->sc_lock); in iscsi_ioctl_session_add()
2000 is->is_conn = icl_new_conn(is->is_conf.isc_offload, in iscsi_ioctl_session_add()
2001 is->is_conf.isc_iser, "iscsi", &is->is_lock); in iscsi_ioctl_session_add()
2002 if (is->is_conn == NULL) { in iscsi_ioctl_session_add()
2003 sx_xunlock(&sc->sc_lock); in iscsi_ioctl_session_add()
2007 is->is_conn->ic_receive = iscsi_receive_callback; in iscsi_ioctl_session_add()
2008 is->is_conn->ic_error = iscsi_error_callback; in iscsi_ioctl_session_add()
2009 is->is_conn->ic_prv0 = is; in iscsi_ioctl_session_add()
2010 TAILQ_INIT(&is->is_outstanding); in iscsi_ioctl_session_add()
2011 STAILQ_INIT(&is->is_postponed); in iscsi_ioctl_session_add()
2012 mtx_init(&is->is_lock, "iscsi_lock", NULL, MTX_DEF); in iscsi_ioctl_session_add()
2013 cv_init(&is->is_maintenance_cv, "iscsi_mt"); in iscsi_ioctl_session_add()
2015 cv_init(&is->is_login_cv, "iscsi_login"); in iscsi_ioctl_session_add()
2025 is->is_conn->ic_max_recv_data_segment_length = 8192; in iscsi_ioctl_session_add()
2026 is->is_conn->ic_max_send_data_segment_length = 8192; in iscsi_ioctl_session_add()
2027 is->is_max_burst_length = 262144; in iscsi_ioctl_session_add()
2028 is->is_first_burst_length = 65536; in iscsi_ioctl_session_add()
2030 is->is_softc = sc; in iscsi_ioctl_session_add()
2031 sc->sc_last_session_id++; in iscsi_ioctl_session_add()
2032 is->is_id = sc->sc_last_session_id; in iscsi_ioctl_session_add()
2033 is->is_isid[0] = 0x80; /* RFC 3720, 10.12.5: 10b, "Random" ISID. */ in iscsi_ioctl_session_add()
2034 arc4rand(&is->is_isid[1], 5, 0); in iscsi_ioctl_session_add()
2035 is->is_tsih = 0; in iscsi_ioctl_session_add()
2036 callout_init(&is->is_callout, 1); in iscsi_ioctl_session_add()
2041 sx_xunlock(&sc->sc_lock); in iscsi_ioctl_session_add()
2044 is->is_ping_timeout = is->is_conf.isc_ping_timeout; in iscsi_ioctl_session_add()
2045 if (is->is_ping_timeout < 0) in iscsi_ioctl_session_add()
2046 is->is_ping_timeout = ping_timeout; in iscsi_ioctl_session_add()
2047 is->is_login_timeout = is->is_conf.isc_login_timeout; in iscsi_ioctl_session_add()
2048 if (is->is_login_timeout < 0) in iscsi_ioctl_session_add()
2049 is->is_login_timeout = login_timeout; in iscsi_ioctl_session_add()
2053 callout_reset_sbt(&is->is_callout, sbt, pr, iscsi_callout, is, 0); in iscsi_ioctl_session_add()
2054 TAILQ_INSERT_TAIL(&sc->sc_sessions, is, is_next); in iscsi_ioctl_session_add()
2058 * Don't notify iscsid(8) if the session is disabled and it's not in iscsi_ioctl_session_add()
2061 if (is->is_conf.isc_enable == 0 && is->is_conf.isc_discovery == 0) { in iscsi_ioctl_session_add()
2063 sx_xunlock(&sc->sc_lock); in iscsi_ioctl_session_add()
2067 is->is_waiting_for_iscsid = true; in iscsi_ioctl_session_add()
2068 strlcpy(is->is_reason, "Waiting for iscsid(8)", sizeof(is->is_reason)); in iscsi_ioctl_session_add()
2070 cv_signal(&sc->sc_cv); in iscsi_ioctl_session_add()
2071 sx_xunlock(&sc->sc_lock); in iscsi_ioctl_session_add()
2082 if (c2->isc_target[0] != '\0' && in iscsi_session_conf_matches()
2083 strcmp(c1->isc_target, c2->isc_target) != 0) in iscsi_session_conf_matches()
2085 if (c2->isc_target_addr[0] != '\0' && in iscsi_session_conf_matches()
2086 strcmp(c1->isc_target_addr, c2->isc_target_addr) != 0) in iscsi_session_conf_matches()
2098 iscsi_sanitize_session_conf(&isr->isr_conf); in iscsi_ioctl_session_remove()
2100 sx_xlock(&sc->sc_lock); in iscsi_ioctl_session_remove()
2101 TAILQ_FOREACH_SAFE(is, &sc->sc_sessions, is_next, tmp) { in iscsi_ioctl_session_remove()
2103 if (iscsi_session_conf_matches(is->is_id, &is->is_conf, in iscsi_ioctl_session_remove()
2104 isr->isr_session_id, &isr->isr_conf)) { in iscsi_ioctl_session_remove()
2111 sx_xunlock(&sc->sc_lock); in iscsi_ioctl_session_remove()
2127 sx_slock(&sc->sc_lock); in iscsi_ioctl_session_list()
2128 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_session_list()
2129 if (i >= isl->isl_nentries) { in iscsi_ioctl_session_list()
2130 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_session_list()
2134 memcpy(&iss.iss_conf, &is->is_conf, sizeof(iss.iss_conf)); in iscsi_ioctl_session_list()
2135 iss.iss_id = is->is_id; in iscsi_ioctl_session_list()
2136 strlcpy(iss.iss_target_alias, is->is_target_alias, sizeof(iss.iss_target_alias)); in iscsi_ioctl_session_list()
2137 strlcpy(iss.iss_reason, is->is_reason, sizeof(iss.iss_reason)); in iscsi_ioctl_session_list()
2138 strlcpy(iss.iss_offload, is->is_conn->ic_offload, sizeof(iss.iss_offload)); in iscsi_ioctl_session_list()
2140 if (is->is_conn->ic_header_crc32c) in iscsi_ioctl_session_list()
2145 if (is->is_conn->ic_data_crc32c) in iscsi_ioctl_session_list()
2151 is->is_conn->ic_max_send_data_segment_length; in iscsi_ioctl_session_list()
2153 is->is_conn->ic_max_recv_data_segment_length; in iscsi_ioctl_session_list()
2154 iss.iss_max_burst_length = is->is_max_burst_length; in iscsi_ioctl_session_list()
2155 iss.iss_first_burst_length = is->is_first_burst_length; in iscsi_ioctl_session_list()
2156 iss.iss_immediate_data = is->is_immediate_data; in iscsi_ioctl_session_list()
2157 iss.iss_connected = is->is_connected; in iscsi_ioctl_session_list()
2159 error = copyout(&iss, isl->isl_pstates + i, sizeof(iss)); in iscsi_ioctl_session_list()
2161 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_session_list()
2166 sx_sunlock(&sc->sc_lock); in iscsi_ioctl_session_list()
2168 isl->isl_nentries = i; in iscsi_ioctl_session_list()
2180 iscsi_sanitize_session_conf(&ism->ism_conf); in iscsi_ioctl_session_modify()
2181 if (iscsi_valid_session_conf(&ism->ism_conf) == false) in iscsi_ioctl_session_modify()
2184 sx_xlock(&sc->sc_lock); in iscsi_ioctl_session_modify()
2185 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_ioctl_session_modify()
2187 if (is->is_id == ism->ism_session_id) { in iscsi_ioctl_session_modify()
2194 sx_xunlock(&sc->sc_lock); in iscsi_ioctl_session_modify()
2201 TAILQ_FOREACH(is2, &sc->sc_sessions, is_next) { in iscsi_ioctl_session_modify()
2205 if (!!ism->ism_conf.isc_discovery != in iscsi_ioctl_session_modify()
2206 !!is2->is_conf.isc_discovery) in iscsi_ioctl_session_modify()
2209 if (strcmp(ism->ism_conf.isc_target_addr, in iscsi_ioctl_session_modify()
2210 is2->is_conf.isc_target_addr) != 0) in iscsi_ioctl_session_modify()
2213 if (ism->ism_conf.isc_discovery == 0 && in iscsi_ioctl_session_modify()
2214 strcmp(ism->ism_conf.isc_target, in iscsi_ioctl_session_modify()
2215 is2->is_conf.isc_target) != 0) in iscsi_ioctl_session_modify()
2219 sx_xunlock(&sc->sc_lock); in iscsi_ioctl_session_modify()
2223 sx_xunlock(&sc->sc_lock); in iscsi_ioctl_session_modify()
2225 memcpy(&is->is_conf, &ism->ism_conf, sizeof(is->is_conf)); in iscsi_ioctl_session_modify()
2239 sc = dev->si_drv1; in iscsi_ioctl()
2294 TAILQ_FOREACH(io, &is->is_outstanding, io_next) { in iscsi_outstanding_find()
2295 if (io->io_initiator_task_tag == initiator_task_tag) in iscsi_outstanding_find()
2308 TAILQ_FOREACH(io, &is->is_outstanding, io_next) { in iscsi_outstanding_find_ccb()
2309 if (io->io_ccb == ccb) in iscsi_outstanding_find_ccb()
2331 error = icl_conn_task_setup(is->is_conn, request, &ccb->csio, in iscsi_outstanding_add()
2332 initiator_task_tagp, &io->io_icl_prv); in iscsi_outstanding_add()
2343 io->io_initiator_task_tag = *initiator_task_tagp; in iscsi_outstanding_add()
2344 io->io_ccb = ccb; in iscsi_outstanding_add()
2345 TAILQ_INSERT_TAIL(&is->is_outstanding, io, io_next); in iscsi_outstanding_add()
2355 icl_conn_task_done(is->is_conn, io->io_icl_prv); in iscsi_outstanding_remove()
2356 TAILQ_REMOVE(&is->is_outstanding, io, io_next); in iscsi_outstanding_remove()
2365 struct ccb_abort *cab = &ccb->cab; in iscsi_action_abort()
2372 KASSERT(is->is_login_phase == false, ("%s called during Login Phase", __func__)); in iscsi_action_abort()
2374 if (is->is_login_phase) { in iscsi_action_abort()
2375 ccb->ccb_h.status = CAM_REQ_ABORTED; in iscsi_action_abort()
2381 aio = iscsi_outstanding_find_ccb(is, cab->abort_ccb); in iscsi_action_abort()
2383 ccb->ccb_h.status = CAM_REQ_CMP; in iscsi_action_abort()
2388 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_action_abort()
2390 ccb->ccb_h.status = CAM_RESRC_UNAVAIL; in iscsi_action_abort()
2395 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_abort()
2397 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_abort()
2402 ccb->ccb_h.status = CAM_RESRC_UNAVAIL; in iscsi_action_abort()
2406 io->io_referenced_task_tag = aio->io_initiator_task_tag; in iscsi_action_abort()
2408 bhstmr = (struct iscsi_bhs_task_management_request *)request->ip_bhs; in iscsi_action_abort()
2409 bhstmr->bhstmr_opcode = ISCSI_BHS_OPCODE_TASK_REQUEST; in iscsi_action_abort()
2410 bhstmr->bhstmr_function = 0x80 | BHSTMR_FUNCTION_ABORT_TASK; in iscsi_action_abort()
2411 bhstmr->bhstmr_lun = htobe64(CAM_EXTLUN_BYTE_SWIZZLE(ccb->ccb_h.target_lun)); in iscsi_action_abort()
2412 bhstmr->bhstmr_initiator_task_tag = initiator_task_tag; in iscsi_action_abort()
2413 bhstmr->bhstmr_referenced_task_tag = aio->io_initiator_task_tag; in iscsi_action_abort()
2432 KASSERT(is->is_login_phase == false, ("%s called during Login Phase", __func__)); in iscsi_action_scsiio()
2434 if (is->is_login_phase) { in iscsi_action_scsiio()
2436 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in iscsi_action_scsiio()
2437 xpt_freeze_devq(ccb->ccb_h.path, 1); in iscsi_action_scsiio()
2440 ccb->ccb_h.status = CAM_REQ_ABORTED | CAM_DEV_QFRZN; in iscsi_action_scsiio()
2446 request = icl_pdu_new(is->is_conn, M_NOWAIT); in iscsi_action_scsiio()
2448 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in iscsi_action_scsiio()
2449 xpt_freeze_devq(ccb->ccb_h.path, 1); in iscsi_action_scsiio()
2452 ccb->ccb_h.status = CAM_RESRC_UNAVAIL | CAM_DEV_QFRZN; in iscsi_action_scsiio()
2457 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_scsiio()
2459 initiator_task_tag = is->is_initiator_task_tag++; in iscsi_action_scsiio()
2464 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in iscsi_action_scsiio()
2465 xpt_freeze_devq(ccb->ccb_h.path, 1); in iscsi_action_scsiio()
2468 ccb->ccb_h.status = CAM_RESRC_UNAVAIL | CAM_DEV_QFRZN; in iscsi_action_scsiio()
2473 csio = &ccb->csio; in iscsi_action_scsiio()
2474 bhssc = (struct iscsi_bhs_scsi_command *)request->ip_bhs; in iscsi_action_scsiio()
2475 bhssc->bhssc_opcode = ISCSI_BHS_OPCODE_SCSI_COMMAND; in iscsi_action_scsiio()
2476 bhssc->bhssc_flags |= BHSSC_FLAGS_F; in iscsi_action_scsiio()
2477 switch (csio->ccb_h.flags & CAM_DIR_MASK) { in iscsi_action_scsiio()
2479 bhssc->bhssc_flags |= BHSSC_FLAGS_R; in iscsi_action_scsiio()
2482 bhssc->bhssc_flags |= BHSSC_FLAGS_W; in iscsi_action_scsiio()
2486 if ((ccb->ccb_h.flags & CAM_TAG_ACTION_VALID) != 0) { in iscsi_action_scsiio()
2487 switch (csio->tag_action) { in iscsi_action_scsiio()
2489 bhssc->bhssc_flags |= BHSSC_FLAGS_ATTR_HOQ; in iscsi_action_scsiio()
2492 bhssc->bhssc_flags |= BHSSC_FLAGS_ATTR_ORDERED; in iscsi_action_scsiio()
2495 bhssc->bhssc_flags |= BHSSC_FLAGS_ATTR_ACA; in iscsi_action_scsiio()
2499 bhssc->bhssc_flags |= BHSSC_FLAGS_ATTR_SIMPLE; in iscsi_action_scsiio()
2503 bhssc->bhssc_flags |= BHSSC_FLAGS_ATTR_UNTAGGED; in iscsi_action_scsiio()
2505 if (is->is_protocol_level >= 2) { in iscsi_action_scsiio()
2506 bhssc->bhssc_pri = (csio->priority << BHSSC_PRI_SHIFT) & in iscsi_action_scsiio()
2510 bhssc->bhssc_lun = htobe64(CAM_EXTLUN_BYTE_SWIZZLE(ccb->ccb_h.target_lun)); in iscsi_action_scsiio()
2511 bhssc->bhssc_initiator_task_tag = initiator_task_tag; in iscsi_action_scsiio()
2512 bhssc->bhssc_expected_data_transfer_length = htonl(csio->dxfer_len); in iscsi_action_scsiio()
2513 KASSERT(csio->cdb_len <= sizeof(bhssc->bhssc_cdb), in iscsi_action_scsiio()
2514 ("unsupported CDB size %zd", (size_t)csio->cdb_len)); in iscsi_action_scsiio()
2516 if (csio->ccb_h.flags & CAM_CDB_POINTER) in iscsi_action_scsiio()
2517 memcpy(&bhssc->bhssc_cdb, csio->cdb_io.cdb_ptr, csio->cdb_len); in iscsi_action_scsiio()
2519 memcpy(&bhssc->bhssc_cdb, csio->cdb_io.cdb_bytes, csio->cdb_len); in iscsi_action_scsiio()
2521 if (is->is_immediate_data && in iscsi_action_scsiio()
2522 (csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) { in iscsi_action_scsiio()
2523 len = csio->dxfer_len; in iscsi_action_scsiio()
2525 if (len > is->is_first_burst_length) { in iscsi_action_scsiio()
2526 ISCSI_SESSION_DEBUG(is, "len %zd -> %d", len, is->is_first_burst_length); in iscsi_action_scsiio()
2527 len = is->is_first_burst_length; in iscsi_action_scsiio()
2529 if (len > is->is_conn->ic_max_send_data_segment_length) { in iscsi_action_scsiio()
2530 ISCSI_SESSION_DEBUG(is, "len %zd -> %d", len, in iscsi_action_scsiio()
2531 is->is_conn->ic_max_send_data_segment_length); in iscsi_action_scsiio()
2532 len = is->is_conn->ic_max_send_data_segment_length; in iscsi_action_scsiio()
2540 if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) { in iscsi_action_scsiio()
2541 xpt_freeze_devq(ccb->ccb_h.path, 1); in iscsi_action_scsiio()
2544 ccb->ccb_h.status = CAM_RESRC_UNAVAIL | CAM_DEV_QFRZN; in iscsi_action_scsiio()
2561 if (is->is_terminating || in iscsi_action()
2562 (is->is_connected == false && fail_on_disconnection)) { in iscsi_action()
2563 ccb->ccb_h.status = CAM_DEV_NOT_THERE; in iscsi_action()
2571 if (is->is_simq_frozen == true) { in iscsi_action()
2572 ccb->ccb_h.status &= ~(CAM_SIM_QUEUED | CAM_STATUS_MASK); in iscsi_action()
2573 ccb->ccb_h.status |= CAM_REQUEUE_REQ; in iscsi_action()
2574 /* Don't freeze the devq - the SIM queue is already frozen. */ in iscsi_action()
2579 switch (ccb->ccb_h.func_code) { in iscsi_action()
2582 struct ccb_pathinq *cpi = &ccb->cpi; in iscsi_action()
2584 cpi->version_num = 1; in iscsi_action()
2585 cpi->hba_inquiry = PI_TAG_ABLE; in iscsi_action()
2586 cpi->target_sprt = 0; in iscsi_action()
2587 cpi->hba_misc = PIM_EXTLUNS; in iscsi_action()
2592 if (is->is_conn == NULL) in iscsi_action()
2594 else if (is->is_conn->ic_unmapped) in iscsi_action()
2595 cpi->hba_misc |= PIM_UNMAPPED; in iscsi_action()
2596 cpi->hba_eng_cnt = 0; in iscsi_action()
2597 cpi->max_target = 0; in iscsi_action()
2603 cpi->max_lun = 255; in iscsi_action()
2604 cpi->initiator_id = ~0; in iscsi_action()
2605 strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); in iscsi_action()
2606 strlcpy(cpi->hba_vid, "iSCSI", HBA_IDLEN); in iscsi_action()
2607 strlcpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); in iscsi_action()
2608 cpi->unit_number = cam_sim_unit(sim); in iscsi_action()
2609 cpi->bus_id = cam_sim_bus(sim); in iscsi_action()
2610 cpi->base_transfer_speed = 150000; /* XXX */ in iscsi_action()
2611 cpi->transport = XPORT_ISCSI; in iscsi_action()
2612 cpi->transport_version = 0; in iscsi_action()
2613 cpi->protocol = PROTO_SCSI; in iscsi_action()
2614 cpi->protocol_version = SCSI_REV_SPC3; in iscsi_action()
2615 cpi->maxio = maxphys; in iscsi_action()
2616 cpi->ccb_h.status = CAM_REQ_CMP; in iscsi_action()
2624 cts = &ccb->cts; in iscsi_action()
2625 scsi = &cts->proto_specific.scsi; in iscsi_action()
2627 cts->protocol = PROTO_SCSI; in iscsi_action()
2628 cts->protocol_version = SCSI_REV_SPC3; in iscsi_action()
2629 cts->transport = XPORT_ISCSI; in iscsi_action()
2630 cts->transport_version = 0; in iscsi_action()
2631 scsi->valid = CTS_SCSI_VALID_TQ; in iscsi_action()
2632 scsi->flags = CTS_SCSI_FLAGS_TAG_ENB; in iscsi_action()
2633 cts->ccb_h.status = CAM_REQ_CMP; in iscsi_action()
2637 cam_calc_geometry(&ccb->ccg, /*extended*/1); in iscsi_action()
2638 ccb->ccb_h.status = CAM_REQ_CMP; in iscsi_action()
2642 * XXX: What's the point? in iscsi_action()
2647 ccb->ccb_h.status = CAM_REQ_CMP; in iscsi_action()
2658 ISCSI_SESSION_DEBUG(is, "got unsupported code 0x%x", ccb->ccb_h.func_code); in iscsi_action()
2660 ccb->ccb_h.status = CAM_FUNC_NOTAVAIL; in iscsi_action()
2671 sx_slock(&sc->sc_lock); in iscsi_terminate_sessions()
2672 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) in iscsi_terminate_sessions()
2674 while(!TAILQ_EMPTY(&sc->sc_sessions)) { in iscsi_terminate_sessions()
2676 cv_wait(&sc->sc_cv, &sc->sc_lock); in iscsi_terminate_sessions()
2679 sx_sunlock(&sc->sc_lock); in iscsi_terminate_sessions()
2704 sx_slock(&sc->sc_lock); in iscsi_shutdown_pre()
2705 TAILQ_FOREACH(is, &sc->sc_sessions, is_next) { in iscsi_shutdown_pre()
2707 if (!is->is_connected) { in iscsi_shutdown_pre()
2713 sx_sunlock(&sc->sc_lock); in iscsi_shutdown_pre()
2732 sx_init(&sc->sc_lock, "iscsi"); in iscsi_load()
2733 TAILQ_INIT(&sc->sc_sessions); in iscsi_load()
2734 cv_init(&sc->sc_cv, "iscsi_cv"); in iscsi_load()
2740 error = make_dev_p(MAKEDEV_CHECKNAME, &sc->sc_cdev, &iscsi_cdevsw, in iscsi_load()
2746 sc->sc_cdev->si_drv1 = sc; in iscsi_load()
2748 sc->sc_shutdown_pre_eh = EVENTHANDLER_REGISTER(shutdown_pre_sync, in iscsi_load()
2752 * CAM shutdown - otherwise when rebooting with an iSCSI session that is in iscsi_load()
2756 sc->sc_shutdown_post_eh = EVENTHANDLER_REGISTER(shutdown_post_sync, in iscsi_load()
2757 iscsi_shutdown_post_sync, sc, SHUTDOWN_PRI_DEFAULT - 1); in iscsi_load()
2767 sx_xlock(&sc->sc_lock); in iscsi_unload()
2768 sc->sc_unloading = true; in iscsi_unload()
2769 cv_signal(&sc->sc_cv); in iscsi_unload()
2770 sx_xunlock(&sc->sc_lock); in iscsi_unload()
2772 if (sc->sc_cdev != NULL) { in iscsi_unload()
2774 destroy_dev(sc->sc_cdev); in iscsi_unload()
2778 if (sc->sc_shutdown_pre_eh != NULL) in iscsi_unload()
2779 EVENTHANDLER_DEREGISTER(shutdown_pre_sync, sc->sc_shutdown_pre_eh); in iscsi_unload()
2780 if (sc->sc_shutdown_post_eh != NULL) in iscsi_unload()
2781 EVENTHANDLER_DEREGISTER(shutdown_post_sync, sc->sc_shutdown_post_eh); in iscsi_unload()
2786 sx_destroy(&sc->sc_lock); in iscsi_unload()
2787 cv_destroy(&sc->sc_cv); in iscsi_unload()
2795 sx_slock(&sc->sc_lock); in iscsi_quiesce()
2796 if (!TAILQ_EMPTY(&sc->sc_sessions)) { in iscsi_quiesce()
2797 sx_sunlock(&sc->sc_lock); in iscsi_quiesce()
2800 sx_sunlock(&sc->sc_lock); in iscsi_quiesce()