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