Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / target / iscsi / iscsi_target_parameters.c
1 /*******************************************************************************
2  * This file contains main functions related to iSCSI Parameter negotiation.
3  *
4  * (c) Copyright 2007-2013 Datera, Inc.
5  *
6  * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  ******************************************************************************/
18
19 #include <linux/slab.h>
20
21 #include <target/iscsi/iscsi_target_core.h>
22 #include "iscsi_target_util.h"
23 #include "iscsi_target_parameters.h"
24
25 int iscsi_login_rx_data(
26         struct iscsi_conn *conn,
27         char *buf,
28         int length)
29 {
30         int rx_got;
31         struct kvec iov;
32
33         memset(&iov, 0, sizeof(struct kvec));
34         iov.iov_len     = length;
35         iov.iov_base    = buf;
36
37         /*
38          * Initial Marker-less Interval.
39          * Add the values regardless of IFMarker/OFMarker, considering
40          * it may not be negoitated yet.
41          */
42         conn->of_marker += length;
43
44         rx_got = rx_data(conn, &iov, 1, length);
45         if (rx_got != length) {
46                 pr_err("rx_data returned %d, expecting %d.\n",
47                                 rx_got, length);
48                 return -1;
49         }
50
51         return 0 ;
52 }
53
54 int iscsi_login_tx_data(
55         struct iscsi_conn *conn,
56         char *pdu_buf,
57         char *text_buf,
58         int text_length)
59 {
60         int length, tx_sent, iov_cnt = 1;
61         struct kvec iov[2];
62
63         length = (ISCSI_HDR_LEN + text_length);
64
65         memset(&iov[0], 0, 2 * sizeof(struct kvec));
66         iov[0].iov_len          = ISCSI_HDR_LEN;
67         iov[0].iov_base         = pdu_buf;
68
69         if (text_buf && text_length) {
70                 iov[1].iov_len  = text_length;
71                 iov[1].iov_base = text_buf;
72                 iov_cnt++;
73         }
74
75         /*
76          * Initial Marker-less Interval.
77          * Add the values regardless of IFMarker/OFMarker, considering
78          * it may not be negoitated yet.
79          */
80         conn->if_marker += length;
81
82         tx_sent = tx_data(conn, &iov[0], iov_cnt, length);
83         if (tx_sent != length) {
84                 pr_err("tx_data returned %d, expecting %d.\n",
85                                 tx_sent, length);
86                 return -1;
87         }
88
89         return 0;
90 }
91
92 void iscsi_dump_conn_ops(struct iscsi_conn_ops *conn_ops)
93 {
94         pr_debug("HeaderDigest: %s\n", (conn_ops->HeaderDigest) ?
95                                 "CRC32C" : "None");
96         pr_debug("DataDigest: %s\n", (conn_ops->DataDigest) ?
97                                 "CRC32C" : "None");
98         pr_debug("MaxRecvDataSegmentLength: %u\n",
99                                 conn_ops->MaxRecvDataSegmentLength);
100         pr_debug("OFMarker: %s\n", (conn_ops->OFMarker) ? "Yes" : "No");
101         pr_debug("IFMarker: %s\n", (conn_ops->IFMarker) ? "Yes" : "No");
102         if (conn_ops->OFMarker)
103                 pr_debug("OFMarkInt: %u\n", conn_ops->OFMarkInt);
104         if (conn_ops->IFMarker)
105                 pr_debug("IFMarkInt: %u\n", conn_ops->IFMarkInt);
106 }
107
108 void iscsi_dump_sess_ops(struct iscsi_sess_ops *sess_ops)
109 {
110         pr_debug("InitiatorName: %s\n", sess_ops->InitiatorName);
111         pr_debug("InitiatorAlias: %s\n", sess_ops->InitiatorAlias);
112         pr_debug("TargetName: %s\n", sess_ops->TargetName);
113         pr_debug("TargetAlias: %s\n", sess_ops->TargetAlias);
114         pr_debug("TargetPortalGroupTag: %hu\n",
115                         sess_ops->TargetPortalGroupTag);
116         pr_debug("MaxConnections: %hu\n", sess_ops->MaxConnections);
117         pr_debug("InitialR2T: %s\n",
118                         (sess_ops->InitialR2T) ? "Yes" : "No");
119         pr_debug("ImmediateData: %s\n", (sess_ops->ImmediateData) ?
120                         "Yes" : "No");
121         pr_debug("MaxBurstLength: %u\n", sess_ops->MaxBurstLength);
122         pr_debug("FirstBurstLength: %u\n", sess_ops->FirstBurstLength);
123         pr_debug("DefaultTime2Wait: %hu\n", sess_ops->DefaultTime2Wait);
124         pr_debug("DefaultTime2Retain: %hu\n",
125                         sess_ops->DefaultTime2Retain);
126         pr_debug("MaxOutstandingR2T: %hu\n",
127                         sess_ops->MaxOutstandingR2T);
128         pr_debug("DataPDUInOrder: %s\n",
129                         (sess_ops->DataPDUInOrder) ? "Yes" : "No");
130         pr_debug("DataSequenceInOrder: %s\n",
131                         (sess_ops->DataSequenceInOrder) ? "Yes" : "No");
132         pr_debug("ErrorRecoveryLevel: %hu\n",
133                         sess_ops->ErrorRecoveryLevel);
134         pr_debug("SessionType: %s\n", (sess_ops->SessionType) ?
135                         "Discovery" : "Normal");
136 }
137
138 void iscsi_print_params(struct iscsi_param_list *param_list)
139 {
140         struct iscsi_param *param;
141
142         list_for_each_entry(param, &param_list->param_list, p_list)
143                 pr_debug("%s: %s\n", param->name, param->value);
144 }
145
146 static struct iscsi_param *iscsi_set_default_param(struct iscsi_param_list *param_list,
147                 char *name, char *value, u8 phase, u8 scope, u8 sender,
148                 u16 type_range, u8 use)
149 {
150         struct iscsi_param *param = NULL;
151
152         param = kzalloc(sizeof(struct iscsi_param), GFP_KERNEL);
153         if (!param) {
154                 pr_err("Unable to allocate memory for parameter.\n");
155                 goto out;
156         }
157         INIT_LIST_HEAD(&param->p_list);
158
159         param->name = kstrdup(name, GFP_KERNEL);
160         if (!param->name) {
161                 pr_err("Unable to allocate memory for parameter name.\n");
162                 goto out;
163         }
164
165         param->value = kstrdup(value, GFP_KERNEL);
166         if (!param->value) {
167                 pr_err("Unable to allocate memory for parameter value.\n");
168                 goto out;
169         }
170
171         param->phase            = phase;
172         param->scope            = scope;
173         param->sender           = sender;
174         param->use              = use;
175         param->type_range       = type_range;
176
177         switch (param->type_range) {
178         case TYPERANGE_BOOL_AND:
179                 param->type = TYPE_BOOL_AND;
180                 break;
181         case TYPERANGE_BOOL_OR:
182                 param->type = TYPE_BOOL_OR;
183                 break;
184         case TYPERANGE_0_TO_2:
185         case TYPERANGE_0_TO_3600:
186         case TYPERANGE_0_TO_32767:
187         case TYPERANGE_0_TO_65535:
188         case TYPERANGE_1_TO_65535:
189         case TYPERANGE_2_TO_3600:
190         case TYPERANGE_512_TO_16777215:
191                 param->type = TYPE_NUMBER;
192                 break;
193         case TYPERANGE_AUTH:
194         case TYPERANGE_DIGEST:
195                 param->type = TYPE_VALUE_LIST | TYPE_STRING;
196                 break;
197         case TYPERANGE_MARKINT:
198                 param->type = TYPE_NUMBER_RANGE;
199                 param->type_range |= TYPERANGE_1_TO_65535;
200                 break;
201         case TYPERANGE_ISCSINAME:
202         case TYPERANGE_SESSIONTYPE:
203         case TYPERANGE_TARGETADDRESS:
204         case TYPERANGE_UTF8:
205                 param->type = TYPE_STRING;
206                 break;
207         default:
208                 pr_err("Unknown type_range 0x%02x\n",
209                                 param->type_range);
210                 goto out;
211         }
212         list_add_tail(&param->p_list, &param_list->param_list);
213
214         return param;
215 out:
216         if (param) {
217                 kfree(param->value);
218                 kfree(param->name);
219                 kfree(param);
220         }
221
222         return NULL;
223 }
224
225 /* #warning Add extension keys */
226 int iscsi_create_default_params(struct iscsi_param_list **param_list_ptr)
227 {
228         struct iscsi_param *param = NULL;
229         struct iscsi_param_list *pl;
230
231         pl = kzalloc(sizeof(struct iscsi_param_list), GFP_KERNEL);
232         if (!pl) {
233                 pr_err("Unable to allocate memory for"
234                                 " struct iscsi_param_list.\n");
235                 return -1 ;
236         }
237         INIT_LIST_HEAD(&pl->param_list);
238         INIT_LIST_HEAD(&pl->extra_response_list);
239
240         /*
241          * The format for setting the initial parameter definitions are:
242          *
243          * Parameter name:
244          * Initial value:
245          * Allowable phase:
246          * Scope:
247          * Allowable senders:
248          * Typerange:
249          * Use:
250          */
251         param = iscsi_set_default_param(pl, AUTHMETHOD, INITIAL_AUTHMETHOD,
252                         PHASE_SECURITY, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
253                         TYPERANGE_AUTH, USE_INITIAL_ONLY);
254         if (!param)
255                 goto out;
256
257         param = iscsi_set_default_param(pl, HEADERDIGEST, INITIAL_HEADERDIGEST,
258                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
259                         TYPERANGE_DIGEST, USE_INITIAL_ONLY);
260         if (!param)
261                 goto out;
262
263         param = iscsi_set_default_param(pl, DATADIGEST, INITIAL_DATADIGEST,
264                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
265                         TYPERANGE_DIGEST, USE_INITIAL_ONLY);
266         if (!param)
267                 goto out;
268
269         param = iscsi_set_default_param(pl, MAXCONNECTIONS,
270                         INITIAL_MAXCONNECTIONS, PHASE_OPERATIONAL,
271                         SCOPE_SESSION_WIDE, SENDER_BOTH,
272                         TYPERANGE_1_TO_65535, USE_LEADING_ONLY);
273         if (!param)
274                 goto out;
275
276         param = iscsi_set_default_param(pl, SENDTARGETS, INITIAL_SENDTARGETS,
277                         PHASE_FFP0, SCOPE_SESSION_WIDE, SENDER_INITIATOR,
278                         TYPERANGE_UTF8, 0);
279         if (!param)
280                 goto out;
281
282         param = iscsi_set_default_param(pl, TARGETNAME, INITIAL_TARGETNAME,
283                         PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_BOTH,
284                         TYPERANGE_ISCSINAME, USE_ALL);
285         if (!param)
286                 goto out;
287
288         param = iscsi_set_default_param(pl, INITIATORNAME,
289                         INITIAL_INITIATORNAME, PHASE_DECLARATIVE,
290                         SCOPE_SESSION_WIDE, SENDER_INITIATOR,
291                         TYPERANGE_ISCSINAME, USE_INITIAL_ONLY);
292         if (!param)
293                 goto out;
294
295         param = iscsi_set_default_param(pl, TARGETALIAS, INITIAL_TARGETALIAS,
296                         PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_TARGET,
297                         TYPERANGE_UTF8, USE_ALL);
298         if (!param)
299                 goto out;
300
301         param = iscsi_set_default_param(pl, INITIATORALIAS,
302                         INITIAL_INITIATORALIAS, PHASE_DECLARATIVE,
303                         SCOPE_SESSION_WIDE, SENDER_INITIATOR, TYPERANGE_UTF8,
304                         USE_ALL);
305         if (!param)
306                 goto out;
307
308         param = iscsi_set_default_param(pl, TARGETADDRESS,
309                         INITIAL_TARGETADDRESS, PHASE_DECLARATIVE,
310                         SCOPE_SESSION_WIDE, SENDER_TARGET,
311                         TYPERANGE_TARGETADDRESS, USE_ALL);
312         if (!param)
313                 goto out;
314
315         param = iscsi_set_default_param(pl, TARGETPORTALGROUPTAG,
316                         INITIAL_TARGETPORTALGROUPTAG,
317                         PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_TARGET,
318                         TYPERANGE_0_TO_65535, USE_INITIAL_ONLY);
319         if (!param)
320                 goto out;
321
322         param = iscsi_set_default_param(pl, INITIALR2T, INITIAL_INITIALR2T,
323                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
324                         TYPERANGE_BOOL_OR, USE_LEADING_ONLY);
325         if (!param)
326                 goto out;
327
328         param = iscsi_set_default_param(pl, IMMEDIATEDATA,
329                         INITIAL_IMMEDIATEDATA, PHASE_OPERATIONAL,
330                         SCOPE_SESSION_WIDE, SENDER_BOTH, TYPERANGE_BOOL_AND,
331                         USE_LEADING_ONLY);
332         if (!param)
333                 goto out;
334
335         param = iscsi_set_default_param(pl, MAXXMITDATASEGMENTLENGTH,
336                         INITIAL_MAXXMITDATASEGMENTLENGTH,
337                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
338                         TYPERANGE_512_TO_16777215, USE_ALL);
339         if (!param)
340                 goto out;
341
342         param = iscsi_set_default_param(pl, MAXRECVDATASEGMENTLENGTH,
343                         INITIAL_MAXRECVDATASEGMENTLENGTH,
344                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
345                         TYPERANGE_512_TO_16777215, USE_ALL);
346         if (!param)
347                 goto out;
348
349         param = iscsi_set_default_param(pl, MAXBURSTLENGTH,
350                         INITIAL_MAXBURSTLENGTH, PHASE_OPERATIONAL,
351                         SCOPE_SESSION_WIDE, SENDER_BOTH,
352                         TYPERANGE_512_TO_16777215, USE_LEADING_ONLY);
353         if (!param)
354                 goto out;
355
356         param = iscsi_set_default_param(pl, FIRSTBURSTLENGTH,
357                         INITIAL_FIRSTBURSTLENGTH,
358                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
359                         TYPERANGE_512_TO_16777215, USE_LEADING_ONLY);
360         if (!param)
361                 goto out;
362
363         param = iscsi_set_default_param(pl, DEFAULTTIME2WAIT,
364                         INITIAL_DEFAULTTIME2WAIT,
365                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
366                         TYPERANGE_0_TO_3600, USE_LEADING_ONLY);
367         if (!param)
368                 goto out;
369
370         param = iscsi_set_default_param(pl, DEFAULTTIME2RETAIN,
371                         INITIAL_DEFAULTTIME2RETAIN,
372                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
373                         TYPERANGE_0_TO_3600, USE_LEADING_ONLY);
374         if (!param)
375                 goto out;
376
377         param = iscsi_set_default_param(pl, MAXOUTSTANDINGR2T,
378                         INITIAL_MAXOUTSTANDINGR2T,
379                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
380                         TYPERANGE_1_TO_65535, USE_LEADING_ONLY);
381         if (!param)
382                 goto out;
383
384         param = iscsi_set_default_param(pl, DATAPDUINORDER,
385                         INITIAL_DATAPDUINORDER, PHASE_OPERATIONAL,
386                         SCOPE_SESSION_WIDE, SENDER_BOTH, TYPERANGE_BOOL_OR,
387                         USE_LEADING_ONLY);
388         if (!param)
389                 goto out;
390
391         param = iscsi_set_default_param(pl, DATASEQUENCEINORDER,
392                         INITIAL_DATASEQUENCEINORDER,
393                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
394                         TYPERANGE_BOOL_OR, USE_LEADING_ONLY);
395         if (!param)
396                 goto out;
397
398         param = iscsi_set_default_param(pl, ERRORRECOVERYLEVEL,
399                         INITIAL_ERRORRECOVERYLEVEL,
400                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
401                         TYPERANGE_0_TO_2, USE_LEADING_ONLY);
402         if (!param)
403                 goto out;
404
405         param = iscsi_set_default_param(pl, SESSIONTYPE, INITIAL_SESSIONTYPE,
406                         PHASE_DECLARATIVE, SCOPE_SESSION_WIDE, SENDER_INITIATOR,
407                         TYPERANGE_SESSIONTYPE, USE_LEADING_ONLY);
408         if (!param)
409                 goto out;
410
411         param = iscsi_set_default_param(pl, IFMARKER, INITIAL_IFMARKER,
412                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
413                         TYPERANGE_BOOL_AND, USE_INITIAL_ONLY);
414         if (!param)
415                 goto out;
416
417         param = iscsi_set_default_param(pl, OFMARKER, INITIAL_OFMARKER,
418                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
419                         TYPERANGE_BOOL_AND, USE_INITIAL_ONLY);
420         if (!param)
421                 goto out;
422
423         param = iscsi_set_default_param(pl, IFMARKINT, INITIAL_IFMARKINT,
424                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
425                         TYPERANGE_MARKINT, USE_INITIAL_ONLY);
426         if (!param)
427                 goto out;
428
429         param = iscsi_set_default_param(pl, OFMARKINT, INITIAL_OFMARKINT,
430                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
431                         TYPERANGE_MARKINT, USE_INITIAL_ONLY);
432         if (!param)
433                 goto out;
434         /*
435          * Extra parameters for ISER from RFC-5046
436          */
437         param = iscsi_set_default_param(pl, RDMAEXTENSIONS, INITIAL_RDMAEXTENSIONS,
438                         PHASE_OPERATIONAL, SCOPE_SESSION_WIDE, SENDER_BOTH,
439                         TYPERANGE_BOOL_AND, USE_LEADING_ONLY);
440         if (!param)
441                 goto out;
442
443         param = iscsi_set_default_param(pl, INITIATORRECVDATASEGMENTLENGTH,
444                         INITIAL_INITIATORRECVDATASEGMENTLENGTH,
445                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
446                         TYPERANGE_512_TO_16777215, USE_ALL);
447         if (!param)
448                 goto out;
449
450         param = iscsi_set_default_param(pl, TARGETRECVDATASEGMENTLENGTH,
451                         INITIAL_TARGETRECVDATASEGMENTLENGTH,
452                         PHASE_OPERATIONAL, SCOPE_CONNECTION_ONLY, SENDER_BOTH,
453                         TYPERANGE_512_TO_16777215, USE_ALL);
454         if (!param)
455                 goto out;
456
457         *param_list_ptr = pl;
458         return 0;
459 out:
460         iscsi_release_param_list(pl);
461         return -1;
462 }
463
464 int iscsi_set_keys_to_negotiate(
465         struct iscsi_param_list *param_list,
466         bool iser)
467 {
468         struct iscsi_param *param;
469
470         param_list->iser = iser;
471
472         list_for_each_entry(param, &param_list->param_list, p_list) {
473                 param->state = 0;
474                 if (!strcmp(param->name, AUTHMETHOD)) {
475                         SET_PSTATE_NEGOTIATE(param);
476                 } else if (!strcmp(param->name, HEADERDIGEST)) {
477                         if (!iser)
478                                 SET_PSTATE_NEGOTIATE(param);
479                 } else if (!strcmp(param->name, DATADIGEST)) {
480                         if (!iser)
481                                 SET_PSTATE_NEGOTIATE(param);
482                 } else if (!strcmp(param->name, MAXCONNECTIONS)) {
483                         SET_PSTATE_NEGOTIATE(param);
484                 } else if (!strcmp(param->name, TARGETNAME)) {
485                         continue;
486                 } else if (!strcmp(param->name, INITIATORNAME)) {
487                         continue;
488                 } else if (!strcmp(param->name, TARGETALIAS)) {
489                         if (param->value)
490                                 SET_PSTATE_NEGOTIATE(param);
491                 } else if (!strcmp(param->name, INITIATORALIAS)) {
492                         continue;
493                 } else if (!strcmp(param->name, TARGETPORTALGROUPTAG)) {
494                         SET_PSTATE_NEGOTIATE(param);
495                 } else if (!strcmp(param->name, INITIALR2T)) {
496                         SET_PSTATE_NEGOTIATE(param);
497                 } else if (!strcmp(param->name, IMMEDIATEDATA)) {
498                         SET_PSTATE_NEGOTIATE(param);
499                 } else if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH)) {
500                         if (!iser)
501                                 SET_PSTATE_NEGOTIATE(param);
502                 } else if (!strcmp(param->name, MAXXMITDATASEGMENTLENGTH)) {
503                         continue;
504                 } else if (!strcmp(param->name, MAXBURSTLENGTH)) {
505                         SET_PSTATE_NEGOTIATE(param);
506                 } else if (!strcmp(param->name, FIRSTBURSTLENGTH)) {
507                         SET_PSTATE_NEGOTIATE(param);
508                 } else if (!strcmp(param->name, DEFAULTTIME2WAIT)) {
509                         SET_PSTATE_NEGOTIATE(param);
510                 } else if (!strcmp(param->name, DEFAULTTIME2RETAIN)) {
511                         SET_PSTATE_NEGOTIATE(param);
512                 } else if (!strcmp(param->name, MAXOUTSTANDINGR2T)) {
513                         SET_PSTATE_NEGOTIATE(param);
514                 } else if (!strcmp(param->name, DATAPDUINORDER)) {
515                         SET_PSTATE_NEGOTIATE(param);
516                 } else if (!strcmp(param->name, DATASEQUENCEINORDER)) {
517                         SET_PSTATE_NEGOTIATE(param);
518                 } else if (!strcmp(param->name, ERRORRECOVERYLEVEL)) {
519                         SET_PSTATE_NEGOTIATE(param);
520                 } else if (!strcmp(param->name, SESSIONTYPE)) {
521                         SET_PSTATE_NEGOTIATE(param);
522                 } else if (!strcmp(param->name, IFMARKER)) {
523                         SET_PSTATE_NEGOTIATE(param);
524                 } else if (!strcmp(param->name, OFMARKER)) {
525                         SET_PSTATE_NEGOTIATE(param);
526                 } else if (!strcmp(param->name, IFMARKINT)) {
527                         SET_PSTATE_NEGOTIATE(param);
528                 } else if (!strcmp(param->name, OFMARKINT)) {
529                         SET_PSTATE_NEGOTIATE(param);
530                 } else if (!strcmp(param->name, RDMAEXTENSIONS)) {
531                         if (iser)
532                                 SET_PSTATE_NEGOTIATE(param);
533                 } else if (!strcmp(param->name, INITIATORRECVDATASEGMENTLENGTH)) {
534                         if (iser)
535                                 SET_PSTATE_NEGOTIATE(param);
536                 } else if (!strcmp(param->name, TARGETRECVDATASEGMENTLENGTH)) {
537                         if (iser)
538                                 SET_PSTATE_NEGOTIATE(param);
539                 }
540         }
541
542         return 0;
543 }
544
545 int iscsi_set_keys_irrelevant_for_discovery(
546         struct iscsi_param_list *param_list)
547 {
548         struct iscsi_param *param;
549
550         list_for_each_entry(param, &param_list->param_list, p_list) {
551                 if (!strcmp(param->name, MAXCONNECTIONS))
552                         param->state &= ~PSTATE_NEGOTIATE;
553                 else if (!strcmp(param->name, INITIALR2T))
554                         param->state &= ~PSTATE_NEGOTIATE;
555                 else if (!strcmp(param->name, IMMEDIATEDATA))
556                         param->state &= ~PSTATE_NEGOTIATE;
557                 else if (!strcmp(param->name, MAXBURSTLENGTH))
558                         param->state &= ~PSTATE_NEGOTIATE;
559                 else if (!strcmp(param->name, FIRSTBURSTLENGTH))
560                         param->state &= ~PSTATE_NEGOTIATE;
561                 else if (!strcmp(param->name, MAXOUTSTANDINGR2T))
562                         param->state &= ~PSTATE_NEGOTIATE;
563                 else if (!strcmp(param->name, DATAPDUINORDER))
564                         param->state &= ~PSTATE_NEGOTIATE;
565                 else if (!strcmp(param->name, DATASEQUENCEINORDER))
566                         param->state &= ~PSTATE_NEGOTIATE;
567                 else if (!strcmp(param->name, ERRORRECOVERYLEVEL))
568                         param->state &= ~PSTATE_NEGOTIATE;
569                 else if (!strcmp(param->name, DEFAULTTIME2WAIT))
570                         param->state &= ~PSTATE_NEGOTIATE;
571                 else if (!strcmp(param->name, DEFAULTTIME2RETAIN))
572                         param->state &= ~PSTATE_NEGOTIATE;
573                 else if (!strcmp(param->name, IFMARKER))
574                         param->state &= ~PSTATE_NEGOTIATE;
575                 else if (!strcmp(param->name, OFMARKER))
576                         param->state &= ~PSTATE_NEGOTIATE;
577                 else if (!strcmp(param->name, IFMARKINT))
578                         param->state &= ~PSTATE_NEGOTIATE;
579                 else if (!strcmp(param->name, OFMARKINT))
580                         param->state &= ~PSTATE_NEGOTIATE;
581                 else if (!strcmp(param->name, RDMAEXTENSIONS))
582                         param->state &= ~PSTATE_NEGOTIATE;
583                 else if (!strcmp(param->name, INITIATORRECVDATASEGMENTLENGTH))
584                         param->state &= ~PSTATE_NEGOTIATE;
585                 else if (!strcmp(param->name, TARGETRECVDATASEGMENTLENGTH))
586                         param->state &= ~PSTATE_NEGOTIATE;
587         }
588
589         return 0;
590 }
591
592 int iscsi_copy_param_list(
593         struct iscsi_param_list **dst_param_list,
594         struct iscsi_param_list *src_param_list,
595         int leading)
596 {
597         struct iscsi_param *param = NULL;
598         struct iscsi_param *new_param = NULL;
599         struct iscsi_param_list *param_list = NULL;
600
601         param_list = kzalloc(sizeof(struct iscsi_param_list), GFP_KERNEL);
602         if (!param_list) {
603                 pr_err("Unable to allocate memory for struct iscsi_param_list.\n");
604                 return -1;
605         }
606         INIT_LIST_HEAD(&param_list->param_list);
607         INIT_LIST_HEAD(&param_list->extra_response_list);
608
609         list_for_each_entry(param, &src_param_list->param_list, p_list) {
610                 if (!leading && (param->scope & SCOPE_SESSION_WIDE)) {
611                         if ((strcmp(param->name, "TargetName") != 0) &&
612                             (strcmp(param->name, "InitiatorName") != 0) &&
613                             (strcmp(param->name, "TargetPortalGroupTag") != 0))
614                                 continue;
615                 }
616
617                 new_param = kzalloc(sizeof(struct iscsi_param), GFP_KERNEL);
618                 if (!new_param) {
619                         pr_err("Unable to allocate memory for struct iscsi_param.\n");
620                         goto err_out;
621                 }
622
623                 new_param->name = kstrdup(param->name, GFP_KERNEL);
624                 new_param->value = kstrdup(param->value, GFP_KERNEL);
625                 if (!new_param->value || !new_param->name) {
626                         kfree(new_param->value);
627                         kfree(new_param->name);
628                         kfree(new_param);
629                         pr_err("Unable to allocate memory for parameter name/value.\n");
630                         goto err_out;
631                 }
632
633                 new_param->set_param = param->set_param;
634                 new_param->phase = param->phase;
635                 new_param->scope = param->scope;
636                 new_param->sender = param->sender;
637                 new_param->type = param->type;
638                 new_param->use = param->use;
639                 new_param->type_range = param->type_range;
640
641                 list_add_tail(&new_param->p_list, &param_list->param_list);
642         }
643
644         if (!list_empty(&param_list->param_list)) {
645                 *dst_param_list = param_list;
646         } else {
647                 pr_err("No parameters allocated.\n");
648                 goto err_out;
649         }
650
651         return 0;
652
653 err_out:
654         iscsi_release_param_list(param_list);
655         return -1;
656 }
657
658 static void iscsi_release_extra_responses(struct iscsi_param_list *param_list)
659 {
660         struct iscsi_extra_response *er, *er_tmp;
661
662         list_for_each_entry_safe(er, er_tmp, &param_list->extra_response_list,
663                         er_list) {
664                 list_del(&er->er_list);
665                 kfree(er);
666         }
667 }
668
669 void iscsi_release_param_list(struct iscsi_param_list *param_list)
670 {
671         struct iscsi_param *param, *param_tmp;
672
673         list_for_each_entry_safe(param, param_tmp, &param_list->param_list,
674                         p_list) {
675                 list_del(&param->p_list);
676
677                 kfree(param->name);
678                 kfree(param->value);
679                 kfree(param);
680         }
681
682         iscsi_release_extra_responses(param_list);
683
684         kfree(param_list);
685 }
686
687 struct iscsi_param *iscsi_find_param_from_key(
688         char *key,
689         struct iscsi_param_list *param_list)
690 {
691         struct iscsi_param *param;
692
693         if (!key || !param_list) {
694                 pr_err("Key or parameter list pointer is NULL.\n");
695                 return NULL;
696         }
697
698         list_for_each_entry(param, &param_list->param_list, p_list) {
699                 if (!strcmp(key, param->name))
700                         return param;
701         }
702
703         pr_err("Unable to locate key \"%s\".\n", key);
704         return NULL;
705 }
706
707 int iscsi_extract_key_value(char *textbuf, char **key, char **value)
708 {
709         *value = strchr(textbuf, '=');
710         if (!*value) {
711                 pr_err("Unable to locate \"=\" separator for key,"
712                                 " ignoring request.\n");
713                 return -1;
714         }
715
716         *key = textbuf;
717         **value = '\0';
718         *value = *value + 1;
719
720         return 0;
721 }
722
723 int iscsi_update_param_value(struct iscsi_param *param, char *value)
724 {
725         kfree(param->value);
726
727         param->value = kstrdup(value, GFP_KERNEL);
728         if (!param->value) {
729                 pr_err("Unable to allocate memory for value.\n");
730                 return -ENOMEM;
731         }
732
733         pr_debug("iSCSI Parameter updated to %s=%s\n",
734                         param->name, param->value);
735         return 0;
736 }
737
738 static int iscsi_add_notunderstood_response(
739         char *key,
740         char *value,
741         struct iscsi_param_list *param_list)
742 {
743         struct iscsi_extra_response *extra_response;
744
745         if (strlen(value) > VALUE_MAXLEN) {
746                 pr_err("Value for notunderstood key \"%s\" exceeds %d,"
747                         " protocol error.\n", key, VALUE_MAXLEN);
748                 return -1;
749         }
750
751         extra_response = kzalloc(sizeof(struct iscsi_extra_response), GFP_KERNEL);
752         if (!extra_response) {
753                 pr_err("Unable to allocate memory for"
754                         " struct iscsi_extra_response.\n");
755                 return -1;
756         }
757         INIT_LIST_HEAD(&extra_response->er_list);
758
759         strlcpy(extra_response->key, key, sizeof(extra_response->key));
760         strlcpy(extra_response->value, NOTUNDERSTOOD,
761                 sizeof(extra_response->value));
762
763         list_add_tail(&extra_response->er_list,
764                         &param_list->extra_response_list);
765         return 0;
766 }
767
768 static int iscsi_check_for_auth_key(char *key)
769 {
770         /*
771          * RFC 1994
772          */
773         if (!strcmp(key, "CHAP_A") || !strcmp(key, "CHAP_I") ||
774             !strcmp(key, "CHAP_C") || !strcmp(key, "CHAP_N") ||
775             !strcmp(key, "CHAP_R"))
776                 return 1;
777
778         /*
779          * RFC 2945
780          */
781         if (!strcmp(key, "SRP_U") || !strcmp(key, "SRP_N") ||
782             !strcmp(key, "SRP_g") || !strcmp(key, "SRP_s") ||
783             !strcmp(key, "SRP_A") || !strcmp(key, "SRP_B") ||
784             !strcmp(key, "SRP_M") || !strcmp(key, "SRP_HM"))
785                 return 1;
786
787         return 0;
788 }
789
790 static void iscsi_check_proposer_for_optional_reply(struct iscsi_param *param)
791 {
792         if (IS_TYPE_BOOL_AND(param)) {
793                 if (!strcmp(param->value, NO))
794                         SET_PSTATE_REPLY_OPTIONAL(param);
795         } else if (IS_TYPE_BOOL_OR(param)) {
796                 if (!strcmp(param->value, YES))
797                         SET_PSTATE_REPLY_OPTIONAL(param);
798                  /*
799                   * Required for gPXE iSCSI boot client
800                   */
801                 if (!strcmp(param->name, IMMEDIATEDATA))
802                         SET_PSTATE_REPLY_OPTIONAL(param);
803         } else if (IS_TYPE_NUMBER(param)) {
804                 if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH))
805                         SET_PSTATE_REPLY_OPTIONAL(param);
806                 /*
807                  * The GlobalSAN iSCSI Initiator for MacOSX does
808                  * not respond to MaxBurstLength, FirstBurstLength,
809                  * DefaultTime2Wait or DefaultTime2Retain parameter keys.
810                  * So, we set them to 'reply optional' here, and assume the
811                  * the defaults from iscsi_parameters.h if the initiator
812                  * is not RFC compliant and the keys are not negotiated.
813                  */
814                 if (!strcmp(param->name, MAXBURSTLENGTH))
815                         SET_PSTATE_REPLY_OPTIONAL(param);
816                 if (!strcmp(param->name, FIRSTBURSTLENGTH))
817                         SET_PSTATE_REPLY_OPTIONAL(param);
818                 if (!strcmp(param->name, DEFAULTTIME2WAIT))
819                         SET_PSTATE_REPLY_OPTIONAL(param);
820                 if (!strcmp(param->name, DEFAULTTIME2RETAIN))
821                         SET_PSTATE_REPLY_OPTIONAL(param);
822                 /*
823                  * Required for gPXE iSCSI boot client
824                  */
825                 if (!strcmp(param->name, MAXCONNECTIONS))
826                         SET_PSTATE_REPLY_OPTIONAL(param);
827         } else if (IS_PHASE_DECLARATIVE(param))
828                 SET_PSTATE_REPLY_OPTIONAL(param);
829 }
830
831 static int iscsi_check_boolean_value(struct iscsi_param *param, char *value)
832 {
833         if (strcmp(value, YES) && strcmp(value, NO)) {
834                 pr_err("Illegal value for \"%s\", must be either"
835                         " \"%s\" or \"%s\".\n", param->name, YES, NO);
836                 return -1;
837         }
838
839         return 0;
840 }
841
842 static int iscsi_check_numerical_value(struct iscsi_param *param, char *value_ptr)
843 {
844         char *tmpptr;
845         int value = 0;
846
847         value = simple_strtoul(value_ptr, &tmpptr, 0);
848
849         if (IS_TYPERANGE_0_TO_2(param)) {
850                 if ((value < 0) || (value > 2)) {
851                         pr_err("Illegal value for \"%s\", must be"
852                                 " between 0 and 2.\n", param->name);
853                         return -1;
854                 }
855                 return 0;
856         }
857         if (IS_TYPERANGE_0_TO_3600(param)) {
858                 if ((value < 0) || (value > 3600)) {
859                         pr_err("Illegal value for \"%s\", must be"
860                                 " between 0 and 3600.\n", param->name);
861                         return -1;
862                 }
863                 return 0;
864         }
865         if (IS_TYPERANGE_0_TO_32767(param)) {
866                 if ((value < 0) || (value > 32767)) {
867                         pr_err("Illegal value for \"%s\", must be"
868                                 " between 0 and 32767.\n", param->name);
869                         return -1;
870                 }
871                 return 0;
872         }
873         if (IS_TYPERANGE_0_TO_65535(param)) {
874                 if ((value < 0) || (value > 65535)) {
875                         pr_err("Illegal value for \"%s\", must be"
876                                 " between 0 and 65535.\n", param->name);
877                         return -1;
878                 }
879                 return 0;
880         }
881         if (IS_TYPERANGE_1_TO_65535(param)) {
882                 if ((value < 1) || (value > 65535)) {
883                         pr_err("Illegal value for \"%s\", must be"
884                                 " between 1 and 65535.\n", param->name);
885                         return -1;
886                 }
887                 return 0;
888         }
889         if (IS_TYPERANGE_2_TO_3600(param)) {
890                 if ((value < 2) || (value > 3600)) {
891                         pr_err("Illegal value for \"%s\", must be"
892                                 " between 2 and 3600.\n", param->name);
893                         return -1;
894                 }
895                 return 0;
896         }
897         if (IS_TYPERANGE_512_TO_16777215(param)) {
898                 if ((value < 512) || (value > 16777215)) {
899                         pr_err("Illegal value for \"%s\", must be"
900                                 " between 512 and 16777215.\n", param->name);
901                         return -1;
902                 }
903                 return 0;
904         }
905
906         return 0;
907 }
908
909 static int iscsi_check_numerical_range_value(struct iscsi_param *param, char *value)
910 {
911         char *left_val_ptr = NULL, *right_val_ptr = NULL;
912         char *tilde_ptr = NULL;
913         u32 left_val, right_val, local_left_val;
914
915         if (strcmp(param->name, IFMARKINT) &&
916             strcmp(param->name, OFMARKINT)) {
917                 pr_err("Only parameters \"%s\" or \"%s\" may contain a"
918                        " numerical range value.\n", IFMARKINT, OFMARKINT);
919                 return -1;
920         }
921
922         if (IS_PSTATE_PROPOSER(param))
923                 return 0;
924
925         tilde_ptr = strchr(value, '~');
926         if (!tilde_ptr) {
927                 pr_err("Unable to locate numerical range indicator"
928                         " \"~\" for \"%s\".\n", param->name);
929                 return -1;
930         }
931         *tilde_ptr = '\0';
932
933         left_val_ptr = value;
934         right_val_ptr = value + strlen(left_val_ptr) + 1;
935
936         if (iscsi_check_numerical_value(param, left_val_ptr) < 0)
937                 return -1;
938         if (iscsi_check_numerical_value(param, right_val_ptr) < 0)
939                 return -1;
940
941         left_val = simple_strtoul(left_val_ptr, NULL, 0);
942         right_val = simple_strtoul(right_val_ptr, NULL, 0);
943         *tilde_ptr = '~';
944
945         if (right_val < left_val) {
946                 pr_err("Numerical range for parameter \"%s\" contains"
947                         " a right value which is less than the left.\n",
948                                 param->name);
949                 return -1;
950         }
951
952         /*
953          * For now,  enforce reasonable defaults for [I,O]FMarkInt.
954          */
955         tilde_ptr = strchr(param->value, '~');
956         if (!tilde_ptr) {
957                 pr_err("Unable to locate numerical range indicator"
958                         " \"~\" for \"%s\".\n", param->name);
959                 return -1;
960         }
961         *tilde_ptr = '\0';
962
963         left_val_ptr = param->value;
964         right_val_ptr = param->value + strlen(left_val_ptr) + 1;
965
966         local_left_val = simple_strtoul(left_val_ptr, NULL, 0);
967         *tilde_ptr = '~';
968
969         if (param->set_param) {
970                 if ((left_val < local_left_val) ||
971                     (right_val < local_left_val)) {
972                         pr_err("Passed value range \"%u~%u\" is below"
973                                 " minimum left value \"%u\" for key \"%s\","
974                                 " rejecting.\n", left_val, right_val,
975                                 local_left_val, param->name);
976                         return -1;
977                 }
978         } else {
979                 if ((left_val < local_left_val) &&
980                     (right_val < local_left_val)) {
981                         pr_err("Received value range \"%u~%u\" is"
982                                 " below minimum left value \"%u\" for key"
983                                 " \"%s\", rejecting.\n", left_val, right_val,
984                                 local_left_val, param->name);
985                         SET_PSTATE_REJECT(param);
986                         if (iscsi_update_param_value(param, REJECT) < 0)
987                                 return -1;
988                 }
989         }
990
991         return 0;
992 }
993
994 static int iscsi_check_string_or_list_value(struct iscsi_param *param, char *value)
995 {
996         if (IS_PSTATE_PROPOSER(param))
997                 return 0;
998
999         if (IS_TYPERANGE_AUTH_PARAM(param)) {
1000                 if (strcmp(value, KRB5) && strcmp(value, SPKM1) &&
1001                     strcmp(value, SPKM2) && strcmp(value, SRP) &&
1002                     strcmp(value, CHAP) && strcmp(value, NONE)) {
1003                         pr_err("Illegal value for \"%s\", must be"
1004                                 " \"%s\", \"%s\", \"%s\", \"%s\", \"%s\""
1005                                 " or \"%s\".\n", param->name, KRB5,
1006                                         SPKM1, SPKM2, SRP, CHAP, NONE);
1007                         return -1;
1008                 }
1009         }
1010         if (IS_TYPERANGE_DIGEST_PARAM(param)) {
1011                 if (strcmp(value, CRC32C) && strcmp(value, NONE)) {
1012                         pr_err("Illegal value for \"%s\", must be"
1013                                 " \"%s\" or \"%s\".\n", param->name,
1014                                         CRC32C, NONE);
1015                         return -1;
1016                 }
1017         }
1018         if (IS_TYPERANGE_SESSIONTYPE(param)) {
1019                 if (strcmp(value, DISCOVERY) && strcmp(value, NORMAL)) {
1020                         pr_err("Illegal value for \"%s\", must be"
1021                                 " \"%s\" or \"%s\".\n", param->name,
1022                                         DISCOVERY, NORMAL);
1023                         return -1;
1024                 }
1025         }
1026
1027         return 0;
1028 }
1029
1030 /*
1031  *      This function is used to pick a value range number,  currently just
1032  *      returns the lesser of both right values.
1033  */
1034 static char *iscsi_get_value_from_number_range(
1035         struct iscsi_param *param,
1036         char *value)
1037 {
1038         char *end_ptr, *tilde_ptr1 = NULL, *tilde_ptr2 = NULL;
1039         u32 acceptor_right_value, proposer_right_value;
1040
1041         tilde_ptr1 = strchr(value, '~');
1042         if (!tilde_ptr1)
1043                 return NULL;
1044         *tilde_ptr1++ = '\0';
1045         proposer_right_value = simple_strtoul(tilde_ptr1, &end_ptr, 0);
1046
1047         tilde_ptr2 = strchr(param->value, '~');
1048         if (!tilde_ptr2)
1049                 return NULL;
1050         *tilde_ptr2++ = '\0';
1051         acceptor_right_value = simple_strtoul(tilde_ptr2, &end_ptr, 0);
1052
1053         return (acceptor_right_value >= proposer_right_value) ?
1054                 tilde_ptr1 : tilde_ptr2;
1055 }
1056
1057 static char *iscsi_check_valuelist_for_support(
1058         struct iscsi_param *param,
1059         char *value)
1060 {
1061         char *tmp1 = NULL, *tmp2 = NULL;
1062         char *acceptor_values = NULL, *proposer_values = NULL;
1063
1064         acceptor_values = param->value;
1065         proposer_values = value;
1066
1067         do {
1068                 if (!proposer_values)
1069                         return NULL;
1070                 tmp1 = strchr(proposer_values, ',');
1071                 if (tmp1)
1072                         *tmp1 = '\0';
1073                 acceptor_values = param->value;
1074                 do {
1075                         if (!acceptor_values) {
1076                                 if (tmp1)
1077                                         *tmp1 = ',';
1078                                 return NULL;
1079                         }
1080                         tmp2 = strchr(acceptor_values, ',');
1081                         if (tmp2)
1082                                 *tmp2 = '\0';
1083                         if (!strcmp(acceptor_values, proposer_values)) {
1084                                 if (tmp2)
1085                                         *tmp2 = ',';
1086                                 goto out;
1087                         }
1088                         if (tmp2)
1089                                 *tmp2++ = ',';
1090
1091                         acceptor_values = tmp2;
1092                 } while (acceptor_values);
1093                 if (tmp1)
1094                         *tmp1++ = ',';
1095                 proposer_values = tmp1;
1096         } while (proposer_values);
1097
1098 out:
1099         return proposer_values;
1100 }
1101
1102 static int iscsi_check_acceptor_state(struct iscsi_param *param, char *value,
1103                                 struct iscsi_conn *conn)
1104 {
1105         u8 acceptor_boolean_value = 0, proposer_boolean_value = 0;
1106         char *negoitated_value = NULL;
1107
1108         if (IS_PSTATE_ACCEPTOR(param)) {
1109                 pr_err("Received key \"%s\" twice, protocol error.\n",
1110                                 param->name);
1111                 return -1;
1112         }
1113
1114         if (IS_PSTATE_REJECT(param))
1115                 return 0;
1116
1117         if (IS_TYPE_BOOL_AND(param)) {
1118                 if (!strcmp(value, YES))
1119                         proposer_boolean_value = 1;
1120                 if (!strcmp(param->value, YES))
1121                         acceptor_boolean_value = 1;
1122                 if (acceptor_boolean_value && proposer_boolean_value)
1123                         do {} while (0);
1124                 else {
1125                         if (iscsi_update_param_value(param, NO) < 0)
1126                                 return -1;
1127                         if (!proposer_boolean_value)
1128                                 SET_PSTATE_REPLY_OPTIONAL(param);
1129                 }
1130         } else if (IS_TYPE_BOOL_OR(param)) {
1131                 if (!strcmp(value, YES))
1132                         proposer_boolean_value = 1;
1133                 if (!strcmp(param->value, YES))
1134                         acceptor_boolean_value = 1;
1135                 if (acceptor_boolean_value || proposer_boolean_value) {
1136                         if (iscsi_update_param_value(param, YES) < 0)
1137                                 return -1;
1138                         if (proposer_boolean_value)
1139                                 SET_PSTATE_REPLY_OPTIONAL(param);
1140                 }
1141         } else if (IS_TYPE_NUMBER(param)) {
1142                 char *tmpptr, buf[11];
1143                 u32 acceptor_value = simple_strtoul(param->value, &tmpptr, 0);
1144                 u32 proposer_value = simple_strtoul(value, &tmpptr, 0);
1145
1146                 memset(buf, 0, sizeof(buf));
1147
1148                 if (!strcmp(param->name, MAXCONNECTIONS) ||
1149                     !strcmp(param->name, MAXBURSTLENGTH) ||
1150                     !strcmp(param->name, FIRSTBURSTLENGTH) ||
1151                     !strcmp(param->name, MAXOUTSTANDINGR2T) ||
1152                     !strcmp(param->name, DEFAULTTIME2RETAIN) ||
1153                     !strcmp(param->name, ERRORRECOVERYLEVEL)) {
1154                         if (proposer_value > acceptor_value) {
1155                                 sprintf(buf, "%u", acceptor_value);
1156                                 if (iscsi_update_param_value(param,
1157                                                 &buf[0]) < 0)
1158                                         return -1;
1159                         } else {
1160                                 if (iscsi_update_param_value(param, value) < 0)
1161                                         return -1;
1162                         }
1163                 } else if (!strcmp(param->name, DEFAULTTIME2WAIT)) {
1164                         if (acceptor_value > proposer_value) {
1165                                 sprintf(buf, "%u", acceptor_value);
1166                                 if (iscsi_update_param_value(param,
1167                                                 &buf[0]) < 0)
1168                                         return -1;
1169                         } else {
1170                                 if (iscsi_update_param_value(param, value) < 0)
1171                                         return -1;
1172                         }
1173                 } else {
1174                         if (iscsi_update_param_value(param, value) < 0)
1175                                 return -1;
1176                 }
1177
1178                 if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH)) {
1179                         struct iscsi_param *param_mxdsl;
1180                         unsigned long long tmp;
1181                         int rc;
1182
1183                         rc = kstrtoull(param->value, 0, &tmp);
1184                         if (rc < 0)
1185                                 return -1;
1186
1187                         conn->conn_ops->MaxRecvDataSegmentLength = tmp;
1188                         pr_debug("Saving op->MaxRecvDataSegmentLength from"
1189                                 " original initiator received value: %u\n",
1190                                 conn->conn_ops->MaxRecvDataSegmentLength);
1191
1192                         param_mxdsl = iscsi_find_param_from_key(
1193                                                 MAXXMITDATASEGMENTLENGTH,
1194                                                 conn->param_list);
1195                         if (!param_mxdsl)
1196                                 return -1;
1197
1198                         rc = iscsi_update_param_value(param,
1199                                                 param_mxdsl->value);
1200                         if (rc < 0)
1201                                 return -1;
1202
1203                         pr_debug("Updated %s to target MXDSL value: %s\n",
1204                                         param->name, param->value);
1205                 }
1206
1207         } else if (IS_TYPE_NUMBER_RANGE(param)) {
1208                 negoitated_value = iscsi_get_value_from_number_range(
1209                                         param, value);
1210                 if (!negoitated_value)
1211                         return -1;
1212                 if (iscsi_update_param_value(param, negoitated_value) < 0)
1213                         return -1;
1214         } else if (IS_TYPE_VALUE_LIST(param)) {
1215                 negoitated_value = iscsi_check_valuelist_for_support(
1216                                         param, value);
1217                 if (!negoitated_value) {
1218                         pr_err("Proposer's value list \"%s\" contains"
1219                                 " no valid values from Acceptor's value list"
1220                                 " \"%s\".\n", value, param->value);
1221                         return -1;
1222                 }
1223                 if (iscsi_update_param_value(param, negoitated_value) < 0)
1224                         return -1;
1225         } else if (IS_PHASE_DECLARATIVE(param)) {
1226                 if (iscsi_update_param_value(param, value) < 0)
1227                         return -1;
1228                 SET_PSTATE_REPLY_OPTIONAL(param);
1229         }
1230
1231         return 0;
1232 }
1233
1234 static int iscsi_check_proposer_state(struct iscsi_param *param, char *value)
1235 {
1236         if (IS_PSTATE_RESPONSE_GOT(param)) {
1237                 pr_err("Received key \"%s\" twice, protocol error.\n",
1238                                 param->name);
1239                 return -1;
1240         }
1241
1242         if (IS_TYPE_NUMBER_RANGE(param)) {
1243                 u32 left_val = 0, right_val = 0, recieved_value = 0;
1244                 char *left_val_ptr = NULL, *right_val_ptr = NULL;
1245                 char *tilde_ptr = NULL;
1246
1247                 if (!strcmp(value, IRRELEVANT) || !strcmp(value, REJECT)) {
1248                         if (iscsi_update_param_value(param, value) < 0)
1249                                 return -1;
1250                         return 0;
1251                 }
1252
1253                 tilde_ptr = strchr(value, '~');
1254                 if (tilde_ptr) {
1255                         pr_err("Illegal \"~\" in response for \"%s\".\n",
1256                                         param->name);
1257                         return -1;
1258                 }
1259                 tilde_ptr = strchr(param->value, '~');
1260                 if (!tilde_ptr) {
1261                         pr_err("Unable to locate numerical range"
1262                                 " indicator \"~\" for \"%s\".\n", param->name);
1263                         return -1;
1264                 }
1265                 *tilde_ptr = '\0';
1266
1267                 left_val_ptr = param->value;
1268                 right_val_ptr = param->value + strlen(left_val_ptr) + 1;
1269                 left_val = simple_strtoul(left_val_ptr, NULL, 0);
1270                 right_val = simple_strtoul(right_val_ptr, NULL, 0);
1271                 recieved_value = simple_strtoul(value, NULL, 0);
1272
1273                 *tilde_ptr = '~';
1274
1275                 if ((recieved_value < left_val) ||
1276                     (recieved_value > right_val)) {
1277                         pr_err("Illegal response \"%s=%u\", value must"
1278                                 " be between %u and %u.\n", param->name,
1279                                 recieved_value, left_val, right_val);
1280                         return -1;
1281                 }
1282         } else if (IS_TYPE_VALUE_LIST(param)) {
1283                 char *comma_ptr = NULL, *tmp_ptr = NULL;
1284
1285                 comma_ptr = strchr(value, ',');
1286                 if (comma_ptr) {
1287                         pr_err("Illegal \",\" in response for \"%s\".\n",
1288                                         param->name);
1289                         return -1;
1290                 }
1291
1292                 tmp_ptr = iscsi_check_valuelist_for_support(param, value);
1293                 if (!tmp_ptr)
1294                         return -1;
1295         }
1296
1297         if (iscsi_update_param_value(param, value) < 0)
1298                 return -1;
1299
1300         return 0;
1301 }
1302
1303 static int iscsi_check_value(struct iscsi_param *param, char *value)
1304 {
1305         char *comma_ptr = NULL;
1306
1307         if (!strcmp(value, REJECT)) {
1308                 if (!strcmp(param->name, IFMARKINT) ||
1309                     !strcmp(param->name, OFMARKINT)) {
1310                         /*
1311                          * Reject is not fatal for [I,O]FMarkInt,  and causes
1312                          * [I,O]FMarker to be reset to No. (See iSCSI v20 A.3.2)
1313                          */
1314                         SET_PSTATE_REJECT(param);
1315                         return 0;
1316                 }
1317                 pr_err("Received %s=%s\n", param->name, value);
1318                 return -1;
1319         }
1320         if (!strcmp(value, IRRELEVANT)) {
1321                 pr_debug("Received %s=%s\n", param->name, value);
1322                 SET_PSTATE_IRRELEVANT(param);
1323                 return 0;
1324         }
1325         if (!strcmp(value, NOTUNDERSTOOD)) {
1326                 if (!IS_PSTATE_PROPOSER(param)) {
1327                         pr_err("Received illegal offer %s=%s\n",
1328                                 param->name, value);
1329                         return -1;
1330                 }
1331
1332 /* #warning FIXME: Add check for X-ExtensionKey here */
1333                 pr_err("Standard iSCSI key \"%s\" cannot be answered"
1334                         " with \"%s\", protocol error.\n", param->name, value);
1335                 return -1;
1336         }
1337
1338         do {
1339                 comma_ptr = NULL;
1340                 comma_ptr = strchr(value, ',');
1341
1342                 if (comma_ptr && !IS_TYPE_VALUE_LIST(param)) {
1343                         pr_err("Detected value separator \",\", but"
1344                                 " key \"%s\" does not allow a value list,"
1345                                 " protocol error.\n", param->name);
1346                         return -1;
1347                 }
1348                 if (comma_ptr)
1349                         *comma_ptr = '\0';
1350
1351                 if (strlen(value) > VALUE_MAXLEN) {
1352                         pr_err("Value for key \"%s\" exceeds %d,"
1353                                 " protocol error.\n", param->name,
1354                                 VALUE_MAXLEN);
1355                         return -1;
1356                 }
1357
1358                 if (IS_TYPE_BOOL_AND(param) || IS_TYPE_BOOL_OR(param)) {
1359                         if (iscsi_check_boolean_value(param, value) < 0)
1360                                 return -1;
1361                 } else if (IS_TYPE_NUMBER(param)) {
1362                         if (iscsi_check_numerical_value(param, value) < 0)
1363                                 return -1;
1364                 } else if (IS_TYPE_NUMBER_RANGE(param)) {
1365                         if (iscsi_check_numerical_range_value(param, value) < 0)
1366                                 return -1;
1367                 } else if (IS_TYPE_STRING(param) || IS_TYPE_VALUE_LIST(param)) {
1368                         if (iscsi_check_string_or_list_value(param, value) < 0)
1369                                 return -1;
1370                 } else {
1371                         pr_err("Huh? 0x%02x\n", param->type);
1372                         return -1;
1373                 }
1374
1375                 if (comma_ptr)
1376                         *comma_ptr++ = ',';
1377
1378                 value = comma_ptr;
1379         } while (value);
1380
1381         return 0;
1382 }
1383
1384 static struct iscsi_param *__iscsi_check_key(
1385         char *key,
1386         int sender,
1387         struct iscsi_param_list *param_list)
1388 {
1389         struct iscsi_param *param;
1390
1391         if (strlen(key) > KEY_MAXLEN) {
1392                 pr_err("Length of key name \"%s\" exceeds %d.\n",
1393                         key, KEY_MAXLEN);
1394                 return NULL;
1395         }
1396
1397         param = iscsi_find_param_from_key(key, param_list);
1398         if (!param)
1399                 return NULL;
1400
1401         if ((sender & SENDER_INITIATOR) && !IS_SENDER_INITIATOR(param)) {
1402                 pr_err("Key \"%s\" may not be sent to %s,"
1403                         " protocol error.\n", param->name,
1404                         (sender & SENDER_RECEIVER) ? "target" : "initiator");
1405                 return NULL;
1406         }
1407
1408         if ((sender & SENDER_TARGET) && !IS_SENDER_TARGET(param)) {
1409                 pr_err("Key \"%s\" may not be sent to %s,"
1410                         " protocol error.\n", param->name,
1411                         (sender & SENDER_RECEIVER) ? "initiator" : "target");
1412                 return NULL;
1413         }
1414
1415         return param;
1416 }
1417
1418 static struct iscsi_param *iscsi_check_key(
1419         char *key,
1420         int phase,
1421         int sender,
1422         struct iscsi_param_list *param_list)
1423 {
1424         struct iscsi_param *param;
1425         /*
1426          * Key name length must not exceed 63 bytes. (See iSCSI v20 5.1)
1427          */
1428         if (strlen(key) > KEY_MAXLEN) {
1429                 pr_err("Length of key name \"%s\" exceeds %d.\n",
1430                         key, KEY_MAXLEN);
1431                 return NULL;
1432         }
1433
1434         param = iscsi_find_param_from_key(key, param_list);
1435         if (!param)
1436                 return NULL;
1437
1438         if ((sender & SENDER_INITIATOR) && !IS_SENDER_INITIATOR(param)) {
1439                 pr_err("Key \"%s\" may not be sent to %s,"
1440                         " protocol error.\n", param->name,
1441                         (sender & SENDER_RECEIVER) ? "target" : "initiator");
1442                 return NULL;
1443         }
1444         if ((sender & SENDER_TARGET) && !IS_SENDER_TARGET(param)) {
1445                 pr_err("Key \"%s\" may not be sent to %s,"
1446                                 " protocol error.\n", param->name,
1447                         (sender & SENDER_RECEIVER) ? "initiator" : "target");
1448                 return NULL;
1449         }
1450
1451         if (IS_PSTATE_ACCEPTOR(param)) {
1452                 pr_err("Key \"%s\" received twice, protocol error.\n",
1453                                 key);
1454                 return NULL;
1455         }
1456
1457         if (!phase)
1458                 return param;
1459
1460         if (!(param->phase & phase)) {
1461                 pr_err("Key \"%s\" may not be negotiated during ",
1462                                 param->name);
1463                 switch (phase) {
1464                 case PHASE_SECURITY:
1465                         pr_debug("Security phase.\n");
1466                         break;
1467                 case PHASE_OPERATIONAL:
1468                         pr_debug("Operational phase.\n");
1469                         break;
1470                 default:
1471                         pr_debug("Unknown phase.\n");
1472                 }
1473                 return NULL;
1474         }
1475
1476         return param;
1477 }
1478
1479 static int iscsi_enforce_integrity_rules(
1480         u8 phase,
1481         struct iscsi_param_list *param_list)
1482 {
1483         char *tmpptr;
1484         u8 DataSequenceInOrder = 0;
1485         u8 ErrorRecoveryLevel = 0, SessionType = 0;
1486         u8 IFMarker = 0, OFMarker = 0;
1487         u8 IFMarkInt_Reject = 1, OFMarkInt_Reject = 1;
1488         u32 FirstBurstLength = 0, MaxBurstLength = 0;
1489         struct iscsi_param *param = NULL;
1490
1491         list_for_each_entry(param, &param_list->param_list, p_list) {
1492                 if (!(param->phase & phase))
1493                         continue;
1494                 if (!strcmp(param->name, SESSIONTYPE))
1495                         if (!strcmp(param->value, NORMAL))
1496                                 SessionType = 1;
1497                 if (!strcmp(param->name, ERRORRECOVERYLEVEL))
1498                         ErrorRecoveryLevel = simple_strtoul(param->value,
1499                                         &tmpptr, 0);
1500                 if (!strcmp(param->name, DATASEQUENCEINORDER))
1501                         if (!strcmp(param->value, YES))
1502                                 DataSequenceInOrder = 1;
1503                 if (!strcmp(param->name, MAXBURSTLENGTH))
1504                         MaxBurstLength = simple_strtoul(param->value,
1505                                         &tmpptr, 0);
1506                 if (!strcmp(param->name, IFMARKER))
1507                         if (!strcmp(param->value, YES))
1508                                 IFMarker = 1;
1509                 if (!strcmp(param->name, OFMARKER))
1510                         if (!strcmp(param->value, YES))
1511                                 OFMarker = 1;
1512                 if (!strcmp(param->name, IFMARKINT))
1513                         if (!strcmp(param->value, REJECT))
1514                                 IFMarkInt_Reject = 1;
1515                 if (!strcmp(param->name, OFMARKINT))
1516                         if (!strcmp(param->value, REJECT))
1517                                 OFMarkInt_Reject = 1;
1518         }
1519
1520         list_for_each_entry(param, &param_list->param_list, p_list) {
1521                 if (!(param->phase & phase))
1522                         continue;
1523                 if (!SessionType && (!IS_PSTATE_ACCEPTOR(param) &&
1524                      (strcmp(param->name, IFMARKER) &&
1525                       strcmp(param->name, OFMARKER) &&
1526                       strcmp(param->name, IFMARKINT) &&
1527                       strcmp(param->name, OFMARKINT))))
1528                         continue;
1529                 if (!strcmp(param->name, MAXOUTSTANDINGR2T) &&
1530                     DataSequenceInOrder && (ErrorRecoveryLevel > 0)) {
1531                         if (strcmp(param->value, "1")) {
1532                                 if (iscsi_update_param_value(param, "1") < 0)
1533                                         return -1;
1534                                 pr_debug("Reset \"%s\" to \"%s\".\n",
1535                                         param->name, param->value);
1536                         }
1537                 }
1538                 if (!strcmp(param->name, MAXCONNECTIONS) && !SessionType) {
1539                         if (strcmp(param->value, "1")) {
1540                                 if (iscsi_update_param_value(param, "1") < 0)
1541                                         return -1;
1542                                 pr_debug("Reset \"%s\" to \"%s\".\n",
1543                                         param->name, param->value);
1544                         }
1545                 }
1546                 if (!strcmp(param->name, FIRSTBURSTLENGTH)) {
1547                         FirstBurstLength = simple_strtoul(param->value,
1548                                         &tmpptr, 0);
1549                         if (FirstBurstLength > MaxBurstLength) {
1550                                 char tmpbuf[11];
1551                                 memset(tmpbuf, 0, sizeof(tmpbuf));
1552                                 sprintf(tmpbuf, "%u", MaxBurstLength);
1553                                 if (iscsi_update_param_value(param, tmpbuf))
1554                                         return -1;
1555                                 pr_debug("Reset \"%s\" to \"%s\".\n",
1556                                         param->name, param->value);
1557                         }
1558                 }
1559                 if (!strcmp(param->name, IFMARKER) && IFMarkInt_Reject) {
1560                         if (iscsi_update_param_value(param, NO) < 0)
1561                                 return -1;
1562                         IFMarker = 0;
1563                         pr_debug("Reset \"%s\" to \"%s\".\n",
1564                                         param->name, param->value);
1565                 }
1566                 if (!strcmp(param->name, OFMARKER) && OFMarkInt_Reject) {
1567                         if (iscsi_update_param_value(param, NO) < 0)
1568                                 return -1;
1569                         OFMarker = 0;
1570                         pr_debug("Reset \"%s\" to \"%s\".\n",
1571                                          param->name, param->value);
1572                 }
1573                 if (!strcmp(param->name, IFMARKINT) && !IFMarker) {
1574                         if (!strcmp(param->value, REJECT))
1575                                 continue;
1576                         param->state &= ~PSTATE_NEGOTIATE;
1577                         if (iscsi_update_param_value(param, IRRELEVANT) < 0)
1578                                 return -1;
1579                         pr_debug("Reset \"%s\" to \"%s\".\n",
1580                                         param->name, param->value);
1581                 }
1582                 if (!strcmp(param->name, OFMARKINT) && !OFMarker) {
1583                         if (!strcmp(param->value, REJECT))
1584                                 continue;
1585                         param->state &= ~PSTATE_NEGOTIATE;
1586                         if (iscsi_update_param_value(param, IRRELEVANT) < 0)
1587                                 return -1;
1588                         pr_debug("Reset \"%s\" to \"%s\".\n",
1589                                         param->name, param->value);
1590                 }
1591         }
1592
1593         return 0;
1594 }
1595
1596 int iscsi_decode_text_input(
1597         u8 phase,
1598         u8 sender,
1599         char *textbuf,
1600         u32 length,
1601         struct iscsi_conn *conn)
1602 {
1603         struct iscsi_param_list *param_list = conn->param_list;
1604         char *tmpbuf, *start = NULL, *end = NULL;
1605
1606         tmpbuf = kzalloc(length + 1, GFP_KERNEL);
1607         if (!tmpbuf) {
1608                 pr_err("Unable to allocate %u + 1 bytes for tmpbuf.\n", length);
1609                 return -1;
1610         }
1611
1612         memcpy(tmpbuf, textbuf, length);
1613         tmpbuf[length] = '\0';
1614         start = tmpbuf;
1615         end = (start + length);
1616
1617         while (start < end) {
1618                 char *key, *value;
1619                 struct iscsi_param *param;
1620
1621                 if (iscsi_extract_key_value(start, &key, &value) < 0) {
1622                         kfree(tmpbuf);
1623                         return -1;
1624                 }
1625
1626                 pr_debug("Got key: %s=%s\n", key, value);
1627
1628                 if (phase & PHASE_SECURITY) {
1629                         if (iscsi_check_for_auth_key(key) > 0) {
1630                                 kfree(tmpbuf);
1631                                 return 1;
1632                         }
1633                 }
1634
1635                 param = iscsi_check_key(key, phase, sender, param_list);
1636                 if (!param) {
1637                         if (iscsi_add_notunderstood_response(key,
1638                                         value, param_list) < 0) {
1639                                 kfree(tmpbuf);
1640                                 return -1;
1641                         }
1642                         start += strlen(key) + strlen(value) + 2;
1643                         continue;
1644                 }
1645                 if (iscsi_check_value(param, value) < 0) {
1646                         kfree(tmpbuf);
1647                         return -1;
1648                 }
1649
1650                 start += strlen(key) + strlen(value) + 2;
1651
1652                 if (IS_PSTATE_PROPOSER(param)) {
1653                         if (iscsi_check_proposer_state(param, value) < 0) {
1654                                 kfree(tmpbuf);
1655                                 return -1;
1656                         }
1657                         SET_PSTATE_RESPONSE_GOT(param);
1658                 } else {
1659                         if (iscsi_check_acceptor_state(param, value, conn) < 0) {
1660                                 kfree(tmpbuf);
1661                                 return -1;
1662                         }
1663                         SET_PSTATE_ACCEPTOR(param);
1664                 }
1665         }
1666
1667         kfree(tmpbuf);
1668         return 0;
1669 }
1670
1671 int iscsi_encode_text_output(
1672         u8 phase,
1673         u8 sender,
1674         char *textbuf,
1675         u32 *length,
1676         struct iscsi_param_list *param_list)
1677 {
1678         char *output_buf = NULL;
1679         struct iscsi_extra_response *er;
1680         struct iscsi_param *param;
1681
1682         output_buf = textbuf + *length;
1683
1684         if (iscsi_enforce_integrity_rules(phase, param_list) < 0)
1685                 return -1;
1686
1687         list_for_each_entry(param, &param_list->param_list, p_list) {
1688                 if (!(param->sender & sender))
1689                         continue;
1690                 if (IS_PSTATE_ACCEPTOR(param) &&
1691                     !IS_PSTATE_RESPONSE_SENT(param) &&
1692                     !IS_PSTATE_REPLY_OPTIONAL(param) &&
1693                     (param->phase & phase)) {
1694                         *length += sprintf(output_buf, "%s=%s",
1695                                 param->name, param->value);
1696                         *length += 1;
1697                         output_buf = textbuf + *length;
1698                         SET_PSTATE_RESPONSE_SENT(param);
1699                         pr_debug("Sending key: %s=%s\n",
1700                                 param->name, param->value);
1701                         continue;
1702                 }
1703                 if (IS_PSTATE_NEGOTIATE(param) &&
1704                     !IS_PSTATE_ACCEPTOR(param) &&
1705                     !IS_PSTATE_PROPOSER(param) &&
1706                     (param->phase & phase)) {
1707                         *length += sprintf(output_buf, "%s=%s",
1708                                 param->name, param->value);
1709                         *length += 1;
1710                         output_buf = textbuf + *length;
1711                         SET_PSTATE_PROPOSER(param);
1712                         iscsi_check_proposer_for_optional_reply(param);
1713                         pr_debug("Sending key: %s=%s\n",
1714                                 param->name, param->value);
1715                 }
1716         }
1717
1718         list_for_each_entry(er, &param_list->extra_response_list, er_list) {
1719                 *length += sprintf(output_buf, "%s=%s", er->key, er->value);
1720                 *length += 1;
1721                 output_buf = textbuf + *length;
1722                 pr_debug("Sending key: %s=%s\n", er->key, er->value);
1723         }
1724         iscsi_release_extra_responses(param_list);
1725
1726         return 0;
1727 }
1728
1729 int iscsi_check_negotiated_keys(struct iscsi_param_list *param_list)
1730 {
1731         int ret = 0;
1732         struct iscsi_param *param;
1733
1734         list_for_each_entry(param, &param_list->param_list, p_list) {
1735                 if (IS_PSTATE_NEGOTIATE(param) &&
1736                     IS_PSTATE_PROPOSER(param) &&
1737                     !IS_PSTATE_RESPONSE_GOT(param) &&
1738                     !IS_PSTATE_REPLY_OPTIONAL(param) &&
1739                     !IS_PHASE_DECLARATIVE(param)) {
1740                         pr_err("No response for proposed key \"%s\".\n",
1741                                         param->name);
1742                         ret = -1;
1743                 }
1744         }
1745
1746         return ret;
1747 }
1748
1749 int iscsi_change_param_value(
1750         char *keyvalue,
1751         struct iscsi_param_list *param_list,
1752         int check_key)
1753 {
1754         char *key = NULL, *value = NULL;
1755         struct iscsi_param *param;
1756         int sender = 0;
1757
1758         if (iscsi_extract_key_value(keyvalue, &key, &value) < 0)
1759                 return -1;
1760
1761         if (!check_key) {
1762                 param = __iscsi_check_key(keyvalue, sender, param_list);
1763                 if (!param)
1764                         return -1;
1765         } else {
1766                 param = iscsi_check_key(keyvalue, 0, sender, param_list);
1767                 if (!param)
1768                         return -1;
1769
1770                 param->set_param = 1;
1771                 if (iscsi_check_value(param, value) < 0) {
1772                         param->set_param = 0;
1773                         return -1;
1774                 }
1775                 param->set_param = 0;
1776         }
1777
1778         if (iscsi_update_param_value(param, value) < 0)
1779                 return -1;
1780
1781         return 0;
1782 }
1783
1784 void iscsi_set_connection_parameters(
1785         struct iscsi_conn_ops *ops,
1786         struct iscsi_param_list *param_list)
1787 {
1788         char *tmpptr;
1789         struct iscsi_param *param;
1790
1791         pr_debug("---------------------------------------------------"
1792                         "---------------\n");
1793         list_for_each_entry(param, &param_list->param_list, p_list) {
1794                 /*
1795                  * Special case to set MAXXMITDATASEGMENTLENGTH from the
1796                  * target requested MaxRecvDataSegmentLength, even though
1797                  * this key is not sent over the wire.
1798                  */
1799                 if (!strcmp(param->name, MAXXMITDATASEGMENTLENGTH)) {
1800                         ops->MaxXmitDataSegmentLength =
1801                                 simple_strtoul(param->value, &tmpptr, 0);
1802                         pr_debug("MaxXmitDataSegmentLength:     %s\n",
1803                                 param->value);
1804                 }
1805
1806                 if (!IS_PSTATE_ACCEPTOR(param) && !IS_PSTATE_PROPOSER(param))
1807                         continue;
1808                 if (!strcmp(param->name, AUTHMETHOD)) {
1809                         pr_debug("AuthMethod:                   %s\n",
1810                                 param->value);
1811                 } else if (!strcmp(param->name, HEADERDIGEST)) {
1812                         ops->HeaderDigest = !strcmp(param->value, CRC32C);
1813                         pr_debug("HeaderDigest:                 %s\n",
1814                                 param->value);
1815                 } else if (!strcmp(param->name, DATADIGEST)) {
1816                         ops->DataDigest = !strcmp(param->value, CRC32C);
1817                         pr_debug("DataDigest:                   %s\n",
1818                                 param->value);
1819                 } else if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH)) {
1820                         /*
1821                          * At this point iscsi_check_acceptor_state() will have
1822                          * set ops->MaxRecvDataSegmentLength from the original
1823                          * initiator provided value.
1824                          */
1825                         pr_debug("MaxRecvDataSegmentLength:     %u\n",
1826                                 ops->MaxRecvDataSegmentLength);
1827                 } else if (!strcmp(param->name, OFMARKER)) {
1828                         ops->OFMarker = !strcmp(param->value, YES);
1829                         pr_debug("OFMarker:                     %s\n",
1830                                 param->value);
1831                 } else if (!strcmp(param->name, IFMARKER)) {
1832                         ops->IFMarker = !strcmp(param->value, YES);
1833                         pr_debug("IFMarker:                     %s\n",
1834                                 param->value);
1835                 } else if (!strcmp(param->name, OFMARKINT)) {
1836                         ops->OFMarkInt =
1837                                 simple_strtoul(param->value, &tmpptr, 0);
1838                         pr_debug("OFMarkInt:                    %s\n",
1839                                 param->value);
1840                 } else if (!strcmp(param->name, IFMARKINT)) {
1841                         ops->IFMarkInt =
1842                                 simple_strtoul(param->value, &tmpptr, 0);
1843                         pr_debug("IFMarkInt:                    %s\n",
1844                                 param->value);
1845                 } else if (!strcmp(param->name, INITIATORRECVDATASEGMENTLENGTH)) {
1846                         ops->InitiatorRecvDataSegmentLength =
1847                                 simple_strtoul(param->value, &tmpptr, 0);
1848                         pr_debug("InitiatorRecvDataSegmentLength: %s\n",
1849                                 param->value);
1850                         ops->MaxRecvDataSegmentLength =
1851                                         ops->InitiatorRecvDataSegmentLength;
1852                         pr_debug("Set MRDSL from InitiatorRecvDataSegmentLength\n");
1853                 } else if (!strcmp(param->name, TARGETRECVDATASEGMENTLENGTH)) {
1854                         ops->TargetRecvDataSegmentLength =
1855                                 simple_strtoul(param->value, &tmpptr, 0);
1856                         pr_debug("TargetRecvDataSegmentLength:  %s\n",
1857                                 param->value);
1858                         ops->MaxXmitDataSegmentLength =
1859                                         ops->TargetRecvDataSegmentLength;
1860                         pr_debug("Set MXDSL from TargetRecvDataSegmentLength\n");
1861                 }
1862         }
1863         pr_debug("----------------------------------------------------"
1864                         "--------------\n");
1865 }
1866
1867 void iscsi_set_session_parameters(
1868         struct iscsi_sess_ops *ops,
1869         struct iscsi_param_list *param_list,
1870         int leading)
1871 {
1872         char *tmpptr;
1873         struct iscsi_param *param;
1874
1875         pr_debug("----------------------------------------------------"
1876                         "--------------\n");
1877         list_for_each_entry(param, &param_list->param_list, p_list) {
1878                 if (!IS_PSTATE_ACCEPTOR(param) && !IS_PSTATE_PROPOSER(param))
1879                         continue;
1880                 if (!strcmp(param->name, INITIATORNAME)) {
1881                         if (!param->value)
1882                                 continue;
1883                         if (leading)
1884                                 snprintf(ops->InitiatorName,
1885                                                 sizeof(ops->InitiatorName),
1886                                                 "%s", param->value);
1887                         pr_debug("InitiatorName:                %s\n",
1888                                 param->value);
1889                 } else if (!strcmp(param->name, INITIATORALIAS)) {
1890                         if (!param->value)
1891                                 continue;
1892                         snprintf(ops->InitiatorAlias,
1893                                                 sizeof(ops->InitiatorAlias),
1894                                                 "%s", param->value);
1895                         pr_debug("InitiatorAlias:               %s\n",
1896                                 param->value);
1897                 } else if (!strcmp(param->name, TARGETNAME)) {
1898                         if (!param->value)
1899                                 continue;
1900                         if (leading)
1901                                 snprintf(ops->TargetName,
1902                                                 sizeof(ops->TargetName),
1903                                                 "%s", param->value);
1904                         pr_debug("TargetName:                   %s\n",
1905                                 param->value);
1906                 } else if (!strcmp(param->name, TARGETALIAS)) {
1907                         if (!param->value)
1908                                 continue;
1909                         snprintf(ops->TargetAlias, sizeof(ops->TargetAlias),
1910                                         "%s", param->value);
1911                         pr_debug("TargetAlias:                  %s\n",
1912                                 param->value);
1913                 } else if (!strcmp(param->name, TARGETPORTALGROUPTAG)) {
1914                         ops->TargetPortalGroupTag =
1915                                 simple_strtoul(param->value, &tmpptr, 0);
1916                         pr_debug("TargetPortalGroupTag:         %s\n",
1917                                 param->value);
1918                 } else if (!strcmp(param->name, MAXCONNECTIONS)) {
1919                         ops->MaxConnections =
1920                                 simple_strtoul(param->value, &tmpptr, 0);
1921                         pr_debug("MaxConnections:               %s\n",
1922                                 param->value);
1923                 } else if (!strcmp(param->name, INITIALR2T)) {
1924                         ops->InitialR2T = !strcmp(param->value, YES);
1925                          pr_debug("InitialR2T:                   %s\n",
1926                                 param->value);
1927                 } else if (!strcmp(param->name, IMMEDIATEDATA)) {
1928                         ops->ImmediateData = !strcmp(param->value, YES);
1929                         pr_debug("ImmediateData:                %s\n",
1930                                 param->value);
1931                 } else if (!strcmp(param->name, MAXBURSTLENGTH)) {
1932                         ops->MaxBurstLength =
1933                                 simple_strtoul(param->value, &tmpptr, 0);
1934                         pr_debug("MaxBurstLength:               %s\n",
1935                                 param->value);
1936                 } else if (!strcmp(param->name, FIRSTBURSTLENGTH)) {
1937                         ops->FirstBurstLength =
1938                                 simple_strtoul(param->value, &tmpptr, 0);
1939                         pr_debug("FirstBurstLength:             %s\n",
1940                                 param->value);
1941                 } else if (!strcmp(param->name, DEFAULTTIME2WAIT)) {
1942                         ops->DefaultTime2Wait =
1943                                 simple_strtoul(param->value, &tmpptr, 0);
1944                         pr_debug("DefaultTime2Wait:             %s\n",
1945                                 param->value);
1946                 } else if (!strcmp(param->name, DEFAULTTIME2RETAIN)) {
1947                         ops->DefaultTime2Retain =
1948                                 simple_strtoul(param->value, &tmpptr, 0);
1949                         pr_debug("DefaultTime2Retain:           %s\n",
1950                                 param->value);
1951                 } else if (!strcmp(param->name, MAXOUTSTANDINGR2T)) {
1952                         ops->MaxOutstandingR2T =
1953                                 simple_strtoul(param->value, &tmpptr, 0);
1954                         pr_debug("MaxOutstandingR2T:            %s\n",
1955                                 param->value);
1956                 } else if (!strcmp(param->name, DATAPDUINORDER)) {
1957                         ops->DataPDUInOrder = !strcmp(param->value, YES);
1958                         pr_debug("DataPDUInOrder:               %s\n",
1959                                 param->value);
1960                 } else if (!strcmp(param->name, DATASEQUENCEINORDER)) {
1961                         ops->DataSequenceInOrder = !strcmp(param->value, YES);
1962                         pr_debug("DataSequenceInOrder:          %s\n",
1963                                 param->value);
1964                 } else if (!strcmp(param->name, ERRORRECOVERYLEVEL)) {
1965                         ops->ErrorRecoveryLevel =
1966                                 simple_strtoul(param->value, &tmpptr, 0);
1967                         pr_debug("ErrorRecoveryLevel:           %s\n",
1968                                 param->value);
1969                 } else if (!strcmp(param->name, SESSIONTYPE)) {
1970                         ops->SessionType = !strcmp(param->value, DISCOVERY);
1971                         pr_debug("SessionType:                  %s\n",
1972                                 param->value);
1973                 } else if (!strcmp(param->name, RDMAEXTENSIONS)) {
1974                         ops->RDMAExtensions = !strcmp(param->value, YES);
1975                         pr_debug("RDMAExtensions:               %s\n",
1976                                 param->value);
1977                 }
1978         }
1979         pr_debug("----------------------------------------------------"
1980                         "--------------\n");
1981
1982 }