iscsi_target_nego.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*******************************************************************************
  3. * This file contains main functions related to iSCSI Parameter negotiation.
  4. *
  5. * (c) Copyright 2007-2013 Datera, Inc.
  6. *
  7. * Author: Nicholas A. Bellinger <[email protected]>
  8. *
  9. ******************************************************************************/
  10. #include <linux/ctype.h>
  11. #include <linux/kthread.h>
  12. #include <linux/slab.h>
  13. #include <linux/sched/signal.h>
  14. #include <net/sock.h>
  15. #include <scsi/iscsi_proto.h>
  16. #include <target/target_core_base.h>
  17. #include <target/target_core_fabric.h>
  18. #include <target/iscsi/iscsi_transport.h>
  19. #include <target/iscsi/iscsi_target_core.h>
  20. #include "iscsi_target_parameters.h"
  21. #include "iscsi_target_login.h"
  22. #include "iscsi_target_nego.h"
  23. #include "iscsi_target_tpg.h"
  24. #include "iscsi_target_util.h"
  25. #include "iscsi_target.h"
  26. #include "iscsi_target_auth.h"
  27. #define MAX_LOGIN_PDUS 7
  28. void convert_null_to_semi(char *buf, int len)
  29. {
  30. int i;
  31. for (i = 0; i < len; i++)
  32. if (buf[i] == '\0')
  33. buf[i] = ';';
  34. }
  35. static int strlen_semi(char *buf)
  36. {
  37. int i = 0;
  38. while (buf[i] != '\0') {
  39. if (buf[i] == ';')
  40. return i;
  41. i++;
  42. }
  43. return -1;
  44. }
  45. int extract_param(
  46. const char *in_buf,
  47. const char *pattern,
  48. unsigned int max_length,
  49. char *out_buf,
  50. unsigned char *type)
  51. {
  52. char *ptr;
  53. int len;
  54. if (!in_buf || !pattern || !out_buf || !type)
  55. return -EINVAL;
  56. ptr = strstr(in_buf, pattern);
  57. if (!ptr)
  58. return -ENOENT;
  59. ptr = strstr(ptr, "=");
  60. if (!ptr)
  61. return -EINVAL;
  62. ptr += 1;
  63. if (*ptr == '0' && (*(ptr+1) == 'x' || *(ptr+1) == 'X')) {
  64. ptr += 2; /* skip 0x */
  65. *type = HEX;
  66. } else if (*ptr == '0' && (*(ptr+1) == 'b' || *(ptr+1) == 'B')) {
  67. ptr += 2; /* skip 0b */
  68. *type = BASE64;
  69. } else
  70. *type = DECIMAL;
  71. len = strlen_semi(ptr);
  72. if (len < 0)
  73. return -EINVAL;
  74. if (len >= max_length) {
  75. pr_err("Length of input: %d exceeds max_length:"
  76. " %d\n", len, max_length);
  77. return -EINVAL;
  78. }
  79. memcpy(out_buf, ptr, len);
  80. out_buf[len] = '\0';
  81. return 0;
  82. }
  83. static struct iscsi_node_auth *iscsi_get_node_auth(struct iscsit_conn *conn)
  84. {
  85. struct iscsi_portal_group *tpg;
  86. struct iscsi_node_acl *nacl;
  87. struct se_node_acl *se_nacl;
  88. if (conn->sess->sess_ops->SessionType)
  89. return &iscsit_global->discovery_acl.node_auth;
  90. se_nacl = conn->sess->se_sess->se_node_acl;
  91. if (!se_nacl) {
  92. pr_err("Unable to locate struct se_node_acl for CHAP auth\n");
  93. return NULL;
  94. }
  95. if (se_nacl->dynamic_node_acl) {
  96. tpg = to_iscsi_tpg(se_nacl->se_tpg);
  97. return &tpg->tpg_demo_auth;
  98. }
  99. nacl = to_iscsi_nacl(se_nacl);
  100. return &nacl->node_auth;
  101. }
  102. static u32 iscsi_handle_authentication(
  103. struct iscsit_conn *conn,
  104. char *in_buf,
  105. char *out_buf,
  106. int in_length,
  107. int *out_length,
  108. unsigned char *authtype)
  109. {
  110. struct iscsi_node_auth *auth;
  111. auth = iscsi_get_node_auth(conn);
  112. if (!auth)
  113. return -1;
  114. if (strstr("CHAP", authtype))
  115. strcpy(conn->sess->auth_type, "CHAP");
  116. else
  117. strcpy(conn->sess->auth_type, NONE);
  118. if (strstr("None", authtype))
  119. return 1;
  120. else if (strstr("CHAP", authtype))
  121. return chap_main_loop(conn, auth, in_buf, out_buf,
  122. &in_length, out_length);
  123. /* SRP, SPKM1, SPKM2 and KRB5 are unsupported */
  124. return 2;
  125. }
  126. static void iscsi_remove_failed_auth_entry(struct iscsit_conn *conn)
  127. {
  128. kfree(conn->auth_protocol);
  129. }
  130. int iscsi_target_check_login_request(
  131. struct iscsit_conn *conn,
  132. struct iscsi_login *login)
  133. {
  134. int req_csg, req_nsg;
  135. u32 payload_length;
  136. struct iscsi_login_req *login_req;
  137. login_req = (struct iscsi_login_req *) login->req;
  138. payload_length = ntoh24(login_req->dlength);
  139. switch (login_req->opcode & ISCSI_OPCODE_MASK) {
  140. case ISCSI_OP_LOGIN:
  141. break;
  142. default:
  143. pr_err("Received unknown opcode 0x%02x.\n",
  144. login_req->opcode & ISCSI_OPCODE_MASK);
  145. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  146. ISCSI_LOGIN_STATUS_INIT_ERR);
  147. return -1;
  148. }
  149. if ((login_req->flags & ISCSI_FLAG_LOGIN_CONTINUE) &&
  150. (login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT)) {
  151. pr_err("Login request has both ISCSI_FLAG_LOGIN_CONTINUE"
  152. " and ISCSI_FLAG_LOGIN_TRANSIT set, protocol error.\n");
  153. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  154. ISCSI_LOGIN_STATUS_INIT_ERR);
  155. return -1;
  156. }
  157. req_csg = ISCSI_LOGIN_CURRENT_STAGE(login_req->flags);
  158. req_nsg = ISCSI_LOGIN_NEXT_STAGE(login_req->flags);
  159. if (req_csg != login->current_stage) {
  160. pr_err("Initiator unexpectedly changed login stage"
  161. " from %d to %d, login failed.\n", login->current_stage,
  162. req_csg);
  163. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  164. ISCSI_LOGIN_STATUS_INIT_ERR);
  165. return -1;
  166. }
  167. if ((req_nsg == 2) || (req_csg >= 2) ||
  168. ((login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT) &&
  169. (req_nsg <= req_csg))) {
  170. pr_err("Illegal login_req->flags Combination, CSG: %d,"
  171. " NSG: %d, ISCSI_FLAG_LOGIN_TRANSIT: %d.\n", req_csg,
  172. req_nsg, (login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT));
  173. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  174. ISCSI_LOGIN_STATUS_INIT_ERR);
  175. return -1;
  176. }
  177. if ((login_req->max_version != login->version_max) ||
  178. (login_req->min_version != login->version_min)) {
  179. pr_err("Login request changed Version Max/Nin"
  180. " unexpectedly to 0x%02x/0x%02x, protocol error\n",
  181. login_req->max_version, login_req->min_version);
  182. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  183. ISCSI_LOGIN_STATUS_INIT_ERR);
  184. return -1;
  185. }
  186. if (memcmp(login_req->isid, login->isid, 6) != 0) {
  187. pr_err("Login request changed ISID unexpectedly,"
  188. " protocol error.\n");
  189. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  190. ISCSI_LOGIN_STATUS_INIT_ERR);
  191. return -1;
  192. }
  193. if (login_req->itt != login->init_task_tag) {
  194. pr_err("Login request changed ITT unexpectedly to"
  195. " 0x%08x, protocol error.\n", login_req->itt);
  196. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  197. ISCSI_LOGIN_STATUS_INIT_ERR);
  198. return -1;
  199. }
  200. if (payload_length > MAX_KEY_VALUE_PAIRS) {
  201. pr_err("Login request payload exceeds default"
  202. " MaxRecvDataSegmentLength: %u, protocol error.\n",
  203. MAX_KEY_VALUE_PAIRS);
  204. return -1;
  205. }
  206. return 0;
  207. }
  208. EXPORT_SYMBOL(iscsi_target_check_login_request);
  209. static int iscsi_target_check_first_request(
  210. struct iscsit_conn *conn,
  211. struct iscsi_login *login)
  212. {
  213. struct iscsi_param *param = NULL;
  214. struct se_node_acl *se_nacl;
  215. login->first_request = 0;
  216. list_for_each_entry(param, &conn->param_list->param_list, p_list) {
  217. if (!strncmp(param->name, SESSIONTYPE, 11)) {
  218. if (!IS_PSTATE_ACCEPTOR(param)) {
  219. pr_err("SessionType key not received"
  220. " in first login request.\n");
  221. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  222. ISCSI_LOGIN_STATUS_MISSING_FIELDS);
  223. return -1;
  224. }
  225. if (!strncmp(param->value, DISCOVERY, 9))
  226. return 0;
  227. }
  228. if (!strncmp(param->name, INITIATORNAME, 13)) {
  229. if (!IS_PSTATE_ACCEPTOR(param)) {
  230. if (!login->leading_connection)
  231. continue;
  232. pr_err("InitiatorName key not received"
  233. " in first login request.\n");
  234. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  235. ISCSI_LOGIN_STATUS_MISSING_FIELDS);
  236. return -1;
  237. }
  238. /*
  239. * For non-leading connections, double check that the
  240. * received InitiatorName matches the existing session's
  241. * struct iscsi_node_acl.
  242. */
  243. if (!login->leading_connection) {
  244. se_nacl = conn->sess->se_sess->se_node_acl;
  245. if (!se_nacl) {
  246. pr_err("Unable to locate"
  247. " struct se_node_acl\n");
  248. iscsit_tx_login_rsp(conn,
  249. ISCSI_STATUS_CLS_INITIATOR_ERR,
  250. ISCSI_LOGIN_STATUS_TGT_NOT_FOUND);
  251. return -1;
  252. }
  253. if (strcmp(param->value,
  254. se_nacl->initiatorname)) {
  255. pr_err("Incorrect"
  256. " InitiatorName: %s for this"
  257. " iSCSI Initiator Node.\n",
  258. param->value);
  259. iscsit_tx_login_rsp(conn,
  260. ISCSI_STATUS_CLS_INITIATOR_ERR,
  261. ISCSI_LOGIN_STATUS_TGT_NOT_FOUND);
  262. return -1;
  263. }
  264. }
  265. }
  266. }
  267. return 0;
  268. }
  269. static int iscsi_target_do_tx_login_io(struct iscsit_conn *conn, struct iscsi_login *login)
  270. {
  271. u32 padding = 0;
  272. struct iscsi_login_rsp *login_rsp;
  273. login_rsp = (struct iscsi_login_rsp *) login->rsp;
  274. login_rsp->opcode = ISCSI_OP_LOGIN_RSP;
  275. hton24(login_rsp->dlength, login->rsp_length);
  276. memcpy(login_rsp->isid, login->isid, 6);
  277. login_rsp->tsih = cpu_to_be16(login->tsih);
  278. login_rsp->itt = login->init_task_tag;
  279. login_rsp->statsn = cpu_to_be32(conn->stat_sn++);
  280. login_rsp->exp_cmdsn = cpu_to_be32(conn->sess->exp_cmd_sn);
  281. login_rsp->max_cmdsn = cpu_to_be32((u32) atomic_read(&conn->sess->max_cmd_sn));
  282. pr_debug("Sending Login Response, Flags: 0x%02x, ITT: 0x%08x,"
  283. " ExpCmdSN; 0x%08x, MaxCmdSN: 0x%08x, StatSN: 0x%08x, Length:"
  284. " %u\n", login_rsp->flags, (__force u32)login_rsp->itt,
  285. ntohl(login_rsp->exp_cmdsn), ntohl(login_rsp->max_cmdsn),
  286. ntohl(login_rsp->statsn), login->rsp_length);
  287. padding = ((-login->rsp_length) & 3);
  288. /*
  289. * Before sending the last login response containing the transition
  290. * bit for full-feature-phase, go ahead and start up TX/RX threads
  291. * now to avoid potential resource allocation failures after the
  292. * final login response has been sent.
  293. */
  294. if (login->login_complete) {
  295. int rc = iscsit_start_kthreads(conn);
  296. if (rc) {
  297. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  298. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  299. return -1;
  300. }
  301. }
  302. if (conn->conn_transport->iscsit_put_login_tx(conn, login,
  303. login->rsp_length + padding) < 0)
  304. goto err;
  305. login->rsp_length = 0;
  306. return 0;
  307. err:
  308. if (login->login_complete) {
  309. if (conn->rx_thread && conn->rx_thread_active) {
  310. send_sig(SIGINT, conn->rx_thread, 1);
  311. complete(&conn->rx_login_comp);
  312. kthread_stop(conn->rx_thread);
  313. }
  314. if (conn->tx_thread && conn->tx_thread_active) {
  315. send_sig(SIGINT, conn->tx_thread, 1);
  316. kthread_stop(conn->tx_thread);
  317. }
  318. spin_lock(&iscsit_global->ts_bitmap_lock);
  319. bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id,
  320. get_order(1));
  321. spin_unlock(&iscsit_global->ts_bitmap_lock);
  322. }
  323. return -1;
  324. }
  325. static void iscsi_target_sk_data_ready(struct sock *sk)
  326. {
  327. struct iscsit_conn *conn = sk->sk_user_data;
  328. bool rc;
  329. pr_debug("Entering iscsi_target_sk_data_ready: conn: %p\n", conn);
  330. write_lock_bh(&sk->sk_callback_lock);
  331. if (!sk->sk_user_data) {
  332. write_unlock_bh(&sk->sk_callback_lock);
  333. return;
  334. }
  335. if (!test_bit(LOGIN_FLAGS_READY, &conn->login_flags)) {
  336. write_unlock_bh(&sk->sk_callback_lock);
  337. pr_debug("Got LOGIN_FLAGS_READY=0, conn: %p >>>>\n", conn);
  338. return;
  339. }
  340. if (test_bit(LOGIN_FLAGS_CLOSED, &conn->login_flags)) {
  341. write_unlock_bh(&sk->sk_callback_lock);
  342. pr_debug("Got LOGIN_FLAGS_CLOSED=1, conn: %p >>>>\n", conn);
  343. return;
  344. }
  345. if (test_and_set_bit(LOGIN_FLAGS_READ_ACTIVE, &conn->login_flags)) {
  346. write_unlock_bh(&sk->sk_callback_lock);
  347. pr_debug("Got LOGIN_FLAGS_READ_ACTIVE=1, conn: %p >>>>\n", conn);
  348. if (iscsi_target_sk_data_ready == conn->orig_data_ready)
  349. return;
  350. conn->orig_data_ready(sk);
  351. return;
  352. }
  353. rc = schedule_delayed_work(&conn->login_work, 0);
  354. if (!rc) {
  355. pr_debug("iscsi_target_sk_data_ready, schedule_delayed_work"
  356. " got false\n");
  357. }
  358. write_unlock_bh(&sk->sk_callback_lock);
  359. }
  360. static void iscsi_target_sk_state_change(struct sock *);
  361. static void iscsi_target_set_sock_callbacks(struct iscsit_conn *conn)
  362. {
  363. struct sock *sk;
  364. if (!conn->sock)
  365. return;
  366. sk = conn->sock->sk;
  367. pr_debug("Entering iscsi_target_set_sock_callbacks: conn: %p\n", conn);
  368. write_lock_bh(&sk->sk_callback_lock);
  369. sk->sk_user_data = conn;
  370. conn->orig_data_ready = sk->sk_data_ready;
  371. conn->orig_state_change = sk->sk_state_change;
  372. sk->sk_data_ready = iscsi_target_sk_data_ready;
  373. sk->sk_state_change = iscsi_target_sk_state_change;
  374. write_unlock_bh(&sk->sk_callback_lock);
  375. sk->sk_sndtimeo = TA_LOGIN_TIMEOUT * HZ;
  376. sk->sk_rcvtimeo = TA_LOGIN_TIMEOUT * HZ;
  377. }
  378. static void iscsi_target_restore_sock_callbacks(struct iscsit_conn *conn)
  379. {
  380. struct sock *sk;
  381. if (!conn->sock)
  382. return;
  383. sk = conn->sock->sk;
  384. pr_debug("Entering iscsi_target_restore_sock_callbacks: conn: %p\n", conn);
  385. write_lock_bh(&sk->sk_callback_lock);
  386. if (!sk->sk_user_data) {
  387. write_unlock_bh(&sk->sk_callback_lock);
  388. return;
  389. }
  390. sk->sk_user_data = NULL;
  391. sk->sk_data_ready = conn->orig_data_ready;
  392. sk->sk_state_change = conn->orig_state_change;
  393. write_unlock_bh(&sk->sk_callback_lock);
  394. sk->sk_sndtimeo = MAX_SCHEDULE_TIMEOUT;
  395. sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT;
  396. }
  397. static int iscsi_target_do_login(struct iscsit_conn *, struct iscsi_login *);
  398. static bool __iscsi_target_sk_check_close(struct sock *sk)
  399. {
  400. if (sk->sk_state == TCP_CLOSE_WAIT || sk->sk_state == TCP_CLOSE) {
  401. pr_debug("__iscsi_target_sk_check_close: TCP_CLOSE_WAIT|TCP_CLOSE,"
  402. "returning TRUE\n");
  403. return true;
  404. }
  405. return false;
  406. }
  407. static bool iscsi_target_sk_check_close(struct iscsit_conn *conn)
  408. {
  409. bool state = false;
  410. if (conn->sock) {
  411. struct sock *sk = conn->sock->sk;
  412. read_lock_bh(&sk->sk_callback_lock);
  413. state = (__iscsi_target_sk_check_close(sk) ||
  414. test_bit(LOGIN_FLAGS_CLOSED, &conn->login_flags));
  415. read_unlock_bh(&sk->sk_callback_lock);
  416. }
  417. return state;
  418. }
  419. static bool iscsi_target_sk_check_flag(struct iscsit_conn *conn, unsigned int flag)
  420. {
  421. bool state = false;
  422. if (conn->sock) {
  423. struct sock *sk = conn->sock->sk;
  424. read_lock_bh(&sk->sk_callback_lock);
  425. state = test_bit(flag, &conn->login_flags);
  426. read_unlock_bh(&sk->sk_callback_lock);
  427. }
  428. return state;
  429. }
  430. static bool iscsi_target_sk_check_and_clear(struct iscsit_conn *conn, unsigned int flag)
  431. {
  432. bool state = false;
  433. if (conn->sock) {
  434. struct sock *sk = conn->sock->sk;
  435. write_lock_bh(&sk->sk_callback_lock);
  436. state = (__iscsi_target_sk_check_close(sk) ||
  437. test_bit(LOGIN_FLAGS_CLOSED, &conn->login_flags));
  438. if (!state)
  439. clear_bit(flag, &conn->login_flags);
  440. write_unlock_bh(&sk->sk_callback_lock);
  441. }
  442. return state;
  443. }
  444. static void iscsi_target_login_drop(struct iscsit_conn *conn, struct iscsi_login *login)
  445. {
  446. bool zero_tsih = login->zero_tsih;
  447. iscsi_remove_failed_auth_entry(conn);
  448. iscsi_target_nego_release(conn);
  449. iscsi_target_login_sess_out(conn, zero_tsih, true);
  450. }
  451. struct conn_timeout {
  452. struct timer_list timer;
  453. struct iscsit_conn *conn;
  454. };
  455. static void iscsi_target_login_timeout(struct timer_list *t)
  456. {
  457. struct conn_timeout *timeout = from_timer(timeout, t, timer);
  458. struct iscsit_conn *conn = timeout->conn;
  459. pr_debug("Entering iscsi_target_login_timeout >>>>>>>>>>>>>>>>>>>\n");
  460. if (conn->login_kworker) {
  461. pr_debug("Sending SIGINT to conn->login_kworker %s/%d\n",
  462. conn->login_kworker->comm, conn->login_kworker->pid);
  463. send_sig(SIGINT, conn->login_kworker, 1);
  464. }
  465. }
  466. static void iscsi_target_do_login_rx(struct work_struct *work)
  467. {
  468. struct iscsit_conn *conn = container_of(work,
  469. struct iscsit_conn, login_work.work);
  470. struct iscsi_login *login = conn->login;
  471. struct iscsi_np *np = login->np;
  472. struct iscsi_portal_group *tpg = conn->tpg;
  473. struct iscsi_tpg_np *tpg_np = conn->tpg_np;
  474. struct conn_timeout timeout;
  475. int rc, zero_tsih = login->zero_tsih;
  476. bool state;
  477. pr_debug("entering iscsi_target_do_login_rx, conn: %p, %s:%d\n",
  478. conn, current->comm, current->pid);
  479. /*
  480. * If iscsi_target_do_login_rx() has been invoked by ->sk_data_ready()
  481. * before initial PDU processing in iscsi_target_start_negotiation()
  482. * has completed, go ahead and retry until it's cleared.
  483. *
  484. * Otherwise if the TCP connection drops while this is occuring,
  485. * iscsi_target_start_negotiation() will detect the failure, call
  486. * cancel_delayed_work_sync(&conn->login_work), and cleanup the
  487. * remaining iscsi connection resources from iscsi_np process context.
  488. */
  489. if (iscsi_target_sk_check_flag(conn, LOGIN_FLAGS_INITIAL_PDU)) {
  490. schedule_delayed_work(&conn->login_work, msecs_to_jiffies(10));
  491. return;
  492. }
  493. spin_lock(&tpg->tpg_state_lock);
  494. state = (tpg->tpg_state == TPG_STATE_ACTIVE);
  495. spin_unlock(&tpg->tpg_state_lock);
  496. if (!state) {
  497. pr_debug("iscsi_target_do_login_rx: tpg_state != TPG_STATE_ACTIVE\n");
  498. goto err;
  499. }
  500. if (iscsi_target_sk_check_close(conn)) {
  501. pr_debug("iscsi_target_do_login_rx, TCP state CLOSE\n");
  502. goto err;
  503. }
  504. conn->login_kworker = current;
  505. allow_signal(SIGINT);
  506. timeout.conn = conn;
  507. timer_setup_on_stack(&timeout.timer, iscsi_target_login_timeout, 0);
  508. mod_timer(&timeout.timer, jiffies + TA_LOGIN_TIMEOUT * HZ);
  509. pr_debug("Starting login timer for %s/%d\n", current->comm, current->pid);
  510. rc = conn->conn_transport->iscsit_get_login_rx(conn, login);
  511. del_timer_sync(&timeout.timer);
  512. destroy_timer_on_stack(&timeout.timer);
  513. flush_signals(current);
  514. conn->login_kworker = NULL;
  515. if (rc < 0)
  516. goto err;
  517. pr_debug("iscsi_target_do_login_rx after rx_login_io, %p, %s:%d\n",
  518. conn, current->comm, current->pid);
  519. /*
  520. * LOGIN_FLAGS_READ_ACTIVE is cleared so that sk_data_ready
  521. * could be triggered again after this.
  522. *
  523. * LOGIN_FLAGS_WRITE_ACTIVE is cleared after we successfully
  524. * process a login PDU, so that sk_state_chage can do login
  525. * cleanup as needed if the socket is closed. If a delayed work is
  526. * ongoing (LOGIN_FLAGS_WRITE_ACTIVE or LOGIN_FLAGS_READ_ACTIVE),
  527. * sk_state_change will leave the cleanup to the delayed work or
  528. * it will schedule a delayed work to do cleanup.
  529. */
  530. if (conn->sock) {
  531. struct sock *sk = conn->sock->sk;
  532. write_lock_bh(&sk->sk_callback_lock);
  533. if (!test_bit(LOGIN_FLAGS_INITIAL_PDU, &conn->login_flags)) {
  534. clear_bit(LOGIN_FLAGS_READ_ACTIVE, &conn->login_flags);
  535. set_bit(LOGIN_FLAGS_WRITE_ACTIVE, &conn->login_flags);
  536. }
  537. write_unlock_bh(&sk->sk_callback_lock);
  538. }
  539. rc = iscsi_target_do_login(conn, login);
  540. if (rc < 0) {
  541. goto err;
  542. } else if (!rc) {
  543. if (iscsi_target_sk_check_and_clear(conn,
  544. LOGIN_FLAGS_WRITE_ACTIVE))
  545. goto err;
  546. } else if (rc == 1) {
  547. cancel_delayed_work(&conn->login_work);
  548. iscsi_target_nego_release(conn);
  549. iscsi_post_login_handler(np, conn, zero_tsih);
  550. iscsit_deaccess_np(np, tpg, tpg_np);
  551. }
  552. return;
  553. err:
  554. iscsi_target_restore_sock_callbacks(conn);
  555. cancel_delayed_work(&conn->login_work);
  556. iscsi_target_login_drop(conn, login);
  557. iscsit_deaccess_np(np, tpg, tpg_np);
  558. }
  559. static void iscsi_target_sk_state_change(struct sock *sk)
  560. {
  561. struct iscsit_conn *conn;
  562. void (*orig_state_change)(struct sock *);
  563. bool state;
  564. pr_debug("Entering iscsi_target_sk_state_change\n");
  565. write_lock_bh(&sk->sk_callback_lock);
  566. conn = sk->sk_user_data;
  567. if (!conn) {
  568. write_unlock_bh(&sk->sk_callback_lock);
  569. return;
  570. }
  571. orig_state_change = conn->orig_state_change;
  572. if (!test_bit(LOGIN_FLAGS_READY, &conn->login_flags)) {
  573. pr_debug("Got LOGIN_FLAGS_READY=0 sk_state_change conn: %p\n",
  574. conn);
  575. write_unlock_bh(&sk->sk_callback_lock);
  576. orig_state_change(sk);
  577. return;
  578. }
  579. state = __iscsi_target_sk_check_close(sk);
  580. pr_debug("__iscsi_target_sk_close_change: state: %d\n", state);
  581. if (test_bit(LOGIN_FLAGS_READ_ACTIVE, &conn->login_flags) ||
  582. test_bit(LOGIN_FLAGS_WRITE_ACTIVE, &conn->login_flags)) {
  583. pr_debug("Got LOGIN_FLAGS_{READ|WRITE}_ACTIVE=1"
  584. " sk_state_change conn: %p\n", conn);
  585. if (state)
  586. set_bit(LOGIN_FLAGS_CLOSED, &conn->login_flags);
  587. write_unlock_bh(&sk->sk_callback_lock);
  588. orig_state_change(sk);
  589. return;
  590. }
  591. if (test_bit(LOGIN_FLAGS_CLOSED, &conn->login_flags)) {
  592. pr_debug("Got LOGIN_FLAGS_CLOSED=1 sk_state_change conn: %p\n",
  593. conn);
  594. write_unlock_bh(&sk->sk_callback_lock);
  595. orig_state_change(sk);
  596. return;
  597. }
  598. /*
  599. * If the TCP connection has dropped, go ahead and set LOGIN_FLAGS_CLOSED,
  600. * but only queue conn->login_work -> iscsi_target_do_login_rx()
  601. * processing if LOGIN_FLAGS_INITIAL_PDU has already been cleared.
  602. *
  603. * When iscsi_target_do_login_rx() runs, iscsi_target_sk_check_close()
  604. * will detect the dropped TCP connection from delayed workqueue context.
  605. *
  606. * If LOGIN_FLAGS_INITIAL_PDU is still set, which means the initial
  607. * iscsi_target_start_negotiation() is running, iscsi_target_do_login()
  608. * via iscsi_target_sk_check_close() or iscsi_target_start_negotiation()
  609. * via iscsi_target_sk_check_and_clear() is responsible for detecting the
  610. * dropped TCP connection in iscsi_np process context, and cleaning up
  611. * the remaining iscsi connection resources.
  612. */
  613. if (state) {
  614. pr_debug("iscsi_target_sk_state_change got failed state\n");
  615. set_bit(LOGIN_FLAGS_CLOSED, &conn->login_flags);
  616. state = test_bit(LOGIN_FLAGS_INITIAL_PDU, &conn->login_flags);
  617. write_unlock_bh(&sk->sk_callback_lock);
  618. orig_state_change(sk);
  619. if (!state)
  620. schedule_delayed_work(&conn->login_work, 0);
  621. return;
  622. }
  623. write_unlock_bh(&sk->sk_callback_lock);
  624. orig_state_change(sk);
  625. }
  626. /*
  627. * NOTE: We check for existing sessions or connections AFTER the initiator
  628. * has been successfully authenticated in order to protect against faked
  629. * ISID/TSIH combinations.
  630. */
  631. static int iscsi_target_check_for_existing_instances(
  632. struct iscsit_conn *conn,
  633. struct iscsi_login *login)
  634. {
  635. if (login->checked_for_existing)
  636. return 0;
  637. login->checked_for_existing = 1;
  638. if (!login->tsih)
  639. return iscsi_check_for_session_reinstatement(conn);
  640. else
  641. return iscsi_login_post_auth_non_zero_tsih(conn, login->cid,
  642. login->initial_exp_statsn);
  643. }
  644. static int iscsi_target_do_authentication(
  645. struct iscsit_conn *conn,
  646. struct iscsi_login *login)
  647. {
  648. int authret;
  649. u32 payload_length;
  650. struct iscsi_param *param;
  651. struct iscsi_login_req *login_req;
  652. struct iscsi_login_rsp *login_rsp;
  653. login_req = (struct iscsi_login_req *) login->req;
  654. login_rsp = (struct iscsi_login_rsp *) login->rsp;
  655. payload_length = ntoh24(login_req->dlength);
  656. param = iscsi_find_param_from_key(AUTHMETHOD, conn->param_list);
  657. if (!param)
  658. return -1;
  659. authret = iscsi_handle_authentication(
  660. conn,
  661. login->req_buf,
  662. login->rsp_buf,
  663. payload_length,
  664. &login->rsp_length,
  665. param->value);
  666. switch (authret) {
  667. case 0:
  668. pr_debug("Received OK response"
  669. " from LIO Authentication, continuing.\n");
  670. break;
  671. case 1:
  672. pr_debug("iSCSI security negotiation"
  673. " completed successfully.\n");
  674. login->auth_complete = 1;
  675. if ((login_req->flags & ISCSI_FLAG_LOGIN_NEXT_STAGE1) &&
  676. (login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT)) {
  677. login_rsp->flags |= (ISCSI_FLAG_LOGIN_NEXT_STAGE1 |
  678. ISCSI_FLAG_LOGIN_TRANSIT);
  679. login->current_stage = 1;
  680. }
  681. return iscsi_target_check_for_existing_instances(
  682. conn, login);
  683. case 2:
  684. pr_err("Security negotiation"
  685. " failed.\n");
  686. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  687. ISCSI_LOGIN_STATUS_AUTH_FAILED);
  688. return -1;
  689. default:
  690. pr_err("Received unknown error %d from LIO"
  691. " Authentication\n", authret);
  692. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  693. ISCSI_LOGIN_STATUS_TARGET_ERROR);
  694. return -1;
  695. }
  696. return 0;
  697. }
  698. bool iscsi_conn_auth_required(struct iscsit_conn *conn)
  699. {
  700. struct iscsi_node_acl *nacl;
  701. struct se_node_acl *se_nacl;
  702. if (conn->sess->sess_ops->SessionType) {
  703. /*
  704. * For SessionType=Discovery
  705. */
  706. return conn->tpg->tpg_attrib.authentication;
  707. }
  708. /*
  709. * For SessionType=Normal
  710. */
  711. se_nacl = conn->sess->se_sess->se_node_acl;
  712. if (!se_nacl) {
  713. pr_debug("Unknown ACL is trying to connect\n");
  714. return true;
  715. }
  716. if (se_nacl->dynamic_node_acl) {
  717. pr_debug("Dynamic ACL %s is trying to connect\n",
  718. se_nacl->initiatorname);
  719. return conn->tpg->tpg_attrib.authentication;
  720. }
  721. pr_debug("Known ACL %s is trying to connect\n",
  722. se_nacl->initiatorname);
  723. nacl = to_iscsi_nacl(se_nacl);
  724. if (nacl->node_attrib.authentication == NA_AUTHENTICATION_INHERITED)
  725. return conn->tpg->tpg_attrib.authentication;
  726. return nacl->node_attrib.authentication;
  727. }
  728. static int iscsi_target_handle_csg_zero(
  729. struct iscsit_conn *conn,
  730. struct iscsi_login *login)
  731. {
  732. int ret;
  733. u32 payload_length;
  734. struct iscsi_param *param;
  735. struct iscsi_login_req *login_req;
  736. struct iscsi_login_rsp *login_rsp;
  737. login_req = (struct iscsi_login_req *) login->req;
  738. login_rsp = (struct iscsi_login_rsp *) login->rsp;
  739. payload_length = ntoh24(login_req->dlength);
  740. param = iscsi_find_param_from_key(AUTHMETHOD, conn->param_list);
  741. if (!param)
  742. return -1;
  743. ret = iscsi_decode_text_input(
  744. PHASE_SECURITY|PHASE_DECLARATIVE,
  745. SENDER_INITIATOR|SENDER_RECEIVER,
  746. login->req_buf,
  747. payload_length,
  748. conn);
  749. if (ret < 0)
  750. return -1;
  751. if (ret > 0) {
  752. if (login->auth_complete) {
  753. pr_err("Initiator has already been"
  754. " successfully authenticated, but is still"
  755. " sending %s keys.\n", param->value);
  756. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  757. ISCSI_LOGIN_STATUS_INIT_ERR);
  758. return -1;
  759. }
  760. goto do_auth;
  761. } else if (!payload_length) {
  762. pr_err("Initiator sent zero length security payload,"
  763. " login failed\n");
  764. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  765. ISCSI_LOGIN_STATUS_AUTH_FAILED);
  766. return -1;
  767. }
  768. if (login->first_request)
  769. if (iscsi_target_check_first_request(conn, login) < 0)
  770. return -1;
  771. ret = iscsi_encode_text_output(
  772. PHASE_SECURITY|PHASE_DECLARATIVE,
  773. SENDER_TARGET,
  774. login->rsp_buf,
  775. &login->rsp_length,
  776. conn->param_list,
  777. conn->tpg->tpg_attrib.login_keys_workaround);
  778. if (ret < 0)
  779. return -1;
  780. if (!iscsi_check_negotiated_keys(conn->param_list)) {
  781. bool auth_required = iscsi_conn_auth_required(conn);
  782. if (auth_required) {
  783. if (!strncmp(param->value, NONE, 4)) {
  784. pr_err("Initiator sent AuthMethod=None but"
  785. " Target is enforcing iSCSI Authentication,"
  786. " login failed.\n");
  787. iscsit_tx_login_rsp(conn,
  788. ISCSI_STATUS_CLS_INITIATOR_ERR,
  789. ISCSI_LOGIN_STATUS_AUTH_FAILED);
  790. return -1;
  791. }
  792. if (!login->auth_complete)
  793. return 0;
  794. if (strncmp(param->value, NONE, 4) &&
  795. !login->auth_complete)
  796. return 0;
  797. }
  798. if ((login_req->flags & ISCSI_FLAG_LOGIN_NEXT_STAGE1) &&
  799. (login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT)) {
  800. login_rsp->flags |= ISCSI_FLAG_LOGIN_NEXT_STAGE1 |
  801. ISCSI_FLAG_LOGIN_TRANSIT;
  802. login->current_stage = 1;
  803. }
  804. }
  805. return 0;
  806. do_auth:
  807. return iscsi_target_do_authentication(conn, login);
  808. }
  809. static bool iscsi_conn_authenticated(struct iscsit_conn *conn,
  810. struct iscsi_login *login)
  811. {
  812. if (!iscsi_conn_auth_required(conn))
  813. return true;
  814. if (login->auth_complete)
  815. return true;
  816. return false;
  817. }
  818. static int iscsi_target_handle_csg_one(struct iscsit_conn *conn, struct iscsi_login *login)
  819. {
  820. int ret;
  821. u32 payload_length;
  822. struct iscsi_login_req *login_req;
  823. struct iscsi_login_rsp *login_rsp;
  824. login_req = (struct iscsi_login_req *) login->req;
  825. login_rsp = (struct iscsi_login_rsp *) login->rsp;
  826. payload_length = ntoh24(login_req->dlength);
  827. ret = iscsi_decode_text_input(
  828. PHASE_OPERATIONAL|PHASE_DECLARATIVE,
  829. SENDER_INITIATOR|SENDER_RECEIVER,
  830. login->req_buf,
  831. payload_length,
  832. conn);
  833. if (ret < 0) {
  834. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  835. ISCSI_LOGIN_STATUS_INIT_ERR);
  836. return -1;
  837. }
  838. if (login->first_request)
  839. if (iscsi_target_check_first_request(conn, login) < 0)
  840. return -1;
  841. if (iscsi_target_check_for_existing_instances(conn, login) < 0)
  842. return -1;
  843. ret = iscsi_encode_text_output(
  844. PHASE_OPERATIONAL|PHASE_DECLARATIVE,
  845. SENDER_TARGET,
  846. login->rsp_buf,
  847. &login->rsp_length,
  848. conn->param_list,
  849. conn->tpg->tpg_attrib.login_keys_workaround);
  850. if (ret < 0) {
  851. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  852. ISCSI_LOGIN_STATUS_INIT_ERR);
  853. return -1;
  854. }
  855. if (!iscsi_conn_authenticated(conn, login)) {
  856. pr_err("Initiator is requesting CSG: 1, has not been"
  857. " successfully authenticated, and the Target is"
  858. " enforcing iSCSI Authentication, login failed.\n");
  859. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  860. ISCSI_LOGIN_STATUS_AUTH_FAILED);
  861. return -1;
  862. }
  863. if (!iscsi_check_negotiated_keys(conn->param_list))
  864. if ((login_req->flags & ISCSI_FLAG_LOGIN_NEXT_STAGE3) &&
  865. (login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT))
  866. login_rsp->flags |= ISCSI_FLAG_LOGIN_NEXT_STAGE3 |
  867. ISCSI_FLAG_LOGIN_TRANSIT;
  868. return 0;
  869. }
  870. /*
  871. * RETURN VALUE:
  872. *
  873. * 1 = Login successful
  874. * -1 = Login failed
  875. * 0 = More PDU exchanges required
  876. */
  877. static int iscsi_target_do_login(struct iscsit_conn *conn, struct iscsi_login *login)
  878. {
  879. int pdu_count = 0;
  880. struct iscsi_login_req *login_req;
  881. struct iscsi_login_rsp *login_rsp;
  882. login_req = (struct iscsi_login_req *) login->req;
  883. login_rsp = (struct iscsi_login_rsp *) login->rsp;
  884. while (1) {
  885. if (++pdu_count > MAX_LOGIN_PDUS) {
  886. pr_err("MAX_LOGIN_PDUS count reached.\n");
  887. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  888. ISCSI_LOGIN_STATUS_TARGET_ERROR);
  889. return -1;
  890. }
  891. switch (ISCSI_LOGIN_CURRENT_STAGE(login_req->flags)) {
  892. case 0:
  893. login_rsp->flags &= ~ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK;
  894. if (iscsi_target_handle_csg_zero(conn, login) < 0)
  895. return -1;
  896. break;
  897. case 1:
  898. login_rsp->flags |= ISCSI_FLAG_LOGIN_CURRENT_STAGE1;
  899. if (iscsi_target_handle_csg_one(conn, login) < 0)
  900. return -1;
  901. if (login_rsp->flags & ISCSI_FLAG_LOGIN_TRANSIT) {
  902. /*
  903. * Check to make sure the TCP connection has not
  904. * dropped asynchronously while session reinstatement
  905. * was occuring in this kthread context, before
  906. * transitioning to full feature phase operation.
  907. */
  908. if (iscsi_target_sk_check_close(conn))
  909. return -1;
  910. login->tsih = conn->sess->tsih;
  911. login->login_complete = 1;
  912. iscsi_target_restore_sock_callbacks(conn);
  913. if (iscsi_target_do_tx_login_io(conn,
  914. login) < 0)
  915. return -1;
  916. return 1;
  917. }
  918. break;
  919. default:
  920. pr_err("Illegal CSG: %d received from"
  921. " Initiator, protocol error.\n",
  922. ISCSI_LOGIN_CURRENT_STAGE(login_req->flags));
  923. break;
  924. }
  925. if (iscsi_target_do_tx_login_io(conn, login) < 0)
  926. return -1;
  927. if (login_rsp->flags & ISCSI_FLAG_LOGIN_TRANSIT) {
  928. login_rsp->flags &= ~ISCSI_FLAG_LOGIN_TRANSIT;
  929. login_rsp->flags &= ~ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK;
  930. }
  931. break;
  932. }
  933. return 0;
  934. }
  935. static void iscsi_initiatorname_tolower(
  936. char *param_buf)
  937. {
  938. char *c;
  939. u32 iqn_size = strlen(param_buf), i;
  940. for (i = 0; i < iqn_size; i++) {
  941. c = &param_buf[i];
  942. if (!isupper(*c))
  943. continue;
  944. *c = tolower(*c);
  945. }
  946. }
  947. /*
  948. * Processes the first Login Request..
  949. */
  950. int iscsi_target_locate_portal(
  951. struct iscsi_np *np,
  952. struct iscsit_conn *conn,
  953. struct iscsi_login *login)
  954. {
  955. char *i_buf = NULL, *s_buf = NULL, *t_buf = NULL;
  956. char *tmpbuf, *start = NULL, *end = NULL, *key, *value;
  957. struct iscsit_session *sess = conn->sess;
  958. struct iscsi_tiqn *tiqn;
  959. struct iscsi_tpg_np *tpg_np = NULL;
  960. struct iscsi_login_req *login_req;
  961. struct se_node_acl *se_nacl;
  962. u32 payload_length, queue_depth = 0;
  963. int sessiontype = 0, ret = 0, tag_num, tag_size;
  964. INIT_DELAYED_WORK(&conn->login_work, iscsi_target_do_login_rx);
  965. iscsi_target_set_sock_callbacks(conn);
  966. login->np = np;
  967. conn->tpg = NULL;
  968. login_req = (struct iscsi_login_req *) login->req;
  969. payload_length = ntoh24(login_req->dlength);
  970. tmpbuf = kmemdup_nul(login->req_buf, payload_length, GFP_KERNEL);
  971. if (!tmpbuf) {
  972. pr_err("Unable to allocate memory for tmpbuf.\n");
  973. return -1;
  974. }
  975. start = tmpbuf;
  976. end = (start + payload_length);
  977. /*
  978. * Locate the initial keys expected from the Initiator node in
  979. * the first login request in order to progress with the login phase.
  980. */
  981. while (start < end) {
  982. if (iscsi_extract_key_value(start, &key, &value) < 0) {
  983. ret = -1;
  984. goto out;
  985. }
  986. if (!strncmp(key, "InitiatorName", 13))
  987. i_buf = value;
  988. else if (!strncmp(key, "SessionType", 11))
  989. s_buf = value;
  990. else if (!strncmp(key, "TargetName", 10))
  991. t_buf = value;
  992. start += strlen(key) + strlen(value) + 2;
  993. }
  994. /*
  995. * See 5.3. Login Phase.
  996. */
  997. if (!i_buf) {
  998. pr_err("InitiatorName key not received"
  999. " in first login request.\n");
  1000. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  1001. ISCSI_LOGIN_STATUS_MISSING_FIELDS);
  1002. ret = -1;
  1003. goto out;
  1004. }
  1005. /*
  1006. * Convert the incoming InitiatorName to lowercase following
  1007. * RFC-3720 3.2.6.1. section c) that says that iSCSI IQNs
  1008. * are NOT case sensitive.
  1009. */
  1010. iscsi_initiatorname_tolower(i_buf);
  1011. if (!s_buf) {
  1012. if (!login->leading_connection)
  1013. goto get_target;
  1014. pr_err("SessionType key not received"
  1015. " in first login request.\n");
  1016. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  1017. ISCSI_LOGIN_STATUS_MISSING_FIELDS);
  1018. ret = -1;
  1019. goto out;
  1020. }
  1021. /*
  1022. * Use default portal group for discovery sessions.
  1023. */
  1024. sessiontype = strncmp(s_buf, DISCOVERY, 9);
  1025. if (!sessiontype) {
  1026. if (!login->leading_connection)
  1027. goto get_target;
  1028. sess->sess_ops->SessionType = 1;
  1029. /*
  1030. * Setup crc32c modules from libcrypto
  1031. */
  1032. if (iscsi_login_setup_crypto(conn) < 0) {
  1033. pr_err("iscsi_login_setup_crypto() failed\n");
  1034. ret = -1;
  1035. goto out;
  1036. }
  1037. /*
  1038. * Serialize access across the discovery struct iscsi_portal_group to
  1039. * process login attempt.
  1040. */
  1041. conn->tpg = iscsit_global->discovery_tpg;
  1042. if (iscsit_access_np(np, conn->tpg) < 0) {
  1043. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  1044. ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
  1045. conn->tpg = NULL;
  1046. ret = -1;
  1047. goto out;
  1048. }
  1049. ret = 0;
  1050. goto alloc_tags;
  1051. }
  1052. get_target:
  1053. if (!t_buf) {
  1054. pr_err("TargetName key not received"
  1055. " in first login request while"
  1056. " SessionType=Normal.\n");
  1057. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  1058. ISCSI_LOGIN_STATUS_MISSING_FIELDS);
  1059. ret = -1;
  1060. goto out;
  1061. }
  1062. /*
  1063. * Locate Target IQN from Storage Node.
  1064. */
  1065. tiqn = iscsit_get_tiqn_for_login(t_buf);
  1066. if (!tiqn) {
  1067. pr_err("Unable to locate Target IQN: %s in"
  1068. " Storage Node\n", t_buf);
  1069. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  1070. ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
  1071. ret = -1;
  1072. goto out;
  1073. }
  1074. pr_debug("Located Storage Object: %s\n", tiqn->tiqn);
  1075. /*
  1076. * Locate Target Portal Group from Storage Node.
  1077. */
  1078. conn->tpg = iscsit_get_tpg_from_np(tiqn, np, &tpg_np);
  1079. if (!conn->tpg) {
  1080. pr_err("Unable to locate Target Portal Group"
  1081. " on %s\n", tiqn->tiqn);
  1082. iscsit_put_tiqn_for_login(tiqn);
  1083. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  1084. ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
  1085. ret = -1;
  1086. goto out;
  1087. }
  1088. conn->tpg_np = tpg_np;
  1089. pr_debug("Located Portal Group Object: %hu\n", conn->tpg->tpgt);
  1090. /*
  1091. * Setup crc32c modules from libcrypto
  1092. */
  1093. if (iscsi_login_setup_crypto(conn) < 0) {
  1094. pr_err("iscsi_login_setup_crypto() failed\n");
  1095. kref_put(&tpg_np->tpg_np_kref, iscsit_login_kref_put);
  1096. iscsit_put_tiqn_for_login(tiqn);
  1097. conn->tpg = NULL;
  1098. ret = -1;
  1099. goto out;
  1100. }
  1101. /*
  1102. * Serialize access across the struct iscsi_portal_group to
  1103. * process login attempt.
  1104. */
  1105. if (iscsit_access_np(np, conn->tpg) < 0) {
  1106. kref_put(&tpg_np->tpg_np_kref, iscsit_login_kref_put);
  1107. iscsit_put_tiqn_for_login(tiqn);
  1108. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  1109. ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
  1110. conn->tpg = NULL;
  1111. ret = -1;
  1112. goto out;
  1113. }
  1114. /*
  1115. * conn->sess->node_acl will be set when the referenced
  1116. * struct iscsit_session is located from received ISID+TSIH in
  1117. * iscsi_login_non_zero_tsih_s2().
  1118. */
  1119. if (!login->leading_connection) {
  1120. ret = 0;
  1121. goto out;
  1122. }
  1123. /*
  1124. * This value is required in iscsi_login_zero_tsih_s2()
  1125. */
  1126. sess->sess_ops->SessionType = 0;
  1127. /*
  1128. * Locate incoming Initiator IQN reference from Storage Node.
  1129. */
  1130. sess->se_sess->se_node_acl = core_tpg_check_initiator_node_acl(
  1131. &conn->tpg->tpg_se_tpg, i_buf);
  1132. if (!sess->se_sess->se_node_acl) {
  1133. pr_err("iSCSI Initiator Node: %s is not authorized to"
  1134. " access iSCSI target portal group: %hu.\n",
  1135. i_buf, conn->tpg->tpgt);
  1136. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
  1137. ISCSI_LOGIN_STATUS_TGT_FORBIDDEN);
  1138. ret = -1;
  1139. goto out;
  1140. }
  1141. se_nacl = sess->se_sess->se_node_acl;
  1142. queue_depth = se_nacl->queue_depth;
  1143. /*
  1144. * Setup pre-allocated tags based upon allowed per NodeACL CmdSN
  1145. * depth for non immediate commands, plus extra tags for immediate
  1146. * commands.
  1147. *
  1148. * Also enforce a ISCSIT_MIN_TAGS to prevent unnecessary contention
  1149. * in per-cpu-ida tag allocation logic + small queue_depth.
  1150. */
  1151. alloc_tags:
  1152. tag_num = max_t(u32, ISCSIT_MIN_TAGS, queue_depth);
  1153. tag_num = (tag_num * 2) + ISCSIT_EXTRA_TAGS;
  1154. tag_size = sizeof(struct iscsit_cmd) + conn->conn_transport->priv_size;
  1155. ret = transport_alloc_session_tags(sess->se_sess, tag_num, tag_size);
  1156. if (ret < 0) {
  1157. iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
  1158. ISCSI_LOGIN_STATUS_NO_RESOURCES);
  1159. ret = -1;
  1160. }
  1161. out:
  1162. kfree(tmpbuf);
  1163. return ret;
  1164. }
  1165. int iscsi_target_start_negotiation(
  1166. struct iscsi_login *login,
  1167. struct iscsit_conn *conn)
  1168. {
  1169. int ret;
  1170. if (conn->sock) {
  1171. struct sock *sk = conn->sock->sk;
  1172. write_lock_bh(&sk->sk_callback_lock);
  1173. set_bit(LOGIN_FLAGS_READY, &conn->login_flags);
  1174. set_bit(LOGIN_FLAGS_INITIAL_PDU, &conn->login_flags);
  1175. write_unlock_bh(&sk->sk_callback_lock);
  1176. }
  1177. /*
  1178. * If iscsi_target_do_login returns zero to signal more PDU
  1179. * exchanges are required to complete the login, go ahead and
  1180. * clear LOGIN_FLAGS_INITIAL_PDU but only if the TCP connection
  1181. * is still active.
  1182. *
  1183. * Otherwise if TCP connection dropped asynchronously, go ahead
  1184. * and perform connection cleanup now.
  1185. */
  1186. ret = iscsi_target_do_login(conn, login);
  1187. if (!ret && iscsi_target_sk_check_and_clear(conn, LOGIN_FLAGS_INITIAL_PDU))
  1188. ret = -1;
  1189. if (ret < 0) {
  1190. iscsi_target_restore_sock_callbacks(conn);
  1191. iscsi_remove_failed_auth_entry(conn);
  1192. }
  1193. if (ret != 0) {
  1194. cancel_delayed_work_sync(&conn->login_work);
  1195. iscsi_target_nego_release(conn);
  1196. }
  1197. return ret;
  1198. }
  1199. void iscsi_target_nego_release(struct iscsit_conn *conn)
  1200. {
  1201. struct iscsi_login *login = conn->conn_login;
  1202. if (!login)
  1203. return;
  1204. kfree(login->req_buf);
  1205. kfree(login->rsp_buf);
  1206. kfree(login);
  1207. conn->conn_login = NULL;
  1208. }