Print this page
NEX-15582 libipmi doesn't support Get Chassis Status IPMI command
Reviewed by: Dan Fields <dan.fields@nexenta.com>
8963 default chunk size used by ipmi_fru_read() is too large for some SP's
Author: Rob Johnston <rob.johnston@joyent.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
8967 libipmi: add support for GET_CHASSIS_STATUS command
8974 fac_prov_ipmi should support binding by entity id and instance
8975 ipmi topo plugin should automatically enumerate sensors on nodes it enumerates
8976 ipmi enumerator should include FRU identity information in FMRI authority
8977 ipmi enumerator doesn't always enumerate nested entities
8978 Add topo facility method for controlling chassis ident indicator
Author: Rob Johnston <rob.johnston@joyent.com>
Reviewed by: Yuri Pankov <yuripv@icloud.com>
Reviewed by: Ben Sims <bensims@gmail.com>
Approved by: Dan McDonald <danmcd@joyent.com>
NEX-15955 Support for more than 255 iSCSI Targets
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
NEX-15955 Support for more than 255 iSCSI Targets
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
NEX-3746 Panic seen if iSCSI Initiator sends a SCSI Response packet to target
NEX-3777 COMSTAR iscsi/io test can panic the target running 5.0
NEX-3785 This is on 5.0 release and iSCSI target can panic while running iSCSI mpxio disable test
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
NEX-3177 enums and string arrays required to be in sync.
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Steve Peng <steve.peng@nexenta.com>
NEX-2359 iSCSI target connection handling is missing refcount audit information
SUP-776 iSCSI target portals not isolating IQNs on different subnets
| Split |
Close |
| Expand all |
| Collapse all |
--- old/usr/src/uts/common/io/comstar/port/iscsit/iscsit.h
+++ new/usr/src/uts/common/io/comstar/port/iscsit/iscsit.h
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
|
↓ open down ↓ |
13 lines elided |
↑ open up ↑ |
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21
22 22 /*
23 23 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
24 - * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
24 + * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
25 25 * Copyright (c) 2017, Joyent, Inc. All rights reserved.
26 26 */
27 27
28 28 #ifndef _ISCSIT_H_
29 29 #define _ISCSIT_H_
30 30
31 31 #include <sys/iscsit/iscsi_if.h>
32 32 #include <sys/iscsit/iscsit_common.h>
33 33
34 34 #include "iscsit_authclient.h"
35 35
36 36 /*
37 37 * For some reason iscsi_protocol.h lists the max version as "0x02" and the
38 38 * min version as "0x00". RFC3720 clearly states that the current version
39 39 * number is 0x00 so that is what we will use.
40 40 */
41 41 #define ISCSIT_MIN_VERSION 0x00
42 42 #define ISCSIT_MAX_VERSION 0x00
43 43 #define ISCSIT_MAX_CONNECTIONS 32 /* MC/S support */
44 44 #define ISCSIT_MAX_RECV_DATA_SEGMENT_LENGTH (32*1024)
45 45 #define ISCSIT_MAX_BURST_LENGTH (1024*1024)
46 46 #define ISCSIT_MAX_FIRST_BURST_LENGTH ISCSI_DEFAULT_FIRST_BURST_LENGTH
47 47 #define ISCSIT_MAX_TIME2WAIT ISCSI_MAX_TIME2WAIT
48 48 #define ISCSIT_MAX_TIME2RETAIN ISCSI_DEFAULT_TIME_TO_RETAIN
|
↓ open down ↓ |
14 lines elided |
↑ open up ↑ |
49 49 #define ISCSIT_MAX_OUTSTANDING_R2T ISCSI_DEFAULT_MAX_OUT_R2T
50 50 #define ISCSIT_MAX_ERROR_RECOVERY_LEVEL 0
51 51 #define ISCSIT_MAX_OUTSTANDING_UNEXPECTED_PDUS 0
52 52
53 53 #define ISCSIT_DEFAULT_TPG "iscsit-default-tpg"
54 54 #define ISCSIT_DEFAULT_TPGT 1
55 55
56 56 #define ISCSI_MAX_TSIH 0xffff
57 57 #define ISCSI_UNSPEC_TSIH 0
58 58
59 -/* Max targets per system */
60 -#define ISCSIT_MAX_TARGETS 1024
61 -
62 59 #define ISCSIT_MAX_WINDOW 1024
63 60 #define ISCSIT_RXPDU_QUEUE_LEN 2048
64 61
65 62 /*
66 63 * MC/S: A timeout is maintained to recover from lost CmdSN (holes in the
67 64 * CmdSN ordering). When the timeout is reached, the ExpCmdSN is advanced
68 65 * past the hole to continue processing the queued commands. This value is
69 66 * system-tunable (volatile rxpdu_queue_threshold) and should be in the
70 67 * range from 5 to 30 seconds.
71 68 */
72 69 #define ISCSIT_RXPDU_QUEUE_THRESHOLD 5 /* 5 seconds */
73 70 #define ISCSIT_RXPDU_QUEUE_MONITOR_INTERVAL 5 /* 5 seconds */
74 71
75 72 /* Time in seconds to wait between calls to stmf_deregister_local_port */
76 73 #define TGT_DEREG_RETRY_SECONDS 1
77 74
78 75 #define ISCSIT_GLOBAL_LOCK(rw) rw_enter(&iscsit_global.global_rwlock, (rw))
79 76 #define ISCSIT_GLOBAL_UNLOCK() rw_exit(&iscsit_global.global_rwlock)
80 77
81 78 /* Circular buffer to hold the out-of-order PDUs in MC/S */
82 79 typedef struct {
83 80 idm_pdu_t *cb_buffer[ISCSIT_RXPDU_QUEUE_LEN];
84 81 int cb_num_elems;
85 82 } iscsit_cbuf_t;
86 83
87 84 /*
88 85 * Used for serial number arithmetic (RFC 1982)
89 86 */
90 87 #define ISCSIT_SNA32_CHECK 0x80000000
91 88
92 89 typedef struct {
93 90 char tpg_name[MAX_TPG_NAMELEN];
94 91 kmutex_t tpg_mutex;
95 92 idm_refcnt_t tpg_refcnt;
96 93 int tpg_online;
97 94 avl_tree_t tpg_portal_list;
98 95 avl_node_t tpg_global_ln;
99 96 list_node_t tpg_delete_ln;
100 97 } iscsit_tpg_t;
101 98
102 99 #define IS_DEFAULT_TPGT(TPGT) \
103 100 (((TPGT) != NULL) && \
104 101 ((TPGT)->tpgt_tpg == iscsit_global.global_default_tpg))
105 102
106 103 typedef struct {
107 104 iscsit_tpg_t *tpgt_tpg;
108 105 idm_refcnt_t tpgt_refcnt;
109 106 avl_node_t tpgt_tgt_ln;
110 107 list_node_t tpgt_delete_ln;
111 108 uint16_t tpgt_tag;
112 109 boolean_t tpgt_needs_tpg_offline;
113 110 } iscsit_tpgt_t;
114 111
115 112 typedef struct {
116 113 struct sockaddr_storage portal_addr;
|
↓ open down ↓ |
45 lines elided |
↑ open up ↑ |
117 114 int portal_online;
118 115 idm_refcnt_t portal_refcnt;
119 116 avl_node_t portal_tpg_ln;
120 117 iscsit_tpg_t *portal_tpg;
121 118 idm_svc_t *portal_svc;
122 119 boolean_t portal_default;
123 120 void *portal_isns;
124 121 } iscsit_portal_t;
125 122
126 123
124 +#define TGT_STATE_LIST() \
125 + item(TS_UNDEFINED) \
126 + item(TS_CREATED) \
127 + item(TS_ONLINING) \
128 + item(TS_ONLINE) \
129 + item(TS_STMF_ONLINE) \
130 + item(TS_DELETING_NEED_OFFLINE) \
131 + item(TS_OFFLINING) \
132 + item(TS_OFFLINE) \
133 + item(TS_STMF_OFFLINE) \
134 + item(TS_DELETING_STMF_DEREG) \
135 + item(TS_DELETING_STMF_DEREG_FAIL) \
136 + item(TS_DELETING) \
137 + item(TS_MAX_STATE)
138 +
127 139 /* Target states and events, update iscsit_ts_name table whenever modified */
128 140 typedef enum {
129 - TS_UNDEFINED = 0,
130 - TS_CREATED,
131 - TS_ONLINING,
132 - TS_ONLINE,
133 - TS_STMF_ONLINE,
134 - TS_DELETING_NEED_OFFLINE,
135 - TS_OFFLINING,
136 - TS_OFFLINE,
137 - TS_STMF_OFFLINE,
138 - TS_DELETING_STMF_DEREG,
139 - TS_DELETING_STMF_DEREG_FAIL,
140 - TS_DELETING,
141 - TS_MAX_STATE
141 +#define item(a) a,
142 + TGT_STATE_LIST()
143 +#undef item
142 144 } iscsit_tgt_state_t;
143 145
144 146 #ifdef ISCSIT_TGT_SM_STRINGS
145 -static const char *iscsit_ts_name[TS_MAX_STATE+1] = {
146 - "TS_UNDEFINED",
147 - "TS_CREATED",
148 - "TS_ONLINING",
149 - "TS_ONLINE",
150 - "TS_STMF_ONLINE",
151 - "TS_DELETING_NEED_OFFLINE",
152 - "TS_OFFLINING",
153 - "TS_OFFLINE",
154 - "TS_STMF_OFFLINE",
155 - "TS_DELETING_STMF_DEREG",
156 - "TS_DELETING_STMF_DEREG_FAIL",
157 - "TS_DELETING",
158 - "TS_MAX_STATE"
147 +static const char *iscsit_ts_name[TS_MAX_STATE + 1] = {
148 +#define item(a) #a,
149 + TGT_STATE_LIST()
150 +#undef item
159 151 };
160 152 #endif
161 153
154 +#define TGT_EVENT_LIST() \
155 + item(TE_UNDEFINED) \
156 + item(TE_STMF_ONLINE_REQ) \
157 + item(TE_ONLINE_SUCCESS) \
158 + item(TE_ONLINE_FAIL) \
159 + item(TE_STMF_ONLINE_COMPLETE_ACK) \
160 + item(TE_STMF_OFFLINE_REQ) \
161 + item(TE_OFFLINE_COMPLETE) \
162 + item(TE_STMF_OFFLINE_COMPLETE_ACK) \
163 + item(TE_DELETE) \
164 + item(TE_STMF_DEREG_SUCCESS) \
165 + item(TE_STMF_DEREG_FAIL) \
166 + item(TE_STMF_DEREG_RETRY) \
167 + item(TE_WAIT_REF_COMPLETE) \
168 + item(TE_MAX_EVENT)
169 +
162 170 typedef enum {
163 - TE_UNDEFINED = 0,
164 - TE_STMF_ONLINE_REQ,
165 - TE_ONLINE_SUCCESS,
166 - TE_ONLINE_FAIL,
167 - TE_STMF_ONLINE_COMPLETE_ACK,
168 - TE_STMF_OFFLINE_REQ,
169 - TE_OFFLINE_COMPLETE,
170 - TE_STMF_OFFLINE_COMPLETE_ACK,
171 - TE_DELETE,
172 - TE_STMF_DEREG_SUCCESS,
173 - TE_STMF_DEREG_FAIL,
174 - TE_STMF_DEREG_RETRY,
175 - TE_WAIT_REF_COMPLETE,
176 - TE_MAX_EVENT
171 +#define item(a) a,
172 + TGT_EVENT_LIST()
173 +#undef item
177 174 } iscsit_tgt_event_t;
178 175
179 176 #ifdef ISCSIT_TGT_SM_STRINGS
180 -static const char *iscsit_te_name[TE_MAX_EVENT+1] = {
181 - "TE_UNDEFINED",
182 - "TE_STMF_ONLINE_REQ",
183 - "TE_ONLINE_SUCCESS",
184 - "TE_ONLINE_FAIL",
185 - "TE_STMF_ONLINE_COMPLETE_ACK",
186 - "TE_STMF_OFFLINE_REQ",
187 - "TE_OFFLINE_COMPLETE",
188 - "TE_STMF_OFFLINE_COMPLETE_ACK",
189 - "TE_DELETE",
190 - "TE_STMF_DEREG_SUCCESS",
191 - "TE_STMF_DEREG_FAIL",
192 - "TE_STMF_DEREG_RETRY",
193 - "TE_WAIT_REF_COMPLETE",
194 - "TE_MAX_EVENT"
177 +static const char *iscsit_te_name[TE_MAX_EVENT + 1] = {
178 +#define item(a) #a,
179 + TGT_EVENT_LIST()
180 +#undef item
195 181 };
196 182 #endif
197 183
198 184 typedef struct {
199 185 char *target_name;
200 186 nvlist_t *target_props;
201 187 kmutex_t target_mutex;
202 188 idm_refcnt_t target_refcnt;
203 189 idm_refcnt_t target_sess_refcnt;
204 190 avl_tree_t target_tpgt_list;
205 191 avl_tree_t target_sess_list;
206 192 avl_node_t target_global_ln;
207 193 avl_node_t target_global_deleted_ln;
208 194 /* STMF lport == iSCSI target */
209 195 scsi_devid_desc_t *target_devid;
210 196 stmf_local_port_t *target_stmf_lport;
211 197 uint8_t target_stmf_lport_registered;
212 198
213 199 /* Target state */
214 200 boolean_t target_sm_busy;
215 201 boolean_t target_deleting;
216 202 iscsit_tgt_state_t target_state;
217 203 iscsit_tgt_state_t target_last_state;
218 204 sm_audit_buf_t target_state_audit;
219 205 list_t target_events;
220 206 uint64_t target_generation;
221 207 } iscsit_tgt_t;
222 208
223 209 typedef struct {
224 210 char ini_name[MAX_ISCSI_NODENAMELEN];
225 211 nvlist_t *ini_props;
226 212 avl_node_t ini_global_ln;
227 213 } iscsit_ini_t;
228 214
229 215 /*
230 216 * iSCSI Auth Information
231 217 */
232 218 typedef struct conn_auth {
233 219 char ca_tgt_chapuser[iscsitAuthStringMaxLength];
234 220 uint8_t ca_tgt_chapsecret[iscsitAuthStringMaxLength];
235 221 int ca_tgt_chapsecretlen;
236 222
237 223 char ca_ini_chapuser[iscsitAuthStringMaxLength];
238 224 uint8_t ca_ini_chapsecret[iscsitAuthStringMaxLength];
239 225 int ca_ini_chapsecretlen;
240 226
241 227 /* RADIUS authentication information */
242 228 boolean_t ca_use_radius;
243 229 struct sockaddr_storage ca_radius_server;
244 230 uint8_t ca_radius_secret[iscsitAuthStringMaxLength];
245 231 int ca_radius_secretlen;
246 232
247 233 /* authentication method list */
248 234 iscsit_auth_method_t ca_method_valid_list[iscsitAuthMethodMaxCount];
249 235
250 236 /* Target alias */
251 237 char ca_tgt_alias[MAX_ISCSI_NODENAMELEN];
252 238 } conn_auth_t;
253 239
254 240 /*
255 241 * We have three state machines (so far) between the IDM connection state
256 242 * machine, the session state machine, and the login state machine. All
257 243 * of these states have some concept of "full feature mode". It's going
258 244 * to be obnoxious if we use a mixture of these "ffp" representations
259 245 * since it will be difficult to ensure the three state machines
260 246 * transition at exactly the same time. We should drive decisions that
261 247 * depend on FFP from the IDM state machine which is actually snooping
262 248 * the iSCSI PDU's and will always transition at the correct time.
263 249 *
264 250 * A consequence of this approach is that there is a window just after
265 251 * login completes where we may get a SCSI request but the session
266 252 * or login state machine has not quite transitioned to "FFP". Whether
267 253 * this is a problem depends on how we use those state machines. This
268 254 * is what we should use them for:
269 255 *
270 256 * IDM Connection state machine - Decisions related to command processing
271 257 * including whether a connection is in FFP
272 258 *
273 259 * Session state machine - Summarize the state of all available connections
274 260 * for the purposes of ERL1, ERL2 and MC/S. A session in LOGGED_IN state
275 261 * should always have at least one FFP connection but there may be a brief
276 262 * window where a session in ACTIVE might have one or more FFP connections
|
↓ open down ↓ |
72 lines elided |
↑ open up ↑ |
277 263 * even though ACTIVE is not strictly an FFP state according to the RFC.
278 264 *
279 265 * Login state machine -- drive the login process, collect negotiated
280 266 * parameters. Another side effect of this approach is that we may get
281 267 * the "notify ffp" callback from the IDM connection state machine before
282 268 * the login state machine has actually transitioned to FFP state.
283 269 */
284 270
285 271 struct iscsit_conn_s;
286 272
273 +/* Add new session states above SS_MAX_STATE */
274 +#define SESSION_STATE_LIST() \
275 + item(SS_UNDEFINED) \
276 + item(SS_Q1_FREE) \
277 + item(SS_Q2_ACTIVE) \
278 + item(SS_Q3_LOGGED_IN) \
279 + item(SS_Q4_FAILED) \
280 + item(SS_Q5_CONTINUE) \
281 + item(SS_Q6_DONE) \
282 + item(SS_Q7_ERROR) \
283 + item(SS_MAX_STATE)
284 +
287 285 /* Update iscsit_ss_name table whenever session states are modified */
288 286 typedef enum {
289 - SS_UNDEFINED = 0,
290 - SS_Q1_FREE,
291 - SS_Q2_ACTIVE,
292 - SS_Q3_LOGGED_IN,
293 - SS_Q4_FAILED,
294 - SS_Q5_CONTINUE,
295 - SS_Q6_DONE,
296 - SS_Q7_ERROR,
297 - /* Add new session states above SS_MAX_STATE */
298 - SS_MAX_STATE
287 +#define item(a) a,
288 + SESSION_STATE_LIST()
289 +#undef item
299 290 } iscsit_session_state_t;
300 291
301 292 #ifdef ISCSIT_SESS_SM_STRINGS
302 293 /* An array of state text values, for use in logging state transitions */
303 -static const char *iscsit_ss_name[SS_MAX_STATE+1] = {
304 - "SS_UNDEFINED",
305 - "SS_Q1_FREE",
306 - "SS_Q2_ACTIVE",
307 - "SS_Q3_LOGGED_IN",
308 - "SS_Q4_FAILED",
309 - "SS_Q5_CONTINUE",
310 - "SS_Q6_DONE",
311 - "SS_Q7_ERROR",
312 - "SS_MAX_STATE"
294 +static const char *iscsit_ss_name[SS_MAX_STATE + 1] = {
295 +#define item(a) #a,
296 + SESSION_STATE_LIST()
297 +#undef item
313 298 };
314 299 #endif
315 300
301 +/* Add new events above SE_MAX_EVENT */
302 +#define SESSION_EVENT_LIST() \
303 + item(SE_UNDEFINED) \
304 + item(SE_CONN_IN_LOGIN) /* From login state machine */ \
305 + item(SE_CONN_LOGGED_IN) /* FFP enabled client notification */ \
306 + item(SE_CONN_FFP_FAIL) /* FFP disabled client notification */ \
307 + item(SE_CONN_FFP_DISABLE) /* FFP disabled client notification */ \
308 + item(SE_CONN_FAIL) /* Conn destroy client notification */ \
309 + item(SE_SESSION_CLOSE) /* FFP disabled client notification */ \
310 + item(SE_SESSION_REINSTATE) /* From login state machine */ \
311 + item(SE_SESSION_TIMEOUT) /* Internal */ \
312 + item(SE_SESSION_CONTINUE) /* From login state machine */ \
313 + item(SE_SESSION_CONTINUE_FAIL) /* From login state machine? */ \
314 + item(SE_MAX_EVENT)
315 +
316 316 /* Update iscsit_se_name table whenever session events are modified */
317 317 typedef enum {
318 - SE_UNDEFINED = 0,
319 - SE_CONN_IN_LOGIN, /* From login state machine */
320 - SE_CONN_LOGGED_IN, /* FFP enabled client notification */
321 - SE_CONN_FFP_FAIL, /* FFP disabled client notification */
322 - SE_CONN_FFP_DISABLE, /* FFP disabled client notification */
323 - SE_CONN_FAIL, /* Conn destroy client notification */
324 - SE_SESSION_CLOSE, /* FFP disabled client notification */
325 - SE_SESSION_REINSTATE, /* From login state machine */
326 - SE_SESSION_TIMEOUT, /* Internal */
327 - SE_SESSION_CONTINUE, /* From login state machine */
328 - SE_SESSION_CONTINUE_FAIL, /* From login state machine? */
329 - /* Add new events above SE_MAX_EVENT */
330 - SE_MAX_EVENT
318 +#define item(a) a,
319 + SESSION_EVENT_LIST()
320 +#undef item
331 321 } iscsit_session_event_t;
332 322
333 323 #ifdef ISCSIT_SESS_SM_STRINGS
334 324 /* An array of event text values, for use in logging events */
335 -static const char *iscsit_se_name[SE_MAX_EVENT+1] = {
336 - "SE_UNDEFINED",
337 - "SE_CONN_IN_LOGIN",
338 - "SE_CONN_LOGGED_IN",
339 - "SE_CONN_FFP_FAIL",
340 - "SE_CONN_FFP_DISABLE",
341 - "SE_CONN_FAIL",
342 - "SE_SESSION_CLOSE",
343 - "SE_SESSION_REINSTATE",
344 - "SE_SESSION_TIMEOUT",
345 - "SE_SESSION_CONTINUE",
346 - "SE_SESSION_CONTINUE_FAIL",
347 - "SE_MAX_EVENT"
325 +static const char *iscsit_se_name[SE_MAX_EVENT + 1] = {
326 +#define item(a) #a,
327 + SESSION_EVENT_LIST()
328 +#undef item
348 329 };
349 330 #endif
350 331
351 332 /*
352 333 * Set in ist_tgt after iscsit_tgt_unbind_sess to differentiate an unbound
353 334 * session from a discovery session.
354 335 */
355 336 #define SESS_UNBOUND_FROM_TGT -1
356 337
357 338 typedef struct {
358 339 stmf_scsi_session_t *ist_stmf_sess;
359 340 stmf_local_port_t *ist_lport;
360 341 iscsit_tgt_t *ist_tgt;
361 342 idm_refcnt_t ist_refcnt;
362 343 kmem_cache_t *ist_task_cache;
363 344 kmutex_t ist_sn_mutex;
364 345 kmutex_t ist_mutex;
365 346 kcondvar_t ist_cv;
366 347 iscsit_session_state_t ist_state;
367 348 iscsit_session_state_t ist_last_state;
368 349 sm_audit_buf_t ist_state_audit;
369 350 boolean_t ist_sm_busy;
370 351 boolean_t ist_sm_complete;
371 352 boolean_t ist_admin_close;
372 353 list_t ist_events;
373 354 int ist_conn_count;
374 355 int ist_ffp_conn_count;
375 356 struct iscsit_conn_s *ist_failed_conn;
376 357 timeout_id_t ist_state_timeout;
377 358 list_t ist_conn_list;
378 359 avl_node_t ist_tgt_ln;
379 360 char *ist_initiator_name;
380 361 char *ist_initiator_alias;
381 362 char *ist_target_name;
|
↓ open down ↓ |
24 lines elided |
↑ open up ↑ |
382 363 char *ist_target_alias;
383 364 uint8_t ist_isid[ISCSI_ISID_LEN];
384 365 uint16_t ist_tsih;
385 366 uint16_t ist_tpgt_tag;
386 367 uint32_t ist_expcmdsn;
387 368 uint32_t ist_maxcmdsn;
388 369 avl_tree_t ist_task_list;
389 370 iscsit_cbuf_t *ist_rxpdu_queue;
390 371 } iscsit_sess_t;
391 372
373 +/* Add new login states above ILS_MAX_STATE */
374 +#define LOGIN_STATE_LIST() \
375 + item(ILS_UNDEFINED) \
376 + item(ILS_LOGIN_INIT) \
377 + item(ILS_LOGIN_WAITING) /* Waiting for more login PDU's */ \
378 + item(ILS_LOGIN_PROCESSING) /* Processing login request */ \
379 + item(ILS_LOGIN_RESPONDING) /* Sending login response */ \
380 + item(ILS_LOGIN_RESPONDED) /* Sent login response (no trans. to FFP) */ \
381 + item(ILS_LOGIN_FFP) /* Sending last login PDU for final response */ \
382 + item(ILS_LOGIN_DONE) /* Last login PDU sent (so we can free it) */ \
383 + item(ILS_LOGIN_ERROR) /* Login error, login failed */ \
384 + item(ILS_MAX_STATE)
385 +
392 386 /* Update iscsit_ils_name table whenever login states are modified */
393 387 typedef enum {
394 - ILS_UNDEFINED = 0,
395 - ILS_LOGIN_INIT,
396 - ILS_LOGIN_WAITING, /* Waiting for more login PDU's */
397 - ILS_LOGIN_PROCESSING, /* Processing login request */
398 - ILS_LOGIN_RESPONDING, /* Sending login response */
399 - ILS_LOGIN_RESPONDED, /* Sent login response (no trans. to FFP) */
400 - ILS_LOGIN_FFP, /* Sending last login PDU for final response */
401 - ILS_LOGIN_DONE, /* Last login PDU sent (so we can free it) */
402 - ILS_LOGIN_ERROR, /* Login error, login failed */
403 - /* Add new login states above ILS_MAX_STATE */
404 - ILS_MAX_STATE
388 +#define item(a) a,
389 + LOGIN_STATE_LIST()
390 +#undef item
405 391 } iscsit_login_state_t;
406 392
407 393 #ifdef ISCSIT_LOGIN_SM_STRINGS
408 -/* An array of login state text values, for use in logging login progress */
409 -static const char *iscsit_ils_name[ILS_MAX_STATE+1] = {
410 - "ILS_UNDEFINED",
411 - "ILS_LOGIN_INIT",
412 - "ILS_LOGIN_WAITING",
413 - "ILS_LOGIN_PROCESSING",
414 - "ILS_LOGIN_RESPONDING",
415 - "ILS_LOGIN_RESPONDED",
416 - "ILS_LOGIN_FFP",
417 - "ILS_LOGIN_DONE",
418 - "ILS_LOGIN_ERROR",
419 - "ILS_MAX_STATE"
394 +/* An array of login state text values, for use in logging login progess */
395 +static const char *iscsit_ils_name[ILS_MAX_STATE + 1] = {
396 +#define item(a) #a,
397 + LOGIN_STATE_LIST()
398 +#undef item
420 399 };
421 400 #endif
422 401
402 +/* Add new login events above ILE_MAX_EVENT */
403 +#define LOGIN_EVENT_LIST() \
404 + item(ILE_UNDEFINED) \
405 + item(ILE_LOGIN_RCV) \
406 + item(ILE_LOGIN_RESP_READY) \
407 + item(ILE_LOGIN_FFP) \
408 + item(ILE_LOGIN_RESP_COMPLETE) \
409 + item(ILE_LOGIN_ERROR) \
410 + item(ILE_LOGIN_CONN_ERROR) \
411 + item(ILE_MAX_EVENT)
412 +
423 413 /* Update iscsit_ile_name table whenever login events are modified */
424 414 typedef enum {
425 - ILE_UNDEFINED = 0,
426 - ILE_LOGIN_RCV,
427 - ILE_LOGIN_RESP_READY,
428 - ILE_LOGIN_FFP,
429 - ILE_LOGIN_RESP_COMPLETE,
430 - ILE_LOGIN_ERROR,
431 - ILE_LOGIN_CONN_ERROR,
432 - /* Add new login events above ILE_MAX_EVENT */
433 - ILE_MAX_EVENT
415 +#define item(a) a,
416 + LOGIN_EVENT_LIST()
417 +#undef item
434 418 } iscsit_login_event_t;
435 419
436 420 #ifdef ISCSIT_LOGIN_SM_STRINGS
437 -/* An array of login event text values, for use in logging login events */
438 -static const char *iscsit_ile_name[ILE_MAX_EVENT+1] = {
439 - "ILE_UNDEFINED",
440 - "ILE_LOGIN_RCV",
441 - "ILE_LOGIN_RESP_READY",
442 - "ILE_LOGIN_FFP",
443 - "ILE_LOGIN_RESP_COMPLETE",
444 - "ILE_LOGIN_ERROR",
445 - "ILE_LOGIN_CONN_ERROR",
446 - "ILE_MAX_EVENT"
421 +/* An array of login event text values, for use in loggin login events */
422 +static const char *iscsit_ile_name[ILE_MAX_EVENT + 1] = {
423 +#define item(a) #a,
424 + LOGIN_EVENT_LIST()
425 +#undef item
447 426 };
448 427 #endif
449 428
450 429 typedef struct {
451 430 uint32_t op_initial_params_set:1,
452 431 op_discovery_session:1,
453 432 op_initial_r2t:1,
454 433 op_immed_data:1,
455 434 op_data_pdu_in_order:1,
456 435 op_data_sequence_in_order:1,
457 436 op_declarative_params_set:1;
458 437 uint64_t op_max_connections;
459 438 uint64_t op_max_recv_data_segment_length;
460 439 uint64_t op_max_burst_length;
461 440 uint64_t op_first_burst_length;
462 441 uint64_t op_default_time_2_wait;
463 442 uint64_t op_default_time_2_retain;
464 443 uint64_t op_max_outstanding_r2t;
465 444 uint64_t op_error_recovery_level;
466 445 } iscsit_op_params_t;
467 446
468 447 typedef struct {
469 448 iscsit_login_state_t icl_login_state;
470 449 iscsit_login_state_t icl_login_last_state;
471 450 sm_audit_buf_t icl_state_audit;
472 451 boolean_t icl_busy;
473 452 boolean_t icl_login_complete;
474 453 kmutex_t icl_mutex;
475 454 uint32_t icl_login_itt;
476 455 uint8_t icl_login_csg;
477 456 uint8_t icl_login_nsg;
478 457 boolean_t icl_login_transit;
479 458 conn_auth_t icl_auth;
480 459 iscsit_auth_client_t icl_auth_client;
481 460 int icl_auth_pass;
482 461 list_t icl_login_events;
483 462 list_t icl_pdu_list;
484 463 uint16_t icl_tsih;
485 464 uint8_t icl_isid[ISCSI_ISID_LEN];
486 465 uint32_t icl_cmdsn;
487 466 uint16_t icl_tpgt_tag;
488 467 char *icl_target_name;
489 468 char *icl_target_alias;
490 469 char *icl_initiator_name;
491 470 char *icl_login_resp_buf;
492 471 void *icl_login_resp_itb; /* mult-pdu idm buf */
493 472 int icl_login_resp_len; /* For kmem_free */
494 473 int icl_login_resp_valid_len;
495 474 uint8_t icl_login_resp_err_class;
496 475 uint8_t icl_login_resp_err_detail;
497 476 iscsi_login_rsp_hdr_t *icl_login_resp_tmpl;
498 477 nvlist_t *icl_request_nvlist;
499 478 nvlist_t *icl_response_nvlist;
500 479 nvlist_t *icl_negotiated_values;
501 480 } iscsit_conn_login_t;
502 481
503 482 #define SET_LOGIN_ERROR(SLE_ICT, SLE_CLASS, SLE_DETAIL) \
504 483 (SLE_ICT)->ict_login_sm.icl_login_resp_err_class = (SLE_CLASS); \
505 484 (SLE_ICT)->ict_login_sm.icl_login_resp_err_detail = (SLE_DETAIL);
506 485
507 486 typedef struct iscsit_conn_s {
508 487 idm_conn_t *ict_ic;
509 488 iscsit_sess_t *ict_sess;
510 489 kmutex_t ict_mutex;
511 490 idm_refcnt_t ict_refcnt;
512 491 idm_refcnt_t ict_dispatch_refcnt;
513 492 list_node_t ict_sess_ln;
514 493 iscsit_conn_login_t ict_login_sm;
515 494 iscsit_op_params_t ict_op;
516 495 uint16_t ict_cid;
517 496 uint32_t ict_statsn;
518 497 kmutex_t ict_statsn_mutex;
519 498 uint32_t ict_keepalive_ttt;
520 499 struct iscsit_conn_s *ict_reinstate_conn;
521 500 uint32_t ict_reinstating:1,
522 501 ict_lost:1,
523 502 ict_destroyed:1;
524 503 /*
525 504 * Parameters for processing text commands
526 505 */
527 506 char *ict_text_rsp_buf;
528 507 uint32_t ict_text_rsp_len;
529 508 uint32_t ict_text_rsp_valid_len;
530 509 uint32_t ict_text_rsp_off;
531 510 uint32_t ict_text_req_itt; /* from initiator */
532 511 uint32_t ict_text_rsp_ttt;
533 512 } iscsit_conn_t;
534 513
535 514 #define ICT_FLAGS_DISCOVERY 0x00000001
536 515
537 516 typedef struct {
538 517 idm_buf_t *ibuf_idm_buf;
539 518 stmf_data_buf_t *ibuf_stmf_buf;
540 519 idm_pdu_t *ibuf_immed_data_pdu;
541 520 boolean_t ibuf_is_immed;
542 521 } iscsit_buf_t;
543 522
544 523 typedef struct {
545 524 scsi_task_t *it_stmf_task;
546 525 idm_task_t *it_idm_task;
547 526 iscsit_buf_t *it_immed_data;
548 527 iscsit_conn_t *it_ict;
549 528 kmutex_t it_mutex;
550 529 idm_pdu_t *it_tm_pdu;
551 530 uint32_t it_stmf_abort:1,
552 531 it_aborted:1,
553 532 it_active:1,
554 533 it_tm_task:1,
555 534 it_tm_responded:1;
556 535 uint32_t it_cmdsn;
557 536 uint32_t it_itt;
|
↓ open down ↓ |
101 lines elided |
↑ open up ↑ |
558 537 uint32_t it_ttt;
559 538 avl_node_t it_sess_ln;
560 539 } iscsit_task_t;
561 540
562 541 typedef struct iscsit_isns_cfg {
563 542 kmutex_t isns_mutex;
564 543 boolean_t isns_state;
565 544 list_t isns_svrs;
566 545 } iscsit_isns_cfg_t;
567 546
547 +#define SERVICE_ENABLED_LIST() \
548 + item(ISE_UNDEFINED) \
549 + item(ISE_DETACHED) \
550 + item(ISE_DISABLED) \
551 + item(ISE_ENABLING) \
552 + item(ISE_ENABLED) \
553 + item(ISE_BUSY) \
554 + item(ISE_DISABLING)
555 +
568 556 /*
569 557 * State values for the iscsit service
570 558 */
571 559 typedef enum {
572 - ISE_UNDEFINED = 0,
573 - ISE_DETACHED,
574 - ISE_DISABLED,
575 - ISE_ENABLING,
576 - ISE_ENABLED,
577 - ISE_BUSY,
578 - ISE_DISABLING
560 +#define item(a) a,
561 + SERVICE_ENABLED_LIST()
562 +#undef item
579 563 } iscsit_service_enabled_t;
580 564
581 565
582 566 typedef struct {
583 567 iscsit_service_enabled_t global_svc_state;
584 568 dev_info_t *global_dip;
585 569 ldi_ident_t global_li;
586 570 nvlist_t *global_props;
587 571 stmf_port_provider_t *global_pp;
588 572 stmf_dbuf_store_t *global_dbuf_store;
589 573 taskq_t *global_dispatch_taskq;
590 574 idm_refcnt_t global_refcnt;
591 575 avl_tree_t global_discovery_sessions;
592 576 avl_tree_t global_target_list;
593 577 list_t global_deleted_target_list;
594 578 avl_tree_t global_tpg_list;
595 579 avl_tree_t global_ini_list;
596 580 iscsit_tpg_t *global_default_tpg;
597 581 vmem_t *global_tsih_pool;
598 582 iscsit_isns_cfg_t global_isns_cfg;
599 583 iscsi_radius_props_t global_radius_server;
600 584 krwlock_t global_rwlock;
601 585 kmutex_t global_state_mutex;
602 586 } iscsit_global_t;
603 587
604 588 extern iscsit_global_t iscsit_global;
605 589
606 590 void
607 591 iscsit_global_hold();
608 592
609 593 void
610 594 iscsit_global_rele();
611 595
612 596 void
613 597 iscsit_global_wait_ref();
614 598
615 599 idm_status_t
616 600 iscsit_login_sm_init(iscsit_conn_t *ict);
617 601
618 602 void
619 603 iscsit_login_sm_fini(iscsit_conn_t *ict);
620 604
621 605 void
622 606 iscsit_login_sm_event(iscsit_conn_t *ic, iscsit_login_event_t event,
623 607 idm_pdu_t *pdu);
624 608
625 609 void
626 610 iscsit_login_sm_event_locked(iscsit_conn_t *ic, iscsit_login_event_t event,
627 611 idm_pdu_t *pdu);
628 612
629 613 int
630 614 iscsit_is_v4_mapped(struct sockaddr_storage *sa, struct sockaddr_storage *v4sa);
631 615
632 616 void
633 617 iscsit_send_async_event(iscsit_conn_t *ict, uint8_t async_event);
634 618
635 619 void
636 620 iscsit_pdu_tx(idm_pdu_t *pdu);
637 621
638 622 void
639 623 iscsit_send_reject(iscsit_conn_t *ict, idm_pdu_t *rejected_pdu, uint8_t reason);
640 624
641 625 void
642 626 iscsit_text_cmd_fini(iscsit_conn_t *ict);
643 627
644 628 /*
645 629 * IDM conn ops
646 630 */
647 631
648 632 idm_rx_pdu_cb_t iscsit_op_scsi_cmd;
649 633 idm_rx_pdu_cb_t iscsit_rx_pdu;
650 634 idm_rx_pdu_error_cb_t iscsit_rx_pdu_error;
651 635 idm_rx_pdu_cb_t iscsit_rx_scsi_rsp;
652 636 idm_task_cb_t iscsit_task_aborted;
653 637 idm_client_notify_cb_t iscsit_client_notify;
654 638 idm_build_hdr_cb_t iscsit_build_hdr;
655 639 idm_update_statsn_cb_t iscsit_update_statsn;
656 640 idm_keepalive_cb_t iscsit_keepalive;
657 641
658 642 /*
659 643 * lport entry points
660 644 */
661 645 stmf_status_t
662 646 iscsit_xfer_scsi_data(scsi_task_t *task, stmf_data_buf_t *dbuf,
663 647 uint32_t ioflags);
664 648
665 649 stmf_status_t
666 650 iscsit_send_scsi_status(scsi_task_t *task, uint32_t ioflags);
667 651
668 652 void
669 653 iscsit_lport_task_free(scsi_task_t *task);
670 654
671 655 stmf_status_t
672 656 iscsit_abort(stmf_local_port_t *lport, int abort_cmd, void *arg,
673 657 uint32_t flags);
674 658
|
↓ open down ↓ |
86 lines elided |
↑ open up ↑ |
675 659 void
676 660 iscsit_ctl(stmf_local_port_t *lport, int cmd, void *arg);
677 661
678 662 /*
679 663 * Connection functions
680 664 */
681 665 idm_status_t
682 666 iscsit_conn_reinstate(iscsit_conn_t *existing_ict, iscsit_conn_t *ict);
683 667
684 668 void
685 -iscsit_conn_destroy_done(iscsit_conn_t *ict);
686 -
687 -void
688 669 iscsit_conn_set_auth(iscsit_conn_t *ict);
689 670
690 671 void
691 672 iscsit_conn_hold(iscsit_conn_t *ict);
692 673
693 674 void
694 675 iscsit_conn_rele(iscsit_conn_t *ict);
695 676
696 677 void
697 678 iscsit_conn_logout(iscsit_conn_t *ict);
698 679
699 680 /*
700 681 * Session functions
701 682 */
702 683 int
703 684 iscsit_sess_avl_compare(const void *void_sess1, const void *void_sess2);
704 685
705 686 iscsit_sess_t *
706 687 iscsit_sess_create(iscsit_tgt_t *tgt, iscsit_conn_t *ict,
707 688 uint32_t cmdsn, uint8_t *isid, uint16_t tag,
708 689 char *initiator_name, char *target_name,
709 690 uint8_t *error_class, uint8_t *error_detail);
710 691
711 692 void
712 693 iscsit_sess_destroy(iscsit_sess_t *ist);
713 694
714 695 void
715 696 iscsit_sess_hold(iscsit_sess_t *ist);
716 697
717 698 idm_status_t
718 699 iscsit_sess_check_hold(iscsit_sess_t *ist);
719 700
720 701 void
721 702 iscsit_sess_rele(iscsit_sess_t *ist);
722 703
723 704 iscsit_conn_t *
724 705 iscsit_sess_lookup_conn(iscsit_sess_t *ist, uint16_t cid);
725 706
726 707 void
727 708 iscsit_sess_bind_conn(iscsit_sess_t *ist, iscsit_conn_t *ict);
728 709
729 710 void
730 711 iscsit_sess_unbind_conn(iscsit_sess_t *ist, iscsit_conn_t *ict);
731 712
732 713 void
733 714 iscsit_sess_close(iscsit_sess_t *ist);
734 715
735 716 iscsit_sess_t *
736 717 iscsit_sess_reinstate(iscsit_tgt_t *tgt, iscsit_sess_t *ist, iscsit_conn_t *ict,
737 718 uint8_t *error_class, uint8_t *error_detail);
738 719
739 720 void
740 721 iscsit_sess_sm_event(iscsit_sess_t *ist, iscsit_session_event_t event,
741 722 iscsit_conn_t *ict);
742 723
743 724 /*
744 725 * Target, TPGT, TPGT and portal functions
745 726 */
746 727
747 728 void
748 729 iscsit_tgt_sm_event(iscsit_tgt_t *tgt, iscsit_tgt_event_t event);
749 730
750 731 void
751 732 tgt_sm_event_locked(iscsit_tgt_t *tgt, iscsit_tgt_event_t event);
752 733
753 734 it_cfg_status_t
754 735 iscsit_config_merge_tgt(it_config_t *cfg);
755 736
756 737 void
757 738 iscsit_config_destroy_tgts(list_t *tgt_del_list);
758 739
759 740 void
760 741 iscsit_config_destroy_tpgts(list_t *tpgt_del_list);
761 742
762 743 iscsit_tgt_t *
763 744 iscsit_tgt_lookup(char *target_name);
764 745
765 746 iscsit_tgt_t *
766 747 iscsit_tgt_lookup_locked(char *target_name);
767 748
768 749 int
769 750 iscsit_tgt_avl_compare(const void *void_tgt1, const void *void_tgt2);
770 751
771 752 int
772 753 iscsit_tpgt_avl_compare(const void *void_tpgt1, const void *void_tpgt2);
773 754
774 755 void
775 756 iscsit_tgt_hold(iscsit_tgt_t *tgt);
776 757
777 758 void
778 759 iscsit_tgt_rele(iscsit_tgt_t *tgt);
779 760
780 761 iscsit_tpgt_t *
781 762 iscsit_tgt_lookup_tpgt(iscsit_tgt_t *tgt, uint16_t tag);
782 763
783 764 void
784 765 iscsit_tpgt_hold(iscsit_tpgt_t *tpgt);
785 766
786 767 void
787 768 iscsit_tpgt_rele(iscsit_tpgt_t *tpgt);
788 769
789 770 iscsit_portal_t *
790 771 iscsit_tgt_lookup_portal(iscsit_tgt_t *tgt, struct sockaddr_storage *sa,
791 772 iscsit_tpgt_t **output_tpgt);
792 773
793 774 iscsit_sess_t *
794 775 iscsit_tgt_lookup_sess(iscsit_tgt_t *tgt, char *initiator_name,
795 776 uint8_t *isid, uint16_t tsih, uint16_t tag);
796 777
797 778 void
798 779 iscsit_tgt_bind_sess(iscsit_tgt_t *tgt, iscsit_sess_t *sess);
799 780
800 781 void
801 782 iscsit_tgt_unbind_sess(iscsit_tgt_t *tgt, iscsit_sess_t *sess);
802 783
803 784 it_cfg_status_t
804 785 iscsit_config_merge_tpg(it_config_t *cfg, list_t *tpg_del_list);
805 786
806 787 void
807 788 iscsit_config_destroy_tpgs(list_t *tpg_del_list);
808 789
809 790 iscsit_tpg_t *
810 791 iscsit_tpg_lookup(char *tpg_name);
811 792
812 793 int
813 794 iscsit_tpg_avl_compare(const void *void_tpg1, const void *void_tpg2);
814 795
815 796 void
816 797 iscsit_tpg_hold(iscsit_tpg_t *tpg);
817 798
818 799 void
819 800 iscsit_tpg_rele(iscsit_tpg_t *tpg);
820 801
821 802 iscsit_tpg_t *
822 803 iscsit_tpg_createdefault();
823 804
824 805 void
825 806 iscsit_tpg_destroydefault(iscsit_tpg_t *tpg);
826 807
827 808 idm_status_t
828 809 iscsit_tpg_online(iscsit_tpg_t *tpg);
829 810
830 811 void
831 812 iscsit_tpg_offline(iscsit_tpg_t *tpg);
832 813
833 814 iscsit_portal_t *
834 815 iscsit_tpg_portal_lookup(iscsit_tpg_t *tpg, struct sockaddr_storage *sa);
835 816
836 817 void
837 818 iscsit_portal_hold(iscsit_portal_t *portal);
838 819
839 820 void
840 821 iscsit_portal_rele(iscsit_portal_t *portal);
841 822
842 823 it_cfg_status_t
843 824 iscsit_config_merge_ini(it_config_t *cfg);
844 825
845 826 int
846 827 iscsit_ini_avl_compare(const void *void_ini1, const void *void_ini2);
847 828
848 829 iscsit_ini_t *
849 830 iscsit_ini_lookup_locked(char *ini_name);
850 831
851 832 int
852 833 iscsit_portal_avl_compare(const void *void_portal1, const void *void_portal2);
853 834
854 835 int
855 836 iscsit_verify_chap_resp(iscsit_conn_login_t *lsm,
856 837 unsigned int chap_i, uchar_t *chap_c, unsigned int challenge_len,
857 838 uchar_t *chap_r, unsigned int resp_len);
858 839
859 840 void
860 841 iscsit_rxpdu_queue_monitor_start(void);
861 842
862 843 void
863 844 iscsit_rxpdu_queue_monitor_stop(void);
864 845
865 846 #endif /* _ISCSIT_H_ */
|
↓ open down ↓ |
168 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX