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
30extern "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
39typedef 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 */
61typedef struct isns_pdu_mult_payload {
62	size_t payload_len;
63	uint8_t payload[1];
64} isns_pdu_mult_payload_t;
65
66typedef 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 */
74void
75isns_client_init(void);
76
77/*
78 * To clean up the resources associated with the iSNS Client module.
79 */
80void
81isns_client_cleanup(void);
82
83/*
84 * To register a network entity against the iSNS server(s) visible to the
85 * specified LHBA.
86 */
87isns_status_t
88isns_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 */
99isns_status_t
100isns_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 */
113isns_status_t
114isns_dereg(uint8_t *lhba_handle, uint8_t *node_name);
115
116/*
117 * To deregister a network entity from the specified iSNS server.
118 */
119isns_status_t
120isns_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 */
128isns_status_t
129isns_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 */
140isns_status_t
141isns_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 */
153isns_status_t
154isns_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 */
166isns_status_t
167isns_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