Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*******************************************************************************
0003  * This file contains main functions related to iSCSI Parameter negotiation.
0004  *
0005  * (c) Copyright 2007-2013 Datera, Inc.
0006  *
0007  * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
0008  *
0009  ******************************************************************************/
0010 
0011 #include <linux/slab.h>
0012 #include <linux/uio.h> /* struct kvec */
0013 #include <target/iscsi/iscsi_target_core.h>
0014 #include "iscsi_target_util.h"
0015 #include "iscsi_target_parameters.h"
0016 
0017 int iscsi_login_rx_data(
0018     struct iscsit_conn *conn,
0019     char *buf,
0020     int length)
0021 {
0022     int rx_got;
0023     struct kvec iov;
0024 
0025     memset(&iov, 0, sizeof(struct kvec));
0026     iov.iov_len = length;
0027     iov.iov_base    = buf;
0028 
0029     rx_got = rx_data(conn, &iov, 1, length);
0030     if (rx_got != length) {
0031         pr_err("rx_data returned %d, expecting %d.\n",
0032                 rx_got, length);
0033         return -1;
0034     }
0035 
0036     return 0 ;
0037 }
0038 
0039 int iscsi_login_tx_data(
0040     struct iscsit_conn *conn,
0041     char *pdu_buf,
0042     char *text_buf,
0043     int text_length)
0044 {
0045     int length, tx_sent, iov_cnt = 1;
0046     struct kvec iov[2];
0047 
0048     length = (ISCSI_HDR_LEN + text_length);
0049 
0050     memset(&iov[0], 0, 2 * sizeof(struct kvec));
0051     iov[0].iov_len      = ISCSI_HDR_LEN;
0052     iov[0].iov_base     = pdu_buf;
0053 
0054     if (text_buf && text_length) {
0055         iov[1].iov_len  = text_length;
0056         iov[1].iov_base = text_buf;
0057         iov_cnt++;
0058     }
0059 
0060     tx_sent = tx_data(conn, &iov[0], iov_cnt, length);
0061     if (tx_sent != length) {
0062         pr_err("tx_data returned %d, expecting %d.\n",
0063                 tx_sent, length);
0064         return -1;
0065     }
0066 
0067     return 0;
0068 }
0069 
0070 void iscsi_dump_conn_ops(struct iscsi_conn_ops *conn_ops)
0071 {
0072     pr_debug("HeaderDigest: %s\n", (conn_ops->HeaderDigest) ?
0073                 "CRC32C" : "None");
0074     pr_debug("DataDigest: %s\n", (conn_ops->DataDigest) ?
0075                 "CRC32C" : "None");
0076     pr_debug("MaxRecvDataSegmentLength: %u\n",
0077                 conn_ops->MaxRecvDataSegmentLength);
0078 }
0079 
0080 void iscsi_dump_sess_ops(struct iscsi_sess_ops *sess_ops)
0081 {
0082     pr_debug("InitiatorName: %s\n", sess_ops->InitiatorName);
0083     pr_debug("InitiatorAlias: %s\n", sess_ops->InitiatorAlias);
0084     pr_debug("TargetName: %s\n", sess_ops->TargetName);
0085     pr_debug("TargetAlias: %s\n", sess_ops->TargetAlias);
0086     pr_debug("TargetPortalGroupTag: %hu\n",
0087             sess_ops->TargetPortalGroupTag);
0088     pr_debug("MaxConnections: %hu\n", sess_ops->MaxConnections);
0089     pr_debug("InitialR2T: %s\n",
0090             (sess_ops->InitialR2T) ? "Yes" : "No");
0091     pr_debug("ImmediateData: %s\n", (sess_ops->ImmediateData) ?
0092             "Yes" : "No");
0093     pr_debug("MaxBurstLength: %u\n", sess_ops->MaxBurstLength);
0094     pr_debug("FirstBurstLength: %u\n", sess_ops->FirstBurstLength);
0095     pr_debug("DefaultTime2Wait: %hu\n", sess_ops->DefaultTime2Wait);
0096     pr_debug("DefaultTime2Retain: %hu\n",
0097             sess_ops->DefaultTime2Retain);
0098     pr_debug("MaxOutstandingR2T: %hu\n",
0099             sess_ops->MaxOutstandingR2T);
0100     pr_debug("DataPDUInOrder: %s\n",
0101             (sess_ops->DataPDUInOrder) ? "Yes" : "No");
0102     pr_debug("DataSequenceInOrder: %s\n",
0103             (sess_ops->DataSequenceInOrder) ? "Yes" : "No");
0104     pr_debug("ErrorRecoveryLevel: %hu\n",
0105             sess_ops->ErrorRecoveryLevel);
0106     pr_debug("SessionType: %s\n", (sess_ops->SessionType) ?
0107             "Discovery" : "Normal");
0108 }
0109 
0110 void iscsi_print_params(struct iscsi_param_list *param_list)
0111 {
0112     struct iscsi_param *param;
0113 
0114     list_for_each_entry(param, &param_list->param_list, p_list)
0115         pr_debug("%s: %s\n", param->name, param->value);
0116 }
0117 
0118 static struct iscsi_param *iscsi_set_default_param(struct iscsi_param_list *param_list,
0119         char *name, char *value, u8 phase, u8 scope, u8 sender,
0120         u16 type_range, u8 use)
0121 {
0122     struct iscsi_param *param = NULL;
0123 
0124     param = kzalloc(sizeof(struct iscsi_param), GFP_KERNEL);
0125     if (!param) {
0126         pr_err("Unable to allocate memory for parameter.\n");
0127         goto out;
0128     }
0129     INIT_LIST_HEAD(&param->p_list);
0130 
0131     param->name = kstrdup(name, GFP_KERNEL);
0132     if (!param->name) {
0133         pr_err("Unable to allocate memory for parameter name.\n");
0134         goto out;
0135     }
0136 
0137     param->value = kstrdup(value, GFP_KERNEL);
0138     if (!param->value) {
0139         pr_err("Unable to allocate memory for parameter value.\n");
0140         goto out;
0141     }
0142 
0143     param->phase        = phase;
0144     param->scope        = scope;
0145     param->sender       = sender;
0146     param->use      = use;
0147     param->type_range   = type_range;
0148 
0149     switch (param->type_range) {
0150     case TYPERANGE_BOOL_AND:
0151         param->type = TYPE_BOOL_AND;
0152         break;
0153     case TYPERANGE_BOOL_OR:
0154         param->type = TYPE_BOOL_OR;
0155         break;
0156     case TYPERANGE_0_TO_2:
0157     case TYPERANGE_0_TO_3600:
0158     case TYPERANGE_0_TO_32767:
0159     case TYPERANGE_0_TO_65535:
0160     case TYPERANGE_1_TO_65535:
0161     case TYPERANGE_2_TO_3600:
0162     case TYPERANGE_512_TO_16777215:
0163         param->type = TYPE_NUMBER;
0164         break;
0165     case TYPERANGE_AUTH:
0166     case TYPERANGE_DIGEST:
0167         param->type = TYPE_VALUE_LIST | TYPE_STRING;
0168         break;
0169     case TYPERANGE_ISCSINAME:
0170     case TYPERANGE_SESSIONTYPE:
0171     case TYPERANGE_TARGETADDRESS:
0172     case TYPERANGE_UTF8:
0173         param->type = TYPE_STRING;
0174         break;
0175     default:
0176         pr_err("Unknown type_range 0x%02x\n",
0177                 param->type_range);
0178         goto out;
0179     }
0180     list_add_tail(&param->p_list, &param_list->param_list);
0181 
0182     return param;
0183 out:
0184     if (param) {
0185         kfree(param->value);
0186         kfree(param->name);
0187         kfree(param);
0188     }
0189 
0190     return NULL;
0191 }
0192 
0193 /* #warning Add extension keys */
0194 int iscsi_create_default_params(struct iscsi_param_list **param_list_ptr)
0195 {
0196     struct iscsi_param *param = NULL;
0197     struct iscsi_param_list *pl;
0198 
0199     pl = kzalloc(sizeof(struct iscsi_param_list), GFP_KERNEL);
0200     if (!pl) {
0201         pr_err("Unable to allocate memory for"
0202                 " struct iscsi_param_list.\n");
0203         return -ENOMEM;
0204     }
0205     INIT_LIST_HEAD(&pl->param_list);
0206     INIT_LIST_HEAD(&pl->extra_response_list);
0207 
0208     /*
0209      * The format for setting the initial parameter definitions are:
0210      *
0211      * Parameter name:
0212      * Initial value:
0213      * Allowable phase:
0214      * Scope:
0215      * Allowable senders:
0216      * Typerange:
0217      * Use:
0218      */
0219     param = iscsi_set_default_param(pl, AUTHMETHOD, INITIAL_AUTHMETHOD,
0220             PHASE_SECURITY, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0221             TYPERANGE_AUTH, USE_INITIAL_ONLY);
0222     if (!param)
0223         goto out;
0224 
0225     param = iscsi_set_default_param(pl, HEADERDIGEST, INITIAL_HEADERDIGEST,
0226             PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0227             TYPERANGE_DIGEST, USE_INITIAL_ONLY);
0228     if (!param)
0229         goto out;
0230 
0231     param = iscsi_set_default_param(pl, DATADIGEST, INITIAL_DATADIGEST,
0232             PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0233             TYPERANGE_DIGEST, USE_INITIAL_ONLY);
0234     if (!param)
0235         goto out;
0236 
0237     param = iscsi_set_default_param(pl, MAXCONNECTIONS,
0238             INITIAL_MAXCONNECTIONS, PHASE_OPERATIONAL,
0239             SCOPE_SESSION_WIDE, SENDER_BOTH,
0240             TYPERANGE_1_TO_65535, USE_LEADING_ONLY);
0241     if (!param)
0242         goto out;
0243 
0244     param = iscsi_set_default_param(pl, SENDTARGETS, INITIAL_SENDTARGETS,
0245             PHASE_FFP0, SCOPE_SESSION_WIDE, SENDER_INITIATOR,
0246             TYPERANGE_UTF8, 0);
0247     if (!param)
0248         goto out;
0249 
0250     param = iscsi_set_default_param(pl, TARGETNAME, INITIAL_TARGETNAME,
0251             PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_BOTH,
0252             TYPERANGE_ISCSINAME, USE_ALL);
0253     if (!param)
0254         goto out;
0255 
0256     param = iscsi_set_default_param(pl, INITIATORNAME,
0257             INITIAL_INITIATORNAME, PHASE_DECLARATIVE,
0258             SCOPE_SESSION_WIDE, SENDER_INITIATOR,
0259             TYPERANGE_ISCSINAME, USE_INITIAL_ONLY);
0260     if (!param)
0261         goto out;
0262 
0263     param = iscsi_set_default_param(pl, TARGETALIAS, INITIAL_TARGETALIAS,
0264             PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_TARGET,
0265             TYPERANGE_UTF8, USE_ALL);
0266     if (!param)
0267         goto out;
0268 
0269     param = iscsi_set_default_param(pl, INITIATORALIAS,
0270             INITIAL_INITIATORALIAS, PHASE_DECLARATIVE,
0271             SCOPE_SESSION_WIDE, SENDER_INITIATOR, TYPERANGE_UTF8,
0272             USE_ALL);
0273     if (!param)
0274         goto out;
0275 
0276     param = iscsi_set_default_param(pl, TARGETADDRESS,
0277             INITIAL_TARGETADDRESS, PHASE_DECLARATIVE,
0278             SCOPE_SESSION_WIDE, SENDER_TARGET,
0279             TYPERANGE_TARGETADDRESS, USE_ALL);
0280     if (!param)
0281         goto out;
0282 
0283     param = iscsi_set_default_param(pl, TARGETPORTALGROUPTAG,
0284             INITIAL_TARGETPORTALGROUPTAG,
0285             PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_TARGET,
0286             TYPERANGE_0_TO_65535, USE_INITIAL_ONLY);
0287     if (!param)
0288         goto out;
0289 
0290     param = iscsi_set_default_param(pl, INITIALR2T, INITIAL_INITIALR2T,
0291             PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
0292             TYPERANGE_BOOL_OR, USE_LEADING_ONLY);
0293     if (!param)
0294         goto out;
0295 
0296     param = iscsi_set_default_param(pl, IMMEDIATEDATA,
0297             INITIAL_IMMEDIATEDATA, PHASE_OPERATIONAL,
0298             SCOPE_SESSION_WIDE, SENDER_BOTH, TYPERANGE_BOOL_AND,
0299             USE_LEADING_ONLY);
0300     if (!param)
0301         goto out;
0302 
0303     param = iscsi_set_default_param(pl, MAXXMITDATASEGMENTLENGTH,
0304             INITIAL_MAXXMITDATASEGMENTLENGTH,
0305             PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0306             TYPERANGE_512_TO_16777215, USE_ALL);
0307     if (!param)
0308         goto out;
0309 
0310     param = iscsi_set_default_param(pl, MAXRECVDATASEGMENTLENGTH,
0311             INITIAL_MAXRECVDATASEGMENTLENGTH,
0312             PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0313             TYPERANGE_512_TO_16777215, USE_ALL);
0314     if (!param)
0315         goto out;
0316 
0317     param = iscsi_set_default_param(pl, MAXBURSTLENGTH,
0318             INITIAL_MAXBURSTLENGTH, PHASE_OPERATIONAL,
0319             SCOPE_SESSION_WIDE, SENDER_BOTH,
0320             TYPERANGE_512_TO_16777215, USE_LEADING_ONLY);
0321     if (!param)
0322         goto out;
0323 
0324     param = iscsi_set_default_param(pl, FIRSTBURSTLENGTH,
0325             INITIAL_FIRSTBURSTLENGTH,
0326             PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
0327             TYPERANGE_512_TO_16777215, USE_LEADING_ONLY);
0328     if (!param)
0329         goto out;
0330 
0331     param = iscsi_set_default_param(pl, DEFAULTTIME2WAIT,
0332             INITIAL_DEFAULTTIME2WAIT,
0333             PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
0334             TYPERANGE_0_TO_3600, USE_LEADING_ONLY);
0335     if (!param)
0336         goto out;
0337 
0338     param = iscsi_set_default_param(pl, DEFAULTTIME2RETAIN,
0339             INITIAL_DEFAULTTIME2RETAIN,
0340             PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
0341             TYPERANGE_0_TO_3600, USE_LEADING_ONLY);
0342     if (!param)
0343         goto out;
0344 
0345     param = iscsi_set_default_param(pl, MAXOUTSTANDINGR2T,
0346             INITIAL_MAXOUTSTANDINGR2T,
0347             PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
0348             TYPERANGE_1_TO_65535, USE_LEADING_ONLY);
0349     if (!param)
0350         goto out;
0351 
0352     param = iscsi_set_default_param(pl, DATAPDUINORDER,
0353             INITIAL_DATAPDUINORDER, PHASE_OPERATIONAL,
0354             SCOPE_SESSION_WIDE, SENDER_BOTH, TYPERANGE_BOOL_OR,
0355             USE_LEADING_ONLY);
0356     if (!param)
0357         goto out;
0358 
0359     param = iscsi_set_default_param(pl, DATASEQUENCEINORDER,
0360             INITIAL_DATASEQUENCEINORDER,
0361             PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
0362             TYPERANGE_BOOL_OR, USE_LEADING_ONLY);
0363     if (!param)
0364         goto out;
0365 
0366     param = iscsi_set_default_param(pl, ERRORRECOVERYLEVEL,
0367             INITIAL_ERRORRECOVERYLEVEL,
0368             PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
0369             TYPERANGE_0_TO_2, USE_LEADING_ONLY);
0370     if (!param)
0371         goto out;
0372 
0373     param = iscsi_set_default_param(pl, SESSIONTYPE, INITIAL_SESSIONTYPE,
0374             PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_INITIATOR,
0375             TYPERANGE_SESSIONTYPE, USE_LEADING_ONLY);
0376     if (!param)
0377         goto out;
0378 
0379     param = iscsi_set_default_param(pl, IFMARKER, INITIAL_IFMARKER,
0380             PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0381             TYPERANGE_BOOL_AND, USE_INITIAL_ONLY);
0382     if (!param)
0383         goto out;
0384 
0385     param = iscsi_set_default_param(pl, OFMARKER, INITIAL_OFMARKER,
0386             PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0387             TYPERANGE_BOOL_AND, USE_INITIAL_ONLY);
0388     if (!param)
0389         goto out;
0390 
0391     param = iscsi_set_default_param(pl, IFMARKINT, INITIAL_IFMARKINT,
0392             PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0393             TYPERANGE_UTF8, USE_INITIAL_ONLY);
0394     if (!param)
0395         goto out;
0396 
0397     param = iscsi_set_default_param(pl, OFMARKINT, INITIAL_OFMARKINT,
0398             PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0399             TYPERANGE_UTF8, USE_INITIAL_ONLY);
0400     if (!param)
0401         goto out;
0402 
0403     /*
0404      * Extra parameters for ISER from RFC-5046
0405      */
0406     param = iscsi_set_default_param(pl, RDMAEXTENSIONS, INITIAL_RDMAEXTENSIONS,
0407             PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
0408             TYPERANGE_BOOL_AND, USE_LEADING_ONLY);
0409     if (!param)
0410         goto out;
0411 
0412     param = iscsi_set_default_param(pl, INITIATORRECVDATASEGMENTLENGTH,
0413             INITIAL_INITIATORRECVDATASEGMENTLENGTH,
0414             PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0415             TYPERANGE_512_TO_16777215, USE_ALL);
0416     if (!param)
0417         goto out;
0418 
0419     param = iscsi_set_default_param(pl, TARGETRECVDATASEGMENTLENGTH,
0420             INITIAL_TARGETRECVDATASEGMENTLENGTH,
0421             PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
0422             TYPERANGE_512_TO_16777215, USE_ALL);
0423     if (!param)
0424         goto out;
0425 
0426     *param_list_ptr = pl;
0427     return 0;
0428 out:
0429     iscsi_release_param_list(pl);
0430     return -1;
0431 }
0432 
0433 int iscsi_set_keys_to_negotiate(
0434     struct iscsi_param_list *param_list,
0435     bool iser)
0436 {
0437     struct iscsi_param *param;
0438 
0439     param_list->iser = iser;
0440 
0441     list_for_each_entry(param, &param_list->param_list, p_list) {
0442         param->state = 0;
0443         if (!strcmp(param->name, AUTHMETHOD)) {
0444             SET_PSTATE_NEGOTIATE(param);
0445         } else if (!strcmp(param->name, HEADERDIGEST)) {
0446             if (!iser)
0447                 SET_PSTATE_NEGOTIATE(param);
0448         } else if (!strcmp(param->name, DATADIGEST)) {
0449             if (!iser)
0450                 SET_PSTATE_NEGOTIATE(param);
0451         } else if (!strcmp(param->name, MAXCONNECTIONS)) {
0452             SET_PSTATE_NEGOTIATE(param);
0453         } else if (!strcmp(param->name, TARGETNAME)) {
0454             continue;
0455         } else if (!strcmp(param->name, INITIATORNAME)) {
0456             continue;
0457         } else if (!strcmp(param->name, TARGETALIAS)) {
0458             if (param->value)
0459                 SET_PSTATE_NEGOTIATE(param);
0460         } else if (!strcmp(param->name, INITIATORALIAS)) {
0461             continue;
0462         } else if (!strcmp(param->name, TARGETPORTALGROUPTAG)) {
0463             SET_PSTATE_NEGOTIATE(param);
0464         } else if (!strcmp(param->name, INITIALR2T)) {
0465             SET_PSTATE_NEGOTIATE(param);
0466         } else if (!strcmp(param->name, IMMEDIATEDATA)) {
0467             SET_PSTATE_NEGOTIATE(param);
0468         } else if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH)) {
0469             if (!iser)
0470                 SET_PSTATE_NEGOTIATE(param);
0471         } else if (!strcmp(param->name, MAXXMITDATASEGMENTLENGTH)) {
0472             continue;
0473         } else if (!strcmp(param->name, MAXBURSTLENGTH)) {
0474             SET_PSTATE_NEGOTIATE(param);
0475         } else if (!strcmp(param->name, FIRSTBURSTLENGTH)) {
0476             SET_PSTATE_NEGOTIATE(param);
0477         } else if (!strcmp(param->name, DEFAULTTIME2WAIT)) {
0478             SET_PSTATE_NEGOTIATE(param);
0479         } else if (!strcmp(param->name, DEFAULTTIME2RETAIN)) {
0480             SET_PSTATE_NEGOTIATE(param);
0481         } else if (!strcmp(param->name, MAXOUTSTANDINGR2T)) {
0482             SET_PSTATE_NEGOTIATE(param);
0483         } else if (!strcmp(param->name, DATAPDUINORDER)) {
0484             SET_PSTATE_NEGOTIATE(param);
0485         } else if (!strcmp(param->name, DATASEQUENCEINORDER)) {
0486             SET_PSTATE_NEGOTIATE(param);
0487         } else if (!strcmp(param->name, ERRORRECOVERYLEVEL)) {
0488             SET_PSTATE_NEGOTIATE(param);
0489         } else if (!strcmp(param->name, SESSIONTYPE)) {
0490             SET_PSTATE_NEGOTIATE(param);
0491         } else if (!strcmp(param->name, IFMARKER)) {
0492             SET_PSTATE_REJECT(param);
0493         } else if (!strcmp(param->name, OFMARKER)) {
0494             SET_PSTATE_REJECT(param);
0495         } else if (!strcmp(param->name, IFMARKINT)) {
0496             SET_PSTATE_REJECT(param);
0497         } else if (!strcmp(param->name, OFMARKINT)) {
0498             SET_PSTATE_REJECT(param);
0499         } else if (!strcmp(param->name, RDMAEXTENSIONS)) {
0500             if (iser)
0501                 SET_PSTATE_NEGOTIATE(param);
0502         } else if (!strcmp(param->name, INITIATORRECVDATASEGMENTLENGTH)) {
0503             if (iser)
0504                 SET_PSTATE_NEGOTIATE(param);
0505         } else if (!strcmp(param->name, TARGETRECVDATASEGMENTLENGTH)) {
0506             if (iser)
0507                 SET_PSTATE_NEGOTIATE(param);
0508         }
0509     }
0510 
0511     return 0;
0512 }
0513 
0514 int iscsi_set_keys_irrelevant_for_discovery(
0515     struct iscsi_param_list *param_list)
0516 {
0517     struct iscsi_param *param;
0518 
0519     list_for_each_entry(param, &param_list->param_list, p_list) {
0520         if (!strcmp(param->name, MAXCONNECTIONS))
0521             param->state &= ~PSTATE_NEGOTIATE;
0522         else if (!strcmp(param->name, INITIALR2T))
0523             param->state &= ~PSTATE_NEGOTIATE;
0524         else if (!strcmp(param->name, IMMEDIATEDATA))
0525             param->state &= ~PSTATE_NEGOTIATE;
0526         else if (!strcmp(param->name, MAXBURSTLENGTH))
0527             param->state &= ~PSTATE_NEGOTIATE;
0528         else if (!strcmp(param->name, FIRSTBURSTLENGTH))
0529             param->state &= ~PSTATE_NEGOTIATE;
0530         else if (!strcmp(param->name, MAXOUTSTANDINGR2T))
0531             param->state &= ~PSTATE_NEGOTIATE;
0532         else if (!strcmp(param->name, DATAPDUINORDER))
0533             param->state &= ~PSTATE_NEGOTIATE;
0534         else if (!strcmp(param->name, DATASEQUENCEINORDER))
0535             param->state &= ~PSTATE_NEGOTIATE;
0536         else if (!strcmp(param->name, ERRORRECOVERYLEVEL))
0537             param->state &= ~PSTATE_NEGOTIATE;
0538         else if (!strcmp(param->name, DEFAULTTIME2WAIT))
0539             param->state &= ~PSTATE_NEGOTIATE;
0540         else if (!strcmp(param->name, DEFAULTTIME2RETAIN))
0541             param->state &= ~PSTATE_NEGOTIATE;
0542         else if (!strcmp(param->name, IFMARKER))
0543             param->state &= ~PSTATE_NEGOTIATE;
0544         else if (!strcmp(param->name, OFMARKER))
0545             param->state &= ~PSTATE_NEGOTIATE;
0546         else if (!strcmp(param->name, IFMARKINT))
0547             param->state &= ~PSTATE_NEGOTIATE;
0548         else if (!strcmp(param->name, OFMARKINT))
0549             param->state &= ~PSTATE_NEGOTIATE;
0550         else if (!strcmp(param->name, RDMAEXTENSIONS))
0551             param->state &= ~PSTATE_NEGOTIATE;
0552         else if (!strcmp(param->name, INITIATORRECVDATASEGMENTLENGTH))
0553             param->state &= ~PSTATE_NEGOTIATE;
0554         else if (!strcmp(param->name, TARGETRECVDATASEGMENTLENGTH))
0555             param->state &= ~PSTATE_NEGOTIATE;
0556     }
0557 
0558     return 0;
0559 }
0560 
0561 int iscsi_copy_param_list(
0562     struct iscsi_param_list **dst_param_list,
0563     struct iscsi_param_list *src_param_list,
0564     int leading)
0565 {
0566     struct iscsi_param *param = NULL;
0567     struct iscsi_param *new_param = NULL;
0568     struct iscsi_param_list *param_list = NULL;
0569 
0570     param_list = kzalloc(sizeof(struct iscsi_param_list), GFP_KERNEL);
0571     if (!param_list) {
0572         pr_err("Unable to allocate memory for struct iscsi_param_list.\n");
0573         return -ENOMEM;
0574     }
0575     INIT_LIST_HEAD(&param_list->param_list);
0576     INIT_LIST_HEAD(&param_list->extra_response_list);
0577 
0578     list_for_each_entry(param, &src_param_list->param_list, p_list) {
0579         if (!leading && (param->scope & SCOPE_SESSION_WIDE)) {
0580             if ((strcmp(param->name, "TargetName") != 0) &&
0581                 (strcmp(param->name, "InitiatorName") != 0) &&
0582                 (strcmp(param->name, "TargetPortalGroupTag") != 0))
0583                 continue;
0584         }
0585 
0586         new_param = kzalloc(sizeof(struct iscsi_param), GFP_KERNEL);
0587         if (!new_param) {
0588             pr_err("Unable to allocate memory for struct iscsi_param.\n");
0589             goto err_out;
0590         }
0591 
0592         new_param->name = kstrdup(param->name, GFP_KERNEL);
0593         new_param->value = kstrdup(param->value, GFP_KERNEL);
0594         if (!new_param->value || !new_param->name) {
0595             kfree(new_param->value);
0596             kfree(new_param->name);
0597             kfree(new_param);
0598             pr_err("Unable to allocate memory for parameter name/value.\n");
0599             goto err_out;
0600         }
0601 
0602         new_param->set_param = param->set_param;
0603         new_param->phase = param->phase;
0604         new_param->scope = param->scope;
0605         new_param->sender = param->sender;
0606         new_param->type = param->type;
0607         new_param->use = param->use;
0608         new_param->type_range = param->type_range;
0609 
0610         list_add_tail(&new_param->p_list, &param_list->param_list);
0611     }
0612 
0613     if (!list_empty(&param_list->param_list)) {
0614         *dst_param_list = param_list;
0615     } else {
0616         pr_err("No parameters allocated.\n");
0617         goto err_out;
0618     }
0619 
0620     return 0;
0621 
0622 err_out:
0623     iscsi_release_param_list(param_list);
0624     return -ENOMEM;
0625 }
0626 
0627 static void iscsi_release_extra_responses(struct iscsi_param_list *param_list)
0628 {
0629     struct iscsi_extra_response *er, *er_tmp;
0630 
0631     list_for_each_entry_safe(er, er_tmp, &param_list->extra_response_list,
0632             er_list) {
0633         list_del(&er->er_list);
0634         kfree(er);
0635     }
0636 }
0637 
0638 void iscsi_release_param_list(struct iscsi_param_list *param_list)
0639 {
0640     struct iscsi_param *param, *param_tmp;
0641 
0642     list_for_each_entry_safe(param, param_tmp, &param_list->param_list,
0643             p_list) {
0644         list_del(&param->p_list);
0645 
0646         kfree(param->name);
0647         kfree(param->value);
0648         kfree(param);
0649     }
0650 
0651     iscsi_release_extra_responses(param_list);
0652 
0653     kfree(param_list);
0654 }
0655 
0656 struct iscsi_param *iscsi_find_param_from_key(
0657     char *key,
0658     struct iscsi_param_list *param_list)
0659 {
0660     struct iscsi_param *param;
0661 
0662     if (!key || !param_list) {
0663         pr_err("Key or parameter list pointer is NULL.\n");
0664         return NULL;
0665     }
0666 
0667     list_for_each_entry(param, &param_list->param_list, p_list) {
0668         if (!strcmp(key, param->name))
0669             return param;
0670     }
0671 
0672     pr_err("Unable to locate key \"%s\".\n", key);
0673     return NULL;
0674 }
0675 EXPORT_SYMBOL(iscsi_find_param_from_key);
0676 
0677 int iscsi_extract_key_value(char *textbuf, char **key, char **value)
0678 {
0679     *value = strchr(textbuf, '=');
0680     if (!*value) {
0681         pr_err("Unable to locate \"=\" separator for key,"
0682                 " ignoring request.\n");
0683         return -1;
0684     }
0685 
0686     *key = textbuf;
0687     **value = '\0';
0688     *value = *value + 1;
0689 
0690     return 0;
0691 }
0692 
0693 int iscsi_update_param_value(struct iscsi_param *param, char *value)
0694 {
0695     kfree(param->value);
0696 
0697     param->value = kstrdup(value, GFP_KERNEL);
0698     if (!param->value) {
0699         pr_err("Unable to allocate memory for value.\n");
0700         return -ENOMEM;
0701     }
0702 
0703     pr_debug("iSCSI Parameter updated to %s=%s\n",
0704             param->name, param->value);
0705     return 0;
0706 }
0707 
0708 static int iscsi_add_notunderstood_response(
0709     char *key,
0710     char *value,
0711     struct iscsi_param_list *param_list)
0712 {
0713     struct iscsi_extra_response *extra_response;
0714 
0715     if (strlen(value) > VALUE_MAXLEN) {
0716         pr_err("Value for notunderstood key \"%s\" exceeds %d,"
0717             " protocol error.\n", key, VALUE_MAXLEN);
0718         return -1;
0719     }
0720 
0721     extra_response = kzalloc(sizeof(struct iscsi_extra_response), GFP_KERNEL);
0722     if (!extra_response) {
0723         pr_err("Unable to allocate memory for"
0724             " struct iscsi_extra_response.\n");
0725         return -ENOMEM;
0726     }
0727     INIT_LIST_HEAD(&extra_response->er_list);
0728 
0729     strlcpy(extra_response->key, key, sizeof(extra_response->key));
0730     strlcpy(extra_response->value, NOTUNDERSTOOD,
0731         sizeof(extra_response->value));
0732 
0733     list_add_tail(&extra_response->er_list,
0734             &param_list->extra_response_list);
0735     return 0;
0736 }
0737 
0738 static int iscsi_check_for_auth_key(char *key)
0739 {
0740     /*
0741      * RFC 1994
0742      */
0743     if (!strcmp(key, "CHAP_A") || !strcmp(key, "CHAP_I") ||
0744         !strcmp(key, "CHAP_C") || !strcmp(key, "CHAP_N") ||
0745         !strcmp(key, "CHAP_R"))
0746         return 1;
0747 
0748     /*
0749      * RFC 2945
0750      */
0751     if (!strcmp(key, "SRP_U") || !strcmp(key, "SRP_N") ||
0752         !strcmp(key, "SRP_g") || !strcmp(key, "SRP_s") ||
0753         !strcmp(key, "SRP_A") || !strcmp(key, "SRP_B") ||
0754         !strcmp(key, "SRP_M") || !strcmp(key, "SRP_HM"))
0755         return 1;
0756 
0757     return 0;
0758 }
0759 
0760 static void iscsi_check_proposer_for_optional_reply(struct iscsi_param *param,
0761                             bool keys_workaround)
0762 {
0763     if (IS_TYPE_BOOL_AND(param)) {
0764         if (!strcmp(param->value, NO))
0765             SET_PSTATE_REPLY_OPTIONAL(param);
0766     } else if (IS_TYPE_BOOL_OR(param)) {
0767         if (!strcmp(param->value, YES))
0768             SET_PSTATE_REPLY_OPTIONAL(param);
0769 
0770         if (keys_workaround) {
0771             /*
0772              * Required for gPXE iSCSI boot client
0773              */
0774             if (!strcmp(param->name, IMMEDIATEDATA))
0775                 SET_PSTATE_REPLY_OPTIONAL(param);
0776         }
0777     } else if (IS_TYPE_NUMBER(param)) {
0778         if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH))
0779             SET_PSTATE_REPLY_OPTIONAL(param);
0780 
0781         if (keys_workaround) {
0782             /*
0783              * Required for Mellanox Flexboot PXE boot ROM
0784              */
0785             if (!strcmp(param->name, FIRSTBURSTLENGTH))
0786                 SET_PSTATE_REPLY_OPTIONAL(param);
0787 
0788             /*
0789              * Required for gPXE iSCSI boot client
0790              */
0791             if (!strcmp(param->name, MAXCONNECTIONS))
0792                 SET_PSTATE_REPLY_OPTIONAL(param);
0793         }
0794     } else if (IS_PHASE_DECLARATIVE(param))
0795         SET_PSTATE_REPLY_OPTIONAL(param);
0796 }
0797 
0798 static int iscsi_check_boolean_value(struct iscsi_param *param, char *value)
0799 {
0800     if (strcmp(value, YES) && strcmp(value, NO)) {
0801         pr_err("Illegal value for \"%s\", must be either"
0802             " \"%s\" or \"%s\".\n", param->name, YES, NO);
0803         return -1;
0804     }
0805 
0806     return 0;
0807 }
0808 
0809 static int iscsi_check_numerical_value(struct iscsi_param *param, char *value_ptr)
0810 {
0811     char *tmpptr;
0812     int value = 0;
0813 
0814     value = simple_strtoul(value_ptr, &tmpptr, 0);
0815 
0816     if (IS_TYPERANGE_0_TO_2(param)) {
0817         if ((value < 0) || (value > 2)) {
0818             pr_err("Illegal value for \"%s\", must be"
0819                 " between 0 and 2.\n", param->name);
0820             return -1;
0821         }
0822         return 0;
0823     }
0824     if (IS_TYPERANGE_0_TO_3600(param)) {
0825         if ((value < 0) || (value > 3600)) {
0826             pr_err("Illegal value for \"%s\", must be"
0827                 " between 0 and 3600.\n", param->name);
0828             return -1;
0829         }
0830         return 0;
0831     }
0832     if (IS_TYPERANGE_0_TO_32767(param)) {
0833         if ((value < 0) || (value > 32767)) {
0834             pr_err("Illegal value for \"%s\", must be"
0835                 " between 0 and 32767.\n", param->name);
0836             return -1;
0837         }
0838         return 0;
0839     }
0840     if (IS_TYPERANGE_0_TO_65535(param)) {
0841         if ((value < 0) || (value > 65535)) {
0842             pr_err("Illegal value for \"%s\", must be"
0843                 " between 0 and 65535.\n", param->name);
0844             return -1;
0845         }
0846         return 0;
0847     }
0848     if (IS_TYPERANGE_1_TO_65535(param)) {
0849         if ((value < 1) || (value > 65535)) {
0850             pr_err("Illegal value for \"%s\", must be"
0851                 " between 1 and 65535.\n", param->name);
0852             return -1;
0853         }
0854         return 0;
0855     }
0856     if (IS_TYPERANGE_2_TO_3600(param)) {
0857         if ((value < 2) || (value > 3600)) {
0858             pr_err("Illegal value for \"%s\", must be"
0859                 " between 2 and 3600.\n", param->name);
0860             return -1;
0861         }
0862         return 0;
0863     }
0864     if (IS_TYPERANGE_512_TO_16777215(param)) {
0865         if ((value < 512) || (value > 16777215)) {
0866             pr_err("Illegal value for \"%s\", must be"
0867                 " between 512 and 16777215.\n", param->name);
0868             return -1;
0869         }
0870         return 0;
0871     }
0872 
0873     return 0;
0874 }
0875 
0876 static int iscsi_check_string_or_list_value(struct iscsi_param *param, char *value)
0877 {
0878     if (IS_PSTATE_PROPOSER(param))
0879         return 0;
0880 
0881     if (IS_TYPERANGE_AUTH_PARAM(param)) {
0882         if (strcmp(value, KRB5) && strcmp(value, SPKM1) &&
0883             strcmp(value, SPKM2) && strcmp(value, SRP) &&
0884             strcmp(value, CHAP) && strcmp(value, NONE)) {
0885             pr_err("Illegal value for \"%s\", must be"
0886                 " \"%s\", \"%s\", \"%s\", \"%s\", \"%s\""
0887                 " or \"%s\".\n", param->name, KRB5,
0888                     SPKM1, SPKM2, SRP, CHAP, NONE);
0889             return -1;
0890         }
0891     }
0892     if (IS_TYPERANGE_DIGEST_PARAM(param)) {
0893         if (strcmp(value, CRC32C) && strcmp(value, NONE)) {
0894             pr_err("Illegal value for \"%s\", must be"
0895                 " \"%s\" or \"%s\".\n", param->name,
0896                     CRC32C, NONE);
0897             return -1;
0898         }
0899     }
0900     if (IS_TYPERANGE_SESSIONTYPE(param)) {
0901         if (strcmp(value, DISCOVERY) && strcmp(value, NORMAL)) {
0902             pr_err("Illegal value for \"%s\", must be"
0903                 " \"%s\" or \"%s\".\n", param->name,
0904                     DISCOVERY, NORMAL);
0905             return -1;
0906         }
0907     }
0908 
0909     return 0;
0910 }
0911 
0912 static char *iscsi_check_valuelist_for_support(
0913     struct iscsi_param *param,
0914     char *value)
0915 {
0916     char *tmp1 = NULL, *tmp2 = NULL;
0917     char *acceptor_values = NULL, *proposer_values = NULL;
0918 
0919     acceptor_values = param->value;
0920     proposer_values = value;
0921 
0922     do {
0923         if (!proposer_values)
0924             return NULL;
0925         tmp1 = strchr(proposer_values, ',');
0926         if (tmp1)
0927             *tmp1 = '\0';
0928         acceptor_values = param->value;
0929         do {
0930             if (!acceptor_values) {
0931                 if (tmp1)
0932                     *tmp1 = ',';
0933                 return NULL;
0934             }
0935             tmp2 = strchr(acceptor_values, ',');
0936             if (tmp2)
0937                 *tmp2 = '\0';
0938             if (!strcmp(acceptor_values, proposer_values)) {
0939                 if (tmp2)
0940                     *tmp2 = ',';
0941                 goto out;
0942             }
0943             if (tmp2)
0944                 *tmp2++ = ',';
0945 
0946             acceptor_values = tmp2;
0947         } while (acceptor_values);
0948         if (tmp1)
0949             *tmp1++ = ',';
0950         proposer_values = tmp1;
0951     } while (proposer_values);
0952 
0953 out:
0954     return proposer_values;
0955 }
0956 
0957 static int iscsi_check_acceptor_state(struct iscsi_param *param, char *value,
0958                 struct iscsit_conn *conn)
0959 {
0960     u8 acceptor_boolean_value = 0, proposer_boolean_value = 0;
0961     char *negotiated_value = NULL;
0962 
0963     if (IS_PSTATE_ACCEPTOR(param)) {
0964         pr_err("Received key \"%s\" twice, protocol error.\n",
0965                 param->name);
0966         return -1;
0967     }
0968 
0969     if (IS_PSTATE_REJECT(param))
0970         return 0;
0971 
0972     if (IS_TYPE_BOOL_AND(param)) {
0973         if (!strcmp(value, YES))
0974             proposer_boolean_value = 1;
0975         if (!strcmp(param->value, YES))
0976             acceptor_boolean_value = 1;
0977         if (acceptor_boolean_value && proposer_boolean_value)
0978             do {} while (0);
0979         else {
0980             if (iscsi_update_param_value(param, NO) < 0)
0981                 return -1;
0982             if (!proposer_boolean_value)
0983                 SET_PSTATE_REPLY_OPTIONAL(param);
0984         }
0985     } else if (IS_TYPE_BOOL_OR(param)) {
0986         if (!strcmp(value, YES))
0987             proposer_boolean_value = 1;
0988         if (!strcmp(param->value, YES))
0989             acceptor_boolean_value = 1;
0990         if (acceptor_boolean_value || proposer_boolean_value) {
0991             if (iscsi_update_param_value(param, YES) < 0)
0992                 return -1;
0993             if (proposer_boolean_value)
0994                 SET_PSTATE_REPLY_OPTIONAL(param);
0995         }
0996     } else if (IS_TYPE_NUMBER(param)) {
0997         char *tmpptr, buf[11];
0998         u32 acceptor_value = simple_strtoul(param->value, &tmpptr, 0);
0999         u32 proposer_value = simple_strtoul(value, &tmpptr, 0);
1000 
1001         memset(buf, 0, sizeof(buf));
1002 
1003         if (!strcmp(param->name, MAXCONNECTIONS) ||
1004             !strcmp(param->name, MAXBURSTLENGTH) ||
1005             !strcmp(param->name, FIRSTBURSTLENGTH) ||
1006             !strcmp(param->name, MAXOUTSTANDINGR2T) ||
1007             !strcmp(param->name, DEFAULTTIME2RETAIN) ||
1008             !strcmp(param->name, ERRORRECOVERYLEVEL)) {
1009             if (proposer_value > acceptor_value) {
1010                 sprintf(buf, "%u", acceptor_value);
1011                 if (iscsi_update_param_value(param,
1012                         &buf[0]) < 0)
1013                     return -1;
1014             } else {
1015                 if (iscsi_update_param_value(param, value) < 0)
1016                     return -1;
1017             }
1018         } else if (!strcmp(param->name, DEFAULTTIME2WAIT)) {
1019             if (acceptor_value > proposer_value) {
1020                 sprintf(buf, "%u", acceptor_value);
1021                 if (iscsi_update_param_value(param,
1022                         &buf[0]) < 0)
1023                     return -1;
1024             } else {
1025                 if (iscsi_update_param_value(param, value) < 0)
1026                     return -1;
1027             }
1028         } else {
1029             if (iscsi_update_param_value(param, value) < 0)
1030                 return -1;
1031         }
1032 
1033         if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH)) {
1034             struct iscsi_param *param_mxdsl;
1035             unsigned long long tmp;
1036             int rc;
1037 
1038             rc = kstrtoull(param->value, 0, &tmp);
1039             if (rc < 0)
1040                 return -1;
1041 
1042             conn->conn_ops->MaxRecvDataSegmentLength = tmp;
1043             pr_debug("Saving op->MaxRecvDataSegmentLength from"
1044                 " original initiator received value: %u\n",
1045                 conn->conn_ops->MaxRecvDataSegmentLength);
1046 
1047             param_mxdsl = iscsi_find_param_from_key(
1048                         MAXXMITDATASEGMENTLENGTH,
1049                         conn->param_list);
1050             if (!param_mxdsl)
1051                 return -1;
1052 
1053             rc = iscsi_update_param_value(param,
1054                         param_mxdsl->value);
1055             if (rc < 0)
1056                 return -1;
1057 
1058             pr_debug("Updated %s to target MXDSL value: %s\n",
1059                     param->name, param->value);
1060         }
1061     } else if (IS_TYPE_VALUE_LIST(param)) {
1062         negotiated_value = iscsi_check_valuelist_for_support(
1063                     param, value);
1064         if (!negotiated_value) {
1065             pr_err("Proposer's value list \"%s\" contains"
1066                 " no valid values from Acceptor's value list"
1067                 " \"%s\".\n", value, param->value);
1068             return -1;
1069         }
1070         if (iscsi_update_param_value(param, negotiated_value) < 0)
1071             return -1;
1072     } else if (IS_PHASE_DECLARATIVE(param)) {
1073         if (iscsi_update_param_value(param, value) < 0)
1074             return -1;
1075         SET_PSTATE_REPLY_OPTIONAL(param);
1076     }
1077 
1078     return 0;
1079 }
1080 
1081 static int iscsi_check_proposer_state(struct iscsi_param *param, char *value)
1082 {
1083     if (IS_PSTATE_RESPONSE_GOT(param)) {
1084         pr_err("Received key \"%s\" twice, protocol error.\n",
1085                 param->name);
1086         return -1;
1087     }
1088 
1089     if (IS_TYPE_VALUE_LIST(param)) {
1090         char *comma_ptr = NULL, *tmp_ptr = NULL;
1091 
1092         comma_ptr = strchr(value, ',');
1093         if (comma_ptr) {
1094             pr_err("Illegal \",\" in response for \"%s\".\n",
1095                     param->name);
1096             return -1;
1097         }
1098 
1099         tmp_ptr = iscsi_check_valuelist_for_support(param, value);
1100         if (!tmp_ptr)
1101             return -1;
1102     }
1103 
1104     if (iscsi_update_param_value(param, value) < 0)
1105         return -1;
1106 
1107     return 0;
1108 }
1109 
1110 static int iscsi_check_value(struct iscsi_param *param, char *value)
1111 {
1112     char *comma_ptr = NULL;
1113 
1114     if (!strcmp(value, REJECT)) {
1115         if (!strcmp(param->name, IFMARKINT) ||
1116             !strcmp(param->name, OFMARKINT)) {
1117             /*
1118              * Reject is not fatal for [I,O]FMarkInt,  and causes
1119              * [I,O]FMarker to be reset to No. (See iSCSI v20 A.3.2)
1120              */
1121             SET_PSTATE_REJECT(param);
1122             return 0;
1123         }
1124         pr_err("Received %s=%s\n", param->name, value);
1125         return -1;
1126     }
1127     if (!strcmp(value, IRRELEVANT)) {
1128         pr_debug("Received %s=%s\n", param->name, value);
1129         SET_PSTATE_IRRELEVANT(param);
1130         return 0;
1131     }
1132     if (!strcmp(value, NOTUNDERSTOOD)) {
1133         if (!IS_PSTATE_PROPOSER(param)) {
1134             pr_err("Received illegal offer %s=%s\n",
1135                 param->name, value);
1136             return -1;
1137         }
1138 
1139 /* #warning FIXME: Add check for X-ExtensionKey here */
1140         pr_err("Standard iSCSI key \"%s\" cannot be answered"
1141             " with \"%s\", protocol error.\n", param->name, value);
1142         return -1;
1143     }
1144 
1145     do {
1146         comma_ptr = NULL;
1147         comma_ptr = strchr(value, ',');
1148 
1149         if (comma_ptr && !IS_TYPE_VALUE_LIST(param)) {
1150             pr_err("Detected value separator \",\", but"
1151                 " key \"%s\" does not allow a value list,"
1152                 " protocol error.\n", param->name);
1153             return -1;
1154         }
1155         if (comma_ptr)
1156             *comma_ptr = '\0';
1157 
1158         if (strlen(value) > VALUE_MAXLEN) {
1159             pr_err("Value for key \"%s\" exceeds %d,"
1160                 " protocol error.\n", param->name,
1161                 VALUE_MAXLEN);
1162             return -1;
1163         }
1164 
1165         if (IS_TYPE_BOOL_AND(param) || IS_TYPE_BOOL_OR(param)) {
1166             if (iscsi_check_boolean_value(param, value) < 0)
1167                 return -1;
1168         } else if (IS_TYPE_NUMBER(param)) {
1169             if (iscsi_check_numerical_value(param, value) < 0)
1170                 return -1;
1171         } else if (IS_TYPE_STRING(param) || IS_TYPE_VALUE_LIST(param)) {
1172             if (iscsi_check_string_or_list_value(param, value) < 0)
1173                 return -1;
1174         } else {
1175             pr_err("Huh? 0x%02x\n", param->type);
1176             return -1;
1177         }
1178 
1179         if (comma_ptr)
1180             *comma_ptr++ = ',';
1181 
1182         value = comma_ptr;
1183     } while (value);
1184 
1185     return 0;
1186 }
1187 
1188 static struct iscsi_param *__iscsi_check_key(
1189     char *key,
1190     int sender,
1191     struct iscsi_param_list *param_list)
1192 {
1193     struct iscsi_param *param;
1194 
1195     if (strlen(key) > KEY_MAXLEN) {
1196         pr_err("Length of key name \"%s\" exceeds %d.\n",
1197             key, KEY_MAXLEN);
1198         return NULL;
1199     }
1200 
1201     param = iscsi_find_param_from_key(key, param_list);
1202     if (!param)
1203         return NULL;
1204 
1205     if ((sender & SENDER_INITIATOR) && !IS_SENDER_INITIATOR(param)) {
1206         pr_err("Key \"%s\" may not be sent to %s,"
1207             " protocol error.\n", param->name,
1208             (sender & SENDER_RECEIVER) ? "target" : "initiator");
1209         return NULL;
1210     }
1211 
1212     if ((sender & SENDER_TARGET) && !IS_SENDER_TARGET(param)) {
1213         pr_err("Key \"%s\" may not be sent to %s,"
1214             " protocol error.\n", param->name,
1215             (sender & SENDER_RECEIVER) ? "initiator" : "target");
1216         return NULL;
1217     }
1218 
1219     return param;
1220 }
1221 
1222 static struct iscsi_param *iscsi_check_key(
1223     char *key,
1224     int phase,
1225     int sender,
1226     struct iscsi_param_list *param_list)
1227 {
1228     struct iscsi_param *param;
1229     /*
1230      * Key name length must not exceed 63 bytes. (See iSCSI v20 5.1)
1231      */
1232     if (strlen(key) > KEY_MAXLEN) {
1233         pr_err("Length of key name \"%s\" exceeds %d.\n",
1234             key, KEY_MAXLEN);
1235         return NULL;
1236     }
1237 
1238     param = iscsi_find_param_from_key(key, param_list);
1239     if (!param)
1240         return NULL;
1241 
1242     if ((sender & SENDER_INITIATOR) && !IS_SENDER_INITIATOR(param)) {
1243         pr_err("Key \"%s\" may not be sent to %s,"
1244             " protocol error.\n", param->name,
1245             (sender & SENDER_RECEIVER) ? "target" : "initiator");
1246         return NULL;
1247     }
1248     if ((sender & SENDER_TARGET) && !IS_SENDER_TARGET(param)) {
1249         pr_err("Key \"%s\" may not be sent to %s,"
1250                 " protocol error.\n", param->name,
1251             (sender & SENDER_RECEIVER) ? "initiator" : "target");
1252         return NULL;
1253     }
1254 
1255     if (IS_PSTATE_ACCEPTOR(param)) {
1256         pr_err("Key \"%s\" received twice, protocol error.\n",
1257                 key);
1258         return NULL;
1259     }
1260 
1261     if (!phase)
1262         return param;
1263 
1264     if (!(param->phase & phase)) {
1265         pr_err("Key \"%s\" may not be negotiated during ",
1266                 param->name);
1267         switch (phase) {
1268         case PHASE_SECURITY:
1269             pr_debug("Security phase.\n");
1270             break;
1271         case PHASE_OPERATIONAL:
1272             pr_debug("Operational phase.\n");
1273             break;
1274         default:
1275             pr_debug("Unknown phase.\n");
1276         }
1277         return NULL;
1278     }
1279 
1280     return param;
1281 }
1282 
1283 static int iscsi_enforce_integrity_rules(
1284     u8 phase,
1285     struct iscsi_param_list *param_list)
1286 {
1287     char *tmpptr;
1288     u8 DataSequenceInOrder = 0;
1289     u8 ErrorRecoveryLevel = 0, SessionType = 0;
1290     u32 FirstBurstLength = 0, MaxBurstLength = 0;
1291     struct iscsi_param *param = NULL;
1292 
1293     list_for_each_entry(param, &param_list->param_list, p_list) {
1294         if (!(param->phase & phase))
1295             continue;
1296         if (!strcmp(param->name, SESSIONTYPE))
1297             if (!strcmp(param->value, NORMAL))
1298                 SessionType = 1;
1299         if (!strcmp(param->name, ERRORRECOVERYLEVEL))
1300             ErrorRecoveryLevel = simple_strtoul(param->value,
1301                     &tmpptr, 0);
1302         if (!strcmp(param->name, DATASEQUENCEINORDER))
1303             if (!strcmp(param->value, YES))
1304                 DataSequenceInOrder = 1;
1305         if (!strcmp(param->name, MAXBURSTLENGTH))
1306             MaxBurstLength = simple_strtoul(param->value,
1307                     &tmpptr, 0);
1308     }
1309 
1310     list_for_each_entry(param, &param_list->param_list, p_list) {
1311         if (!(param->phase & phase))
1312             continue;
1313         if (!SessionType && !IS_PSTATE_ACCEPTOR(param))
1314             continue;
1315         if (!strcmp(param->name, MAXOUTSTANDINGR2T) &&
1316             DataSequenceInOrder && (ErrorRecoveryLevel > 0)) {
1317             if (strcmp(param->value, "1")) {
1318                 if (iscsi_update_param_value(param, "1") < 0)
1319                     return -1;
1320                 pr_debug("Reset \"%s\" to \"%s\".\n",
1321                     param->name, param->value);
1322             }
1323         }
1324         if (!strcmp(param->name, MAXCONNECTIONS) && !SessionType) {
1325             if (strcmp(param->value, "1")) {
1326                 if (iscsi_update_param_value(param, "1") < 0)
1327                     return -1;
1328                 pr_debug("Reset \"%s\" to \"%s\".\n",
1329                     param->name, param->value);
1330             }
1331         }
1332         if (!strcmp(param->name, FIRSTBURSTLENGTH)) {
1333             FirstBurstLength = simple_strtoul(param->value,
1334                     &tmpptr, 0);
1335             if (FirstBurstLength > MaxBurstLength) {
1336                 char tmpbuf[11];
1337                 memset(tmpbuf, 0, sizeof(tmpbuf));
1338                 sprintf(tmpbuf, "%u", MaxBurstLength);
1339                 if (iscsi_update_param_value(param, tmpbuf))
1340                     return -1;
1341                 pr_debug("Reset \"%s\" to \"%s\".\n",
1342                     param->name, param->value);
1343             }
1344         }
1345     }
1346 
1347     return 0;
1348 }
1349 
1350 int iscsi_decode_text_input(
1351     u8 phase,
1352     u8 sender,
1353     char *textbuf,
1354     u32 length,
1355     struct iscsit_conn *conn)
1356 {
1357     struct iscsi_param_list *param_list = conn->param_list;
1358     char *tmpbuf, *start = NULL, *end = NULL;
1359 
1360     tmpbuf = kmemdup_nul(textbuf, length, GFP_KERNEL);
1361     if (!tmpbuf) {
1362         pr_err("Unable to allocate %u + 1 bytes for tmpbuf.\n", length);
1363         return -ENOMEM;
1364     }
1365 
1366     start = tmpbuf;
1367     end = (start + length);
1368 
1369     while (start < end) {
1370         char *key, *value;
1371         struct iscsi_param *param;
1372 
1373         if (iscsi_extract_key_value(start, &key, &value) < 0)
1374             goto free_buffer;
1375 
1376         pr_debug("Got key: %s=%s\n", key, value);
1377 
1378         if (phase & PHASE_SECURITY) {
1379             if (iscsi_check_for_auth_key(key) > 0) {
1380                 kfree(tmpbuf);
1381                 return 1;
1382             }
1383         }
1384 
1385         param = iscsi_check_key(key, phase, sender, param_list);
1386         if (!param) {
1387             if (iscsi_add_notunderstood_response(key, value,
1388                                  param_list) < 0)
1389                 goto free_buffer;
1390 
1391             start += strlen(key) + strlen(value) + 2;
1392             continue;
1393         }
1394         if (iscsi_check_value(param, value) < 0)
1395             goto free_buffer;
1396 
1397         start += strlen(key) + strlen(value) + 2;
1398 
1399         if (IS_PSTATE_PROPOSER(param)) {
1400             if (iscsi_check_proposer_state(param, value) < 0)
1401                 goto free_buffer;
1402 
1403             SET_PSTATE_RESPONSE_GOT(param);
1404         } else {
1405             if (iscsi_check_acceptor_state(param, value, conn) < 0)
1406                 goto free_buffer;
1407 
1408             SET_PSTATE_ACCEPTOR(param);
1409         }
1410     }
1411 
1412     kfree(tmpbuf);
1413     return 0;
1414 
1415 free_buffer:
1416     kfree(tmpbuf);
1417     return -1;
1418 }
1419 
1420 int iscsi_encode_text_output(
1421     u8 phase,
1422     u8 sender,
1423     char *textbuf,
1424     u32 *length,
1425     struct iscsi_param_list *param_list,
1426     bool keys_workaround)
1427 {
1428     char *output_buf = NULL;
1429     struct iscsi_extra_response *er;
1430     struct iscsi_param *param;
1431 
1432     output_buf = textbuf + *length;
1433 
1434     if (iscsi_enforce_integrity_rules(phase, param_list) < 0)
1435         return -1;
1436 
1437     list_for_each_entry(param, &param_list->param_list, p_list) {
1438         if (!(param->sender & sender))
1439             continue;
1440         if (IS_PSTATE_ACCEPTOR(param) &&
1441             !IS_PSTATE_RESPONSE_SENT(param) &&
1442             !IS_PSTATE_REPLY_OPTIONAL(param) &&
1443             (param->phase & phase)) {
1444             *length += sprintf(output_buf, "%s=%s",
1445                 param->name, param->value);
1446             *length += 1;
1447             output_buf = textbuf + *length;
1448             SET_PSTATE_RESPONSE_SENT(param);
1449             pr_debug("Sending key: %s=%s\n",
1450                 param->name, param->value);
1451             continue;
1452         }
1453         if (IS_PSTATE_NEGOTIATE(param) &&
1454             !IS_PSTATE_ACCEPTOR(param) &&
1455             !IS_PSTATE_PROPOSER(param) &&
1456             (param->phase & phase)) {
1457             *length += sprintf(output_buf, "%s=%s",
1458                 param->name, param->value);
1459             *length += 1;
1460             output_buf = textbuf + *length;
1461             SET_PSTATE_PROPOSER(param);
1462             iscsi_check_proposer_for_optional_reply(param,
1463                                     keys_workaround);
1464             pr_debug("Sending key: %s=%s\n",
1465                 param->name, param->value);
1466         }
1467     }
1468 
1469     list_for_each_entry(er, &param_list->extra_response_list, er_list) {
1470         *length += sprintf(output_buf, "%s=%s", er->key, er->value);
1471         *length += 1;
1472         output_buf = textbuf + *length;
1473         pr_debug("Sending key: %s=%s\n", er->key, er->value);
1474     }
1475     iscsi_release_extra_responses(param_list);
1476 
1477     return 0;
1478 }
1479 
1480 int iscsi_check_negotiated_keys(struct iscsi_param_list *param_list)
1481 {
1482     int ret = 0;
1483     struct iscsi_param *param;
1484 
1485     list_for_each_entry(param, &param_list->param_list, p_list) {
1486         if (IS_PSTATE_NEGOTIATE(param) &&
1487             IS_PSTATE_PROPOSER(param) &&
1488             !IS_PSTATE_RESPONSE_GOT(param) &&
1489             !IS_PSTATE_REPLY_OPTIONAL(param) &&
1490             !IS_PHASE_DECLARATIVE(param)) {
1491             pr_err("No response for proposed key \"%s\".\n",
1492                     param->name);
1493             ret = -1;
1494         }
1495     }
1496 
1497     return ret;
1498 }
1499 
1500 int iscsi_change_param_value(
1501     char *keyvalue,
1502     struct iscsi_param_list *param_list,
1503     int check_key)
1504 {
1505     char *key = NULL, *value = NULL;
1506     struct iscsi_param *param;
1507     int sender = 0;
1508 
1509     if (iscsi_extract_key_value(keyvalue, &key, &value) < 0)
1510         return -1;
1511 
1512     if (!check_key) {
1513         param = __iscsi_check_key(keyvalue, sender, param_list);
1514         if (!param)
1515             return -1;
1516     } else {
1517         param = iscsi_check_key(keyvalue, 0, sender, param_list);
1518         if (!param)
1519             return -1;
1520 
1521         param->set_param = 1;
1522         if (iscsi_check_value(param, value) < 0) {
1523             param->set_param = 0;
1524             return -1;
1525         }
1526         param->set_param = 0;
1527     }
1528 
1529     if (iscsi_update_param_value(param, value) < 0)
1530         return -1;
1531 
1532     return 0;
1533 }
1534 
1535 void iscsi_set_connection_parameters(
1536     struct iscsi_conn_ops *ops,
1537     struct iscsi_param_list *param_list)
1538 {
1539     char *tmpptr;
1540     struct iscsi_param *param;
1541 
1542     pr_debug("---------------------------------------------------"
1543             "---------------\n");
1544     list_for_each_entry(param, &param_list->param_list, p_list) {
1545         /*
1546          * Special case to set MAXXMITDATASEGMENTLENGTH from the
1547          * target requested MaxRecvDataSegmentLength, even though
1548          * this key is not sent over the wire.
1549          */
1550         if (!strcmp(param->name, MAXXMITDATASEGMENTLENGTH)) {
1551             ops->MaxXmitDataSegmentLength =
1552                 simple_strtoul(param->value, &tmpptr, 0);
1553             pr_debug("MaxXmitDataSegmentLength:     %s\n",
1554                 param->value);
1555         }
1556 
1557         if (!IS_PSTATE_ACCEPTOR(param) && !IS_PSTATE_PROPOSER(param))
1558             continue;
1559         if (!strcmp(param->name, AUTHMETHOD)) {
1560             pr_debug("AuthMethod:                   %s\n",
1561                 param->value);
1562         } else if (!strcmp(param->name, HEADERDIGEST)) {
1563             ops->HeaderDigest = !strcmp(param->value, CRC32C);
1564             pr_debug("HeaderDigest:                 %s\n",
1565                 param->value);
1566         } else if (!strcmp(param->name, DATADIGEST)) {
1567             ops->DataDigest = !strcmp(param->value, CRC32C);
1568             pr_debug("DataDigest:                   %s\n",
1569                 param->value);
1570         } else if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH)) {
1571             /*
1572              * At this point iscsi_check_acceptor_state() will have
1573              * set ops->MaxRecvDataSegmentLength from the original
1574              * initiator provided value.
1575              */
1576             pr_debug("MaxRecvDataSegmentLength:     %u\n",
1577                 ops->MaxRecvDataSegmentLength);
1578         } else if (!strcmp(param->name, INITIATORRECVDATASEGMENTLENGTH)) {
1579             ops->InitiatorRecvDataSegmentLength =
1580                 simple_strtoul(param->value, &tmpptr, 0);
1581             pr_debug("InitiatorRecvDataSegmentLength: %s\n",
1582                 param->value);
1583             ops->MaxRecvDataSegmentLength =
1584                     ops->InitiatorRecvDataSegmentLength;
1585             pr_debug("Set MRDSL from InitiatorRecvDataSegmentLength\n");
1586         } else if (!strcmp(param->name, TARGETRECVDATASEGMENTLENGTH)) {
1587             ops->TargetRecvDataSegmentLength =
1588                 simple_strtoul(param->value, &tmpptr, 0);
1589             pr_debug("TargetRecvDataSegmentLength:  %s\n",
1590                 param->value);
1591             ops->MaxXmitDataSegmentLength =
1592                     ops->TargetRecvDataSegmentLength;
1593             pr_debug("Set MXDSL from TargetRecvDataSegmentLength\n");
1594         }
1595     }
1596     pr_debug("----------------------------------------------------"
1597             "--------------\n");
1598 }
1599 
1600 void iscsi_set_session_parameters(
1601     struct iscsi_sess_ops *ops,
1602     struct iscsi_param_list *param_list,
1603     int leading)
1604 {
1605     char *tmpptr;
1606     struct iscsi_param *param;
1607 
1608     pr_debug("----------------------------------------------------"
1609             "--------------\n");
1610     list_for_each_entry(param, &param_list->param_list, p_list) {
1611         if (!IS_PSTATE_ACCEPTOR(param) && !IS_PSTATE_PROPOSER(param))
1612             continue;
1613         if (!strcmp(param->name, INITIATORNAME)) {
1614             if (!param->value)
1615                 continue;
1616             if (leading)
1617                 snprintf(ops->InitiatorName,
1618                         sizeof(ops->InitiatorName),
1619                         "%s", param->value);
1620             pr_debug("InitiatorName:                %s\n",
1621                 param->value);
1622         } else if (!strcmp(param->name, INITIATORALIAS)) {
1623             if (!param->value)
1624                 continue;
1625             snprintf(ops->InitiatorAlias,
1626                         sizeof(ops->InitiatorAlias),
1627                         "%s", param->value);
1628             pr_debug("InitiatorAlias:               %s\n",
1629                 param->value);
1630         } else if (!strcmp(param->name, TARGETNAME)) {
1631             if (!param->value)
1632                 continue;
1633             if (leading)
1634                 snprintf(ops->TargetName,
1635                         sizeof(ops->TargetName),
1636                         "%s", param->value);
1637             pr_debug("TargetName:                   %s\n",
1638                 param->value);
1639         } else if (!strcmp(param->name, TARGETALIAS)) {
1640             if (!param->value)
1641                 continue;
1642             snprintf(ops->TargetAlias, sizeof(ops->TargetAlias),
1643                     "%s", param->value);
1644             pr_debug("TargetAlias:                  %s\n",
1645                 param->value);
1646         } else if (!strcmp(param->name, TARGETPORTALGROUPTAG)) {
1647             ops->TargetPortalGroupTag =
1648                 simple_strtoul(param->value, &tmpptr, 0);
1649             pr_debug("TargetPortalGroupTag:         %s\n",
1650                 param->value);
1651         } else if (!strcmp(param->name, MAXCONNECTIONS)) {
1652             ops->MaxConnections =
1653                 simple_strtoul(param->value, &tmpptr, 0);
1654             pr_debug("MaxConnections:               %s\n",
1655                 param->value);
1656         } else if (!strcmp(param->name, INITIALR2T)) {
1657             ops->InitialR2T = !strcmp(param->value, YES);
1658             pr_debug("InitialR2T:                   %s\n",
1659                 param->value);
1660         } else if (!strcmp(param->name, IMMEDIATEDATA)) {
1661             ops->ImmediateData = !strcmp(param->value, YES);
1662             pr_debug("ImmediateData:                %s\n",
1663                 param->value);
1664         } else if (!strcmp(param->name, MAXBURSTLENGTH)) {
1665             ops->MaxBurstLength =
1666                 simple_strtoul(param->value, &tmpptr, 0);
1667             pr_debug("MaxBurstLength:               %s\n",
1668                 param->value);
1669         } else if (!strcmp(param->name, FIRSTBURSTLENGTH)) {
1670             ops->FirstBurstLength =
1671                 simple_strtoul(param->value, &tmpptr, 0);
1672             pr_debug("FirstBurstLength:             %s\n",
1673                 param->value);
1674         } else if (!strcmp(param->name, DEFAULTTIME2WAIT)) {
1675             ops->DefaultTime2Wait =
1676                 simple_strtoul(param->value, &tmpptr, 0);
1677             pr_debug("DefaultTime2Wait:             %s\n",
1678                 param->value);
1679         } else if (!strcmp(param->name, DEFAULTTIME2RETAIN)) {
1680             ops->DefaultTime2Retain =
1681                 simple_strtoul(param->value, &tmpptr, 0);
1682             pr_debug("DefaultTime2Retain:           %s\n",
1683                 param->value);
1684         } else if (!strcmp(param->name, MAXOUTSTANDINGR2T)) {
1685             ops->MaxOutstandingR2T =
1686                 simple_strtoul(param->value, &tmpptr, 0);
1687             pr_debug("MaxOutstandingR2T:            %s\n",
1688                 param->value);
1689         } else if (!strcmp(param->name, DATAPDUINORDER)) {
1690             ops->DataPDUInOrder = !strcmp(param->value, YES);
1691             pr_debug("DataPDUInOrder:               %s\n",
1692                 param->value);
1693         } else if (!strcmp(param->name, DATASEQUENCEINORDER)) {
1694             ops->DataSequenceInOrder = !strcmp(param->value, YES);
1695             pr_debug("DataSequenceInOrder:          %s\n",
1696                 param->value);
1697         } else if (!strcmp(param->name, ERRORRECOVERYLEVEL)) {
1698             ops->ErrorRecoveryLevel =
1699                 simple_strtoul(param->value, &tmpptr, 0);
1700             pr_debug("ErrorRecoveryLevel:           %s\n",
1701                 param->value);
1702         } else if (!strcmp(param->name, SESSIONTYPE)) {
1703             ops->SessionType = !strcmp(param->value, DISCOVERY);
1704             pr_debug("SessionType:                  %s\n",
1705                 param->value);
1706         } else if (!strcmp(param->name, RDMAEXTENSIONS)) {
1707             ops->RDMAExtensions = !strcmp(param->value, YES);
1708             pr_debug("RDMAExtensions:               %s\n",
1709                 param->value);
1710         }
1711     }
1712     pr_debug("----------------------------------------------------"
1713             "--------------\n");
1714 
1715 }