root/drivers/target/iscsi/iscsi_target_parameters.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. iscsi_login_rx_data
  2. iscsi_login_tx_data
  3. iscsi_dump_conn_ops
  4. iscsi_dump_sess_ops
  5. iscsi_print_params
  6. iscsi_set_default_param
  7. iscsi_create_default_params
  8. iscsi_set_keys_to_negotiate
  9. iscsi_set_keys_irrelevant_for_discovery
  10. iscsi_copy_param_list
  11. iscsi_release_extra_responses
  12. iscsi_release_param_list
  13. iscsi_find_param_from_key
  14. iscsi_extract_key_value
  15. iscsi_update_param_value
  16. iscsi_add_notunderstood_response
  17. iscsi_check_for_auth_key
  18. iscsi_check_proposer_for_optional_reply
  19. iscsi_check_boolean_value
  20. iscsi_check_numerical_value
  21. iscsi_check_string_or_list_value
  22. iscsi_check_valuelist_for_support
  23. iscsi_check_acceptor_state
  24. iscsi_check_proposer_state
  25. iscsi_check_value
  26. __iscsi_check_key
  27. iscsi_check_key
  28. iscsi_enforce_integrity_rules
  29. iscsi_decode_text_input
  30. iscsi_encode_text_output
  31. iscsi_check_negotiated_keys
  32. iscsi_change_param_value
  33. iscsi_set_connection_parameters
  34. iscsi_set_session_parameters

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*******************************************************************************
   3  * This file contains main functions related to iSCSI Parameter negotiation.
   4  *
   5  * (c) Copyright 2007-2013 Datera, Inc.
   6  *
   7  * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
   8  *
   9  ******************************************************************************/
  10 
  11 #include <linux/slab.h>
  12 #include <linux/uio.h> /* struct kvec */
  13 #include <target/iscsi/iscsi_target_core.h>
  14 #include "iscsi_target_util.h"
  15 #include "iscsi_target_parameters.h"
  16 
  17 int iscsi_login_rx_data(
  18         struct iscsi_conn *conn,
  19         char *buf,
  20         int length)
  21 {
  22         int rx_got;
  23         struct kvec iov;
  24 
  25         memset(&iov, 0, sizeof(struct kvec));
  26         iov.iov_len     = length;
  27         iov.iov_base    = buf;
  28 
  29         rx_got = rx_data(conn, &iov, 1, length);
  30         if (rx_got != length) {
  31                 pr_err("rx_data returned %d, expecting %d.\n",
  32                                 rx_got, length);
  33                 return -1;
  34         }
  35 
  36         return 0 ;
  37 }
  38 
  39 int iscsi_login_tx_data(
  40         struct iscsi_conn *conn,
  41         char *pdu_buf,
  42         char *text_buf,
  43         int text_length)
  44 {
  45         int length, tx_sent, iov_cnt = 1;
  46         struct kvec iov[2];
  47 
  48         length = (ISCSI_HDR_LEN + text_length);
  49 
  50         memset(&iov[0], 0, 2 * sizeof(struct kvec));
  51         iov[0].iov_len          = ISCSI_HDR_LEN;
  52         iov[0].iov_base         = pdu_buf;
  53 
  54         if (text_buf && text_length) {
  55                 iov[1].iov_len  = text_length;
  56                 iov[1].iov_base = text_buf;
  57                 iov_cnt++;
  58         }
  59 
  60         tx_sent = tx_data(conn, &iov[0], iov_cnt, length);
  61         if (tx_sent != length) {
  62                 pr_err("tx_data returned %d, expecting %d.\n",
  63                                 tx_sent, length);
  64                 return -1;
  65         }
  66 
  67         return 0;
  68 }
  69 
  70 void iscsi_dump_conn_ops(struct iscsi_conn_ops *conn_ops)
  71 {
  72         pr_debug("HeaderDigest: %s\n", (conn_ops->HeaderDigest) ?
  73                                 "CRC32C" : "None");
  74         pr_debug("DataDigest: %s\n", (conn_ops->DataDigest) ?
  75                                 "CRC32C" : "None");
  76         pr_debug("MaxRecvDataSegmentLength: %u\n",
  77                                 conn_ops->MaxRecvDataSegmentLength);
  78 }
  79 
  80 void iscsi_dump_sess_ops(struct iscsi_sess_ops *sess_ops)
  81 {
  82         pr_debug("InitiatorName: %s\n", sess_ops->InitiatorName);
  83         pr_debug("InitiatorAlias: %s\n", sess_ops->InitiatorAlias);
  84         pr_debug("TargetName: %s\n", sess_ops->TargetName);
  85         pr_debug("TargetAlias: %s\n", sess_ops->TargetAlias);
  86         pr_debug("TargetPortalGroupTag: %hu\n",
  87                         sess_ops->TargetPortalGroupTag);
  88         pr_debug("MaxConnections: %hu\n", sess_ops->MaxConnections);
  89         pr_debug("InitialR2T: %s\n",
  90                         (sess_ops->InitialR2T) ? "Yes" : "No");
  91         pr_debug("ImmediateData: %s\n", (sess_ops->ImmediateData) ?
  92                         "Yes" : "No");
  93         pr_debug("MaxBurstLength: %u\n", sess_ops->MaxBurstLength);
  94         pr_debug("FirstBurstLength: %u\n", sess_ops->FirstBurstLength);
  95         pr_debug("DefaultTime2Wait: %hu\n", sess_ops->DefaultTime2Wait);
  96         pr_debug("DefaultTime2Retain: %hu\n",
  97                         sess_ops->DefaultTime2Retain);
  98         pr_debug("MaxOutstandingR2T: %hu\n",
  99                         sess_ops->MaxOutstandingR2T);
 100         pr_debug("DataPDUInOrder: %s\n",
 101                         (sess_ops->DataPDUInOrder) ? "Yes" : "No");
 102         pr_debug("DataSequenceInOrder: %s\n",
 103                         (sess_ops->DataSequenceInOrder) ? "Yes" : "No");
 104         pr_debug("ErrorRecoveryLevel: %hu\n",
 105                         sess_ops->ErrorRecoveryLevel);
 106         pr_debug("SessionType: %s\n", (sess_ops->SessionType) ?
 107                         "Discovery" : "Normal");
 108 }
 109 
 110 void iscsi_print_params(struct iscsi_param_list *param_list)
 111 {
 112         struct iscsi_param *param;
 113 
 114         list_for_each_entry(param, &param_list->param_list, p_list)
 115                 pr_debug("%s: %s\n", param->name, param->value);
 116 }
 117 
 118 static struct iscsi_param *iscsi_set_default_param(struct iscsi_param_list *param_list,
 119                 char *name, char *value, u8 phase, u8 scope, u8 sender,
 120                 u16 type_range, u8 use)
 121 {
 122         struct iscsi_param *param = NULL;
 123 
 124         param = kzalloc(sizeof(struct iscsi_param), GFP_KERNEL);
 125         if (!param) {
 126                 pr_err("Unable to allocate memory for parameter.\n");
 127                 goto out;
 128         }
 129         INIT_LIST_HEAD(&param->p_list);
 130 
 131         param->name = kstrdup(name, GFP_KERNEL);
 132         if (!param->name) {
 133                 pr_err("Unable to allocate memory for parameter name.\n");
 134                 goto out;
 135         }
 136 
 137         param->value = kstrdup(value, GFP_KERNEL);
 138         if (!param->value) {
 139                 pr_err("Unable to allocate memory for parameter value.\n");
 140                 goto out;
 141         }
 142 
 143         param->phase            = phase;
 144         param->scope            = scope;
 145         param->sender           = sender;
 146         param->use              = use;
 147         param->type_range       = type_range;
 148 
 149         switch (param->type_range) {
 150         case TYPERANGE_BOOL_AND:
 151                 param->type = TYPE_BOOL_AND;
 152                 break;
 153         case TYPERANGE_BOOL_OR:
 154                 param->type = TYPE_BOOL_OR;
 155                 break;
 156         case TYPERANGE_0_TO_2:
 157         case TYPERANGE_0_TO_3600:
 158         case TYPERANGE_0_TO_32767:
 159         case TYPERANGE_0_TO_65535:
 160         case TYPERANGE_1_TO_65535:
 161         case TYPERANGE_2_TO_3600:
 162         case TYPERANGE_512_TO_16777215:
 163                 param->type = TYPE_NUMBER;
 164                 break;
 165         case TYPERANGE_AUTH:
 166         case TYPERANGE_DIGEST:
 167                 param->type = TYPE_VALUE_LIST | TYPE_STRING;
 168                 break;
 169         case TYPERANGE_ISCSINAME:
 170         case TYPERANGE_SESSIONTYPE:
 171         case TYPERANGE_TARGETADDRESS:
 172         case TYPERANGE_UTF8:
 173                 param->type = TYPE_STRING;
 174                 break;
 175         default:
 176                 pr_err("Unknown type_range 0x%02x\n",
 177                                 param->type_range);
 178                 goto out;
 179         }
 180         list_add_tail(&param->p_list, &param_list->param_list);
 181 
 182         return param;
 183 out:
 184         if (param) {
 185                 kfree(param->value);
 186                 kfree(param->name);
 187                 kfree(param);
 188         }
 189 
 190         return NULL;
 191 }
 192 
 193 /* #warning Add extension keys */
 194 int iscsi_create_default_params(struct iscsi_param_list **param_list_ptr)
 195 {
 196         struct iscsi_param *param = NULL;
 197         struct iscsi_param_list *pl;
 198 
 199         pl = kzalloc(sizeof(struct iscsi_param_list), GFP_KERNEL);
 200         if (!pl) {
 201                 pr_err("Unable to allocate memory for"
 202                                 " struct iscsi_param_list.\n");
 203                 return -ENOMEM;
 204         }
 205         INIT_LIST_HEAD(&pl->param_list);
 206         INIT_LIST_HEAD(&pl->extra_response_list);
 207 
 208         /*
 209          * The format for setting the initial parameter definitions are:
 210          *
 211          * Parameter name:
 212          * Initial value:
 213          * Allowable phase:
 214          * Scope:
 215          * Allowable senders:
 216          * Typerange:
 217          * Use:
 218          */
 219         param = iscsi_set_default_param(pl, AUTHMETHOD, INITIAL_AUTHMETHOD,
 220                         PHASE_SECURITY, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 221                         TYPERANGE_AUTH, USE_INITIAL_ONLY);
 222         if (!param)
 223                 goto out;
 224 
 225         param = iscsi_set_default_param(pl, HEADERDIGEST, INITIAL_HEADERDIGEST,
 226                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 227                         TYPERANGE_DIGEST, USE_INITIAL_ONLY);
 228         if (!param)
 229                 goto out;
 230 
 231         param = iscsi_set_default_param(pl, DATADIGEST, INITIAL_DATADIGEST,
 232                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 233                         TYPERANGE_DIGEST, USE_INITIAL_ONLY);
 234         if (!param)
 235                 goto out;
 236 
 237         param = iscsi_set_default_param(pl, MAXCONNECTIONS,
 238                         INITIAL_MAXCONNECTIONS, PHASE_OPERATIONAL,
 239                         SCOPE_SESSION_WIDE, SENDER_BOTH,
 240                         TYPERANGE_1_TO_65535, USE_LEADING_ONLY);
 241         if (!param)
 242                 goto out;
 243 
 244         param = iscsi_set_default_param(pl, SENDTARGETS, INITIAL_SENDTARGETS,
 245                         PHASE_FFP0, SCOPE_SESSION_WIDE, SENDER_INITIATOR,
 246                         TYPERANGE_UTF8, 0);
 247         if (!param)
 248                 goto out;
 249 
 250         param = iscsi_set_default_param(pl, TARGETNAME, INITIAL_TARGETNAME,
 251                         PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_BOTH,
 252                         TYPERANGE_ISCSINAME, USE_ALL);
 253         if (!param)
 254                 goto out;
 255 
 256         param = iscsi_set_default_param(pl, INITIATORNAME,
 257                         INITIAL_INITIATORNAME, PHASE_DECLARATIVE,
 258                         SCOPE_SESSION_WIDE, SENDER_INITIATOR,
 259                         TYPERANGE_ISCSINAME, USE_INITIAL_ONLY);
 260         if (!param)
 261                 goto out;
 262 
 263         param = iscsi_set_default_param(pl, TARGETALIAS, INITIAL_TARGETALIAS,
 264                         PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_TARGET,
 265                         TYPERANGE_UTF8, USE_ALL);
 266         if (!param)
 267                 goto out;
 268 
 269         param = iscsi_set_default_param(pl, INITIATORALIAS,
 270                         INITIAL_INITIATORALIAS, PHASE_DECLARATIVE,
 271                         SCOPE_SESSION_WIDE, SENDER_INITIATOR, TYPERANGE_UTF8,
 272                         USE_ALL);
 273         if (!param)
 274                 goto out;
 275 
 276         param = iscsi_set_default_param(pl, TARGETADDRESS,
 277                         INITIAL_TARGETADDRESS, PHASE_DECLARATIVE,
 278                         SCOPE_SESSION_WIDE, SENDER_TARGET,
 279                         TYPERANGE_TARGETADDRESS, USE_ALL);
 280         if (!param)
 281                 goto out;
 282 
 283         param = iscsi_set_default_param(pl, TARGETPORTALGROUPTAG,
 284                         INITIAL_TARGETPORTALGROUPTAG,
 285                         PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_TARGET,
 286                         TYPERANGE_0_TO_65535, USE_INITIAL_ONLY);
 287         if (!param)
 288                 goto out;
 289 
 290         param = iscsi_set_default_param(pl, INITIALR2T, INITIAL_INITIALR2T,
 291                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
 292                         TYPERANGE_BOOL_OR, USE_LEADING_ONLY);
 293         if (!param)
 294                 goto out;
 295 
 296         param = iscsi_set_default_param(pl, IMMEDIATEDATA,
 297                         INITIAL_IMMEDIATEDATA, PHASE_OPERATIONAL,
 298                         SCOPE_SESSION_WIDE, SENDER_BOTH, TYPERANGE_BOOL_AND,
 299                         USE_LEADING_ONLY);
 300         if (!param)
 301                 goto out;
 302 
 303         param = iscsi_set_default_param(pl, MAXXMITDATASEGMENTLENGTH,
 304                         INITIAL_MAXXMITDATASEGMENTLENGTH,
 305                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 306                         TYPERANGE_512_TO_16777215, USE_ALL);
 307         if (!param)
 308                 goto out;
 309 
 310         param = iscsi_set_default_param(pl, MAXRECVDATASEGMENTLENGTH,
 311                         INITIAL_MAXRECVDATASEGMENTLENGTH,
 312                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 313                         TYPERANGE_512_TO_16777215, USE_ALL);
 314         if (!param)
 315                 goto out;
 316 
 317         param = iscsi_set_default_param(pl, MAXBURSTLENGTH,
 318                         INITIAL_MAXBURSTLENGTH, PHASE_OPERATIONAL,
 319                         SCOPE_SESSION_WIDE, SENDER_BOTH,
 320                         TYPERANGE_512_TO_16777215, USE_LEADING_ONLY);
 321         if (!param)
 322                 goto out;
 323 
 324         param = iscsi_set_default_param(pl, FIRSTBURSTLENGTH,
 325                         INITIAL_FIRSTBURSTLENGTH,
 326                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
 327                         TYPERANGE_512_TO_16777215, USE_LEADING_ONLY);
 328         if (!param)
 329                 goto out;
 330 
 331         param = iscsi_set_default_param(pl, DEFAULTTIME2WAIT,
 332                         INITIAL_DEFAULTTIME2WAIT,
 333                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
 334                         TYPERANGE_0_TO_3600, USE_LEADING_ONLY);
 335         if (!param)
 336                 goto out;
 337 
 338         param = iscsi_set_default_param(pl, DEFAULTTIME2RETAIN,
 339                         INITIAL_DEFAULTTIME2RETAIN,
 340                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
 341                         TYPERANGE_0_TO_3600, USE_LEADING_ONLY);
 342         if (!param)
 343                 goto out;
 344 
 345         param = iscsi_set_default_param(pl, MAXOUTSTANDINGR2T,
 346                         INITIAL_MAXOUTSTANDINGR2T,
 347                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
 348                         TYPERANGE_1_TO_65535, USE_LEADING_ONLY);
 349         if (!param)
 350                 goto out;
 351 
 352         param = iscsi_set_default_param(pl, DATAPDUINORDER,
 353                         INITIAL_DATAPDUINORDER, PHASE_OPERATIONAL,
 354                         SCOPE_SESSION_WIDE, SENDER_BOTH, TYPERANGE_BOOL_OR,
 355                         USE_LEADING_ONLY);
 356         if (!param)
 357                 goto out;
 358 
 359         param = iscsi_set_default_param(pl, DATASEQUENCEINORDER,
 360                         INITIAL_DATASEQUENCEINORDER,
 361                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
 362                         TYPERANGE_BOOL_OR, USE_LEADING_ONLY);
 363         if (!param)
 364                 goto out;
 365 
 366         param = iscsi_set_default_param(pl, ERRORRECOVERYLEVEL,
 367                         INITIAL_ERRORRECOVERYLEVEL,
 368                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
 369                         TYPERANGE_0_TO_2, USE_LEADING_ONLY);
 370         if (!param)
 371                 goto out;
 372 
 373         param = iscsi_set_default_param(pl, SESSIONTYPE, INITIAL_SESSIONTYPE,
 374                         PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_INITIATOR,
 375                         TYPERANGE_SESSIONTYPE, USE_LEADING_ONLY);
 376         if (!param)
 377                 goto out;
 378 
 379         param = iscsi_set_default_param(pl, IFMARKER, INITIAL_IFMARKER,
 380                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 381                         TYPERANGE_BOOL_AND, USE_INITIAL_ONLY);
 382         if (!param)
 383                 goto out;
 384 
 385         param = iscsi_set_default_param(pl, OFMARKER, INITIAL_OFMARKER,
 386                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 387                         TYPERANGE_BOOL_AND, USE_INITIAL_ONLY);
 388         if (!param)
 389                 goto out;
 390 
 391         param = iscsi_set_default_param(pl, IFMARKINT, INITIAL_IFMARKINT,
 392                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 393                         TYPERANGE_UTF8, USE_INITIAL_ONLY);
 394         if (!param)
 395                 goto out;
 396 
 397         param = iscsi_set_default_param(pl, OFMARKINT, INITIAL_OFMARKINT,
 398                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 399                         TYPERANGE_UTF8, USE_INITIAL_ONLY);
 400         if (!param)
 401                 goto out;
 402 
 403         /*
 404          * Extra parameters for ISER from RFC-5046
 405          */
 406         param = iscsi_set_default_param(pl, RDMAEXTENSIONS, INITIAL_RDMAEXTENSIONS,
 407                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
 408                         TYPERANGE_BOOL_AND, USE_LEADING_ONLY);
 409         if (!param)
 410                 goto out;
 411 
 412         param = iscsi_set_default_param(pl, INITIATORRECVDATASEGMENTLENGTH,
 413                         INITIAL_INITIATORRECVDATASEGMENTLENGTH,
 414                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 415                         TYPERANGE_512_TO_16777215, USE_ALL);
 416         if (!param)
 417                 goto out;
 418 
 419         param = iscsi_set_default_param(pl, TARGETRECVDATASEGMENTLENGTH,
 420                         INITIAL_TARGETRECVDATASEGMENTLENGTH,
 421                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
 422                         TYPERANGE_512_TO_16777215, USE_ALL);
 423         if (!param)
 424                 goto out;
 425 
 426         *param_list_ptr = pl;
 427         return 0;
 428 out:
 429         iscsi_release_param_list(pl);
 430         return -1;
 431 }
 432 
 433 int iscsi_set_keys_to_negotiate(
 434         struct iscsi_param_list *param_list,
 435         bool iser)
 436 {
 437         struct iscsi_param *param;
 438 
 439         param_list->iser = iser;
 440 
 441         list_for_each_entry(param, &param_list->param_list, p_list) {
 442                 param->state = 0;
 443                 if (!strcmp(param->name, AUTHMETHOD)) {
 444                         SET_PSTATE_NEGOTIATE(param);
 445                 } else if (!strcmp(param->name, HEADERDIGEST)) {
 446                         if (!iser)
 447                                 SET_PSTATE_NEGOTIATE(param);
 448                 } else if (!strcmp(param->name, DATADIGEST)) {
 449                         if (!iser)
 450                                 SET_PSTATE_NEGOTIATE(param);
 451                 } else if (!strcmp(param->name, MAXCONNECTIONS)) {
 452                         SET_PSTATE_NEGOTIATE(param);
 453                 } else if (!strcmp(param->name, TARGETNAME)) {
 454                         continue;
 455                 } else if (!strcmp(param->name, INITIATORNAME)) {
 456                         continue;
 457                 } else if (!strcmp(param->name, TARGETALIAS)) {
 458                         if (param->value)
 459                                 SET_PSTATE_NEGOTIATE(param);
 460                 } else if (!strcmp(param->name, INITIATORALIAS)) {
 461                         continue;
 462                 } else if (!strcmp(param->name, TARGETPORTALGROUPTAG)) {
 463                         SET_PSTATE_NEGOTIATE(param);
 464                 } else if (!strcmp(param->name, INITIALR2T)) {
 465                         SET_PSTATE_NEGOTIATE(param);
 466                 } else if (!strcmp(param->name, IMMEDIATEDATA)) {
 467                         SET_PSTATE_NEGOTIATE(param);
 468                 } else if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH)) {
 469                         if (!iser)
 470                                 SET_PSTATE_NEGOTIATE(param);
 471                 } else if (!strcmp(param->name, MAXXMITDATASEGMENTLENGTH)) {
 472                         continue;
 473                 } else if (!strcmp(param->name, MAXBURSTLENGTH)) {
 474                         SET_PSTATE_NEGOTIATE(param);
 475                 } else if (!strcmp(param->name, FIRSTBURSTLENGTH)) {
 476                         SET_PSTATE_NEGOTIATE(param);
 477                 } else if (!strcmp(param->name, DEFAULTTIME2WAIT)) {
 478                         SET_PSTATE_NEGOTIATE(param);
 479                 } else if (!strcmp(param->name, DEFAULTTIME2RETAIN)) {
 480                         SET_PSTATE_NEGOTIATE(param);
 481                 } else if (!strcmp(param->name, MAXOUTSTANDINGR2T)) {
 482                         SET_PSTATE_NEGOTIATE(param);
 483                 } else if (!strcmp(param->name, DATAPDUINORDER)) {
 484                         SET_PSTATE_NEGOTIATE(param);
 485                 } else if (!strcmp(param->name, DATASEQUENCEINORDER)) {
 486                         SET_PSTATE_NEGOTIATE(param);
 487                 } else if (!strcmp(param->name, ERRORRECOVERYLEVEL)) {
 488                         SET_PSTATE_NEGOTIATE(param);
 489                 } else if (!strcmp(param->name, SESSIONTYPE)) {
 490                         SET_PSTATE_NEGOTIATE(param);
 491                 } else if (!strcmp(param->name, IFMARKER)) {
 492                         SET_PSTATE_REJECT(param);
 493                 } else if (!strcmp(param->name, OFMARKER)) {
 494                         SET_PSTATE_REJECT(param);
 495                 } else if (!strcmp(param->name, IFMARKINT)) {
 496                         SET_PSTATE_REJECT(param);
 497                 } else if (!strcmp(param->name, OFMARKINT)) {
 498                         SET_PSTATE_REJECT(param);
 499                 } else if (!strcmp(param->name, RDMAEXTENSIONS)) {
 500                         if (iser)
 501                                 SET_PSTATE_NEGOTIATE(param);
 502                 } else if (!strcmp(param->name, INITIATORRECVDATASEGMENTLENGTH)) {
 503                         if (iser)
 504                                 SET_PSTATE_NEGOTIATE(param);
 505                 } else if (!strcmp(param->name, TARGETRECVDATASEGMENTLENGTH)) {
 506                         if (iser)
 507                                 SET_PSTATE_NEGOTIATE(param);
 508                 }
 509         }
 510 
 511         return 0;
 512 }
 513 
 514 int iscsi_set_keys_irrelevant_for_discovery(
 515         struct iscsi_param_list *param_list)
 516 {
 517         struct iscsi_param *param;
 518 
 519         list_for_each_entry(param, &param_list->param_list, p_list) {
 520                 if (!strcmp(param->name, MAXCONNECTIONS))
 521                         param->state &= ~PSTATE_NEGOTIATE;
 522                 else if (!strcmp(param->name, INITIALR2T))
 523                         param->state &= ~PSTATE_NEGOTIATE;
 524                 else if (!strcmp(param->name, IMMEDIATEDATA))
 525                         param->state &= ~PSTATE_NEGOTIATE;
 526                 else if (!strcmp(param->name, MAXBURSTLENGTH))
 527                         param->state &= ~PSTATE_NEGOTIATE;
 528                 else if (!strcmp(param->name, FIRSTBURSTLENGTH))
 529                         param->state &= ~PSTATE_NEGOTIATE;
 530                 else if (!strcmp(param->name, MAXOUTSTANDINGR2T))
 531                         param->state &= ~PSTATE_NEGOTIATE;
 532                 else if (!strcmp(param->name, DATAPDUINORDER))
 533                         param->state &= ~PSTATE_NEGOTIATE;
 534                 else if (!strcmp(param->name, DATASEQUENCEINORDER))
 535                         param->state &= ~PSTATE_NEGOTIATE;
 536                 else if (!strcmp(param->name, ERRORRECOVERYLEVEL))
 537                         param->state &= ~PSTATE_NEGOTIATE;
 538                 else if (!strcmp(param->name, DEFAULTTIME2WAIT))
 539                         param->state &= ~PSTATE_NEGOTIATE;
 540                 else if (!strcmp(param->name, DEFAULTTIME2RETAIN))
 541                         param->state &= ~PSTATE_NEGOTIATE;
 542                 else if (!strcmp(param->name, IFMARKER))
 543                         param->state &= ~PSTATE_NEGOTIATE;
 544                 else if (!strcmp(param->name, OFMARKER))
 545                         param->state &= ~PSTATE_NEGOTIATE;
 546                 else if (!strcmp(param->name, IFMARKINT))
 547                         param->state &= ~PSTATE_NEGOTIATE;
 548                 else if (!strcmp(param->name, OFMARKINT))
 549                         param->state &= ~PSTATE_NEGOTIATE;
 550                 else if (!strcmp(param->name, RDMAEXTENSIONS))
 551                         param->state &= ~PSTATE_NEGOTIATE;
 552                 else if (!strcmp(param->name, INITIATORRECVDATASEGMENTLENGTH))
 553                         param->state &= ~PSTATE_NEGOTIATE;
 554                 else if (!strcmp(param->name, TARGETRECVDATASEGMENTLENGTH))
 555                         param->state &= ~PSTATE_NEGOTIATE;
 556         }
 557 
 558         return 0;
 559 }
 560 
 561 int iscsi_copy_param_list(
 562         struct iscsi_param_list **dst_param_list,
 563         struct iscsi_param_list *src_param_list,
 564         int leading)
 565 {
 566         struct iscsi_param *param = NULL;
 567         struct iscsi_param *new_param = NULL;
 568         struct iscsi_param_list *param_list = NULL;
 569 
 570         param_list = kzalloc(sizeof(struct iscsi_param_list), GFP_KERNEL);
 571         if (!param_list) {
 572                 pr_err("Unable to allocate memory for struct iscsi_param_list.\n");
 573                 return -ENOMEM;
 574         }
 575         INIT_LIST_HEAD(&param_list->param_list);
 576         INIT_LIST_HEAD(&param_list->extra_response_list);
 577 
 578         list_for_each_entry(param, &src_param_list->param_list, p_list) {
 579                 if (!leading && (param->scope & SCOPE_SESSION_WIDE)) {
 580                         if ((strcmp(param->name, "TargetName") != 0) &&
 581                             (strcmp(param->name, "InitiatorName") != 0) &&
 582                             (strcmp(param->name, "TargetPortalGroupTag") != 0))
 583                                 continue;
 584                 }
 585 
 586                 new_param = kzalloc(sizeof(struct iscsi_param), GFP_KERNEL);
 587                 if (!new_param) {
 588                         pr_err("Unable to allocate memory for struct iscsi_param.\n");
 589                         goto err_out;
 590                 }
 591 
 592                 new_param->name = kstrdup(param->name, GFP_KERNEL);
 593                 new_param->value = kstrdup(param->value, GFP_KERNEL);
 594                 if (!new_param->value || !new_param->name) {
 595                         kfree(new_param->value);
 596                         kfree(new_param->name);
 597                         kfree(new_param);
 598                         pr_err("Unable to allocate memory for parameter name/value.\n");
 599                         goto err_out;
 600                 }
 601 
 602                 new_param->set_param = param->set_param;
 603                 new_param->phase = param->phase;
 604                 new_param->scope = param->scope;
 605                 new_param->sender = param->sender;
 606                 new_param->type = param->type;
 607                 new_param->use = param->use;
 608                 new_param->type_range = param->type_range;
 609 
 610                 list_add_tail(&new_param->p_list, &param_list->param_list);
 611         }
 612 
 613         if (!list_empty(&param_list->param_list)) {
 614                 *dst_param_list = param_list;
 615         } else {
 616                 pr_err("No parameters allocated.\n");
 617                 goto err_out;
 618         }
 619 
 620         return 0;
 621 
 622 err_out:
 623         iscsi_release_param_list(param_list);
 624         return -ENOMEM;
 625 }
 626 
 627 static void iscsi_release_extra_responses(struct iscsi_param_list *param_list)
 628 {
 629         struct iscsi_extra_response *er, *er_tmp;
 630 
 631         list_for_each_entry_safe(er, er_tmp, &param_list->extra_response_list,
 632                         er_list) {
 633                 list_del(&er->er_list);
 634                 kfree(er);
 635         }
 636 }
 637 
 638 void iscsi_release_param_list(struct iscsi_param_list *param_list)
 639 {
 640         struct iscsi_param *param, *param_tmp;
 641 
 642         list_for_each_entry_safe(param, param_tmp, &param_list->param_list,
 643                         p_list) {
 644                 list_del(&param->p_list);
 645 
 646                 kfree(param->name);
 647                 kfree(param->value);
 648                 kfree(param);
 649         }
 650 
 651         iscsi_release_extra_responses(param_list);
 652 
 653         kfree(param_list);
 654 }
 655 
 656 struct iscsi_param *iscsi_find_param_from_key(
 657         char *key,
 658         struct iscsi_param_list *param_list)
 659 {
 660         struct iscsi_param *param;
 661 
 662         if (!key || !param_list) {
 663                 pr_err("Key or parameter list pointer is NULL.\n");
 664                 return NULL;
 665         }
 666 
 667         list_for_each_entry(param, &param_list->param_list, p_list) {
 668                 if (!strcmp(key, param->name))
 669                         return param;
 670         }
 671 
 672         pr_err("Unable to locate key \"%s\".\n", key);
 673         return NULL;
 674 }
 675 EXPORT_SYMBOL(iscsi_find_param_from_key);
 676 
 677 int iscsi_extract_key_value(char *textbuf, char **key, char **value)
 678 {
 679         *value = strchr(textbuf, '=');
 680         if (!*value) {
 681                 pr_err("Unable to locate \"=\" separator for key,"
 682                                 " ignoring request.\n");
 683                 return -1;
 684         }
 685 
 686         *key = textbuf;
 687         **value = '\0';
 688         *value = *value + 1;
 689 
 690         return 0;
 691 }
 692 
 693 int iscsi_update_param_value(struct iscsi_param *param, char *value)
 694 {
 695         kfree(param->value);
 696 
 697         param->value = kstrdup(value, GFP_KERNEL);
 698         if (!param->value) {
 699                 pr_err("Unable to allocate memory for value.\n");
 700                 return -ENOMEM;
 701         }
 702 
 703         pr_debug("iSCSI Parameter updated to %s=%s\n",
 704                         param->name, param->value);
 705         return 0;
 706 }
 707 
 708 static int iscsi_add_notunderstood_response(
 709         char *key,
 710         char *value,
 711         struct iscsi_param_list *param_list)
 712 {
 713         struct iscsi_extra_response *extra_response;
 714 
 715         if (strlen(value) > VALUE_MAXLEN) {
 716                 pr_err("Value for notunderstood key \"%s\" exceeds %d,"
 717                         " protocol error.\n", key, VALUE_MAXLEN);
 718                 return -1;
 719         }
 720 
 721         extra_response = kzalloc(sizeof(struct iscsi_extra_response), GFP_KERNEL);
 722         if (!extra_response) {
 723                 pr_err("Unable to allocate memory for"
 724                         " struct iscsi_extra_response.\n");
 725                 return -ENOMEM;
 726         }
 727         INIT_LIST_HEAD(&extra_response->er_list);
 728 
 729         strlcpy(extra_response->key, key, sizeof(extra_response->key));
 730         strlcpy(extra_response->value, NOTUNDERSTOOD,
 731                 sizeof(extra_response->value));
 732 
 733         list_add_tail(&extra_response->er_list,
 734                         &param_list->extra_response_list);
 735         return 0;
 736 }
 737 
 738 static int iscsi_check_for_auth_key(char *key)
 739 {
 740         /*
 741          * RFC 1994
 742          */
 743         if (!strcmp(key, "CHAP_A") || !strcmp(key, "CHAP_I") ||
 744             !strcmp(key, "CHAP_C") || !strcmp(key, "CHAP_N") ||
 745             !strcmp(key, "CHAP_R"))
 746                 return 1;
 747 
 748         /*
 749          * RFC 2945
 750          */
 751         if (!strcmp(key, "SRP_U") || !strcmp(key, "SRP_N") ||
 752             !strcmp(key, "SRP_g") || !strcmp(key, "SRP_s") ||
 753             !strcmp(key, "SRP_A") || !strcmp(key, "SRP_B") ||
 754             !strcmp(key, "SRP_M") || !strcmp(key, "SRP_HM"))
 755                 return 1;
 756 
 757         return 0;
 758 }
 759 
 760 static void iscsi_check_proposer_for_optional_reply(struct iscsi_param *param,
 761                                                     bool keys_workaround)
 762 {
 763         if (IS_TYPE_BOOL_AND(param)) {
 764                 if (!strcmp(param->value, NO))
 765                         SET_PSTATE_REPLY_OPTIONAL(param);
 766         } else if (IS_TYPE_BOOL_OR(param)) {
 767                 if (!strcmp(param->value, YES))
 768                         SET_PSTATE_REPLY_OPTIONAL(param);
 769 
 770                 if (keys_workaround) {
 771                         /*
 772                          * Required for gPXE iSCSI boot client
 773                          */
 774                         if (!strcmp(param->name, IMMEDIATEDATA))
 775                                 SET_PSTATE_REPLY_OPTIONAL(param);
 776                 }
 777         } else if (IS_TYPE_NUMBER(param)) {
 778                 if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH))
 779                         SET_PSTATE_REPLY_OPTIONAL(param);
 780 
 781                 if (keys_workaround) {
 782                         /*
 783                          * Required for Mellanox Flexboot PXE boot ROM
 784                          */
 785                         if (!strcmp(param->name, FIRSTBURSTLENGTH))
 786                                 SET_PSTATE_REPLY_OPTIONAL(param);
 787 
 788                         /*
 789                          * Required for gPXE iSCSI boot client
 790                          */
 791                         if (!strcmp(param->name, MAXCONNECTIONS))
 792                                 SET_PSTATE_REPLY_OPTIONAL(param);
 793                 }
 794         } else if (IS_PHASE_DECLARATIVE(param))
 795                 SET_PSTATE_REPLY_OPTIONAL(param);
 796 }
 797 
 798 static int iscsi_check_boolean_value(struct iscsi_param *param, char *value)
 799 {
 800         if (strcmp(value, YES) && strcmp(value, NO)) {
 801                 pr_err("Illegal value for \"%s\", must be either"
 802                         " \"%s\" or \"%s\".\n", param->name, YES, NO);
 803                 return -1;
 804         }
 805 
 806         return 0;
 807 }
 808 
 809 static int iscsi_check_numerical_value(struct iscsi_param *param, char *value_ptr)
 810 {
 811         char *tmpptr;
 812         int value = 0;
 813 
 814         value = simple_strtoul(value_ptr, &tmpptr, 0);
 815 
 816         if (IS_TYPERANGE_0_TO_2(param)) {
 817                 if ((value < 0) || (value > 2)) {
 818                         pr_err("Illegal value for \"%s\", must be"
 819                                 " between 0 and 2.\n", param->name);
 820                         return -1;
 821                 }
 822                 return 0;
 823         }
 824         if (IS_TYPERANGE_0_TO_3600(param)) {
 825                 if ((value < 0) || (value > 3600)) {
 826                         pr_err("Illegal value for \"%s\", must be"
 827                                 " between 0 and 3600.\n", param->name);
 828                         return -1;
 829                 }
 830                 return 0;
 831         }
 832         if (IS_TYPERANGE_0_TO_32767(param)) {
 833                 if ((value < 0) || (value > 32767)) {
 834                         pr_err("Illegal value for \"%s\", must be"
 835                                 " between 0 and 32767.\n", param->name);
 836                         return -1;
 837                 }
 838                 return 0;
 839         }
 840         if (IS_TYPERANGE_0_TO_65535(param)) {
 841                 if ((value < 0) || (value > 65535)) {
 842                         pr_err("Illegal value for \"%s\", must be"
 843                                 " between 0 and 65535.\n", param->name);
 844                         return -1;
 845                 }
 846                 return 0;
 847         }
 848         if (IS_TYPERANGE_1_TO_65535(param)) {
 849                 if ((value < 1) || (value > 65535)) {
 850                         pr_err("Illegal value for \"%s\", must be"
 851                                 " between 1 and 65535.\n", param->name);
 852                         return -1;
 853                 }
 854                 return 0;
 855         }
 856         if (IS_TYPERANGE_2_TO_3600(param)) {
 857                 if ((value < 2) || (value > 3600)) {
 858                         pr_err("Illegal value for \"%s\", must be"
 859                                 " between 2 and 3600.\n", param->name);
 860                         return -1;
 861                 }
 862                 return 0;
 863         }
 864         if (IS_TYPERANGE_512_TO_16777215(param)) {
 865                 if ((value < 512) || (value > 16777215)) {
 866                         pr_err("Illegal value for \"%s\", must be"
 867                                 " between 512 and 16777215.\n", param->name);
 868                         return -1;
 869                 }
 870                 return 0;
 871         }
 872 
 873         return 0;
 874 }
 875 
 876 static int iscsi_check_string_or_list_value(struct iscsi_param *param, char *value)
 877 {
 878         if (IS_PSTATE_PROPOSER(param))
 879                 return 0;
 880 
 881         if (IS_TYPERANGE_AUTH_PARAM(param)) {
 882                 if (strcmp(value, KRB5) && strcmp(value, SPKM1) &&
 883                     strcmp(value, SPKM2) && strcmp(value, SRP) &&
 884                     strcmp(value, CHAP) && strcmp(value, NONE)) {
 885                         pr_err("Illegal value for \"%s\", must be"
 886                                 " \"%s\", \"%s\", \"%s\", \"%s\", \"%s\""
 887                                 " or \"%s\".\n", param->name, KRB5,
 888                                         SPKM1, SPKM2, SRP, CHAP, NONE);
 889                         return -1;
 890                 }
 891         }
 892         if (IS_TYPERANGE_DIGEST_PARAM(param)) {
 893                 if (strcmp(value, CRC32C) && strcmp(value, NONE)) {
 894                         pr_err("Illegal value for \"%s\", must be"
 895                                 " \"%s\" or \"%s\".\n", param->name,
 896                                         CRC32C, NONE);
 897                         return -1;
 898                 }
 899         }
 900         if (IS_TYPERANGE_SESSIONTYPE(param)) {
 901                 if (strcmp(value, DISCOVERY) && strcmp(value, NORMAL)) {
 902                         pr_err("Illegal value for \"%s\", must be"
 903                                 " \"%s\" or \"%s\".\n", param->name,
 904                                         DISCOVERY, NORMAL);
 905                         return -1;
 906                 }
 907         }
 908 
 909         return 0;
 910 }
 911 
 912 static char *iscsi_check_valuelist_for_support(
 913         struct iscsi_param *param,
 914         char *value)
 915 {
 916         char *tmp1 = NULL, *tmp2 = NULL;
 917         char *acceptor_values = NULL, *proposer_values = NULL;
 918 
 919         acceptor_values = param->value;
 920         proposer_values = value;
 921 
 922         do {
 923                 if (!proposer_values)
 924                         return NULL;
 925                 tmp1 = strchr(proposer_values, ',');
 926                 if (tmp1)
 927                         *tmp1 = '\0';
 928                 acceptor_values = param->value;
 929                 do {
 930                         if (!acceptor_values) {
 931                                 if (tmp1)
 932                                         *tmp1 = ',';
 933                                 return NULL;
 934                         }
 935                         tmp2 = strchr(acceptor_values, ',');
 936                         if (tmp2)
 937                                 *tmp2 = '\0';
 938                         if (!strcmp(acceptor_values, proposer_values)) {
 939                                 if (tmp2)
 940                                         *tmp2 = ',';
 941                                 goto out;
 942                         }
 943                         if (tmp2)
 944                                 *tmp2++ = ',';
 945 
 946                         acceptor_values = tmp2;
 947                 } while (acceptor_values);
 948                 if (tmp1)
 949                         *tmp1++ = ',';
 950                 proposer_values = tmp1;
 951         } while (proposer_values);
 952 
 953 out:
 954         return proposer_values;
 955 }
 956 
 957 static int iscsi_check_acceptor_state(struct iscsi_param *param, char *value,
 958                                 struct iscsi_conn *conn)
 959 {
 960         u8 acceptor_boolean_value = 0, proposer_boolean_value = 0;
 961         char *negotiated_value = NULL;
 962 
 963         if (IS_PSTATE_ACCEPTOR(param)) {
 964                 pr_err("Received key \"%s\" twice, protocol error.\n",
 965                                 param->name);
 966                 return -1;
 967         }
 968 
 969         if (IS_PSTATE_REJECT(param))
 970                 return 0;
 971 
 972         if (IS_TYPE_BOOL_AND(param)) {
 973                 if (!strcmp(value, YES))
 974                         proposer_boolean_value = 1;
 975                 if (!strcmp(param->value, YES))
 976                         acceptor_boolean_value = 1;
 977                 if (acceptor_boolean_value && proposer_boolean_value)
 978                         do {} while (0);
 979                 else {
 980                         if (iscsi_update_param_value(param, NO) < 0)
 981                                 return -1;
 982                         if (!proposer_boolean_value)
 983                                 SET_PSTATE_REPLY_OPTIONAL(param);
 984                 }
 985         } else if (IS_TYPE_BOOL_OR(param)) {
 986                 if (!strcmp(value, YES))
 987                         proposer_boolean_value = 1;
 988                 if (!strcmp(param->value, YES))
 989                         acceptor_boolean_value = 1;
 990                 if (acceptor_boolean_value || proposer_boolean_value) {
 991                         if (iscsi_update_param_value(param, YES) < 0)
 992                                 return -1;
 993                         if (proposer_boolean_value)
 994                                 SET_PSTATE_REPLY_OPTIONAL(param);
 995                 }
 996         } else if (IS_TYPE_NUMBER(param)) {
 997                 char *tmpptr, buf[11];
 998                 u32 acceptor_value = simple_strtoul(param->value, &tmpptr, 0);
 999                 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 iscsi_conn *conn)
1356 {
1357         struct iscsi_param_list *param_list = conn->param_list;
1358         char *tmpbuf, *start = NULL, *end = NULL;
1359 
1360         tmpbuf = kzalloc(length + 1, GFP_KERNEL);
1361         if (!tmpbuf) {
1362                 pr_err("Unable to allocate %u + 1 bytes for tmpbuf.\n", length);
1363                 return -ENOMEM;
1364         }
1365 
1366         memcpy(tmpbuf, textbuf, length);
1367         tmpbuf[length] = '\0';
1368         start = tmpbuf;
1369         end = (start + length);
1370 
1371         while (start < end) {
1372                 char *key, *value;
1373                 struct iscsi_param *param;
1374 
1375                 if (iscsi_extract_key_value(start, &key, &value) < 0)
1376                         goto free_buffer;
1377 
1378                 pr_debug("Got key: %s=%s\n", key, value);
1379 
1380                 if (phase & PHASE_SECURITY) {
1381                         if (iscsi_check_for_auth_key(key) > 0) {
1382                                 kfree(tmpbuf);
1383                                 return 1;
1384                         }
1385                 }
1386 
1387                 param = iscsi_check_key(key, phase, sender, param_list);
1388                 if (!param) {
1389                         if (iscsi_add_notunderstood_response(key, value,
1390                                                              param_list) < 0)
1391                                 goto free_buffer;
1392 
1393                         start += strlen(key) + strlen(value) + 2;
1394                         continue;
1395                 }
1396                 if (iscsi_check_value(param, value) < 0)
1397                         goto free_buffer;
1398 
1399                 start += strlen(key) + strlen(value) + 2;
1400 
1401                 if (IS_PSTATE_PROPOSER(param)) {
1402                         if (iscsi_check_proposer_state(param, value) < 0)
1403                                 goto free_buffer;
1404 
1405                         SET_PSTATE_RESPONSE_GOT(param);
1406                 } else {
1407                         if (iscsi_check_acceptor_state(param, value, conn) < 0)
1408                                 goto free_buffer;
1409 
1410                         SET_PSTATE_ACCEPTOR(param);
1411                 }
1412         }
1413 
1414         kfree(tmpbuf);
1415         return 0;
1416 
1417 free_buffer:
1418         kfree(tmpbuf);
1419         return -1;
1420 }
1421 
1422 int iscsi_encode_text_output(
1423         u8 phase,
1424         u8 sender,
1425         char *textbuf,
1426         u32 *length,
1427         struct iscsi_param_list *param_list,
1428         bool keys_workaround)
1429 {
1430         char *output_buf = NULL;
1431         struct iscsi_extra_response *er;
1432         struct iscsi_param *param;
1433 
1434         output_buf = textbuf + *length;
1435 
1436         if (iscsi_enforce_integrity_rules(phase, param_list) < 0)
1437                 return -1;
1438 
1439         list_for_each_entry(param, &param_list->param_list, p_list) {
1440                 if (!(param->sender & sender))
1441                         continue;
1442                 if (IS_PSTATE_ACCEPTOR(param) &&
1443                     !IS_PSTATE_RESPONSE_SENT(param) &&
1444                     !IS_PSTATE_REPLY_OPTIONAL(param) &&
1445                     (param->phase & phase)) {
1446                         *length += sprintf(output_buf, "%s=%s",
1447                                 param->name, param->value);
1448                         *length += 1;
1449                         output_buf = textbuf + *length;
1450                         SET_PSTATE_RESPONSE_SENT(param);
1451                         pr_debug("Sending key: %s=%s\n",
1452                                 param->name, param->value);
1453                         continue;
1454                 }
1455                 if (IS_PSTATE_NEGOTIATE(param) &&
1456                     !IS_PSTATE_ACCEPTOR(param) &&
1457                     !IS_PSTATE_PROPOSER(param) &&
1458                     (param->phase & phase)) {
1459                         *length += sprintf(output_buf, "%s=%s",
1460                                 param->name, param->value);
1461                         *length += 1;
1462                         output_buf = textbuf + *length;
1463                         SET_PSTATE_PROPOSER(param);
1464                         iscsi_check_proposer_for_optional_reply(param,
1465                                                                 keys_workaround);
1466                         pr_debug("Sending key: %s=%s\n",
1467                                 param->name, param->value);
1468                 }
1469         }
1470 
1471         list_for_each_entry(er, &param_list->extra_response_list, er_list) {
1472                 *length += sprintf(output_buf, "%s=%s", er->key, er->value);
1473                 *length += 1;
1474                 output_buf = textbuf + *length;
1475                 pr_debug("Sending key: %s=%s\n", er->key, er->value);
1476         }
1477         iscsi_release_extra_responses(param_list);
1478 
1479         return 0;
1480 }
1481 
1482 int iscsi_check_negotiated_keys(struct iscsi_param_list *param_list)
1483 {
1484         int ret = 0;
1485         struct iscsi_param *param;
1486 
1487         list_for_each_entry(param, &param_list->param_list, p_list) {
1488                 if (IS_PSTATE_NEGOTIATE(param) &&
1489                     IS_PSTATE_PROPOSER(param) &&
1490                     !IS_PSTATE_RESPONSE_GOT(param) &&
1491                     !IS_PSTATE_REPLY_OPTIONAL(param) &&
1492                     !IS_PHASE_DECLARATIVE(param)) {
1493                         pr_err("No response for proposed key \"%s\".\n",
1494                                         param->name);
1495                         ret = -1;
1496                 }
1497         }
1498 
1499         return ret;
1500 }
1501 
1502 int iscsi_change_param_value(
1503         char *keyvalue,
1504         struct iscsi_param_list *param_list,
1505         int check_key)
1506 {
1507         char *key = NULL, *value = NULL;
1508         struct iscsi_param *param;
1509         int sender = 0;
1510 
1511         if (iscsi_extract_key_value(keyvalue, &key, &value) < 0)
1512                 return -1;
1513 
1514         if (!check_key) {
1515                 param = __iscsi_check_key(keyvalue, sender, param_list);
1516                 if (!param)
1517                         return -1;
1518         } else {
1519                 param = iscsi_check_key(keyvalue, 0, sender, param_list);
1520                 if (!param)
1521                         return -1;
1522 
1523                 param->set_param = 1;
1524                 if (iscsi_check_value(param, value) < 0) {
1525                         param->set_param = 0;
1526                         return -1;
1527                 }
1528                 param->set_param = 0;
1529         }
1530 
1531         if (iscsi_update_param_value(param, value) < 0)
1532                 return -1;
1533 
1534         return 0;
1535 }
1536 
1537 void iscsi_set_connection_parameters(
1538         struct iscsi_conn_ops *ops,
1539         struct iscsi_param_list *param_list)
1540 {
1541         char *tmpptr;
1542         struct iscsi_param *param;
1543 
1544         pr_debug("---------------------------------------------------"
1545                         "---------------\n");
1546         list_for_each_entry(param, &param_list->param_list, p_list) {
1547                 /*
1548                  * Special case to set MAXXMITDATASEGMENTLENGTH from the
1549                  * target requested MaxRecvDataSegmentLength, even though
1550                  * this key is not sent over the wire.
1551                  */
1552                 if (!strcmp(param->name, MAXXMITDATASEGMENTLENGTH)) {
1553                         ops->MaxXmitDataSegmentLength =
1554                                 simple_strtoul(param->value, &tmpptr, 0);
1555                         pr_debug("MaxXmitDataSegmentLength:     %s\n",
1556                                 param->value);
1557                 }
1558 
1559                 if (!IS_PSTATE_ACCEPTOR(param) && !IS_PSTATE_PROPOSER(param))
1560                         continue;
1561                 if (!strcmp(param->name, AUTHMETHOD)) {
1562                         pr_debug("AuthMethod:                   %s\n",
1563                                 param->value);
1564                 } else if (!strcmp(param->name, HEADERDIGEST)) {
1565                         ops->HeaderDigest = !strcmp(param->value, CRC32C);
1566                         pr_debug("HeaderDigest:                 %s\n",
1567                                 param->value);
1568                 } else if (!strcmp(param->name, DATADIGEST)) {
1569                         ops->DataDigest = !strcmp(param->value, CRC32C);
1570                         pr_debug("DataDigest:                   %s\n",
1571                                 param->value);
1572                 } else if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH)) {
1573                         /*
1574                          * At this point iscsi_check_acceptor_state() will have
1575                          * set ops->MaxRecvDataSegmentLength from the original
1576                          * initiator provided value.
1577                          */
1578                         pr_debug("MaxRecvDataSegmentLength:     %u\n",
1579                                 ops->MaxRecvDataSegmentLength);
1580                 } else if (!strcmp(param->name, INITIATORRECVDATASEGMENTLENGTH)) {
1581                         ops->InitiatorRecvDataSegmentLength =
1582                                 simple_strtoul(param->value, &tmpptr, 0);
1583                         pr_debug("InitiatorRecvDataSegmentLength: %s\n",
1584                                 param->value);
1585                         ops->MaxRecvDataSegmentLength =
1586                                         ops->InitiatorRecvDataSegmentLength;
1587                         pr_debug("Set MRDSL from InitiatorRecvDataSegmentLength\n");
1588                 } else if (!strcmp(param->name, TARGETRECVDATASEGMENTLENGTH)) {
1589                         ops->TargetRecvDataSegmentLength =
1590                                 simple_strtoul(param->value, &tmpptr, 0);
1591                         pr_debug("TargetRecvDataSegmentLength:  %s\n",
1592                                 param->value);
1593                         ops->MaxXmitDataSegmentLength =
1594                                         ops->TargetRecvDataSegmentLength;
1595                         pr_debug("Set MXDSL from TargetRecvDataSegmentLength\n");
1596                 }
1597         }
1598         pr_debug("----------------------------------------------------"
1599                         "--------------\n");
1600 }
1601 
1602 void iscsi_set_session_parameters(
1603         struct iscsi_sess_ops *ops,
1604         struct iscsi_param_list *param_list,
1605         int leading)
1606 {
1607         char *tmpptr;
1608         struct iscsi_param *param;
1609 
1610         pr_debug("----------------------------------------------------"
1611                         "--------------\n");
1612         list_for_each_entry(param, &param_list->param_list, p_list) {
1613                 if (!IS_PSTATE_ACCEPTOR(param) && !IS_PSTATE_PROPOSER(param))
1614                         continue;
1615                 if (!strcmp(param->name, INITIATORNAME)) {
1616                         if (!param->value)
1617                                 continue;
1618                         if (leading)
1619                                 snprintf(ops->InitiatorName,
1620                                                 sizeof(ops->InitiatorName),
1621                                                 "%s", param->value);
1622                         pr_debug("InitiatorName:                %s\n",
1623                                 param->value);
1624                 } else if (!strcmp(param->name, INITIATORALIAS)) {
1625                         if (!param->value)
1626                                 continue;
1627                         snprintf(ops->InitiatorAlias,
1628                                                 sizeof(ops->InitiatorAlias),
1629                                                 "%s", param->value);
1630                         pr_debug("InitiatorAlias:               %s\n",
1631                                 param->value);
1632                 } else if (!strcmp(param->name, TARGETNAME)) {
1633                         if (!param->value)
1634                                 continue;
1635                         if (leading)
1636                                 snprintf(ops->TargetName,
1637                                                 sizeof(ops->TargetName),
1638                                                 "%s", param->value);
1639                         pr_debug("TargetName:                   %s\n",
1640                                 param->value);
1641                 } else if (!strcmp(param->name, TARGETALIAS)) {
1642                         if (!param->value)
1643                                 continue;
1644                         snprintf(ops->TargetAlias, sizeof(ops->TargetAlias),
1645                                         "%s", param->value);
1646                         pr_debug("TargetAlias:                  %s\n",
1647                                 param->value);
1648                 } else if (!strcmp(param->name, TARGETPORTALGROUPTAG)) {
1649                         ops->TargetPortalGroupTag =
1650                                 simple_strtoul(param->value, &tmpptr, 0);
1651                         pr_debug("TargetPortalGroupTag:         %s\n",
1652                                 param->value);
1653                 } else if (!strcmp(param->name, MAXCONNECTIONS)) {
1654                         ops->MaxConnections =
1655                                 simple_strtoul(param->value, &tmpptr, 0);
1656                         pr_debug("MaxConnections:               %s\n",
1657                                 param->value);
1658                 } else if (!strcmp(param->name, INITIALR2T)) {
1659                         ops->InitialR2T = !strcmp(param->value, YES);
1660                         pr_debug("InitialR2T:                   %s\n",
1661                                 param->value);
1662                 } else if (!strcmp(param->name, IMMEDIATEDATA)) {
1663                         ops->ImmediateData = !strcmp(param->value, YES);
1664                         pr_debug("ImmediateData:                %s\n",
1665                                 param->value);
1666                 } else if (!strcmp(param->name, MAXBURSTLENGTH)) {
1667                         ops->MaxBurstLength =
1668                                 simple_strtoul(param->value, &tmpptr, 0);
1669                         pr_debug("MaxBurstLength:               %s\n",
1670                                 param->value);
1671                 } else if (!strcmp(param->name, FIRSTBURSTLENGTH)) {
1672                         ops->FirstBurstLength =
1673                                 simple_strtoul(param->value, &tmpptr, 0);
1674                         pr_debug("FirstBurstLength:             %s\n",
1675                                 param->value);
1676                 } else if (!strcmp(param->name, DEFAULTTIME2WAIT)) {
1677                         ops->DefaultTime2Wait =
1678                                 simple_strtoul(param->value, &tmpptr, 0);
1679                         pr_debug("DefaultTime2Wait:             %s\n",
1680                                 param->value);
1681                 } else if (!strcmp(param->name, DEFAULTTIME2RETAIN)) {
1682                         ops->DefaultTime2Retain =
1683                                 simple_strtoul(param->value, &tmpptr, 0);
1684                         pr_debug("DefaultTime2Retain:           %s\n",
1685                                 param->value);
1686                 } else if (!strcmp(param->name, MAXOUTSTANDINGR2T)) {
1687                         ops->MaxOutstandingR2T =
1688                                 simple_strtoul(param->value, &tmpptr, 0);
1689                         pr_debug("MaxOutstandingR2T:            %s\n",
1690                                 param->value);
1691                 } else if (!strcmp(param->name, DATAPDUINORDER)) {
1692                         ops->DataPDUInOrder = !strcmp(param->value, YES);
1693                         pr_debug("DataPDUInOrder:               %s\n",
1694                                 param->value);
1695                 } else if (!strcmp(param->name, DATASEQUENCEINORDER)) {
1696                         ops->DataSequenceInOrder = !strcmp(param->value, YES);
1697                         pr_debug("DataSequenceInOrder:          %s\n",
1698                                 param->value);
1699                 } else if (!strcmp(param->name, ERRORRECOVERYLEVEL)) {
1700                         ops->ErrorRecoveryLevel =
1701                                 simple_strtoul(param->value, &tmpptr, 0);
1702                         pr_debug("ErrorRecoveryLevel:           %s\n",
1703                                 param->value);
1704                 } else if (!strcmp(param->name, SESSIONTYPE)) {
1705                         ops->SessionType = !strcmp(param->value, DISCOVERY);
1706                         pr_debug("SessionType:                  %s\n",
1707                                 param->value);
1708                 } else if (!strcmp(param->name, RDMAEXTENSIONS)) {
1709                         ops->RDMAExtensions = !strcmp(param->value, YES);
1710                         pr_debug("RDMAExtensions:               %s\n",
1711                                 param->value);
1712                 }
1713         }
1714         pr_debug("----------------------------------------------------"
1715                         "--------------\n");
1716 
1717 }

/* [<][>][^][v][top][bottom][index][help] */