Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
[cascardo/linux.git] / drivers / target / iscsi / iscsi_target_nego.c
1 /*******************************************************************************
2  * This file contains main functions related to iSCSI Parameter negotiation.
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
21 #include <linux/ctype.h>
22 #include <scsi/iscsi_proto.h>
23 #include <target/target_core_base.h>
24 #include <target/target_core_fabric.h>
25 #include <target/iscsi/iscsi_transport.h>
26
27 #include "iscsi_target_core.h"
28 #include "iscsi_target_parameters.h"
29 #include "iscsi_target_login.h"
30 #include "iscsi_target_nego.h"
31 #include "iscsi_target_tpg.h"
32 #include "iscsi_target_util.h"
33 #include "iscsi_target.h"
34 #include "iscsi_target_auth.h"
35
36 #define MAX_LOGIN_PDUS  7
37 #define TEXT_LEN        4096
38
39 void convert_null_to_semi(char *buf, int len)
40 {
41         int i;
42
43         for (i = 0; i < len; i++)
44                 if (buf[i] == '\0')
45                         buf[i] = ';';
46 }
47
48 static int strlen_semi(char *buf)
49 {
50         int i = 0;
51
52         while (buf[i] != '\0') {
53                 if (buf[i] == ';')
54                         return i;
55                 i++;
56         }
57
58         return -1;
59 }
60
61 int extract_param(
62         const char *in_buf,
63         const char *pattern,
64         unsigned int max_length,
65         char *out_buf,
66         unsigned char *type)
67 {
68         char *ptr;
69         int len;
70
71         if (!in_buf || !pattern || !out_buf || !type)
72                 return -1;
73
74         ptr = strstr(in_buf, pattern);
75         if (!ptr)
76                 return -1;
77
78         ptr = strstr(ptr, "=");
79         if (!ptr)
80                 return -1;
81
82         ptr += 1;
83         if (*ptr == '0' && (*(ptr+1) == 'x' || *(ptr+1) == 'X')) {
84                 ptr += 2; /* skip 0x */
85                 *type = HEX;
86         } else
87                 *type = DECIMAL;
88
89         len = strlen_semi(ptr);
90         if (len < 0)
91                 return -1;
92
93         if (len > max_length) {
94                 pr_err("Length of input: %d exceeds max_length:"
95                         " %d\n", len, max_length);
96                 return -1;
97         }
98         memcpy(out_buf, ptr, len);
99         out_buf[len] = '\0';
100
101         return 0;
102 }
103
104 static u32 iscsi_handle_authentication(
105         struct iscsi_conn *conn,
106         char *in_buf,
107         char *out_buf,
108         int in_length,
109         int *out_length,
110         unsigned char *authtype)
111 {
112         struct iscsi_session *sess = conn->sess;
113         struct iscsi_node_auth *auth;
114         struct iscsi_node_acl *iscsi_nacl;
115         struct iscsi_portal_group *iscsi_tpg;
116         struct se_node_acl *se_nacl;
117
118         if (!sess->sess_ops->SessionType) {
119                 /*
120                  * For SessionType=Normal
121                  */
122                 se_nacl = conn->sess->se_sess->se_node_acl;
123                 if (!se_nacl) {
124                         pr_err("Unable to locate struct se_node_acl for"
125                                         " CHAP auth\n");
126                         return -1;
127                 }
128                 iscsi_nacl = container_of(se_nacl, struct iscsi_node_acl,
129                                 se_node_acl);
130                 if (!iscsi_nacl) {
131                         pr_err("Unable to locate struct iscsi_node_acl for"
132                                         " CHAP auth\n");
133                         return -1;
134                 }
135
136                 if (se_nacl->dynamic_node_acl) {
137                         iscsi_tpg = container_of(se_nacl->se_tpg,
138                                         struct iscsi_portal_group, tpg_se_tpg);
139
140                         auth = &iscsi_tpg->tpg_demo_auth;
141                 } else {
142                         iscsi_nacl = container_of(se_nacl, struct iscsi_node_acl,
143                                                   se_node_acl);
144
145                         auth = ISCSI_NODE_AUTH(iscsi_nacl);
146                 }
147         } else {
148                 /*
149                  * For SessionType=Discovery
150                  */
151                 auth = &iscsit_global->discovery_acl.node_auth;
152         }
153
154         if (strstr("CHAP", authtype))
155                 strcpy(conn->sess->auth_type, "CHAP");
156         else
157                 strcpy(conn->sess->auth_type, NONE);
158
159         if (strstr("None", authtype))
160                 return 1;
161 #ifdef CANSRP
162         else if (strstr("SRP", authtype))
163                 return srp_main_loop(conn, auth, in_buf, out_buf,
164                                 &in_length, out_length);
165 #endif
166         else if (strstr("CHAP", authtype))
167                 return chap_main_loop(conn, auth, in_buf, out_buf,
168                                 &in_length, out_length);
169         else if (strstr("SPKM1", authtype))
170                 return 2;
171         else if (strstr("SPKM2", authtype))
172                 return 2;
173         else if (strstr("KRB5", authtype))
174                 return 2;
175         else
176                 return 2;
177 }
178
179 static void iscsi_remove_failed_auth_entry(struct iscsi_conn *conn)
180 {
181         kfree(conn->auth_protocol);
182 }
183
184 int iscsi_target_check_login_request(
185         struct iscsi_conn *conn,
186         struct iscsi_login *login)
187 {
188         int req_csg, req_nsg;
189         u32 payload_length;
190         struct iscsi_login_req *login_req;
191
192         login_req = (struct iscsi_login_req *) login->req;
193         payload_length = ntoh24(login_req->dlength);
194
195         switch (login_req->opcode & ISCSI_OPCODE_MASK) {
196         case ISCSI_OP_LOGIN:
197                 break;
198         default:
199                 pr_err("Received unknown opcode 0x%02x.\n",
200                                 login_req->opcode & ISCSI_OPCODE_MASK);
201                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
202                                 ISCSI_LOGIN_STATUS_INIT_ERR);
203                 return -1;
204         }
205
206         if ((login_req->flags & ISCSI_FLAG_LOGIN_CONTINUE) &&
207             (login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT)) {
208                 pr_err("Login request has both ISCSI_FLAG_LOGIN_CONTINUE"
209                         " and ISCSI_FLAG_LOGIN_TRANSIT set, protocol error.\n");
210                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
211                                 ISCSI_LOGIN_STATUS_INIT_ERR);
212                 return -1;
213         }
214
215         req_csg = ISCSI_LOGIN_CURRENT_STAGE(login_req->flags);
216         req_nsg = ISCSI_LOGIN_NEXT_STAGE(login_req->flags);
217
218         if (req_csg != login->current_stage) {
219                 pr_err("Initiator unexpectedly changed login stage"
220                         " from %d to %d, login failed.\n", login->current_stage,
221                         req_csg);
222                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
223                                 ISCSI_LOGIN_STATUS_INIT_ERR);
224                 return -1;
225         }
226
227         if ((req_nsg == 2) || (req_csg >= 2) ||
228            ((login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT) &&
229             (req_nsg <= req_csg))) {
230                 pr_err("Illegal login_req->flags Combination, CSG: %d,"
231                         " NSG: %d, ISCSI_FLAG_LOGIN_TRANSIT: %d.\n", req_csg,
232                         req_nsg, (login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT));
233                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
234                                 ISCSI_LOGIN_STATUS_INIT_ERR);
235                 return -1;
236         }
237
238         if ((login_req->max_version != login->version_max) ||
239             (login_req->min_version != login->version_min)) {
240                 pr_err("Login request changed Version Max/Nin"
241                         " unexpectedly to 0x%02x/0x%02x, protocol error\n",
242                         login_req->max_version, login_req->min_version);
243                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
244                                 ISCSI_LOGIN_STATUS_INIT_ERR);
245                 return -1;
246         }
247
248         if (memcmp(login_req->isid, login->isid, 6) != 0) {
249                 pr_err("Login request changed ISID unexpectedly,"
250                                 " protocol error.\n");
251                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
252                                 ISCSI_LOGIN_STATUS_INIT_ERR);
253                 return -1;
254         }
255
256         if (login_req->itt != login->init_task_tag) {
257                 pr_err("Login request changed ITT unexpectedly to"
258                         " 0x%08x, protocol error.\n", login_req->itt);
259                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
260                                 ISCSI_LOGIN_STATUS_INIT_ERR);
261                 return -1;
262         }
263
264         if (payload_length > MAX_KEY_VALUE_PAIRS) {
265                 pr_err("Login request payload exceeds default"
266                         " MaxRecvDataSegmentLength: %u, protocol error.\n",
267                                 MAX_KEY_VALUE_PAIRS);
268                 return -1;
269         }
270
271         return 0;
272 }
273
274 static int iscsi_target_check_first_request(
275         struct iscsi_conn *conn,
276         struct iscsi_login *login)
277 {
278         struct iscsi_param *param = NULL;
279         struct se_node_acl *se_nacl;
280
281         login->first_request = 0;
282
283         list_for_each_entry(param, &conn->param_list->param_list, p_list) {
284                 if (!strncmp(param->name, SESSIONTYPE, 11)) {
285                         if (!IS_PSTATE_ACCEPTOR(param)) {
286                                 pr_err("SessionType key not received"
287                                         " in first login request.\n");
288                                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
289                                         ISCSI_LOGIN_STATUS_MISSING_FIELDS);
290                                 return -1;
291                         }
292                         if (!strncmp(param->value, DISCOVERY, 9))
293                                 return 0;
294                 }
295
296                 if (!strncmp(param->name, INITIATORNAME, 13)) {
297                         if (!IS_PSTATE_ACCEPTOR(param)) {
298                                 if (!login->leading_connection)
299                                         continue;
300
301                                 pr_err("InitiatorName key not received"
302                                         " in first login request.\n");
303                                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
304                                         ISCSI_LOGIN_STATUS_MISSING_FIELDS);
305                                 return -1;
306                         }
307
308                         /*
309                          * For non-leading connections, double check that the
310                          * received InitiatorName matches the existing session's
311                          * struct iscsi_node_acl.
312                          */
313                         if (!login->leading_connection) {
314                                 se_nacl = conn->sess->se_sess->se_node_acl;
315                                 if (!se_nacl) {
316                                         pr_err("Unable to locate"
317                                                 " struct se_node_acl\n");
318                                         iscsit_tx_login_rsp(conn,
319                                                         ISCSI_STATUS_CLS_INITIATOR_ERR,
320                                                         ISCSI_LOGIN_STATUS_TGT_NOT_FOUND);
321                                         return -1;
322                                 }
323
324                                 if (strcmp(param->value,
325                                                 se_nacl->initiatorname)) {
326                                         pr_err("Incorrect"
327                                                 " InitiatorName: %s for this"
328                                                 " iSCSI Initiator Node.\n",
329                                                 param->value);
330                                         iscsit_tx_login_rsp(conn,
331                                                         ISCSI_STATUS_CLS_INITIATOR_ERR,
332                                                         ISCSI_LOGIN_STATUS_TGT_NOT_FOUND);
333                                         return -1;
334                                 }
335                         }
336                 }
337         }
338
339         return 0;
340 }
341
342 static int iscsi_target_do_tx_login_io(struct iscsi_conn *conn, struct iscsi_login *login)
343 {
344         u32 padding = 0;
345         struct iscsi_session *sess = conn->sess;
346         struct iscsi_login_rsp *login_rsp;
347
348         login_rsp = (struct iscsi_login_rsp *) login->rsp;
349
350         login_rsp->opcode               = ISCSI_OP_LOGIN_RSP;
351         hton24(login_rsp->dlength, login->rsp_length);
352         memcpy(login_rsp->isid, login->isid, 6);
353         login_rsp->tsih                 = cpu_to_be16(login->tsih);
354         login_rsp->itt                  = login->init_task_tag;
355         login_rsp->statsn               = cpu_to_be32(conn->stat_sn++);
356         login_rsp->exp_cmdsn            = cpu_to_be32(conn->sess->exp_cmd_sn);
357         login_rsp->max_cmdsn            = cpu_to_be32(conn->sess->max_cmd_sn);
358
359         pr_debug("Sending Login Response, Flags: 0x%02x, ITT: 0x%08x,"
360                 " ExpCmdSN; 0x%08x, MaxCmdSN: 0x%08x, StatSN: 0x%08x, Length:"
361                 " %u\n", login_rsp->flags, (__force u32)login_rsp->itt,
362                 ntohl(login_rsp->exp_cmdsn), ntohl(login_rsp->max_cmdsn),
363                 ntohl(login_rsp->statsn), login->rsp_length);
364
365         padding = ((-login->rsp_length) & 3);
366
367         if (conn->conn_transport->iscsit_put_login_tx(conn, login,
368                                         login->rsp_length + padding) < 0)
369                 return -1;
370
371         login->rsp_length               = 0;
372         mutex_lock(&sess->cmdsn_mutex);
373         login_rsp->exp_cmdsn            = cpu_to_be32(sess->exp_cmd_sn);
374         login_rsp->max_cmdsn            = cpu_to_be32(sess->max_cmd_sn);
375         mutex_unlock(&sess->cmdsn_mutex);
376
377         return 0;
378 }
379
380 static int iscsi_target_do_login_io(struct iscsi_conn *conn, struct iscsi_login *login)
381 {
382         if (iscsi_target_do_tx_login_io(conn, login) < 0)
383                 return -1;
384
385         if (conn->conn_transport->iscsit_get_login_rx(conn, login) < 0)
386                 return -1;
387
388         return 0;
389 }
390
391 /*
392  *      NOTE: We check for existing sessions or connections AFTER the initiator
393  *      has been successfully authenticated in order to protect against faked
394  *      ISID/TSIH combinations.
395  */
396 static int iscsi_target_check_for_existing_instances(
397         struct iscsi_conn *conn,
398         struct iscsi_login *login)
399 {
400         if (login->checked_for_existing)
401                 return 0;
402
403         login->checked_for_existing = 1;
404
405         if (!login->tsih)
406                 return iscsi_check_for_session_reinstatement(conn);
407         else
408                 return iscsi_login_post_auth_non_zero_tsih(conn, login->cid,
409                                 login->initial_exp_statsn);
410 }
411
412 static int iscsi_target_do_authentication(
413         struct iscsi_conn *conn,
414         struct iscsi_login *login)
415 {
416         int authret;
417         u32 payload_length;
418         struct iscsi_param *param;
419         struct iscsi_login_req *login_req;
420         struct iscsi_login_rsp *login_rsp;
421
422         login_req = (struct iscsi_login_req *) login->req;
423         login_rsp = (struct iscsi_login_rsp *) login->rsp;
424         payload_length = ntoh24(login_req->dlength);
425
426         param = iscsi_find_param_from_key(AUTHMETHOD, conn->param_list);
427         if (!param)
428                 return -1;
429
430         authret = iscsi_handle_authentication(
431                         conn,
432                         login->req_buf,
433                         login->rsp_buf,
434                         payload_length,
435                         &login->rsp_length,
436                         param->value);
437         switch (authret) {
438         case 0:
439                 pr_debug("Received OK response"
440                 " from LIO Authentication, continuing.\n");
441                 break;
442         case 1:
443                 pr_debug("iSCSI security negotiation"
444                         " completed successfully.\n");
445                 login->auth_complete = 1;
446                 if ((login_req->flags & ISCSI_FLAG_LOGIN_NEXT_STAGE1) &&
447                     (login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT)) {
448                         login_rsp->flags |= (ISCSI_FLAG_LOGIN_NEXT_STAGE1 |
449                                              ISCSI_FLAG_LOGIN_TRANSIT);
450                         login->current_stage = 1;
451                 }
452                 return iscsi_target_check_for_existing_instances(
453                                 conn, login);
454         case 2:
455                 pr_err("Security negotiation"
456                         " failed.\n");
457                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
458                                 ISCSI_LOGIN_STATUS_AUTH_FAILED);
459                 return -1;
460         default:
461                 pr_err("Received unknown error %d from LIO"
462                                 " Authentication\n", authret);
463                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
464                                 ISCSI_LOGIN_STATUS_TARGET_ERROR);
465                 return -1;
466         }
467
468         return 0;
469 }
470
471 static int iscsi_target_handle_csg_zero(
472         struct iscsi_conn *conn,
473         struct iscsi_login *login)
474 {
475         int ret;
476         u32 payload_length;
477         struct iscsi_param *param;
478         struct iscsi_login_req *login_req;
479         struct iscsi_login_rsp *login_rsp;
480
481         login_req = (struct iscsi_login_req *) login->req;
482         login_rsp = (struct iscsi_login_rsp *) login->rsp;
483         payload_length = ntoh24(login_req->dlength);
484
485         param = iscsi_find_param_from_key(AUTHMETHOD, conn->param_list);
486         if (!param)
487                 return -1;
488
489         ret = iscsi_decode_text_input(
490                         PHASE_SECURITY|PHASE_DECLARATIVE,
491                         SENDER_INITIATOR|SENDER_RECEIVER,
492                         login->req_buf,
493                         payload_length,
494                         conn);
495         if (ret < 0)
496                 return -1;
497
498         if (ret > 0) {
499                 if (login->auth_complete) {
500                         pr_err("Initiator has already been"
501                                 " successfully authenticated, but is still"
502                                 " sending %s keys.\n", param->value);
503                         iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
504                                         ISCSI_LOGIN_STATUS_INIT_ERR);
505                         return -1;
506                 }
507
508                 goto do_auth;
509         }
510
511         if (login->first_request)
512                 if (iscsi_target_check_first_request(conn, login) < 0)
513                         return -1;
514
515         ret = iscsi_encode_text_output(
516                         PHASE_SECURITY|PHASE_DECLARATIVE,
517                         SENDER_TARGET,
518                         login->rsp_buf,
519                         &login->rsp_length,
520                         conn->param_list);
521         if (ret < 0)
522                 return -1;
523
524         if (!iscsi_check_negotiated_keys(conn->param_list)) {
525                 if (ISCSI_TPG_ATTRIB(ISCSI_TPG_C(conn))->authentication &&
526                     !strncmp(param->value, NONE, 4)) {
527                         pr_err("Initiator sent AuthMethod=None but"
528                                 " Target is enforcing iSCSI Authentication,"
529                                         " login failed.\n");
530                         iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
531                                         ISCSI_LOGIN_STATUS_AUTH_FAILED);
532                         return -1;
533                 }
534
535                 if (ISCSI_TPG_ATTRIB(ISCSI_TPG_C(conn))->authentication &&
536                     !login->auth_complete)
537                         return 0;
538
539                 if (strncmp(param->value, NONE, 4) && !login->auth_complete)
540                         return 0;
541
542                 if ((login_req->flags & ISCSI_FLAG_LOGIN_NEXT_STAGE1) &&
543                     (login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT)) {
544                         login_rsp->flags |= ISCSI_FLAG_LOGIN_NEXT_STAGE1 |
545                                             ISCSI_FLAG_LOGIN_TRANSIT;
546                         login->current_stage = 1;
547                 }
548         }
549
550         return 0;
551 do_auth:
552         return iscsi_target_do_authentication(conn, login);
553 }
554
555 static int iscsi_target_handle_csg_one(struct iscsi_conn *conn, struct iscsi_login *login)
556 {
557         int ret;
558         u32 payload_length;
559         struct iscsi_login_req *login_req;
560         struct iscsi_login_rsp *login_rsp;
561
562         login_req = (struct iscsi_login_req *) login->req;
563         login_rsp = (struct iscsi_login_rsp *) login->rsp;
564         payload_length = ntoh24(login_req->dlength);
565
566         ret = iscsi_decode_text_input(
567                         PHASE_OPERATIONAL|PHASE_DECLARATIVE,
568                         SENDER_INITIATOR|SENDER_RECEIVER,
569                         login->req_buf,
570                         payload_length,
571                         conn);
572         if (ret < 0) {
573                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
574                                 ISCSI_LOGIN_STATUS_INIT_ERR);
575                 return -1;
576         }
577
578         if (login->first_request)
579                 if (iscsi_target_check_first_request(conn, login) < 0)
580                         return -1;
581
582         if (iscsi_target_check_for_existing_instances(conn, login) < 0)
583                 return -1;
584
585         ret = iscsi_encode_text_output(
586                         PHASE_OPERATIONAL|PHASE_DECLARATIVE,
587                         SENDER_TARGET,
588                         login->rsp_buf,
589                         &login->rsp_length,
590                         conn->param_list);
591         if (ret < 0) {
592                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
593                                 ISCSI_LOGIN_STATUS_INIT_ERR);
594                 return -1;
595         }
596
597         if (!login->auth_complete &&
598              ISCSI_TPG_ATTRIB(ISCSI_TPG_C(conn))->authentication) {
599                 pr_err("Initiator is requesting CSG: 1, has not been"
600                          " successfully authenticated, and the Target is"
601                         " enforcing iSCSI Authentication, login failed.\n");
602                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
603                                 ISCSI_LOGIN_STATUS_AUTH_FAILED);
604                 return -1;
605         }
606
607         if (!iscsi_check_negotiated_keys(conn->param_list))
608                 if ((login_req->flags & ISCSI_FLAG_LOGIN_NEXT_STAGE3) &&
609                     (login_req->flags & ISCSI_FLAG_LOGIN_TRANSIT))
610                         login_rsp->flags |= ISCSI_FLAG_LOGIN_NEXT_STAGE3 |
611                                             ISCSI_FLAG_LOGIN_TRANSIT;
612
613         return 0;
614 }
615
616 static int iscsi_target_do_login(struct iscsi_conn *conn, struct iscsi_login *login)
617 {
618         int pdu_count = 0;
619         struct iscsi_login_req *login_req;
620         struct iscsi_login_rsp *login_rsp;
621
622         login_req = (struct iscsi_login_req *) login->req;
623         login_rsp = (struct iscsi_login_rsp *) login->rsp;
624
625         while (1) {
626                 if (++pdu_count > MAX_LOGIN_PDUS) {
627                         pr_err("MAX_LOGIN_PDUS count reached.\n");
628                         iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
629                                         ISCSI_LOGIN_STATUS_TARGET_ERROR);
630                         return -1;
631                 }
632
633                 switch (ISCSI_LOGIN_CURRENT_STAGE(login_req->flags)) {
634                 case 0:
635                         login_rsp->flags &= ~ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK;
636                         if (iscsi_target_handle_csg_zero(conn, login) < 0)
637                                 return -1;
638                         break;
639                 case 1:
640                         login_rsp->flags |= ISCSI_FLAG_LOGIN_CURRENT_STAGE1;
641                         if (iscsi_target_handle_csg_one(conn, login) < 0)
642                                 return -1;
643                         if (login_rsp->flags & ISCSI_FLAG_LOGIN_TRANSIT) {
644                                 login->tsih = conn->sess->tsih;
645                                 login->login_complete = 1;
646                                 if (iscsi_target_do_tx_login_io(conn,
647                                                 login) < 0)
648                                         return -1;
649                                 return 0;
650                         }
651                         break;
652                 default:
653                         pr_err("Illegal CSG: %d received from"
654                                 " Initiator, protocol error.\n",
655                                 ISCSI_LOGIN_CURRENT_STAGE(login_req->flags));
656                         break;
657                 }
658
659                 if (iscsi_target_do_login_io(conn, login) < 0)
660                         return -1;
661
662                 if (login_rsp->flags & ISCSI_FLAG_LOGIN_TRANSIT) {
663                         login_rsp->flags &= ~ISCSI_FLAG_LOGIN_TRANSIT;
664                         login_rsp->flags &= ~ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK;
665                 }
666         }
667
668         return 0;
669 }
670
671 static void iscsi_initiatorname_tolower(
672         char *param_buf)
673 {
674         char *c;
675         u32 iqn_size = strlen(param_buf), i;
676
677         for (i = 0; i < iqn_size; i++) {
678                 c = &param_buf[i];
679                 if (!isupper(*c))
680                         continue;
681
682                 *c = tolower(*c);
683         }
684 }
685
686 /*
687  * Processes the first Login Request..
688  */
689 int iscsi_target_locate_portal(
690         struct iscsi_np *np,
691         struct iscsi_conn *conn,
692         struct iscsi_login *login)
693 {
694         char *i_buf = NULL, *s_buf = NULL, *t_buf = NULL;
695         char *tmpbuf, *start = NULL, *end = NULL, *key, *value;
696         struct iscsi_session *sess = conn->sess;
697         struct iscsi_tiqn *tiqn;
698         struct iscsi_login_req *login_req;
699         u32 payload_length;
700         int sessiontype = 0, ret = 0;
701
702         login_req = (struct iscsi_login_req *) login->req;
703         payload_length = ntoh24(login_req->dlength);
704
705         tmpbuf = kzalloc(payload_length + 1, GFP_KERNEL);
706         if (!tmpbuf) {
707                 pr_err("Unable to allocate memory for tmpbuf.\n");
708                 return -1;
709         }
710
711         memcpy(tmpbuf, login->req_buf, payload_length);
712         tmpbuf[payload_length] = '\0';
713         start = tmpbuf;
714         end = (start + payload_length);
715
716         /*
717          * Locate the initial keys expected from the Initiator node in
718          * the first login request in order to progress with the login phase.
719          */
720         while (start < end) {
721                 if (iscsi_extract_key_value(start, &key, &value) < 0) {
722                         ret = -1;
723                         goto out;
724                 }
725
726                 if (!strncmp(key, "InitiatorName", 13))
727                         i_buf = value;
728                 else if (!strncmp(key, "SessionType", 11))
729                         s_buf = value;
730                 else if (!strncmp(key, "TargetName", 10))
731                         t_buf = value;
732
733                 start += strlen(key) + strlen(value) + 2;
734         }
735         /*
736          * See 5.3.  Login Phase.
737          */
738         if (!i_buf) {
739                 pr_err("InitiatorName key not received"
740                         " in first login request.\n");
741                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
742                         ISCSI_LOGIN_STATUS_MISSING_FIELDS);
743                 ret = -1;
744                 goto out;
745         }
746         /*
747          * Convert the incoming InitiatorName to lowercase following
748          * RFC-3720 3.2.6.1. section c) that says that iSCSI IQNs
749          * are NOT case sensitive.
750          */
751         iscsi_initiatorname_tolower(i_buf);
752
753         if (!s_buf) {
754                 if (!login->leading_connection)
755                         goto get_target;
756
757                 pr_err("SessionType key not received"
758                         " in first login request.\n");
759                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
760                         ISCSI_LOGIN_STATUS_MISSING_FIELDS);
761                 ret = -1;
762                 goto out;
763         }
764
765         /*
766          * Use default portal group for discovery sessions.
767          */
768         sessiontype = strncmp(s_buf, DISCOVERY, 9);
769         if (!sessiontype) {
770                 conn->tpg = iscsit_global->discovery_tpg;
771                 if (!login->leading_connection)
772                         goto get_target;
773
774                 sess->sess_ops->SessionType = 1;
775                 /*
776                  * Setup crc32c modules from libcrypto
777                  */
778                 if (iscsi_login_setup_crypto(conn) < 0) {
779                         pr_err("iscsi_login_setup_crypto() failed\n");
780                         ret = -1;
781                         goto out;
782                 }
783                 /*
784                  * Serialize access across the discovery struct iscsi_portal_group to
785                  * process login attempt.
786                  */
787                 if (iscsit_access_np(np, conn->tpg) < 0) {
788                         iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
789                                 ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
790                         ret = -1;
791                         goto out;
792                 }
793                 ret = 0;
794                 goto out;
795         }
796
797 get_target:
798         if (!t_buf) {
799                 pr_err("TargetName key not received"
800                         " in first login request while"
801                         " SessionType=Normal.\n");
802                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
803                         ISCSI_LOGIN_STATUS_MISSING_FIELDS);
804                 ret = -1;
805                 goto out;
806         }
807
808         /*
809          * Locate Target IQN from Storage Node.
810          */
811         tiqn = iscsit_get_tiqn_for_login(t_buf);
812         if (!tiqn) {
813                 pr_err("Unable to locate Target IQN: %s in"
814                         " Storage Node\n", t_buf);
815                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
816                                 ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
817                 ret = -1;
818                 goto out;
819         }
820         pr_debug("Located Storage Object: %s\n", tiqn->tiqn);
821
822         /*
823          * Locate Target Portal Group from Storage Node.
824          */
825         conn->tpg = iscsit_get_tpg_from_np(tiqn, np);
826         if (!conn->tpg) {
827                 pr_err("Unable to locate Target Portal Group"
828                                 " on %s\n", tiqn->tiqn);
829                 iscsit_put_tiqn_for_login(tiqn);
830                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
831                                 ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
832                 ret = -1;
833                 goto out;
834         }
835         pr_debug("Located Portal Group Object: %hu\n", conn->tpg->tpgt);
836         /*
837          * Setup crc32c modules from libcrypto
838          */
839         if (iscsi_login_setup_crypto(conn) < 0) {
840                 pr_err("iscsi_login_setup_crypto() failed\n");
841                 ret = -1;
842                 goto out;
843         }
844         /*
845          * Serialize access across the struct iscsi_portal_group to
846          * process login attempt.
847          */
848         if (iscsit_access_np(np, conn->tpg) < 0) {
849                 iscsit_put_tiqn_for_login(tiqn);
850                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
851                                 ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
852                 ret = -1;
853                 conn->tpg = NULL;
854                 goto out;
855         }
856
857         /*
858          * conn->sess->node_acl will be set when the referenced
859          * struct iscsi_session is located from received ISID+TSIH in
860          * iscsi_login_non_zero_tsih_s2().
861          */
862         if (!login->leading_connection) {
863                 ret = 0;
864                 goto out;
865         }
866
867         /*
868          * This value is required in iscsi_login_zero_tsih_s2()
869          */
870         sess->sess_ops->SessionType = 0;
871
872         /*
873          * Locate incoming Initiator IQN reference from Storage Node.
874          */
875         sess->se_sess->se_node_acl = core_tpg_check_initiator_node_acl(
876                         &conn->tpg->tpg_se_tpg, i_buf);
877         if (!sess->se_sess->se_node_acl) {
878                 pr_err("iSCSI Initiator Node: %s is not authorized to"
879                         " access iSCSI target portal group: %hu.\n",
880                                 i_buf, conn->tpg->tpgt);
881                 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
882                                 ISCSI_LOGIN_STATUS_TGT_FORBIDDEN);
883                 ret = -1;
884                 goto out;
885         }
886
887         ret = 0;
888 out:
889         kfree(tmpbuf);
890         return ret;
891 }
892
893 int iscsi_target_start_negotiation(
894         struct iscsi_login *login,
895         struct iscsi_conn *conn)
896 {
897         int ret;
898
899         ret = iscsi_target_do_login(conn, login);
900         if (ret != 0)
901                 iscsi_remove_failed_auth_entry(conn);
902
903         iscsi_target_nego_release(conn);
904         return ret;
905 }
906
907 void iscsi_target_nego_release(struct iscsi_conn *conn)
908 {
909         struct iscsi_login *login = conn->conn_login;
910
911         if (!login)
912                 return;
913
914         kfree(login->req_buf);
915         kfree(login->rsp_buf);
916         kfree(login);
917
918         conn->conn_login = NULL;
919 }