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