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, ¶m_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(¶m->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(¶m->p_list, ¶m_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, ¶m_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, ¶m_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(¶m_list->param_list); 576 INIT_LIST_HEAD(¶m_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, ¶m_list->param_list); 611 } 612 613 if (!list_empty(¶m_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, ¶m_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, ¶m_list->param_list, 643 p_list) { 644 list_del(¶m->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, ¶m_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 ¶m_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, ¶m_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, ¶m_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, ¶m_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, ¶m_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, ¶m_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, ¶m_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, ¶m_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 } 1718