iscsi_target_login.c 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446
  1. /*******************************************************************************
  2. * This file contains the login functions used by the iSCSI Target driver.
  3. *
  4. * \u00a9 Copyright 2007-2011 RisingTide Systems LLC.
  5. *
  6. * Licensed to the Linux Foundation under the General Public License (GPL) version 2.
  7. *
  8. * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. ******************************************************************************/
  20. #include <linux/string.h>
  21. #include <linux/kthread.h>
  22. #include <linux/crypto.h>
  23. #include <linux/idr.h>
  24. #include <scsi/iscsi_proto.h>
  25. #include <target/target_core_base.h>
  26. #include <target/target_core_fabric.h>
  27. #include "iscsi_target_core.h"
  28. #include "iscsi_target_tq.h"
  29. #include "iscsi_target_device.h"
  30. #include "iscsi_target_nego.h"
  31. #include "iscsi_target_erl0.h"
  32. #include "iscsi_target_erl2.h"
  33. #include "iscsi_target_login.h"
  34. #include "iscsi_target_stat.h"
  35. #include "iscsi_target_tpg.h"
  36. #include "iscsi_target_util.h"
  37. #include "iscsi_target.h"
  38. #include "iscsi_target_parameters.h"
  39. #include <target/iscsi/iscsi_transport.h>
  40. static struct iscsi_login *iscsi_login_init_conn(struct iscsi_conn *conn)
  41. {
  42. struct iscsi_login *login;
  43. login = kzalloc(sizeof(struct iscsi_login), GFP_KERNEL);
  44. if (!login) {
  45. pr_err("Unable to allocate memory for struct iscsi_login.\n");
  46. return NULL;
  47. }
  48. conn->login = login;
  49. login->conn = conn;
  50. login->first_request = 1;
  51. login->req_buf = kzalloc(MAX_KEY_VALUE_PAIRS, GFP_KERNEL);
  52. if (!login->req_buf) {
  53. pr_err("Unable to allocate memory for response buffer.\n");
  54. goto out_login;
  55. }
  56. login->rsp_buf = kzalloc(MAX_KEY_VALUE_PAIRS, GFP_KERNEL);
  57. if (!login->rsp_buf) {
  58. pr_err("Unable to allocate memory for request buffer.\n");
  59. goto out_req_buf;
  60. }
  61. conn->conn_ops = kzalloc(sizeof(struct iscsi_conn_ops), GFP_KERNEL);
  62. if (!conn->conn_ops) {
  63. pr_err("Unable to allocate memory for"
  64. " struct iscsi_conn_ops.\n");
  65. goto out_rsp_buf;
  66. }
  67. init_waitqueue_head(&conn->queues_wq);
  68. INIT_LIST_HEAD(&conn->conn_list);
  69. INIT_LIST_HEAD(&conn->conn_cmd_list);
  70. INIT_LIST_HEAD(&conn->immed_queue_list);
  71. INIT_LIST_HEAD(&conn->response_queue_list);
  72. init_completion(&conn->conn_post_wait_comp);
  73. init_completion(&conn->conn_wait_comp);
  74. init_completion(&conn->conn_wait_rcfr_comp);
  75. init_completion(&conn->conn_waiting_on_uc_comp);
  76. init_completion(&conn->conn_logout_comp);
  77. init_completion(&conn->rx_half_close_comp);
  78. init_completion(&conn->tx_half_close_comp);
  79. spin_lock_init(&conn->cmd_lock);
  80. spin_lock_init(&conn->conn_usage_lock);
  81. spin_lock_init(&conn->immed_queue_lock);
  82. spin_lock_init(&conn->nopin_timer_lock);
  83. spin_lock_init(&conn->response_queue_lock);
  84. spin_lock_init(&conn->state_lock);
  85. if (!zalloc_cpumask_var(&conn->conn_cpumask, GFP_KERNEL)) {
  86. pr_err("Unable to allocate conn->conn_cpumask\n");
  87. goto out_conn_ops;
  88. }
  89. conn->conn_login = login;
  90. return login;
  91. out_conn_ops:
  92. kfree(conn->conn_ops);
  93. out_rsp_buf:
  94. kfree(login->rsp_buf);
  95. out_req_buf:
  96. kfree(login->req_buf);
  97. out_login:
  98. kfree(login);
  99. return NULL;
  100. }
  101. /*
  102. * Used by iscsi_target_nego.c:iscsi_target_locate_portal() to setup
  103. * per struct iscsi_conn libcrypto contexts for crc32c and crc32-intel
  104. */
  105. int iscsi_login_setup_crypto(struct iscsi_conn *conn)
  106. {
  107. /*
  108. * Setup slicing by CRC32C algorithm for RX and TX libcrypto contexts
  109. * which will default to crc32c_intel.ko for cpu_has_xmm4_2, or fallback
  110. * to software 1x8 byte slicing from crc32c.ko
  111. */
  112. conn->conn_rx_hash.flags = 0;
  113. conn->conn_rx_hash.tfm = crypto_alloc_hash("crc32c", 0,
  114. CRYPTO_ALG_ASYNC);
  115. if (IS_ERR(conn->conn_rx_hash.tfm)) {
  116. pr_err("crypto_alloc_hash() failed for conn_rx_tfm\n");
  117. return -ENOMEM;
  118. }
  119. conn->conn_tx_hash.flags = 0;
  120. conn->conn_tx_hash.tfm = crypto_alloc_hash("crc32c", 0,
  121. CRYPTO_ALG_ASYNC);
  122. if (IS_ERR(conn->conn_tx_hash.tfm)) {
  123. pr_err("crypto_alloc_hash() failed for conn_tx_tfm\n");
  124. crypto_free_hash(conn->conn_rx_hash.tfm);
  125. return -ENOMEM;
  126. }
  127. return 0;
  128. }
  129. static int iscsi_login_check_initiator_version(
  130. struct iscsi_conn *conn,
  131. u8 version_max,
  132. u8 version_min)
  133. {
  134. if ((version_max != 0x00) || (version_min != 0x00)) {
  135. pr_err("Unsupported iSCSI IETF Pre-RFC Revision,"
  136. " version Min/Max 0x%02x/0x%02x, rejecting login.\n",
  137. version_min, version_max);
  138. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  139. ISCSI_LOGIN_STATUS_NO_VERSION);
  140. return -1;
  141. }
  142. return 0;
  143. }
  144. int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn)
  145. {
  146. int sessiontype;
  147. struct iscsi_param *initiatorname_param = NULL, *sessiontype_param = NULL;
  148. struct iscsi_portal_group *tpg = conn->tpg;
  149. struct iscsi_session *sess = NULL, *sess_p = NULL;
  150. struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
  151. struct se_session *se_sess, *se_sess_tmp;
  152. initiatorname_param = iscsi_find_param_from_key(
  153. INITIATORNAME, conn->param_list);
  154. sessiontype_param = iscsi_find_param_from_key(
  155. SESSIONTYPE, conn->param_list);
  156. if (!initiatorname_param || !sessiontype_param) {
  157. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  158. ISCSI_LOGIN_STATUS_MISSING_FIELDS);
  159. return -1;
  160. }
  161. sessiontype = (strncmp(sessiontype_param->value, NORMAL, 6)) ? 1 : 0;
  162. spin_lock_bh(&se_tpg->session_lock);
  163. list_for_each_entry_safe(se_sess, se_sess_tmp, &se_tpg->tpg_sess_list,
  164. sess_list) {
  165. sess_p = se_sess->fabric_sess_ptr;
  166. spin_lock(&sess_p->conn_lock);
  167. if (atomic_read(&sess_p->session_fall_back_to_erl0) ||
  168. atomic_read(&sess_p->session_logout) ||
  169. (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
  170. spin_unlock(&sess_p->conn_lock);
  171. continue;
  172. }
  173. if (!memcmp(sess_p->isid, conn->sess->isid, 6) &&
  174. (!strcmp(sess_p->sess_ops->InitiatorName,
  175. initiatorname_param->value) &&
  176. (sess_p->sess_ops->SessionType == sessiontype))) {
  177. atomic_set(&sess_p->session_reinstatement, 1);
  178. spin_unlock(&sess_p->conn_lock);
  179. iscsit_inc_session_usage_count(sess_p);
  180. iscsit_stop_time2retain_timer(sess_p);
  181. sess = sess_p;
  182. break;
  183. }
  184. spin_unlock(&sess_p->conn_lock);
  185. }
  186. spin_unlock_bh(&se_tpg->session_lock);
  187. /*
  188. * If the Time2Retain handler has expired, the session is already gone.
  189. */
  190. if (!sess)
  191. return 0;
  192. pr_debug("%s iSCSI Session SID %u is still active for %s,"
  193. " preforming session reinstatement.\n", (sessiontype) ?
  194. "Discovery" : "Normal", sess->sid,
  195. sess->sess_ops->InitiatorName);
  196. spin_lock_bh(&sess->conn_lock);
  197. if (sess->session_state == TARG_SESS_STATE_FAILED) {
  198. spin_unlock_bh(&sess->conn_lock);
  199. iscsit_dec_session_usage_count(sess);
  200. target_put_session(sess->se_sess);
  201. return 0;
  202. }
  203. spin_unlock_bh(&sess->conn_lock);
  204. iscsit_stop_session(sess, 1, 1);
  205. iscsit_dec_session_usage_count(sess);
  206. target_put_session(sess->se_sess);
  207. return 0;
  208. }
  209. static void iscsi_login_set_conn_values(
  210. struct iscsi_session *sess,
  211. struct iscsi_conn *conn,
  212. __be16 cid)
  213. {
  214. conn->sess = sess;
  215. conn->cid = be16_to_cpu(cid);
  216. /*
  217. * Generate a random Status sequence number (statsn) for the new
  218. * iSCSI connection.
  219. */
  220. get_random_bytes(&conn->stat_sn, sizeof(u32));
  221. mutex_lock(&auth_id_lock);
  222. conn->auth_id = iscsit_global->auth_id++;
  223. mutex_unlock(&auth_id_lock);
  224. }
  225. /*
  226. * This is the leading connection of a new session,
  227. * or session reinstatement.
  228. */
  229. static int iscsi_login_zero_tsih_s1(
  230. struct iscsi_conn *conn,
  231. unsigned char *buf)
  232. {
  233. struct iscsi_session *sess = NULL;
  234. struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
  235. int ret;
  236. sess = kzalloc(sizeof(struct iscsi_session), GFP_KERNEL);
  237. if (!sess) {
  238. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  239. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  240. pr_err("Could not allocate memory for session\n");
  241. return -ENOMEM;
  242. }
  243. iscsi_login_set_conn_values(sess, conn, pdu->cid);
  244. sess->init_task_tag = pdu->itt;
  245. memcpy(&sess->isid, pdu->isid, 6);
  246. sess->exp_cmd_sn = be32_to_cpu(pdu->cmdsn);
  247. INIT_LIST_HEAD(&sess->sess_conn_list);
  248. INIT_LIST_HEAD(&sess->sess_ooo_cmdsn_list);
  249. INIT_LIST_HEAD(&sess->cr_active_list);
  250. INIT_LIST_HEAD(&sess->cr_inactive_list);
  251. init_completion(&sess->async_msg_comp);
  252. init_completion(&sess->reinstatement_comp);
  253. init_completion(&sess->session_wait_comp);
  254. init_completion(&sess->session_waiting_on_uc_comp);
  255. mutex_init(&sess->cmdsn_mutex);
  256. spin_lock_init(&sess->conn_lock);
  257. spin_lock_init(&sess->cr_a_lock);
  258. spin_lock_init(&sess->cr_i_lock);
  259. spin_lock_init(&sess->session_usage_lock);
  260. spin_lock_init(&sess->ttt_lock);
  261. idr_preload(GFP_KERNEL);
  262. spin_lock_bh(&sess_idr_lock);
  263. ret = idr_alloc(&sess_idr, NULL, 0, 0, GFP_NOWAIT);
  264. if (ret >= 0)
  265. sess->session_index = ret;
  266. spin_unlock_bh(&sess_idr_lock);
  267. idr_preload_end();
  268. if (ret < 0) {
  269. pr_err("idr_alloc() for sess_idr failed\n");
  270. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  271. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  272. kfree(sess);
  273. return -ENOMEM;
  274. }
  275. sess->creation_time = get_jiffies_64();
  276. spin_lock_init(&sess->session_stats_lock);
  277. /*
  278. * The FFP CmdSN window values will be allocated from the TPG's
  279. * Initiator Node's ACL once the login has been successfully completed.
  280. */
  281. sess->max_cmd_sn = be32_to_cpu(pdu->cmdsn);
  282. sess->sess_ops = kzalloc(sizeof(struct iscsi_sess_ops), GFP_KERNEL);
  283. if (!sess->sess_ops) {
  284. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  285. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  286. pr_err("Unable to allocate memory for"
  287. " struct iscsi_sess_ops.\n");
  288. kfree(sess);
  289. return -ENOMEM;
  290. }
  291. sess->se_sess = transport_init_session();
  292. if (IS_ERR(sess->se_sess)) {
  293. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  294. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  295. kfree(sess);
  296. return -ENOMEM;
  297. }
  298. return 0;
  299. }
  300. static int iscsi_login_zero_tsih_s2(
  301. struct iscsi_conn *conn)
  302. {
  303. struct iscsi_node_attrib *na;
  304. struct iscsi_session *sess = conn->sess;
  305. unsigned char buf[32];
  306. bool iser = false;
  307. sess->tpg = conn->tpg;
  308. /*
  309. * Assign a new TPG Session Handle. Note this is protected with
  310. * struct iscsi_portal_group->np_login_sem from iscsit_access_np().
  311. */
  312. sess->tsih = ++ISCSI_TPG_S(sess)->ntsih;
  313. if (!sess->tsih)
  314. sess->tsih = ++ISCSI_TPG_S(sess)->ntsih;
  315. /*
  316. * Create the default params from user defined values..
  317. */
  318. if (iscsi_copy_param_list(&conn->param_list,
  319. ISCSI_TPG_C(conn)->param_list, 1) < 0) {
  320. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  321. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  322. return -1;
  323. }
  324. if (conn->conn_transport->transport_type == ISCSI_INFINIBAND)
  325. iser = true;
  326. iscsi_set_keys_to_negotiate(conn->param_list, iser);
  327. if (sess->sess_ops->SessionType)
  328. return iscsi_set_keys_irrelevant_for_discovery(
  329. conn->param_list);
  330. na = iscsit_tpg_get_node_attrib(sess);
  331. /*
  332. * Need to send TargetPortalGroupTag back in first login response
  333. * on any iSCSI connection where the Initiator provides TargetName.
  334. * See 5.3.1. Login Phase Start
  335. *
  336. * In our case, we have already located the struct iscsi_tiqn at this point.
  337. */
  338. memset(buf, 0, 32);
  339. sprintf(buf, "TargetPortalGroupTag=%hu", ISCSI_TPG_S(sess)->tpgt);
  340. if (iscsi_change_param_value(buf, conn->param_list, 0) < 0) {
  341. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  342. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  343. return -1;
  344. }
  345. /*
  346. * Workaround for Initiators that have broken connection recovery logic.
  347. *
  348. * "We would really like to get rid of this." Linux-iSCSI.org team
  349. */
  350. memset(buf, 0, 32);
  351. sprintf(buf, "ErrorRecoveryLevel=%d", na->default_erl);
  352. if (iscsi_change_param_value(buf, conn->param_list, 0) < 0) {
  353. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  354. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  355. return -1;
  356. }
  357. if (iscsi_login_disable_FIM_keys(conn->param_list, conn) < 0)
  358. return -1;
  359. /*
  360. * Set RDMAExtensions=Yes by default for iSER enabled network portals
  361. */
  362. if (iser) {
  363. struct iscsi_param *param;
  364. unsigned long mrdsl, off;
  365. int rc;
  366. sprintf(buf, "RDMAExtensions=Yes");
  367. if (iscsi_change_param_value(buf, conn->param_list, 0) < 0) {
  368. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  369. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  370. return -1;
  371. }
  372. /*
  373. * Make MaxRecvDataSegmentLength PAGE_SIZE aligned for
  374. * Immediate Data + Unsolicitied Data-OUT if necessary..
  375. */
  376. param = iscsi_find_param_from_key("MaxRecvDataSegmentLength",
  377. conn->param_list);
  378. if (!param) {
  379. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  380. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  381. return -1;
  382. }
  383. rc = kstrtoul(param->value, 0, &mrdsl);
  384. if (rc < 0) {
  385. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  386. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  387. return -1;
  388. }
  389. off = mrdsl % PAGE_SIZE;
  390. if (!off)
  391. return 0;
  392. if (mrdsl < PAGE_SIZE)
  393. mrdsl = PAGE_SIZE;
  394. else
  395. mrdsl -= off;
  396. pr_warn("Aligning ISER MaxRecvDataSegmentLength: %lu down"
  397. " to PAGE_SIZE\n", mrdsl);
  398. sprintf(buf, "MaxRecvDataSegmentLength=%lu\n", mrdsl);
  399. if (iscsi_change_param_value(buf, conn->param_list, 0) < 0) {
  400. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  401. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  402. return -1;
  403. }
  404. }
  405. return 0;
  406. }
  407. /*
  408. * Remove PSTATE_NEGOTIATE for the four FIM related keys.
  409. * The Initiator node will be able to enable FIM by proposing them itself.
  410. */
  411. int iscsi_login_disable_FIM_keys(
  412. struct iscsi_param_list *param_list,
  413. struct iscsi_conn *conn)
  414. {
  415. struct iscsi_param *param;
  416. param = iscsi_find_param_from_key("OFMarker", param_list);
  417. if (!param) {
  418. pr_err("iscsi_find_param_from_key() for"
  419. " OFMarker failed\n");
  420. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  421. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  422. return -1;
  423. }
  424. param->state &= ~PSTATE_NEGOTIATE;
  425. param = iscsi_find_param_from_key("OFMarkInt", param_list);
  426. if (!param) {
  427. pr_err("iscsi_find_param_from_key() for"
  428. " IFMarker failed\n");
  429. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  430. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  431. return -1;
  432. }
  433. param->state &= ~PSTATE_NEGOTIATE;
  434. param = iscsi_find_param_from_key("IFMarker", param_list);
  435. if (!param) {
  436. pr_err("iscsi_find_param_from_key() for"
  437. " IFMarker failed\n");
  438. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  439. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  440. return -1;
  441. }
  442. param->state &= ~PSTATE_NEGOTIATE;
  443. param = iscsi_find_param_from_key("IFMarkInt", param_list);
  444. if (!param) {
  445. pr_err("iscsi_find_param_from_key() for"
  446. " IFMarker failed\n");
  447. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  448. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  449. return -1;
  450. }
  451. param->state &= ~PSTATE_NEGOTIATE;
  452. return 0;
  453. }
  454. static int iscsi_login_non_zero_tsih_s1(
  455. struct iscsi_conn *conn,
  456. unsigned char *buf)
  457. {
  458. struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
  459. iscsi_login_set_conn_values(NULL, conn, pdu->cid);
  460. return 0;
  461. }
  462. /*
  463. * Add a new connection to an existing session.
  464. */
  465. static int iscsi_login_non_zero_tsih_s2(
  466. struct iscsi_conn *conn,
  467. unsigned char *buf)
  468. {
  469. struct iscsi_portal_group *tpg = conn->tpg;
  470. struct iscsi_session *sess = NULL, *sess_p = NULL;
  471. struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
  472. struct se_session *se_sess, *se_sess_tmp;
  473. struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
  474. bool iser = false;
  475. spin_lock_bh(&se_tpg->session_lock);
  476. list_for_each_entry_safe(se_sess, se_sess_tmp, &se_tpg->tpg_sess_list,
  477. sess_list) {
  478. sess_p = (struct iscsi_session *)se_sess->fabric_sess_ptr;
  479. if (atomic_read(&sess_p->session_fall_back_to_erl0) ||
  480. atomic_read(&sess_p->session_logout) ||
  481. (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED))
  482. continue;
  483. if (!memcmp(sess_p->isid, pdu->isid, 6) &&
  484. (sess_p->tsih == be16_to_cpu(pdu->tsih))) {
  485. iscsit_inc_session_usage_count(sess_p);
  486. iscsit_stop_time2retain_timer(sess_p);
  487. sess = sess_p;
  488. break;
  489. }
  490. }
  491. spin_unlock_bh(&se_tpg->session_lock);
  492. /*
  493. * If the Time2Retain handler has expired, the session is already gone.
  494. */
  495. if (!sess) {
  496. pr_err("Initiator attempting to add a connection to"
  497. " a non-existent session, rejecting iSCSI Login.\n");
  498. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  499. ISCSI_LOGIN_STATUS_NO_SESSION);
  500. return -1;
  501. }
  502. /*
  503. * Stop the Time2Retain timer if this is a failed session, we restart
  504. * the timer if the login is not successful.
  505. */
  506. spin_lock_bh(&sess->conn_lock);
  507. if (sess->session_state == TARG_SESS_STATE_FAILED)
  508. atomic_set(&sess->session_continuation, 1);
  509. spin_unlock_bh(&sess->conn_lock);
  510. iscsi_login_set_conn_values(sess, conn, pdu->cid);
  511. if (iscsi_copy_param_list(&conn->param_list,
  512. ISCSI_TPG_C(conn)->param_list, 0) < 0) {
  513. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  514. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  515. return -1;
  516. }
  517. if (conn->conn_transport->transport_type == ISCSI_INFINIBAND)
  518. iser = true;
  519. iscsi_set_keys_to_negotiate(conn->param_list, iser);
  520. /*
  521. * Need to send TargetPortalGroupTag back in first login response
  522. * on any iSCSI connection where the Initiator provides TargetName.
  523. * See 5.3.1. Login Phase Start
  524. *
  525. * In our case, we have already located the struct iscsi_tiqn at this point.
  526. */
  527. memset(buf, 0, 32);
  528. sprintf(buf, "TargetPortalGroupTag=%hu", ISCSI_TPG_S(sess)->tpgt);
  529. if (iscsi_change_param_value(buf, conn->param_list, 0) < 0) {
  530. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  531. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  532. return -1;
  533. }
  534. return iscsi_login_disable_FIM_keys(conn->param_list, conn);
  535. }
  536. int iscsi_login_post_auth_non_zero_tsih(
  537. struct iscsi_conn *conn,
  538. u16 cid,
  539. u32 exp_statsn)
  540. {
  541. struct iscsi_conn *conn_ptr = NULL;
  542. struct iscsi_conn_recovery *cr = NULL;
  543. struct iscsi_session *sess = conn->sess;
  544. /*
  545. * By following item 5 in the login table, if we have found
  546. * an existing ISID and a valid/existing TSIH and an existing
  547. * CID we do connection reinstatement. Currently we dont not
  548. * support it so we send back an non-zero status class to the
  549. * initiator and release the new connection.
  550. */
  551. conn_ptr = iscsit_get_conn_from_cid_rcfr(sess, cid);
  552. if (conn_ptr) {
  553. pr_err("Connection exists with CID %hu for %s,"
  554. " performing connection reinstatement.\n",
  555. conn_ptr->cid, sess->sess_ops->InitiatorName);
  556. iscsit_connection_reinstatement_rcfr(conn_ptr);
  557. iscsit_dec_conn_usage_count(conn_ptr);
  558. }
  559. /*
  560. * Check for any connection recovery entires containing CID.
  561. * We use the original ExpStatSN sent in the first login request
  562. * to acknowledge commands for the failed connection.
  563. *
  564. * Also note that an explict logout may have already been sent,
  565. * but the response may not be sent due to additional connection
  566. * loss.
  567. */
  568. if (sess->sess_ops->ErrorRecoveryLevel == 2) {
  569. cr = iscsit_get_inactive_connection_recovery_entry(
  570. sess, cid);
  571. if (cr) {
  572. pr_debug("Performing implicit logout"
  573. " for connection recovery on CID: %hu\n",
  574. conn->cid);
  575. iscsit_discard_cr_cmds_by_expstatsn(cr, exp_statsn);
  576. }
  577. }
  578. /*
  579. * Else we follow item 4 from the login table in that we have
  580. * found an existing ISID and a valid/existing TSIH and a new
  581. * CID we go ahead and continue to add a new connection to the
  582. * session.
  583. */
  584. pr_debug("Adding CID %hu to existing session for %s.\n",
  585. cid, sess->sess_ops->InitiatorName);
  586. if ((atomic_read(&sess->nconn) + 1) > sess->sess_ops->MaxConnections) {
  587. pr_err("Adding additional connection to this session"
  588. " would exceed MaxConnections %d, login failed.\n",
  589. sess->sess_ops->MaxConnections);
  590. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  591. ISCSI_LOGIN_STATUS_ISID_ERROR);
  592. return -1;
  593. }
  594. return 0;
  595. }
  596. static void iscsi_post_login_start_timers(struct iscsi_conn *conn)
  597. {
  598. struct iscsi_session *sess = conn->sess;
  599. /*
  600. * FIXME: Unsolicitied NopIN support for ISER
  601. */
  602. if (conn->conn_transport->transport_type == ISCSI_INFINIBAND)
  603. return;
  604. if (!sess->sess_ops->SessionType)
  605. iscsit_start_nopin_timer(conn);
  606. }
  607. int iscsi_post_login_handler(
  608. struct iscsi_np *np,
  609. struct iscsi_conn *conn,
  610. u8 zero_tsih)
  611. {
  612. int stop_timer = 0;
  613. struct iscsi_session *sess = conn->sess;
  614. struct se_session *se_sess = sess->se_sess;
  615. struct iscsi_portal_group *tpg = ISCSI_TPG_S(sess);
  616. struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
  617. struct iscsi_thread_set *ts;
  618. iscsit_inc_conn_usage_count(conn);
  619. iscsit_collect_login_stats(conn, ISCSI_STATUS_CLS_SUCCESS,
  620. ISCSI_LOGIN_STATUS_ACCEPT);
  621. pr_debug("Moving to TARG_CONN_STATE_LOGGED_IN.\n");
  622. conn->conn_state = TARG_CONN_STATE_LOGGED_IN;
  623. iscsi_set_connection_parameters(conn->conn_ops, conn->param_list);
  624. iscsit_set_sync_and_steering_values(conn);
  625. /*
  626. * SCSI Initiator -> SCSI Target Port Mapping
  627. */
  628. ts = iscsi_get_thread_set();
  629. if (!zero_tsih) {
  630. iscsi_set_session_parameters(sess->sess_ops,
  631. conn->param_list, 0);
  632. iscsi_release_param_list(conn->param_list);
  633. conn->param_list = NULL;
  634. spin_lock_bh(&sess->conn_lock);
  635. atomic_set(&sess->session_continuation, 0);
  636. if (sess->session_state == TARG_SESS_STATE_FAILED) {
  637. pr_debug("Moving to"
  638. " TARG_SESS_STATE_LOGGED_IN.\n");
  639. sess->session_state = TARG_SESS_STATE_LOGGED_IN;
  640. stop_timer = 1;
  641. }
  642. pr_debug("iSCSI Login successful on CID: %hu from %s to"
  643. " %s:%hu,%hu\n", conn->cid, conn->login_ip,
  644. conn->local_ip, conn->local_port, tpg->tpgt);
  645. list_add_tail(&conn->conn_list, &sess->sess_conn_list);
  646. atomic_inc(&sess->nconn);
  647. pr_debug("Incremented iSCSI Connection count to %hu"
  648. " from node: %s\n", atomic_read(&sess->nconn),
  649. sess->sess_ops->InitiatorName);
  650. spin_unlock_bh(&sess->conn_lock);
  651. iscsi_post_login_start_timers(conn);
  652. iscsi_activate_thread_set(conn, ts);
  653. /*
  654. * Determine CPU mask to ensure connection's RX and TX kthreads
  655. * are scheduled on the same CPU.
  656. */
  657. iscsit_thread_get_cpumask(conn);
  658. conn->conn_rx_reset_cpumask = 1;
  659. conn->conn_tx_reset_cpumask = 1;
  660. iscsit_dec_conn_usage_count(conn);
  661. if (stop_timer) {
  662. spin_lock_bh(&se_tpg->session_lock);
  663. iscsit_stop_time2retain_timer(sess);
  664. spin_unlock_bh(&se_tpg->session_lock);
  665. }
  666. iscsit_dec_session_usage_count(sess);
  667. return 0;
  668. }
  669. iscsi_set_session_parameters(sess->sess_ops, conn->param_list, 1);
  670. iscsi_release_param_list(conn->param_list);
  671. conn->param_list = NULL;
  672. iscsit_determine_maxcmdsn(sess);
  673. spin_lock_bh(&se_tpg->session_lock);
  674. __transport_register_session(&sess->tpg->tpg_se_tpg,
  675. se_sess->se_node_acl, se_sess, sess);
  676. pr_debug("Moving to TARG_SESS_STATE_LOGGED_IN.\n");
  677. sess->session_state = TARG_SESS_STATE_LOGGED_IN;
  678. pr_debug("iSCSI Login successful on CID: %hu from %s to %s:%hu,%hu\n",
  679. conn->cid, conn->login_ip, conn->local_ip, conn->local_port,
  680. tpg->tpgt);
  681. spin_lock_bh(&sess->conn_lock);
  682. list_add_tail(&conn->conn_list, &sess->sess_conn_list);
  683. atomic_inc(&sess->nconn);
  684. pr_debug("Incremented iSCSI Connection count to %hu from node:"
  685. " %s\n", atomic_read(&sess->nconn),
  686. sess->sess_ops->InitiatorName);
  687. spin_unlock_bh(&sess->conn_lock);
  688. sess->sid = tpg->sid++;
  689. if (!sess->sid)
  690. sess->sid = tpg->sid++;
  691. pr_debug("Established iSCSI session from node: %s\n",
  692. sess->sess_ops->InitiatorName);
  693. tpg->nsessions++;
  694. if (tpg->tpg_tiqn)
  695. tpg->tpg_tiqn->tiqn_nsessions++;
  696. pr_debug("Incremented number of active iSCSI sessions to %u on"
  697. " iSCSI Target Portal Group: %hu\n", tpg->nsessions, tpg->tpgt);
  698. spin_unlock_bh(&se_tpg->session_lock);
  699. iscsi_post_login_start_timers(conn);
  700. iscsi_activate_thread_set(conn, ts);
  701. /*
  702. * Determine CPU mask to ensure connection's RX and TX kthreads
  703. * are scheduled on the same CPU.
  704. */
  705. iscsit_thread_get_cpumask(conn);
  706. conn->conn_rx_reset_cpumask = 1;
  707. conn->conn_tx_reset_cpumask = 1;
  708. iscsit_dec_conn_usage_count(conn);
  709. return 0;
  710. }
  711. static void iscsi_handle_login_thread_timeout(unsigned long data)
  712. {
  713. struct iscsi_np *np = (struct iscsi_np *) data;
  714. spin_lock_bh(&np->np_thread_lock);
  715. pr_err("iSCSI Login timeout on Network Portal %s:%hu\n",
  716. np->np_ip, np->np_port);
  717. if (np->np_login_timer_flags & ISCSI_TF_STOP) {
  718. spin_unlock_bh(&np->np_thread_lock);
  719. return;
  720. }
  721. if (np->np_thread)
  722. send_sig(SIGINT, np->np_thread, 1);
  723. np->np_login_timer_flags &= ~ISCSI_TF_RUNNING;
  724. spin_unlock_bh(&np->np_thread_lock);
  725. }
  726. static void iscsi_start_login_thread_timer(struct iscsi_np *np)
  727. {
  728. /*
  729. * This used the TA_LOGIN_TIMEOUT constant because at this
  730. * point we do not have access to ISCSI_TPG_ATTRIB(tpg)->login_timeout
  731. */
  732. spin_lock_bh(&np->np_thread_lock);
  733. init_timer(&np->np_login_timer);
  734. np->np_login_timer.expires = (get_jiffies_64() + TA_LOGIN_TIMEOUT * HZ);
  735. np->np_login_timer.data = (unsigned long)np;
  736. np->np_login_timer.function = iscsi_handle_login_thread_timeout;
  737. np->np_login_timer_flags &= ~ISCSI_TF_STOP;
  738. np->np_login_timer_flags |= ISCSI_TF_RUNNING;
  739. add_timer(&np->np_login_timer);
  740. pr_debug("Added timeout timer to iSCSI login request for"
  741. " %u seconds.\n", TA_LOGIN_TIMEOUT);
  742. spin_unlock_bh(&np->np_thread_lock);
  743. }
  744. static void iscsi_stop_login_thread_timer(struct iscsi_np *np)
  745. {
  746. spin_lock_bh(&np->np_thread_lock);
  747. if (!(np->np_login_timer_flags & ISCSI_TF_RUNNING)) {
  748. spin_unlock_bh(&np->np_thread_lock);
  749. return;
  750. }
  751. np->np_login_timer_flags |= ISCSI_TF_STOP;
  752. spin_unlock_bh(&np->np_thread_lock);
  753. del_timer_sync(&np->np_login_timer);
  754. spin_lock_bh(&np->np_thread_lock);
  755. np->np_login_timer_flags &= ~ISCSI_TF_RUNNING;
  756. spin_unlock_bh(&np->np_thread_lock);
  757. }
  758. int iscsit_setup_np(
  759. struct iscsi_np *np,
  760. struct __kernel_sockaddr_storage *sockaddr)
  761. {
  762. struct socket *sock = NULL;
  763. int backlog = 5, ret, opt = 0, len;
  764. switch (np->np_network_transport) {
  765. case ISCSI_TCP:
  766. np->np_ip_proto = IPPROTO_TCP;
  767. np->np_sock_type = SOCK_STREAM;
  768. break;
  769. case ISCSI_SCTP_TCP:
  770. np->np_ip_proto = IPPROTO_SCTP;
  771. np->np_sock_type = SOCK_STREAM;
  772. break;
  773. case ISCSI_SCTP_UDP:
  774. np->np_ip_proto = IPPROTO_SCTP;
  775. np->np_sock_type = SOCK_SEQPACKET;
  776. break;
  777. default:
  778. pr_err("Unsupported network_transport: %d\n",
  779. np->np_network_transport);
  780. return -EINVAL;
  781. }
  782. np->np_ip_proto = IPPROTO_TCP;
  783. np->np_sock_type = SOCK_STREAM;
  784. ret = sock_create(sockaddr->ss_family, np->np_sock_type,
  785. np->np_ip_proto, &sock);
  786. if (ret < 0) {
  787. pr_err("sock_create() failed.\n");
  788. return ret;
  789. }
  790. np->np_socket = sock;
  791. /*
  792. * Setup the np->np_sockaddr from the passed sockaddr setup
  793. * in iscsi_target_configfs.c code..
  794. */
  795. memcpy(&np->np_sockaddr, sockaddr,
  796. sizeof(struct __kernel_sockaddr_storage));
  797. if (sockaddr->ss_family == AF_INET6)
  798. len = sizeof(struct sockaddr_in6);
  799. else
  800. len = sizeof(struct sockaddr_in);
  801. /*
  802. * Set SO_REUSEADDR, and disable Nagel Algorithm with TCP_NODELAY.
  803. */
  804. /* FIXME: Someone please explain why this is endian-safe */
  805. opt = 1;
  806. if (np->np_network_transport == ISCSI_TCP) {
  807. ret = kernel_setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
  808. (char *)&opt, sizeof(opt));
  809. if (ret < 0) {
  810. pr_err("kernel_setsockopt() for TCP_NODELAY"
  811. " failed: %d\n", ret);
  812. goto fail;
  813. }
  814. }
  815. /* FIXME: Someone please explain why this is endian-safe */
  816. ret = kernel_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
  817. (char *)&opt, sizeof(opt));
  818. if (ret < 0) {
  819. pr_err("kernel_setsockopt() for SO_REUSEADDR"
  820. " failed\n");
  821. goto fail;
  822. }
  823. ret = kernel_setsockopt(sock, IPPROTO_IP, IP_FREEBIND,
  824. (char *)&opt, sizeof(opt));
  825. if (ret < 0) {
  826. pr_err("kernel_setsockopt() for IP_FREEBIND"
  827. " failed\n");
  828. goto fail;
  829. }
  830. ret = kernel_bind(sock, (struct sockaddr *)&np->np_sockaddr, len);
  831. if (ret < 0) {
  832. pr_err("kernel_bind() failed: %d\n", ret);
  833. goto fail;
  834. }
  835. ret = kernel_listen(sock, backlog);
  836. if (ret != 0) {
  837. pr_err("kernel_listen() failed: %d\n", ret);
  838. goto fail;
  839. }
  840. return 0;
  841. fail:
  842. np->np_socket = NULL;
  843. if (sock)
  844. sock_release(sock);
  845. return ret;
  846. }
  847. int iscsi_target_setup_login_socket(
  848. struct iscsi_np *np,
  849. struct __kernel_sockaddr_storage *sockaddr)
  850. {
  851. struct iscsit_transport *t;
  852. int rc;
  853. t = iscsit_get_transport(np->np_network_transport);
  854. if (!t)
  855. return -EINVAL;
  856. rc = t->iscsit_setup_np(np, sockaddr);
  857. if (rc < 0) {
  858. iscsit_put_transport(t);
  859. return rc;
  860. }
  861. np->np_transport = t;
  862. return 0;
  863. }
  864. int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
  865. {
  866. struct socket *new_sock, *sock = np->np_socket;
  867. struct sockaddr_in sock_in;
  868. struct sockaddr_in6 sock_in6;
  869. int rc, err;
  870. rc = kernel_accept(sock, &new_sock, 0);
  871. if (rc < 0)
  872. return rc;
  873. conn->sock = new_sock;
  874. conn->login_family = np->np_sockaddr.ss_family;
  875. if (np->np_sockaddr.ss_family == AF_INET6) {
  876. memset(&sock_in6, 0, sizeof(struct sockaddr_in6));
  877. rc = conn->sock->ops->getname(conn->sock,
  878. (struct sockaddr *)&sock_in6, &err, 1);
  879. if (!rc) {
  880. if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr))
  881. snprintf(conn->login_ip, sizeof(conn->login_ip), "[%pI6c]",
  882. &sock_in6.sin6_addr.in6_u);
  883. else
  884. snprintf(conn->login_ip, sizeof(conn->login_ip), "%pI4",
  885. &sock_in6.sin6_addr.s6_addr32[3]);
  886. conn->login_port = ntohs(sock_in6.sin6_port);
  887. }
  888. rc = conn->sock->ops->getname(conn->sock,
  889. (struct sockaddr *)&sock_in6, &err, 0);
  890. if (!rc) {
  891. if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr))
  892. snprintf(conn->local_ip, sizeof(conn->local_ip), "[%pI6c]",
  893. &sock_in6.sin6_addr.in6_u);
  894. else
  895. snprintf(conn->local_ip, sizeof(conn->local_ip), "%pI4",
  896. &sock_in6.sin6_addr.s6_addr32[3]);
  897. conn->local_port = ntohs(sock_in6.sin6_port);
  898. }
  899. } else {
  900. memset(&sock_in, 0, sizeof(struct sockaddr_in));
  901. rc = conn->sock->ops->getname(conn->sock,
  902. (struct sockaddr *)&sock_in, &err, 1);
  903. if (!rc) {
  904. sprintf(conn->login_ip, "%pI4",
  905. &sock_in.sin_addr.s_addr);
  906. conn->login_port = ntohs(sock_in.sin_port);
  907. }
  908. rc = conn->sock->ops->getname(conn->sock,
  909. (struct sockaddr *)&sock_in, &err, 0);
  910. if (!rc) {
  911. sprintf(conn->local_ip, "%pI4",
  912. &sock_in.sin_addr.s_addr);
  913. conn->local_port = ntohs(sock_in.sin_port);
  914. }
  915. }
  916. return 0;
  917. }
  918. int iscsit_get_login_rx(struct iscsi_conn *conn, struct iscsi_login *login)
  919. {
  920. struct iscsi_login_req *login_req;
  921. u32 padding = 0, payload_length;
  922. if (iscsi_login_rx_data(conn, login->req, ISCSI_HDR_LEN) < 0)
  923. return -1;
  924. login_req = (struct iscsi_login_req *)login->req;
  925. payload_length = ntoh24(login_req->dlength);
  926. padding = ((-payload_length) & 3);
  927. pr_debug("Got Login Command, Flags 0x%02x, ITT: 0x%08x,"
  928. " CmdSN: 0x%08x, ExpStatSN: 0x%08x, CID: %hu, Length: %u\n",
  929. login_req->flags, login_req->itt, login_req->cmdsn,
  930. login_req->exp_statsn, login_req->cid, payload_length);
  931. /*
  932. * Setup the initial iscsi_login values from the leading
  933. * login request PDU.
  934. */
  935. if (login->first_request) {
  936. login_req = (struct iscsi_login_req *)login->req;
  937. login->leading_connection = (!login_req->tsih) ? 1 : 0;
  938. login->current_stage = ISCSI_LOGIN_CURRENT_STAGE(login_req->flags);
  939. login->version_min = login_req->min_version;
  940. login->version_max = login_req->max_version;
  941. memcpy(login->isid, login_req->isid, 6);
  942. login->cmd_sn = be32_to_cpu(login_req->cmdsn);
  943. login->init_task_tag = login_req->itt;
  944. login->initial_exp_statsn = be32_to_cpu(login_req->exp_statsn);
  945. login->cid = be16_to_cpu(login_req->cid);
  946. login->tsih = be16_to_cpu(login_req->tsih);
  947. }
  948. if (iscsi_target_check_login_request(conn, login) < 0)
  949. return -1;
  950. memset(login->req_buf, 0, MAX_KEY_VALUE_PAIRS);
  951. if (iscsi_login_rx_data(conn, login->req_buf,
  952. payload_length + padding) < 0)
  953. return -1;
  954. return 0;
  955. }
  956. int iscsit_put_login_tx(struct iscsi_conn *conn, struct iscsi_login *login,
  957. u32 length)
  958. {
  959. if (iscsi_login_tx_data(conn, login->rsp, login->rsp_buf, length) < 0)
  960. return -1;
  961. return 0;
  962. }
  963. static int
  964. iscsit_conn_set_transport(struct iscsi_conn *conn, struct iscsit_transport *t)
  965. {
  966. int rc;
  967. if (!t->owner) {
  968. conn->conn_transport = t;
  969. return 0;
  970. }
  971. rc = try_module_get(t->owner);
  972. if (!rc) {
  973. pr_err("try_module_get() failed for %s\n", t->name);
  974. return -EINVAL;
  975. }
  976. conn->conn_transport = t;
  977. return 0;
  978. }
  979. void iscsi_target_login_sess_out(struct iscsi_conn *conn,
  980. struct iscsi_np *np, bool zero_tsih, bool new_sess)
  981. {
  982. if (new_sess == false)
  983. goto old_sess_out;
  984. pr_err("iSCSI Login negotiation failed.\n");
  985. iscsit_collect_login_stats(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  986. ISCSI_LOGIN_STATUS_INIT_ERR);
  987. if (!zero_tsih || !conn->sess)
  988. goto old_sess_out;
  989. if (conn->sess->se_sess)
  990. transport_free_session(conn->sess->se_sess);
  991. if (conn->sess->session_index != 0) {
  992. spin_lock_bh(&sess_idr_lock);
  993. idr_remove(&sess_idr, conn->sess->session_index);
  994. spin_unlock_bh(&sess_idr_lock);
  995. }
  996. kfree(conn->sess->sess_ops);
  997. kfree(conn->sess);
  998. old_sess_out:
  999. iscsi_stop_login_thread_timer(np);
  1000. /*
  1001. * If login negotiation fails check if the Time2Retain timer
  1002. * needs to be restarted.
  1003. */
  1004. if (!zero_tsih && conn->sess) {
  1005. spin_lock_bh(&conn->sess->conn_lock);
  1006. if (conn->sess->session_state == TARG_SESS_STATE_FAILED) {
  1007. struct se_portal_group *se_tpg =
  1008. &ISCSI_TPG_C(conn)->tpg_se_tpg;
  1009. atomic_set(&conn->sess->session_continuation, 0);
  1010. spin_unlock_bh(&conn->sess->conn_lock);
  1011. spin_lock_bh(&se_tpg->session_lock);
  1012. iscsit_start_time2retain_handler(conn->sess);
  1013. spin_unlock_bh(&se_tpg->session_lock);
  1014. } else
  1015. spin_unlock_bh(&conn->sess->conn_lock);
  1016. iscsit_dec_session_usage_count(conn->sess);
  1017. }
  1018. if (!IS_ERR(conn->conn_rx_hash.tfm))
  1019. crypto_free_hash(conn->conn_rx_hash.tfm);
  1020. if (!IS_ERR(conn->conn_tx_hash.tfm))
  1021. crypto_free_hash(conn->conn_tx_hash.tfm);
  1022. if (conn->conn_cpumask)
  1023. free_cpumask_var(conn->conn_cpumask);
  1024. kfree(conn->conn_ops);
  1025. if (conn->param_list) {
  1026. iscsi_release_param_list(conn->param_list);
  1027. conn->param_list = NULL;
  1028. }
  1029. iscsi_target_nego_release(conn);
  1030. if (conn->sock) {
  1031. sock_release(conn->sock);
  1032. conn->sock = NULL;
  1033. }
  1034. if (conn->conn_transport->iscsit_free_conn)
  1035. conn->conn_transport->iscsit_free_conn(conn);
  1036. iscsit_put_transport(conn->conn_transport);
  1037. kfree(conn);
  1038. }
  1039. static int __iscsi_target_login_thread(struct iscsi_np *np)
  1040. {
  1041. u8 *buffer, zero_tsih = 0;
  1042. int ret = 0, rc, stop;
  1043. struct iscsi_conn *conn = NULL;
  1044. struct iscsi_login *login;
  1045. struct iscsi_portal_group *tpg = NULL;
  1046. struct iscsi_login_req *pdu;
  1047. struct iscsi_tpg_np *tpg_np;
  1048. bool new_sess = false;
  1049. flush_signals(current);
  1050. spin_lock_bh(&np->np_thread_lock);
  1051. if (np->np_thread_state == ISCSI_NP_THREAD_RESET) {
  1052. np->np_thread_state = ISCSI_NP_THREAD_ACTIVE;
  1053. complete(&np->np_restart_comp);
  1054. } else {
  1055. np->np_thread_state = ISCSI_NP_THREAD_ACTIVE;
  1056. }
  1057. spin_unlock_bh(&np->np_thread_lock);
  1058. conn = kzalloc(sizeof(struct iscsi_conn), GFP_KERNEL);
  1059. if (!conn) {
  1060. pr_err("Could not allocate memory for"
  1061. " new connection\n");
  1062. /* Get another socket */
  1063. return 1;
  1064. }
  1065. pr_debug("Moving to TARG_CONN_STATE_FREE.\n");
  1066. conn->conn_state = TARG_CONN_STATE_FREE;
  1067. if (iscsit_conn_set_transport(conn, np->np_transport) < 0) {
  1068. kfree(conn);
  1069. return 1;
  1070. }
  1071. rc = np->np_transport->iscsit_accept_np(np, conn);
  1072. if (rc == -ENOSYS) {
  1073. complete(&np->np_restart_comp);
  1074. iscsit_put_transport(conn->conn_transport);
  1075. kfree(conn);
  1076. conn = NULL;
  1077. goto exit;
  1078. } else if (rc < 0) {
  1079. spin_lock_bh(&np->np_thread_lock);
  1080. if (np->np_thread_state == ISCSI_NP_THREAD_RESET) {
  1081. spin_unlock_bh(&np->np_thread_lock);
  1082. complete(&np->np_restart_comp);
  1083. if (ret == -ENODEV) {
  1084. iscsit_put_transport(conn->conn_transport);
  1085. kfree(conn);
  1086. conn = NULL;
  1087. goto out;
  1088. }
  1089. /* Get another socket */
  1090. return 1;
  1091. }
  1092. spin_unlock_bh(&np->np_thread_lock);
  1093. iscsit_put_transport(conn->conn_transport);
  1094. kfree(conn);
  1095. conn = NULL;
  1096. goto out;
  1097. }
  1098. /*
  1099. * Perform the remaining iSCSI connection initialization items..
  1100. */
  1101. login = iscsi_login_init_conn(conn);
  1102. if (!login) {
  1103. goto new_sess_out;
  1104. }
  1105. iscsi_start_login_thread_timer(np);
  1106. pr_debug("Moving to TARG_CONN_STATE_XPT_UP.\n");
  1107. conn->conn_state = TARG_CONN_STATE_XPT_UP;
  1108. /*
  1109. * This will process the first login request + payload..
  1110. */
  1111. rc = np->np_transport->iscsit_get_login_rx(conn, login);
  1112. if (rc == 1)
  1113. return 1;
  1114. else if (rc < 0)
  1115. goto new_sess_out;
  1116. buffer = &login->req[0];
  1117. pdu = (struct iscsi_login_req *)buffer;
  1118. /*
  1119. * Used by iscsit_tx_login_rsp() for Login Resonses PDUs
  1120. * when Status-Class != 0.
  1121. */
  1122. conn->login_itt = pdu->itt;
  1123. spin_lock_bh(&np->np_thread_lock);
  1124. if (np->np_thread_state != ISCSI_NP_THREAD_ACTIVE) {
  1125. spin_unlock_bh(&np->np_thread_lock);
  1126. pr_err("iSCSI Network Portal on %s:%hu currently not"
  1127. " active.\n", np->np_ip, np->np_port);
  1128. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  1129. ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
  1130. goto new_sess_out;
  1131. }
  1132. spin_unlock_bh(&np->np_thread_lock);
  1133. conn->network_transport = np->np_network_transport;
  1134. pr_debug("Received iSCSI login request from %s on %s Network"
  1135. " Portal %s:%hu\n", conn->login_ip, np->np_transport->name,
  1136. conn->local_ip, conn->local_port);
  1137. pr_debug("Moving to TARG_CONN_STATE_IN_LOGIN.\n");
  1138. conn->conn_state = TARG_CONN_STATE_IN_LOGIN;
  1139. if (iscsi_login_check_initiator_version(conn, pdu->max_version,
  1140. pdu->min_version) < 0)
  1141. goto new_sess_out;
  1142. zero_tsih = (pdu->tsih == 0x0000);
  1143. if (zero_tsih) {
  1144. /*
  1145. * This is the leading connection of a new session.
  1146. * We wait until after authentication to check for
  1147. * session reinstatement.
  1148. */
  1149. if (iscsi_login_zero_tsih_s1(conn, buffer) < 0)
  1150. goto new_sess_out;
  1151. } else {
  1152. /*
  1153. * Add a new connection to an existing session.
  1154. * We check for a non-existant session in
  1155. * iscsi_login_non_zero_tsih_s2() below based
  1156. * on ISID/TSIH, but wait until after authentication
  1157. * to check for connection reinstatement, etc.
  1158. */
  1159. if (iscsi_login_non_zero_tsih_s1(conn, buffer) < 0)
  1160. goto new_sess_out;
  1161. }
  1162. /*
  1163. * SessionType: Discovery
  1164. *
  1165. * Locates Default Portal
  1166. *
  1167. * SessionType: Normal
  1168. *
  1169. * Locates Target Portal from NP -> Target IQN
  1170. */
  1171. rc = iscsi_target_locate_portal(np, conn, login);
  1172. if (rc < 0) {
  1173. tpg = conn->tpg;
  1174. goto new_sess_out;
  1175. }
  1176. login->zero_tsih = zero_tsih;
  1177. tpg = conn->tpg;
  1178. if (!tpg) {
  1179. pr_err("Unable to locate struct iscsi_conn->tpg\n");
  1180. goto new_sess_out;
  1181. }
  1182. if (zero_tsih) {
  1183. if (iscsi_login_zero_tsih_s2(conn) < 0)
  1184. goto new_sess_out;
  1185. } else {
  1186. if (iscsi_login_non_zero_tsih_s2(conn, buffer) < 0)
  1187. goto old_sess_out;
  1188. }
  1189. ret = iscsi_target_start_negotiation(login, conn);
  1190. if (ret < 0)
  1191. goto new_sess_out;
  1192. if (!conn->sess) {
  1193. pr_err("struct iscsi_conn session pointer is NULL!\n");
  1194. goto new_sess_out;
  1195. }
  1196. iscsi_stop_login_thread_timer(np);
  1197. if (signal_pending(current))
  1198. goto new_sess_out;
  1199. if (ret == 1) {
  1200. tpg_np = conn->tpg_np;
  1201. ret = iscsi_post_login_handler(np, conn, zero_tsih);
  1202. if (ret < 0)
  1203. goto new_sess_out;
  1204. iscsit_deaccess_np(np, tpg, tpg_np);
  1205. }
  1206. tpg = NULL;
  1207. tpg_np = NULL;
  1208. /* Get another socket */
  1209. return 1;
  1210. new_sess_out:
  1211. new_sess = true;
  1212. old_sess_out:
  1213. tpg_np = conn->tpg_np;
  1214. iscsi_target_login_sess_out(conn, np, zero_tsih, new_sess);
  1215. new_sess = false;
  1216. if (tpg) {
  1217. iscsit_deaccess_np(np, tpg, tpg_np);
  1218. tpg = NULL;
  1219. tpg_np = NULL;
  1220. }
  1221. out:
  1222. stop = kthread_should_stop();
  1223. if (!stop && signal_pending(current)) {
  1224. spin_lock_bh(&np->np_thread_lock);
  1225. stop = (np->np_thread_state == ISCSI_NP_THREAD_SHUTDOWN);
  1226. spin_unlock_bh(&np->np_thread_lock);
  1227. }
  1228. /* Wait for another socket.. */
  1229. if (!stop)
  1230. return 1;
  1231. exit:
  1232. iscsi_stop_login_thread_timer(np);
  1233. spin_lock_bh(&np->np_thread_lock);
  1234. np->np_thread_state = ISCSI_NP_THREAD_EXIT;
  1235. np->np_thread = NULL;
  1236. spin_unlock_bh(&np->np_thread_lock);
  1237. return 0;
  1238. }
  1239. int iscsi_target_login_thread(void *arg)
  1240. {
  1241. struct iscsi_np *np = arg;
  1242. int ret;
  1243. allow_signal(SIGINT);
  1244. while (!kthread_should_stop()) {
  1245. ret = __iscsi_target_login_thread(np);
  1246. /*
  1247. * We break and exit here unless another sock_accept() call
  1248. * is expected.
  1249. */
  1250. if (ret != 1)
  1251. break;
  1252. }
  1253. return 0;
  1254. }