1700 Add SCSI UNMAP support
[unleashed.git] / usr / src / uts / common / sys / iscsit / iscsit_common.h
blob4d5d58ef30e22219bbce641cb2b6146d3b234d52
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
22 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
25 #ifndef _ISCSIT_COMMON_H_
26 #define _ISCSIT_COMMON_H_
28 #ifdef _KERNEL
29 #include <sys/nvpair.h>
30 #else
31 #include <libnvpair.h>
32 #endif
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
38 #define ISCSIT_API_VERS0 0
40 #define ISCSIT_MODNAME "iscsit"
41 #define ISCSIT_NODE "/devices/pseudo/iscsit@0:iscsit"
43 typedef enum {
44 ITCFG_SUCCESS = 0,
45 ITCFG_INVALID,
46 ITCFG_TGT_CREATE_ERR,
47 ITCFG_MISC_ERR
48 } it_cfg_status_t;
51 * This structure is passed back to the driver during ISCSIT_IOC_ENABLE_SVC
52 * in order to provide the fully qualified hostname for use as the EID
53 * by iSNS.
56 #define ISCSIT_MAX_HOSTNAME_LEN 256
58 typedef struct iscsit_hostinfo_s {
59 uint32_t length;
60 char fqhn[ISCSIT_MAX_HOSTNAME_LEN];
61 } iscsit_hostinfo_t;
63 #define ISCSIT_IOC_SET_CONFIG 1
64 #define ISCSIT_IOC_GET_STATE 2
65 #define ISCSIT_IOC_ENABLE_SVC 101
66 #define ISCSIT_IOC_DISABLE_SVC 102
68 /* XXX Rationalize these with other error values (used in it_smf.c */
69 #define ITADM_SUCCESS 0
70 #define ITADM_FATAL_ERROR 0x1
71 #define ITADM_NO_MEM 0x2
72 #define ITADM_INVALID 0x4
73 #define ITADM_NODATA 0x8
74 #define ITADM_PERM 0x10
77 #define PROP_AUTH "auth"
78 #define PROP_ALIAS "alias"
79 #define PROP_CHAP_USER "chapuser"
80 #define PROP_CHAP_SECRET "chapsecret"
81 #define PROP_TARGET_CHAP_USER "targetchapuser"
82 #define PROP_TARGET_CHAP_SECRET "targetchapsecret"
83 #define PROP_RADIUS_SERVER "radiusserver"
84 #define PROP_RADIUS_SECRET "radiussecret"
85 #define PROP_ISNS_ENABLED "isns"
86 #define PROP_ISNS_SERVER "isnsserver"
87 #define PROP_OLD_TARGET_NAME "oldtargetname"
89 #define PA_AUTH_RADIUS "radius"
90 #define PA_AUTH_CHAP "chap"
91 #define PA_AUTH_NONE "none"
93 typedef struct {
94 int set_cfg_vers;
95 int set_cfg_pnvlist_len;
96 caddr_t set_cfg_pnvlist;
97 } iscsit_ioc_set_config_t;
99 typedef struct {
100 int getst_vers;
101 int getst_pnvlist_len;
102 char *getst_pnvlist;
103 } iscsit_ioc_getstate_t;
105 #ifdef _SYSCALL32
106 typedef struct {
107 int set_cfg_vers;
108 int set_cfg_pnvlist_len;
109 caddr32_t set_cfg_pnvlist;
110 } iscsit_ioc_set_config32_t;
112 typedef struct {
113 int getst_vers;
114 int getst_pnvlist_len;
115 caddr32_t getst_pnvlist;
116 } iscsit_ioc_getstate32_t;
117 #endif /* _SYSCALL32 */
119 /* Shared user/kernel structures */
120 /* Maximum size of a Target Portal Group name */
121 #define MAX_TPG_NAMELEN 256 /* XXX */
123 /* Maximum size of an iSCSI Target Node name */
124 #define MAX_ISCSI_NODENAMELEN 256 /* XXX */
127 * A target portal group tag is a binding between a target and a target
128 * portal group along with a numerical value associated with that binding.
129 * The numerical identifier is used as the 'target portal group tag' defined
130 * in RFC3720.
132 * tpgt_tpg_name The name of the target portal group associated with
133 * this target portal group tag.
134 * tpgt_generation Generation number which is incremented each time the
135 * structure changes.
136 * tpgt_next Next target portal group tag in th list of target portal
137 * group tags. If tpgt_next is NUL, then this is the last
138 * target portal group in the list.
139 * tpgt_tag A numerical identifier that uniquely identifies a
140 * target portal group within the associated target node.
142 typedef struct it_tpgt_s {
143 char tpgt_tpg_name[MAX_TPG_NAMELEN];
144 uint64_t tpgt_generation;
145 struct it_tpgt_s *tpgt_next;
146 uint16_t tpgt_tag;
147 } it_tpgt_t;
150 * An iSCSI target node is represented by an it_tgt_structure. Each
151 * target node includes a list of associated target portal group tags
152 * and a list of properties.
154 * tgt_name The iSCSI target node name in either IQN or EUI
155 * format (see RFC3720).
156 * tgt_generation Generation number which is incremented each time
157 * the structure changes.
158 * tgt_next Next target in the list of targets. If tgt_next
159 * is NULL, then this is the last target in the list.
160 * tgt_tpgt_list A linked list representing the current target
161 * portal group tags associated with this target.
162 * tgt_tpgt_count The number of currently defined target portal
163 * group tags.
164 * tgt_properties An nvlist representation of the properties
165 * associated with this target. This list can be
166 * manipulated using libnvpair(3lib), and should be
167 * validated and stored using it_tgt_setprop().
169 * Target nvlist Properties:
171 * nvlist Key Type Valid Values
172 * --------------------------------------------------------------------
173 * targetchapuser string any string or "none" to remove
174 * targetchapsecret string string of at least 12 characters
175 * but not more than 255 characters.
176 * secret will be base64 encoded when
177 * stored.
178 * alias string any string or "none" to remove
179 * auth string "radius", "chap", or "none"
182 typedef struct it_tgt_s {
183 char tgt_name[MAX_ISCSI_NODENAMELEN];
184 uint64_t tgt_generation;
185 struct it_tgt_s *tgt_next;
186 it_tpgt_t *tgt_tpgt_list;
187 uint32_t tgt_tpgt_count;
188 nvlist_t *tgt_properties;
189 } it_tgt_t;
192 * A target portal is represented by an IP address and a listening
193 * TCP port.
195 * portal_addr sockaddr_storage structure representing the
196 * IPv4 or IPv6 address and TCP port associated
197 * with the portal.
198 * portal_next Next portal in the list of portals. If
199 * portal_next is NULL, this is the last portal
200 * in the list.
202 typedef struct it_portal_s {
203 struct sockaddr_storage portal_addr;
204 struct it_portal_s *portal_next;
205 } it_portal_t;
208 * A portal is an IP address and TCP port and a portal group is a set
209 * of portals. Each defined portal belongs to exactly one portal group.
210 * Applications can associate a target portal group with a particular
211 * target using a target portal group name. Initiators can only connect
212 * to targets through the portals associated with the target's target
213 * portal group tags.
215 * tpg_name Identifier for the target portal group.
216 * tpg_generation Generation number which is incremented each
217 * time this structure changes.
218 * tpg_next Next target portal group in the list of target
219 * portal groups. If tpg_next is NULL, this is the
220 * last target portal group in the list.
221 * tpg_portal_count Number of it_portal_t structures in the list.
222 * tpg_portal_list Linked list of it_portal_t structures.
224 typedef struct it_tpg_s {
225 char tpg_name[MAX_TPG_NAMELEN];
226 uint64_t tpg_generation;
227 struct it_tpg_s *tpg_next;
228 uint32_t tpg_portal_count;
229 it_portal_t *tpg_portal_list;
230 } it_tpg_t;
233 * A context representing a remote iSCSI initiator node. The purpose
234 * of this structure is to maintain information specific to a remote
235 * initiator such as the CHAP username and CHAP secret.
237 * ini_name the iSCSI node name of the remote initiator.
238 * ini_generation Generation number which is incremented each
239 * time this structure changes.
240 * ini_next Next initiator in the list of initiators.
241 * If ini_next is NULL, this is the last initiator
242 * in the list.
243 * ini_properties Name/Value list containing the properties
244 * associated with the initiator context. This list
245 * can be manipulated using libnvpair(3lib), and should
246 * be validated and stored using it_ini_setprop().
248 * Initiator nvlist Properties:
250 * nvlist Key Type Valid Values
251 * --------------------------------------------------------------------
252 * chapuser string any string
253 * chapsecret string string of at least 12 characters
254 * but not more than 255 characters.
255 * secret will be base64 encoded when
256 * stored.
258 typedef struct it_ini_s {
259 char ini_name[MAX_ISCSI_NODENAMELEN];
260 uint64_t ini_generation;
261 struct it_ini_s *ini_next;
262 nvlist_t *ini_properties;
263 } it_ini_t;
267 * This structure represents a complete configuration for the iscsit
268 * port provider. In addition to the global configuration, it_config_t
269 * includes lists of child objects including targets, target portal
270 * groups and initiator contexts. Each object includes a "generation"
271 * value which is used by the iscsit kernel driver to identify changes
272 * from one configuration update to the next.
274 * stmf_token A uint64_t that contains the value returned from a
275 * successful call to stmfGetProviderDataProt(3STMF).
276 * This token is used to verify that the configuration
277 * data persistently stored in COMSTAR has not been
278 * modified since this version was loaded.
279 * config_version Version number for this configuration structure
280 * config_tgt_list Linked list of target contexts representing the
281 * currently defined targets. Applications can add
282 * targets to or remove targets from this list using
283 * the it_tgt_create and it_tgt_delete functions.
284 * config_tgt_count The number of currently defined targets.
285 * config_tpg_list Linked list of target portal group contexts.
286 * Applications can add or remove target portal groups
287 * to/from this list using the it_tpg_create and
288 * it_tpg_delete functions.
289 * config_tpg_count The number of currently defined target portal groups
290 * config_ini_list Linked list of initiator contexts. Applications
291 * can add initiator contexts or remove initiator
292 * contexts from this list using the it_ini_create
293 * and it_ini_delete functions.
294 * config_ini_count The number of currently defined initiator contexts.
295 * config_global_properties
296 * Name/Value list representing the current global
297 * property settings. This list can be manipulated
298 * using libnvpair(3lib), and should be validated
299 * and stored using it_config_setprop().
300 * config_isns_svr_list
301 * Linked list of currently defined iSNS servers.
302 * Applications can add or remove iSNS servers by
303 * using the it_config_setprop() function and changing
304 * the array of iSNS servers stored in the "isnsserver"
305 * property.
306 * config_isns_svr_count
307 * The number of currently defined iSNS servers.
309 * Global nvlist Properties:
311 * nvlist Key Type Valid Values
312 * --------------------------------------------------------------------
313 * alias string any string
314 * auth string "radius", "chap", or "none"
315 * isns boolean B_TRUE, B_FALSE
316 * isnsserver string array Array of portal specifications of
317 * the form IPaddress:port. Port
318 * is optional; if not specified, the
319 * default iSNS port number of 3205 will
320 * be used. IPv6 addresses should
321 * be enclosed in square brackets '[' ']'.
322 * If "none" is specified, all defined
323 * iSNS servers will be removed from the
324 * configuration.
325 * radiusserver string IPaddress:port specification as
326 * described for 'isnsserver'.
327 * radiussecret string string of at least 12 characters
328 * but not more than 255 characters.
329 * secret will be base64 encoded when
330 * stored.
332 typedef struct it_config_s {
333 uint64_t stmf_token;
334 uint32_t config_version;
335 it_tgt_t *config_tgt_list;
336 uint32_t config_tgt_count;
337 it_tpg_t *config_tpg_list;
338 uint32_t config_tpg_count;
339 it_ini_t *config_ini_list;
340 uint32_t config_ini_count;
341 it_portal_t *config_isns_svr_list;
342 uint32_t config_isns_svr_count;
343 nvlist_t *config_global_properties;
344 } it_config_t;
347 /* Functions to convert iSCSI target structures to/from nvlists. */
349 it_config_to_nv(it_config_t *cfg, nvlist_t **nvl);
352 * nvlist version of config is 3 list-of-list, + 1 proplist. arrays
353 * are interesting, but lists-of-lists are more useful when doing
354 * individual lookups when we later add support for it. Also, no
355 * need to store name in individual struct representation.
358 it_nv_to_config(nvlist_t *nvl, it_config_t **cfg);
361 it_nv_to_tgtlist(nvlist_t *nvl, uint32_t *count, it_tgt_t **tgtlist);
364 it_tgtlist_to_nv(it_tgt_t *tgtlist, nvlist_t **nvl);
367 it_tgt_to_nv(it_tgt_t *tgt, nvlist_t **nvl);
370 it_nv_to_tgt(nvlist_t *nvl, char *name, it_tgt_t **tgt);
373 it_tpgt_to_nv(it_tpgt_t *tpgt, nvlist_t **nvl);
376 it_nv_to_tpgt(nvlist_t *nvl, char *name, it_tpgt_t **tpgt);
379 it_tpgtlist_to_nv(it_tpgt_t *tpgtlist, nvlist_t **nvl);
382 it_nv_to_tpgtlist(nvlist_t *nvl, uint32_t *count, it_tpgt_t **tpgtlist);
385 it_tpg_to_nv(it_tpg_t *tpg, nvlist_t **nvl);
388 it_nv_to_tpg(nvlist_t *nvl, char *name, it_tpg_t **tpg);
391 it_tpglist_to_nv(it_tpg_t *tpglist, nvlist_t **nvl);
394 it_nv_to_tpglist(nvlist_t *nvl, uint32_t *count, it_tpg_t **tpglist);
397 it_ini_to_nv(it_ini_t *ini, nvlist_t **nvl);
400 it_nv_to_ini(nvlist_t *nvl, char *name, it_ini_t **ini);
403 it_inilist_to_nv(it_ini_t *inilist, nvlist_t **nvl);
406 it_nv_to_inilist(nvlist_t *nvl, uint32_t *count, it_ini_t **inilist);
408 it_tgt_t *
409 it_tgt_lookup(it_config_t *cfg, char *tgt_name);
411 it_tpg_t *
412 it_tpg_lookup(it_config_t *cfg, char *tpg_name);
414 it_portal_t *
415 it_sns_svr_lookup(it_config_t *cfg, struct sockaddr_storage *sa);
417 it_portal_t *
418 it_portal_lookup(it_tpg_t *cfg_tpg, struct sockaddr_storage *sa);
421 it_sa_compare(struct sockaddr_storage *sa1, struct sockaddr_storage *sa2);
424 * Convert a sockaddr to the string representation, suitable for
425 * storing in an nvlist or printing out in a list.
428 sockaddr_to_str(struct sockaddr_storage *sa, char **addr);
431 * Convert a char string to a sockaddr structure
433 * default_port should be the port to be used, if not specified
434 * as part of the supplied string 'arg'.
436 struct sockaddr_storage *
437 it_common_convert_sa(char *arg, struct sockaddr_storage *buf,
438 uint32_t default_port);
441 * Convert an string array of IP-addr:port to a portal list
444 it_array_to_portallist(char **arr, uint32_t count, uint32_t default_port,
445 it_portal_t **portallist, uint32_t *list_count);
448 * Function: it_config_free_cmn()
450 * Free any resources associated with the it_config_t structure.
452 * Parameters:
453 * cfg A C representation of the current iSCSI configuration
455 void
456 it_config_free_cmn(it_config_t *cfg);
459 * Function: it_tgt_free_cmn()
461 * Frees an it_tgt_t structure. If tgt_next is not NULL, frees
462 * all structures in the list.
464 void
465 it_tgt_free_cmn(it_tgt_t *tgt);
468 * Function: it_tpgt_free_cmn()
470 * Deallocates resources of an it_tpgt_t structure. If tpgt->next
471 * is not NULL, frees all members of the list.
473 void
474 it_tpgt_free_cmn(it_tpgt_t *tpgt);
477 * Function: it_tpg_free_cmn()
479 * Deallocates resources associated with an it_tpg_t structure.
480 * If tpg->next is not NULL, frees all members of the list.
482 void
483 it_tpg_free_cmn(it_tpg_t *tpg);
486 * Function: it_ini_free_cmn()
488 * Deallocates resources of an it_ini_t structure. If ini->next is
489 * not NULL, frees all members of the list.
491 void
492 it_ini_free_cmn(it_ini_t *ini);
495 * Function: iscsi_binary_to_base64_str()
497 * Encodes a byte array into a base64 string.
500 iscsi_binary_to_base64_str(uint8_t *in_buf, int in_buf_len,
501 char *base64_str_buf, int base64_buf_len);
504 * Function: iscsi_base64_str_to_binary()
506 * Decodes a base64 string into a byte array
509 iscsi_base64_str_to_binary(char *hstr, int hstr_len,
510 uint8_t *binary, int binary_buf_len, int *out_len);
512 #ifdef __cplusplus
514 #endif
516 #endif /* _ISCSIT_COMMON_H_ */