1 /*
2  * CDDL HEADER START
3  *
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.
7  *
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.
12  *
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]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_ISNS_CLIENT_H
27 #define	_ISNS_CLIENT_H
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 #include <sys/types.h>
34 #include <sys/scsi/adapters/iscsi_if.h>
35 
36 #define	ISNS_DEFAULT_ESI_SCN_PORT	32046
37 #define	ISNS_DEFAULT_PORTAL_GROUP_TAG	1
38 
39 typedef enum isns_status {
40 	isns_ok,
41 	isns_no_svr_found,
42 	isns_internal_err,
43 	isns_create_msg_err,
44 	isns_open_conn_err,
45 	isns_send_msg_err,
46 	isns_rcv_msg_err,
47 	isns_no_rsp_rcvd,
48 	isns_op_failed,
49 	isns_op_partially_failed,
50 	isns_no_transport_found
51 } isns_status_t;
52 
53 #define	ISNSP_MULT_PAYLOAD_HEADER_SIZE		8
54 /*
55  * when we concatenate payloads from multiple pdus, we need
56  * a larger payload_len then what is defined in isns_protocol.h
57  *
58  * for each payload that comes in, we need to save off the payload_len
59  * and the payload
60  */
61 typedef struct isns_pdu_mult_payload {
62 	size_t payload_len;
63 	uint8_t payload[1];
64 } isns_pdu_mult_payload_t;
65 
66 typedef struct isns_scn_callback_arg {
67 	uint32_t scn_type;
68 	uint8_t source_key_attr[ISCSI_MAX_NAME_LEN];
69 } isns_scn_callback_arg_t;
70 
71 /*
72  * To initialize the iSNS Client module.
73  */
74 void
75 isns_client_init(void);
76 
77 /*
78  * To clean up the resources associated with the iSNS Client module.
79  */
80 void
81 isns_client_cleanup(void);
82 
83 /*
84  * To register a network entity against the iSNS server(s) visible to the
85  * specified LHBA.
86  */
87 isns_status_t
88 isns_reg(uint8_t *lhba_handle,
89 	uint8_t *node_name,
90 	size_t node_name_len,
91 	uint8_t *node_alias,
92 	size_t node_alias_len,
93 	uint32_t node_type,
94 	void (*scn_callback)(void *));
95 
96 /*
97  * To register a network entity against the specified iSNS server.
98  */
99 isns_status_t
100 isns_reg_one_server(entry_t *isns_server,
101 	uint8_t *lhba_handle,
102 	uint8_t *node_name,
103 	size_t node_name_len,
104 	uint8_t *node_alias,
105 	size_t node_alias_len,
106 	uint32_t node_type,
107 	void (*scn_callback)(void *));
108 
109 /*
110  * To deregister a network entity from the all iSNS server(s) visible to the
111  * specified LHBA.
112  */
113 isns_status_t
114 isns_dereg(uint8_t *lhba_handle, uint8_t *node_name);
115 
116 /*
117  * To deregister a network entity from the specified iSNS server.
118  */
119 isns_status_t
120 isns_dereg_one_server(entry_t *isns_server, uint8_t *node_name,
121 	boolean_t is_last_isns_server);
122 
123 /*
124  * To query all portal group objects that are visible to the specified LHBA
125  * registered through all iSNS servers this LHBA discovered.
126  * pg_list is NULL if no portal group object is found.
127  */
128 isns_status_t
129 isns_query(uint8_t *lhba_handle,
130 	uint8_t *node_name,
131 	uint8_t *node_alias,
132 	uint32_t node_type,
133 	isns_portal_group_list_t **pg_list);
134 
135 /*
136  * To query all portal group objects registered through the specified iSNS
137  * server registered through the specified iSNS server. pg_list is NULL if
138  * no portal group object is found.
139  */
140 isns_status_t
141 isns_query_one_server(iscsi_addr_t *isns_server_addr,
142 	uint8_t *lhba_handle,
143 	uint8_t *node_name,
144 	uint8_t *node_alias,
145 	uint32_t node_type,
146 	isns_portal_group_list_t **pg_list);
147 
148 /*
149  * To query the portal group objects associated with the specified storage
150  * node through all iSNS servers this LHBA discovered. pg_list is NULL if
151  * no portal group object is found.
152  */
153 isns_status_t
154 isns_query_one_node(uint8_t *target_node_name,
155 	uint8_t *lhba_handle,
156 	uint8_t *source_node_name,
157 	uint8_t *source_node_alias,
158 	uint32_t source_node_type,
159 	isns_portal_group_list_t **pg_list);
160 
161 /*
162  * To query the portal group objects associated with the specified storage
163  * node registered through the specified iSNS server. pg_list is NULL if
164  * no portal group object is found.
165  */
166 isns_status_t
167 isns_query_one_server_one_node(iscsi_addr_t *isns_server_addr,
168 	uint8_t *target_node_name,
169 	uint8_t *lhba_handle,
170 	uint8_t *source_node_name,
171 	uint8_t *source_node_alias,
172 	uint32_t source_node_type,
173 	isns_portal_group_list_t **pg_list);
174 
175 #ifdef __cplusplus
176 }
177 #endif
178 
179 #endif /* _ISNS_CLIENT_H */
180