1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef ISCSI_PARAMETERS_H
3  #define ISCSI_PARAMETERS_H
4  
5  #include <linux/types.h>
6  #include <scsi/iscsi_proto.h>
7  
8  struct iscsi_extra_response {
9  	char key[KEY_MAXLEN];
10  	char value[32];
11  	struct list_head er_list;
12  } ____cacheline_aligned;
13  
14  struct iscsi_param {
15  	char *name;
16  	char *value;
17  	u8 set_param;
18  	u8 phase;
19  	u8 scope;
20  	u8 sender;
21  	u8 type;
22  	u8 use;
23  	u16 type_range;
24  	u32 state;
25  	struct list_head p_list;
26  } ____cacheline_aligned;
27  
28  struct iscsit_conn;
29  struct iscsi_conn_ops;
30  struct iscsi_param_list;
31  struct iscsi_sess_ops;
32  
33  extern int iscsi_login_rx_data(struct iscsit_conn *, char *, int);
34  extern int iscsi_login_tx_data(struct iscsit_conn *, char *, char *, int);
35  extern void iscsi_dump_conn_ops(struct iscsi_conn_ops *);
36  extern void iscsi_dump_sess_ops(struct iscsi_sess_ops *);
37  extern void iscsi_print_params(struct iscsi_param_list *);
38  extern int iscsi_create_default_params(struct iscsi_param_list **);
39  extern int iscsi_set_keys_to_negotiate(struct iscsi_param_list *, bool);
40  extern int iscsi_set_keys_irrelevant_for_discovery(struct iscsi_param_list *);
41  extern int iscsi_copy_param_list(struct iscsi_param_list **,
42  			struct iscsi_param_list *, int);
43  extern int iscsi_change_param_value(char *, struct iscsi_param_list *, int);
44  extern void iscsi_release_param_list(struct iscsi_param_list *);
45  extern struct iscsi_param *iscsi_find_param_from_key(char *, struct iscsi_param_list *);
46  extern int iscsi_extract_key_value(char *, char **, char **);
47  extern int iscsi_update_param_value(struct iscsi_param *, char *);
48  extern int iscsi_decode_text_input(u8, u8, char *, u32, struct iscsit_conn *);
49  extern int iscsi_encode_text_output(u8, u8, char *, u32 *,
50  			struct iscsi_param_list *, bool);
51  extern int iscsi_check_negotiated_keys(struct iscsi_param_list *);
52  extern void iscsi_set_connection_parameters(struct iscsi_conn_ops *,
53  			struct iscsi_param_list *);
54  extern void iscsi_set_session_parameters(struct iscsi_sess_ops *,
55  			struct iscsi_param_list *, int);
56  
57  #define YES				"Yes"
58  #define NO				"No"
59  #define ALL				"All"
60  #define IRRELEVANT			"Irrelevant"
61  #define NONE				"None"
62  #define NOTUNDERSTOOD			"NotUnderstood"
63  #define REJECT				"Reject"
64  
65  /*
66   * The Parameter Names.
67   */
68  #define AUTHMETHOD			"AuthMethod"
69  #define HEADERDIGEST			"HeaderDigest"
70  #define DATADIGEST			"DataDigest"
71  #define MAXCONNECTIONS			"MaxConnections"
72  #define SENDTARGETS			"SendTargets"
73  #define TARGETNAME			"TargetName"
74  #define INITIATORNAME			"InitiatorName"
75  #define TARGETALIAS			"TargetAlias"
76  #define INITIATORALIAS			"InitiatorAlias"
77  #define TARGETADDRESS			"TargetAddress"
78  #define TARGETPORTALGROUPTAG		"TargetPortalGroupTag"
79  #define INITIALR2T			"InitialR2T"
80  #define IMMEDIATEDATA			"ImmediateData"
81  #define MAXRECVDATASEGMENTLENGTH	"MaxRecvDataSegmentLength"
82  #define MAXXMITDATASEGMENTLENGTH	"MaxXmitDataSegmentLength"
83  #define MAXBURSTLENGTH			"MaxBurstLength"
84  #define FIRSTBURSTLENGTH		"FirstBurstLength"
85  #define DEFAULTTIME2WAIT		"DefaultTime2Wait"
86  #define DEFAULTTIME2RETAIN		"DefaultTime2Retain"
87  #define MAXOUTSTANDINGR2T		"MaxOutstandingR2T"
88  #define DATAPDUINORDER			"DataPDUInOrder"
89  #define DATASEQUENCEINORDER		"DataSequenceInOrder"
90  #define ERRORRECOVERYLEVEL		"ErrorRecoveryLevel"
91  #define SESSIONTYPE			"SessionType"
92  #define IFMARKER			"IFMarker"
93  #define OFMARKER			"OFMarker"
94  #define IFMARKINT			"IFMarkInt"
95  #define OFMARKINT			"OFMarkInt"
96  
97  /*
98   * Parameter names of iSCSI Extentions for RDMA (iSER).  See RFC-5046
99   */
100  #define RDMAEXTENSIONS			"RDMAExtensions"
101  #define INITIATORRECVDATASEGMENTLENGTH	"InitiatorRecvDataSegmentLength"
102  #define TARGETRECVDATASEGMENTLENGTH	"TargetRecvDataSegmentLength"
103  
104  /*
105   * For AuthMethod.
106   */
107  #define KRB5				"KRB5"
108  #define SPKM1				"SPKM1"
109  #define SPKM2				"SPKM2"
110  #define SRP				"SRP"
111  #define CHAP				"CHAP"
112  
113  /*
114   * Initial values for Parameter Negotiation.
115   */
116  #define INITIAL_AUTHMETHOD			CHAP
117  #define INITIAL_HEADERDIGEST			"CRC32C,None"
118  #define INITIAL_DATADIGEST			"CRC32C,None"
119  #define INITIAL_MAXCONNECTIONS			"1"
120  #define INITIAL_SENDTARGETS			ALL
121  #define INITIAL_TARGETNAME			"LIO.Target"
122  #define INITIAL_INITIATORNAME			"LIO.Initiator"
123  #define INITIAL_TARGETALIAS			"LIO Target"
124  #define INITIAL_INITIATORALIAS			"LIO Initiator"
125  #define INITIAL_TARGETADDRESS			"0.0.0.0:0000,0"
126  #define INITIAL_TARGETPORTALGROUPTAG		"1"
127  #define INITIAL_INITIALR2T			YES
128  #define INITIAL_IMMEDIATEDATA			YES
129  #define INITIAL_MAXRECVDATASEGMENTLENGTH	"8192"
130  /*
131   * Match outgoing MXDSL default to incoming Open-iSCSI default
132   */
133  #define INITIAL_MAXXMITDATASEGMENTLENGTH	"262144"
134  #define INITIAL_MAXBURSTLENGTH			"262144"
135  #define INITIAL_FIRSTBURSTLENGTH		"65536"
136  #define INITIAL_DEFAULTTIME2WAIT		"2"
137  #define INITIAL_DEFAULTTIME2RETAIN		"20"
138  #define INITIAL_MAXOUTSTANDINGR2T		"1"
139  #define INITIAL_DATAPDUINORDER			YES
140  #define INITIAL_DATASEQUENCEINORDER		YES
141  #define INITIAL_ERRORRECOVERYLEVEL		"0"
142  #define INITIAL_SESSIONTYPE			NORMAL
143  #define INITIAL_IFMARKER			NO
144  #define INITIAL_OFMARKER			NO
145  #define INITIAL_IFMARKINT			REJECT
146  #define INITIAL_OFMARKINT			REJECT
147  
148  /*
149   * Initial values for iSER parameters following RFC-5046 Section 6
150   */
151  #define INITIAL_RDMAEXTENSIONS			NO
152  #define INITIAL_INITIATORRECVDATASEGMENTLENGTH	"262144"
153  #define INITIAL_TARGETRECVDATASEGMENTLENGTH	"8192"
154  
155  /*
156   * For [Header,Data]Digests.
157   */
158  #define CRC32C				"CRC32C"
159  
160  /*
161   * For SessionType.
162   */
163  #define DISCOVERY			"Discovery"
164  #define NORMAL				"Normal"
165  
166  /*
167   * struct iscsi_param->use
168   */
169  #define USE_LEADING_ONLY		0x01
170  #define USE_INITIAL_ONLY		0x02
171  #define USE_ALL				0x04
172  
173  #define IS_USE_LEADING_ONLY(p)		((p)->use & USE_LEADING_ONLY)
174  #define IS_USE_INITIAL_ONLY(p)		((p)->use & USE_INITIAL_ONLY)
175  #define IS_USE_ALL(p)			((p)->use & USE_ALL)
176  
177  #define SET_USE_INITIAL_ONLY(p)		((p)->use |= USE_INITIAL_ONLY)
178  
179  /*
180   * struct iscsi_param->sender
181   */
182  #define	SENDER_INITIATOR		0x01
183  #define SENDER_TARGET			0x02
184  #define SENDER_BOTH			0x03
185  /* Used in iscsi_check_key() */
186  #define SENDER_RECEIVER			0x04
187  
188  #define IS_SENDER_INITIATOR(p)		((p)->sender & SENDER_INITIATOR)
189  #define IS_SENDER_TARGET(p)		((p)->sender & SENDER_TARGET)
190  #define IS_SENDER_BOTH(p)		((p)->sender & SENDER_BOTH)
191  
192  /*
193   * struct iscsi_param->scope
194   */
195  #define SCOPE_CONNECTION_ONLY		0x01
196  #define SCOPE_SESSION_WIDE		0x02
197  
198  #define IS_SCOPE_CONNECTION_ONLY(p)	((p)->scope & SCOPE_CONNECTION_ONLY)
199  #define IS_SCOPE_SESSION_WIDE(p)	((p)->scope & SCOPE_SESSION_WIDE)
200  
201  /*
202   * struct iscsi_param->phase
203   */
204  #define PHASE_SECURITY			0x01
205  #define PHASE_OPERATIONAL		0x02
206  #define PHASE_DECLARATIVE		0x04
207  #define PHASE_FFP0			0x08
208  
209  #define IS_PHASE_SECURITY(p)		((p)->phase & PHASE_SECURITY)
210  #define IS_PHASE_OPERATIONAL(p)		((p)->phase & PHASE_OPERATIONAL)
211  #define IS_PHASE_DECLARATIVE(p)		((p)->phase & PHASE_DECLARATIVE)
212  #define IS_PHASE_FFP0(p)		((p)->phase & PHASE_FFP0)
213  
214  /*
215   * struct iscsi_param->type
216   */
217  #define TYPE_BOOL_AND			0x01
218  #define TYPE_BOOL_OR			0x02
219  #define TYPE_NUMBER			0x04
220  #define TYPE_NUMBER_RANGE		0x08
221  #define TYPE_STRING			0x10
222  #define TYPE_VALUE_LIST			0x20
223  
224  #define IS_TYPE_BOOL_AND(p)		((p)->type & TYPE_BOOL_AND)
225  #define IS_TYPE_BOOL_OR(p)		((p)->type & TYPE_BOOL_OR)
226  #define IS_TYPE_NUMBER(p)		((p)->type & TYPE_NUMBER)
227  #define IS_TYPE_NUMBER_RANGE(p)		((p)->type & TYPE_NUMBER_RANGE)
228  #define IS_TYPE_STRING(p)		((p)->type & TYPE_STRING)
229  #define IS_TYPE_VALUE_LIST(p)		((p)->type & TYPE_VALUE_LIST)
230  
231  /*
232   * struct iscsi_param->type_range
233   */
234  #define TYPERANGE_BOOL_AND		0x0001
235  #define TYPERANGE_BOOL_OR		0x0002
236  #define TYPERANGE_0_TO_2		0x0004
237  #define TYPERANGE_0_TO_3600		0x0008
238  #define TYPERANGE_0_TO_32767		0x0010
239  #define TYPERANGE_0_TO_65535		0x0020
240  #define TYPERANGE_1_TO_65535		0x0040
241  #define TYPERANGE_2_TO_3600		0x0080
242  #define TYPERANGE_512_TO_16777215	0x0100
243  #define TYPERANGE_AUTH			0x0200
244  #define TYPERANGE_DIGEST		0x0400
245  #define TYPERANGE_ISCSINAME		0x0800
246  #define TYPERANGE_SESSIONTYPE		0x1000
247  #define TYPERANGE_TARGETADDRESS		0x2000
248  #define TYPERANGE_UTF8			0x4000
249  
250  #define IS_TYPERANGE_0_TO_2(p)		((p)->type_range & TYPERANGE_0_TO_2)
251  #define IS_TYPERANGE_0_TO_3600(p)	((p)->type_range & TYPERANGE_0_TO_3600)
252  #define IS_TYPERANGE_0_TO_32767(p)	((p)->type_range & TYPERANGE_0_TO_32767)
253  #define IS_TYPERANGE_0_TO_65535(p)	((p)->type_range & TYPERANGE_0_TO_65535)
254  #define IS_TYPERANGE_1_TO_65535(p)	((p)->type_range & TYPERANGE_1_TO_65535)
255  #define IS_TYPERANGE_2_TO_3600(p)	((p)->type_range & TYPERANGE_2_TO_3600)
256  #define IS_TYPERANGE_512_TO_16777215(p)	((p)->type_range & \
257  						TYPERANGE_512_TO_16777215)
258  #define IS_TYPERANGE_AUTH_PARAM(p)	((p)->type_range & TYPERANGE_AUTH)
259  #define IS_TYPERANGE_DIGEST_PARAM(p)	((p)->type_range & TYPERANGE_DIGEST)
260  #define IS_TYPERANGE_SESSIONTYPE(p)	((p)->type_range & \
261  						TYPERANGE_SESSIONTYPE)
262  
263  /*
264   * struct iscsi_param->state
265   */
266  #define PSTATE_ACCEPTOR			0x01
267  #define PSTATE_NEGOTIATE		0x02
268  #define PSTATE_PROPOSER			0x04
269  #define PSTATE_IRRELEVANT		0x08
270  #define PSTATE_REJECT			0x10
271  #define PSTATE_REPLY_OPTIONAL		0x20
272  #define PSTATE_RESPONSE_GOT		0x40
273  #define PSTATE_RESPONSE_SENT		0x80
274  
275  #define IS_PSTATE_ACCEPTOR(p)		((p)->state & PSTATE_ACCEPTOR)
276  #define IS_PSTATE_NEGOTIATE(p)		((p)->state & PSTATE_NEGOTIATE)
277  #define IS_PSTATE_PROPOSER(p)		((p)->state & PSTATE_PROPOSER)
278  #define IS_PSTATE_IRRELEVANT(p)		((p)->state & PSTATE_IRRELEVANT)
279  #define IS_PSTATE_REJECT(p)		((p)->state & PSTATE_REJECT)
280  #define IS_PSTATE_REPLY_OPTIONAL(p)	((p)->state & PSTATE_REPLY_OPTIONAL)
281  #define IS_PSTATE_RESPONSE_GOT(p)	((p)->state & PSTATE_RESPONSE_GOT)
282  #define IS_PSTATE_RESPONSE_SENT(p)	((p)->state & PSTATE_RESPONSE_SENT)
283  
284  #define SET_PSTATE_ACCEPTOR(p)		((p)->state |= PSTATE_ACCEPTOR)
285  #define SET_PSTATE_NEGOTIATE(p)		((p)->state |= PSTATE_NEGOTIATE)
286  #define SET_PSTATE_PROPOSER(p)		((p)->state |= PSTATE_PROPOSER)
287  #define SET_PSTATE_IRRELEVANT(p)	((p)->state |= PSTATE_IRRELEVANT)
288  #define SET_PSTATE_REJECT(p)		((p)->state |= PSTATE_REJECT)
289  #define SET_PSTATE_REPLY_OPTIONAL(p)	((p)->state |= PSTATE_REPLY_OPTIONAL)
290  #define SET_PSTATE_RESPONSE_GOT(p)	((p)->state |= PSTATE_RESPONSE_GOT)
291  #define SET_PSTATE_RESPONSE_SENT(p)	((p)->state |= PSTATE_RESPONSE_SENT)
292  
293  #endif /* ISCSI_PARAMETERS_H */
294