Lines Matching full:conn

37 static struct iscsi_login *iscsi_login_init_conn(struct iscsit_conn *conn)  in iscsi_login_init_conn()  argument
46 conn->login = login; in iscsi_login_init_conn()
47 login->conn = conn; in iscsi_login_init_conn()
62 conn->conn_login = login; in iscsi_login_init_conn()
74 struct iscsit_conn *conn, in iscsi_login_check_initiator_version() argument
82 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, in iscsi_login_check_initiator_version()
90 int iscsi_check_for_session_reinstatement(struct iscsit_conn *conn) in iscsi_check_for_session_reinstatement() argument
94 struct iscsi_portal_group *tpg = conn->tpg; in iscsi_check_for_session_reinstatement()
100 INITIATORNAME, conn->param_list); in iscsi_check_for_session_reinstatement()
102 SESSIONTYPE, conn->param_list); in iscsi_check_for_session_reinstatement()
104 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, in iscsi_check_for_session_reinstatement()
124 if (!memcmp(sess_p->isid, conn->sess->isid, 6) && in iscsi_check_for_session_reinstatement()
167 struct iscsit_conn *conn, in iscsi_login_set_conn_values() argument
171 conn->sess = sess; in iscsi_login_set_conn_values()
172 conn->cid = be16_to_cpu(cid); in iscsi_login_set_conn_values()
177 ret = get_random_bytes_wait(&conn->stat_sn, sizeof(u32)); in iscsi_login_set_conn_values()
182 conn->auth_id = iscsit_global->auth_id++; in iscsi_login_set_conn_values()
188 struct iscsit_conn *conn, in iscsi_change_param_sprintf() argument
200 if (iscsi_change_param_value(buf, conn->param_list, 0) < 0) { in iscsi_change_param_sprintf()
201 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, in iscsi_change_param_sprintf()
215 struct iscsit_conn *conn, in iscsi_login_zero_tsih_s1() argument
224 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, in iscsi_login_zero_tsih_s1()
230 if (iscsi_login_set_conn_values(sess, conn, pdu->cid)) in iscsi_login_zero_tsih_s1()
257 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, in iscsi_login_zero_tsih_s1()
272 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, in iscsi_login_zero_tsih_s1()
281 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, in iscsi_login_zero_tsih_s1()
294 conn->sess = NULL; in iscsi_login_zero_tsih_s1()
299 struct iscsit_conn *conn) in iscsi_login_zero_tsih_s2() argument
302 struct iscsit_session *sess = conn->sess; in iscsi_login_zero_tsih_s2()
306 sess->tpg = conn->tpg; in iscsi_login_zero_tsih_s2()
319 if (iscsi_copy_param_list(&conn->param_list, in iscsi_login_zero_tsih_s2()
320 conn->tpg->param_list, 1) < 0) { in iscsi_login_zero_tsih_s2()
321 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, in iscsi_login_zero_tsih_s2()
326 if (conn->conn_transport->transport_type == ISCSI_INFINIBAND) in iscsi_login_zero_tsih_s2()
329 iscsi_set_keys_to_negotiate(conn->param_list, iser); in iscsi_login_zero_tsih_s2()
333 conn->param_list); in iscsi_login_zero_tsih_s2()
341 param = iscsi_find_param_from_key(AUTHMETHOD, conn->param_list); in iscsi_login_zero_tsih_s2()
343 if (!iscsi_conn_auth_required(conn)) in iscsi_login_zero_tsih_s2()
344 if (iscsi_change_param_sprintf(conn, "AuthMethod=%s", in iscsi_login_zero_tsih_s2()
356 if (iscsi_change_param_sprintf(conn, "TargetPortalGroupTag=%hu", sess->tpg->tpgt)) in iscsi_login_zero_tsih_s2()
364 if (iscsi_change_param_sprintf(conn, "ErrorRecoveryLevel=%d", na->default_erl)) in iscsi_login_zero_tsih_s2()
375 if (iscsi_change_param_sprintf(conn, "RDMAExtensions=Yes")) in iscsi_login_zero_tsih_s2()
383 conn->param_list); in iscsi_login_zero_tsih_s2()
385 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, in iscsi_login_zero_tsih_s2()
391 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, in iscsi_login_zero_tsih_s2()
407 if (iscsi_change_param_sprintf(conn, "MaxRecvDataSegmentLength=%lu\n", mrdsl)) in iscsi_login_zero_tsih_s2()
418 if (iscsi_change_param_sprintf(conn, "ImmediateData=No")) in iscsi_login_zero_tsih_s2()
421 if (iscsi_change_param_sprintf(conn, "InitialR2T=Yes")) in iscsi_login_zero_tsih_s2()
433 struct iscsit_conn *conn, in iscsi_login_non_zero_tsih_s1() argument
438 return iscsi_login_set_conn_values(NULL, conn, pdu->cid); in iscsi_login_non_zero_tsih_s1()
445 struct iscsit_conn *conn, in iscsi_login_non_zero_tsih_s2() argument
448 struct iscsi_portal_group *tpg = conn->tpg; in iscsi_login_non_zero_tsih_s2()
481 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, in iscsi_login_non_zero_tsih_s2()
495 if (iscsi_login_set_conn_values(sess, conn, pdu->cid) < 0 || in iscsi_login_non_zero_tsih_s2()
496 iscsi_copy_param_list(&conn->param_list, in iscsi_login_non_zero_tsih_s2()
497 conn->tpg->param_list, 0) < 0) { in iscsi_login_non_zero_tsih_s2()
498 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, in iscsi_login_non_zero_tsih_s2()
503 if (conn->conn_transport->transport_type == ISCSI_INFINIBAND) in iscsi_login_non_zero_tsih_s2()
506 iscsi_set_keys_to_negotiate(conn->param_list, iser); in iscsi_login_non_zero_tsih_s2()
514 if (iscsi_change_param_sprintf(conn, "TargetPortalGroupTag=%hu", sess->tpg->tpgt)) in iscsi_login_non_zero_tsih_s2()
521 struct iscsit_conn *conn, in iscsi_login_post_auth_non_zero_tsih() argument
527 struct iscsit_session *sess = conn->sess; in iscsi_login_post_auth_non_zero_tsih()
561 conn->cid); in iscsi_login_post_auth_non_zero_tsih()
579 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, in iscsi_login_post_auth_non_zero_tsih()
587 static void iscsi_post_login_start_timers(struct iscsit_conn *conn) in iscsi_post_login_start_timers() argument
589 struct iscsit_session *sess = conn->sess; in iscsi_post_login_start_timers()
593 if (conn->conn_transport->transport_type == ISCSI_INFINIBAND) in iscsi_post_login_start_timers()
597 iscsit_start_nopin_timer(conn); in iscsi_post_login_start_timers()
600 int iscsit_start_kthreads(struct iscsit_conn *conn) in iscsit_start_kthreads() argument
605 conn->bitmap_id = bitmap_find_free_region(iscsit_global->ts_bitmap, in iscsit_start_kthreads()
609 if (conn->bitmap_id < 0) { in iscsit_start_kthreads()
615 conn->tx_thread = kthread_run(iscsi_target_tx_thread, conn, in iscsit_start_kthreads()
617 if (IS_ERR(conn->tx_thread)) { in iscsit_start_kthreads()
619 ret = PTR_ERR(conn->tx_thread); in iscsit_start_kthreads()
622 conn->tx_thread_active = true; in iscsit_start_kthreads()
624 conn->rx_thread = kthread_run(iscsi_target_rx_thread, conn, in iscsit_start_kthreads()
626 if (IS_ERR(conn->rx_thread)) { in iscsit_start_kthreads()
628 ret = PTR_ERR(conn->rx_thread); in iscsit_start_kthreads()
631 conn->rx_thread_active = true; in iscsit_start_kthreads()
635 send_sig(SIGINT, conn->tx_thread, 1); in iscsit_start_kthreads()
636 kthread_stop(conn->tx_thread); in iscsit_start_kthreads()
637 conn->tx_thread_active = false; in iscsit_start_kthreads()
640 bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id, in iscsit_start_kthreads()
648 struct iscsit_conn *conn, in iscsi_post_login_handler() argument
652 struct iscsit_session *sess = conn->sess; in iscsi_post_login_handler()
657 iscsit_inc_conn_usage_count(conn); in iscsi_post_login_handler()
659 iscsit_collect_login_stats(conn, ISCSI_STATUS_CLS_SUCCESS, in iscsi_post_login_handler()
663 conn->conn_state = TARG_CONN_STATE_LOGGED_IN; in iscsi_post_login_handler()
665 iscsi_set_connection_parameters(conn->conn_ops, conn->param_list); in iscsi_post_login_handler()
671 conn->param_list, 0); in iscsi_post_login_handler()
672 iscsi_release_param_list(conn->param_list); in iscsi_post_login_handler()
673 conn->param_list = NULL; in iscsi_post_login_handler()
685 " %pISpc,%hu\n", conn->cid, &conn->login_sockaddr, in iscsi_post_login_handler()
686 &conn->local_sockaddr, tpg->tpgt); in iscsi_post_login_handler()
688 list_add_tail(&conn->conn_list, &sess->sess_conn_list); in iscsi_post_login_handler()
695 iscsi_post_login_start_timers(conn); in iscsi_post_login_handler()
700 iscsit_thread_get_cpumask(conn); in iscsi_post_login_handler()
701 conn->conn_rx_reset_cpumask = 1; in iscsi_post_login_handler()
702 conn->conn_tx_reset_cpumask = 1; in iscsi_post_login_handler()
707 complete(&conn->rx_login_comp); in iscsi_post_login_handler()
708 iscsit_dec_conn_usage_count(conn); in iscsi_post_login_handler()
719 iscsi_set_session_parameters(sess->sess_ops, conn->param_list, 1); in iscsi_post_login_handler()
720 iscsi_release_param_list(conn->param_list); in iscsi_post_login_handler()
721 conn->param_list = NULL; in iscsi_post_login_handler()
732 conn->cid, &conn->login_sockaddr, &conn->local_sockaddr, in iscsi_post_login_handler()
736 list_add_tail(&conn->conn_list, &sess->sess_conn_list); in iscsi_post_login_handler()
757 iscsi_post_login_start_timers(conn); in iscsi_post_login_handler()
762 iscsit_thread_get_cpumask(conn); in iscsi_post_login_handler()
763 conn->conn_rx_reset_cpumask = 1; in iscsi_post_login_handler()
764 conn->conn_tx_reset_cpumask = 1; in iscsi_post_login_handler()
769 complete(&conn->rx_login_comp); in iscsi_post_login_handler()
770 iscsit_dec_conn_usage_count(conn); in iscsi_post_login_handler()
866 int iscsit_accept_np(struct iscsi_np *np, struct iscsit_conn *conn) in iscsit_accept_np() argument
877 conn->sock = new_sock; in iscsit_accept_np()
878 conn->login_family = np->np_sockaddr.ss_family; in iscsit_accept_np()
883 rc = conn->sock->ops->getname(conn->sock, in iscsit_accept_np()
887 memcpy(&conn->login_sockaddr, &sock_in6, sizeof(sock_in6)); in iscsit_accept_np()
893 memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in)); in iscsit_accept_np()
897 rc = conn->sock->ops->getname(conn->sock, in iscsit_accept_np()
901 memcpy(&conn->local_sockaddr, &sock_in6, sizeof(sock_in6)); in iscsit_accept_np()
907 memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in)); in iscsit_accept_np()
913 rc = conn->sock->ops->getname(conn->sock, in iscsit_accept_np()
916 memcpy(&conn->login_sockaddr, &sock_in, sizeof(sock_in)); in iscsit_accept_np()
918 rc = conn->sock->ops->getname(conn->sock, in iscsit_accept_np()
921 memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in)); in iscsit_accept_np()
927 int iscsit_get_login_rx(struct iscsit_conn *conn, struct iscsi_login *login) in iscsit_get_login_rx() argument
932 if (iscsi_login_rx_data(conn, login->req, ISCSI_HDR_LEN) < 0) in iscsit_get_login_rx()
961 if (iscsi_target_check_login_request(conn, login) < 0) in iscsit_get_login_rx()
965 if (iscsi_login_rx_data(conn, login->req_buf, in iscsit_get_login_rx()
972 int iscsit_put_login_tx(struct iscsit_conn *conn, struct iscsi_login *login, in iscsit_put_login_tx() argument
975 if (iscsi_login_tx_data(conn, login->rsp, login->rsp_buf, length) < 0) in iscsit_put_login_tx()
982 iscsit_conn_set_transport(struct iscsit_conn *conn, struct iscsit_transport *t) in iscsit_conn_set_transport() argument
987 conn->conn_transport = t; in iscsit_conn_set_transport()
997 conn->conn_transport = t; in iscsit_conn_set_transport()
1003 struct iscsit_conn *conn; in iscsit_alloc_conn() local
1005 conn = kzalloc(sizeof(struct iscsit_conn), GFP_KERNEL); in iscsit_alloc_conn()
1006 if (!conn) { in iscsit_alloc_conn()
1011 conn->conn_state = TARG_CONN_STATE_FREE; in iscsit_alloc_conn()
1013 init_waitqueue_head(&conn->queues_wq); in iscsit_alloc_conn()
1014 INIT_LIST_HEAD(&conn->conn_list); in iscsit_alloc_conn()
1015 INIT_LIST_HEAD(&conn->conn_cmd_list); in iscsit_alloc_conn()
1016 INIT_LIST_HEAD(&conn->immed_queue_list); in iscsit_alloc_conn()
1017 INIT_LIST_HEAD(&conn->response_queue_list); in iscsit_alloc_conn()
1018 init_completion(&conn->conn_post_wait_comp); in iscsit_alloc_conn()
1019 init_completion(&conn->conn_wait_comp); in iscsit_alloc_conn()
1020 init_completion(&conn->conn_wait_rcfr_comp); in iscsit_alloc_conn()
1021 init_completion(&conn->conn_waiting_on_uc_comp); in iscsit_alloc_conn()
1022 init_completion(&conn->conn_logout_comp); in iscsit_alloc_conn()
1023 init_completion(&conn->rx_half_close_comp); in iscsit_alloc_conn()
1024 init_completion(&conn->tx_half_close_comp); in iscsit_alloc_conn()
1025 init_completion(&conn->rx_login_comp); in iscsit_alloc_conn()
1026 spin_lock_init(&conn->cmd_lock); in iscsit_alloc_conn()
1027 spin_lock_init(&conn->conn_usage_lock); in iscsit_alloc_conn()
1028 spin_lock_init(&conn->immed_queue_lock); in iscsit_alloc_conn()
1029 spin_lock_init(&conn->nopin_timer_lock); in iscsit_alloc_conn()
1030 spin_lock_init(&conn->response_queue_lock); in iscsit_alloc_conn()
1031 spin_lock_init(&conn->state_lock); in iscsit_alloc_conn()
1032 spin_lock_init(&conn->login_worker_lock); in iscsit_alloc_conn()
1033 spin_lock_init(&conn->login_timer_lock); in iscsit_alloc_conn()
1035 timer_setup(&conn->nopin_response_timer, in iscsit_alloc_conn()
1037 timer_setup(&conn->nopin_timer, iscsit_handle_nopin_timeout, 0); in iscsit_alloc_conn()
1038 timer_setup(&conn->login_timer, iscsit_login_timeout, 0); in iscsit_alloc_conn()
1040 if (iscsit_conn_set_transport(conn, np->np_transport) < 0) in iscsit_alloc_conn()
1043 conn->conn_ops = kzalloc(sizeof(struct iscsi_conn_ops), GFP_KERNEL); in iscsit_alloc_conn()
1044 if (!conn->conn_ops) { in iscsit_alloc_conn()
1049 if (!zalloc_cpumask_var(&conn->conn_cpumask, GFP_KERNEL)) { in iscsit_alloc_conn()
1050 pr_err("Unable to allocate conn->conn_cpumask\n"); in iscsit_alloc_conn()
1054 if (!zalloc_cpumask_var(&conn->allowed_cpumask, GFP_KERNEL)) { in iscsit_alloc_conn()
1055 pr_err("Unable to allocate conn->allowed_cpumask\n"); in iscsit_alloc_conn()
1059 conn->cmd_cnt = target_alloc_cmd_counter(); in iscsit_alloc_conn()
1060 if (!conn->cmd_cnt) in iscsit_alloc_conn()
1063 return conn; in iscsit_alloc_conn()
1066 free_cpumask_var(conn->allowed_cpumask); in iscsit_alloc_conn()
1068 free_cpumask_var(conn->conn_cpumask); in iscsit_alloc_conn()
1070 kfree(conn->conn_ops); in iscsit_alloc_conn()
1072 iscsit_put_transport(conn->conn_transport); in iscsit_alloc_conn()
1074 kfree(conn); in iscsit_alloc_conn()
1078 void iscsit_free_conn(struct iscsit_conn *conn) in iscsit_free_conn() argument
1080 target_free_cmd_counter(conn->cmd_cnt); in iscsit_free_conn()
1081 free_cpumask_var(conn->allowed_cpumask); in iscsit_free_conn()
1082 free_cpumask_var(conn->conn_cpumask); in iscsit_free_conn()
1083 kfree(conn->conn_ops); in iscsit_free_conn()
1084 iscsit_put_transport(conn->conn_transport); in iscsit_free_conn()
1085 kfree(conn); in iscsit_free_conn()
1088 void iscsi_target_login_sess_out(struct iscsit_conn *conn, in iscsi_target_login_sess_out() argument
1095 iscsit_collect_login_stats(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, in iscsi_target_login_sess_out()
1097 if (!zero_tsih || !conn->sess) in iscsi_target_login_sess_out()
1100 transport_free_session(conn->sess->se_sess); in iscsi_target_login_sess_out()
1101 ida_free(&sess_ida, conn->sess->session_index); in iscsi_target_login_sess_out()
1102 kfree(conn->sess->sess_ops); in iscsi_target_login_sess_out()
1103 kfree(conn->sess); in iscsi_target_login_sess_out()
1104 conn->sess = NULL; in iscsi_target_login_sess_out()
1111 if (!zero_tsih && conn->sess) { in iscsi_target_login_sess_out()
1112 spin_lock_bh(&conn->sess->conn_lock); in iscsi_target_login_sess_out()
1113 if (conn->sess->session_state == TARG_SESS_STATE_FAILED) { in iscsi_target_login_sess_out()
1115 &conn->tpg->tpg_se_tpg; in iscsi_target_login_sess_out()
1117 atomic_set(&conn->sess->session_continuation, 0); in iscsi_target_login_sess_out()
1118 spin_unlock_bh(&conn->sess->conn_lock); in iscsi_target_login_sess_out()
1120 iscsit_start_time2retain_handler(conn->sess); in iscsi_target_login_sess_out()
1123 spin_unlock_bh(&conn->sess->conn_lock); in iscsi_target_login_sess_out()
1124 iscsit_dec_session_usage_count(conn->sess); in iscsi_target_login_sess_out()
1127 if (conn->param_list) { in iscsi_target_login_sess_out()
1128 iscsi_release_param_list(conn->param_list); in iscsi_target_login_sess_out()
1129 conn->param_list = NULL; in iscsi_target_login_sess_out()
1131 iscsi_target_nego_release(conn); in iscsi_target_login_sess_out()
1133 if (conn->sock) { in iscsi_target_login_sess_out()
1134 sock_release(conn->sock); in iscsi_target_login_sess_out()
1135 conn->sock = NULL; in iscsi_target_login_sess_out()
1138 if (conn->conn_transport->iscsit_wait_conn) in iscsi_target_login_sess_out()
1139 conn->conn_transport->iscsit_wait_conn(conn); in iscsi_target_login_sess_out()
1141 if (conn->conn_transport->iscsit_free_conn) in iscsi_target_login_sess_out()
1142 conn->conn_transport->iscsit_free_conn(conn); in iscsi_target_login_sess_out()
1144 iscsit_free_conn(conn); in iscsi_target_login_sess_out()
1151 struct iscsit_conn *conn = NULL; in __iscsi_target_login_thread() local
1174 conn = iscsit_alloc_conn(np); in __iscsi_target_login_thread()
1175 if (!conn) { in __iscsi_target_login_thread()
1180 rc = np->np_transport->iscsit_accept_np(np, conn); in __iscsi_target_login_thread()
1183 iscsit_free_conn(conn); in __iscsi_target_login_thread()
1191 iscsit_free_conn(conn); in __iscsi_target_login_thread()
1196 iscsit_free_conn(conn); in __iscsi_target_login_thread()
1202 login = iscsi_login_init_conn(conn); in __iscsi_target_login_thread()
1207 iscsit_start_login_timer(conn, current); in __iscsi_target_login_thread()
1210 conn->conn_state = TARG_CONN_STATE_XPT_UP; in __iscsi_target_login_thread()
1214 rc = np->np_transport->iscsit_get_login_rx(conn, login); in __iscsi_target_login_thread()
1226 conn->login_itt = pdu->itt; in __iscsi_target_login_thread()
1233 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, in __iscsi_target_login_thread()
1239 conn->network_transport = np->np_network_transport; in __iscsi_target_login_thread()
1242 " Portal %pISpc\n", &conn->login_sockaddr, np->np_transport->name, in __iscsi_target_login_thread()
1243 &conn->local_sockaddr); in __iscsi_target_login_thread()
1246 conn->conn_state = TARG_CONN_STATE_IN_LOGIN; in __iscsi_target_login_thread()
1248 if (iscsi_login_check_initiator_version(conn, pdu->max_version, in __iscsi_target_login_thread()
1259 if (iscsi_login_zero_tsih_s1(conn, buffer) < 0) in __iscsi_target_login_thread()
1269 if (iscsi_login_non_zero_tsih_s1(conn, buffer) < 0) in __iscsi_target_login_thread()
1281 rc = iscsi_target_locate_portal(np, conn, login); in __iscsi_target_login_thread()
1283 tpg = conn->tpg; in __iscsi_target_login_thread()
1288 if (conn->sess) in __iscsi_target_login_thread()
1289 conn->sess->se_sess->sup_prot_ops = in __iscsi_target_login_thread()
1290 conn->conn_transport->iscsit_get_sup_prot_ops(conn); in __iscsi_target_login_thread()
1292 tpg = conn->tpg; in __iscsi_target_login_thread()
1299 if (iscsi_login_zero_tsih_s2(conn) < 0) in __iscsi_target_login_thread()
1302 if (iscsi_login_non_zero_tsih_s2(conn, buffer) < 0) in __iscsi_target_login_thread()
1306 if (conn->conn_transport->iscsit_validate_params) { in __iscsi_target_login_thread()
1307 ret = conn->conn_transport->iscsit_validate_params(conn); in __iscsi_target_login_thread()
1316 ret = iscsi_target_start_negotiation(login, conn); in __iscsi_target_login_thread()
1321 tpg_np = conn->tpg_np; in __iscsi_target_login_thread()
1323 iscsi_post_login_handler(np, conn, zero_tsih); in __iscsi_target_login_thread()
1335 iscsit_stop_login_timer(conn); in __iscsi_target_login_thread()
1336 tpg_np = conn->tpg_np; in __iscsi_target_login_thread()
1337 iscsi_target_login_sess_out(conn, zero_tsih, new_sess); in __iscsi_target_login_thread()