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 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef	_SYS_FIBRE_CHANNEL_IMPL_FCGS2_H
27#define	_SYS_FIBRE_CHANNEL_IMPL_FCGS2_H
28
29
30#include <sys/note.h>
31
32#ifdef	__cplusplus
33extern "C" {
34#endif
35
36/*
37 * A device handle describes the characterics of a device
38 * Node. Each device handle also contains information
39 * on the serveral different ports it is discovered on.
40 *
41 * Classification of Name Server Objects
42 *
43 * +-----------------------------------+---------------------------+
44 * |  Device (node) Specific           |  Port Specific            |
45 * +-----------------------------------+---------------------------+
46 * |  Node Name (NN)                   | Port type (PT)            |
47 * |  Symbolic Node Name Length        | Port Id (ID)              |
48 * |  Symbloic Node Name(SNN)          | Symbolic Port Name length |
49 * |  Initial Process associator(IPA)  | Symbolic Port Name (SPN)  |
50 * |                                   | Class of Service (CS)     |
51 * |                                   | fc4 types (FT)            |
52 * |                                   | IP Address (IP)           |
53 * +-----------------------------------+---------------------------+
54 *
55 * The above classification causes some inconvenience in not having
56 * the ability to directly copy all the nameserver objects into a
57 * contiguous piece of memory. But we'll live with it.
58 */
59
60#define	CT_REV			0x01	/* Common Transport revision */
61
62/* FCS types */
63#define	FCSTYPE_KEYSERVICE	0xF7
64#define	FCSTYPE_ALIAS		0xF8
65#define	FCSTYPE_MGMTSERVICE	0xFA
66#define	FCSTYPE_TIMESERVICE	0xFB
67#define	FCSTYPE_DIRECTORY	0xFC
68#define	FCSTYEP_FABRIC		0xFD
69
70/*
71 * FCS subtypes for Directory Service
72 */
73#define	FCSSUB_DS_NAME_SERVER		0x02	/* Zoned Name Server */
74#define	FCSSUB_DS_IPADDR_SERVER		0x03	/* IP Address Server */
75
76/*
77 * FCS subtypes for Management Service
78 */
79#define	FCSSUB_MS_CONFIG_SERVER		0x01	/* Fabric Config Server */
80#define	FCSSUB_MS_UNZONED_NAME_SERVER	0x02	/* Unzoned Name Server */
81#define	FCSSUB_MS_ZONE_SERVER		0x03	/* Fabric Zone Server */
82
83/*
84 * FCS subtypes for Time Service
85 */
86#define	FCSSUB_TS_TIME_SERVER		0x01	/* Time Server */
87
88/*
89 * FCS subtypes for Alias Service
90 */
91#define	FCSSUB_AS_ALIAS_SERVER		0x01	/* Alias Server */
92
93/*
94 * FCS subtypes for Key Service
95 */
96#define	FCSSUB_KS_KEY_SERVER		0x00	/* Key Distribution Server */
97
98/* FC-CT response codes */
99#define	FS_RJT_IU		0x8001
100#define	FS_ACC_IU		0x8002
101
102/* FS_RJT Reason Codes */
103#define	FSRJT_BADCMD		0x01	/* Invalid command code */
104#define	FSRJT_BADVER		0x02	/* Invalid version level */
105#define	FSRJT_LOGICALERR	0x03	/* Logical error */
106#define	FSRJT_BADSIZE		0x04	/* Invalid IU size */
107#define	FSRJT_BUSY		0x05	/* Logical busy */
108#define	FSRJT_PROTOCOLERR	0x07	/* Protocol error */
109#define	FSRJT_CMDFAILED		0x08	/* Unable to perform command */
110#define	FSRJT_UNSUPP		0x0b	/* Command not supported */
111#define	FSRJT_VENDOR		0xff	/* vendor unique error */
112
113/* Name Service Command Codes */
114#define	NS_GA_NXT		0x0100	/* Get All next */
115#define	NS_GPN_ID		0x0112	/* Get Port Name */
116#define	NS_GNN_ID		0x0113	/* Get Node Name */
117#define	NS_GCS_ID		0x0114	/* Get Class Of service */
118#define	NS_GFT_ID		0x0117	/* Get FC-4 Types */
119#define	NS_GSPN_ID		0x0118	/* Get Sym Port name */
120#define	NS_GPT_ID		0x011A	/* Get Port Type */
121#define	NS_GID_PN		0x0121	/* Get port id for PN */
122#define	NS_GID_NN		0x0131	/* Get port id for NN */
123#define	NS_GIP_NN		0x0135	/* Get IP address */
124#define	NS_GIPA_NN		0x0136	/* Get I.P.A */
125#define	NS_GSNN_NN		0x0139	/* Get Sym Node name */
126#define	NS_GNN_IP		0x0153	/* Get Node name for IP */
127#define	NS_GIPA_IP		0x0156	/* Get I.P.A for IP */
128#define	NS_GID_FT		0x0171	/* Get port Id for FC-4 type */
129#define	NS_GID_PT		0x01A1	/* Get port Id for type */
130#define	NS_RPN_ID		0x0212	/* Reg port name */
131#define	NS_RNN_ID		0x0213	/* Reg node name */
132#define	NS_RCS_ID		0x0214	/* Reg C.O.S */
133#define	NS_RFT_ID		0x0217	/* Reg FC-4 Types */
134#define	NS_RSPN_ID		0x0218	/* Reg Sym Port name */
135#define	NS_RPT_ID		0x021A	/* Reg Port Type */
136#define	NS_RIP_NN		0x0235	/* Reg I.P address */
137#define	NS_RIPA_NN		0x0236	/* Reg I.P.A */
138#define	NS_RSNN_NN		0x0239	/* Reg Sym Node name */
139#define	NS_DA_ID		0x0300	/* De-Register all */
140
141/* Name service reject explanation codes */
142#define	NSRJTX_NONE		0x00	/* No additional explanation */
143#define	NSRJTX_PORTNOTREG	0x01	/* Port ID not registered */
144#define	NSRJTX_PWWNNOTREG	0x02	/* Port Name not registered */
145#define	NSRJTX_NWWNNOTREG	0x03	/* Node Name not registered */
146#define	NSRJTX_CoSNOTREG	0x04	/* Class of Service no registered */
147#define	NSRJTX_IPNOTREG		0x05	/* IP Address not registered */
148#define	NSRJTX_IPANOTREG	0x06	/* Initial Proc. Assoc not reg. */
149#define	NSRJTX_FC4NOTREG	0x07	/* FC$ types not registered */
150#define	NSRJTX_SPNNOTREG	0x08	/* Symbolic port name not registered */
151#define	NSRJTX_SNNNOTREG	0x09	/* Symbolic node name not registered */
152#define	NSRJTX_TYPENOTREG	0x0a	/* Port type not registered */
153#define	NSRJTX_NOPERM		0x10	/* Access denied */
154#define	NSRJTX_BADPORTID	0x11	/* Unacceptable port ID */
155#define	NSRJTX_DBEMPTY		0x12	/* Data base empty */
156
157/* Management Service Command Codes */
158#define	MS_GIEL		0x0101	/* Get Interconnect Element List */
159
160#define	FC_NS_CLASSF		0x01
161#define	FC_NS_CLASS1		0x02
162#define	FC_NS_CLASS2		0x04
163#define	FC_NS_CLASS3		0x08
164#define	FC_NS_CLASS4		0x10
165#define	FC_NS_CLASS5		0x20
166#define	FC_NS_CLASS6		0x40
167
168#define	FC_NS_PORT_UNKNOWN	0x00
169#define	FC_NS_PORT_N		0x01
170#define	FC_NS_PORT_NL		0x02
171#define	FC_NS_PORT_F_NL		0x03
172#define	FC_NS_PORT_NX		0x7F
173#define	FC_NS_PORT_F		0x81
174#define	FC_NS_PORT_FL		0x82
175#define	FC_NS_PORT_E		0x84
176
177#define	FC_IS_CMD_A_QUERY(cmd)	((cmd) >= NS_GA_NXT && (cmd) <= NS_GID_PT)
178#define	FC_IS_CMD_A_REG(cmd)	((cmd) >= NS_RPN_ID && (cmd) <= NS_DA_ID)
179#define	NS_GAN_RESP_LEN		(sizeof (ns_resp_gan_t))
180
181/*
182 * SCR registration function codes
183 */
184#define	FC_SCR_FABRIC_REGISTRATION	0x01
185#define	FC_SCR_NPORT_REGISTRATION	0x02
186#define	FC_SCR_FULL_REGISTRATION	0x03
187#define	FC_SCR_CLEAR_REGISTRATION	0xFF
188
189/*
190 * Register port/node name request payload
191 *
192 * 'x' means either P (port) or N (node)
193 */
194typedef struct rxn_id {
195	fc_portid_t	rxn_port_id;	/* Port Identfier */
196	la_wwn_t	rxn_xname;		/* Port/Node Name */
197} ns_rxn_req_t;
198
199/*
200 * Register Class of service request payload
201 */
202typedef struct rcos {
203	fc_portid_t	rcos_port_id;
204	uint32_t	rcos_cos;
205} ns_rcos_t;
206
207/*
208 * Register FC-4 TYPEs request payload
209 */
210typedef struct rfc_type {
211	fc_portid_t	rfc_port_id;
212	uchar_t		rfc_types[32];	/* bit map of ULP types */
213} ns_rfc_type_t;
214
215/*
216 * Register symbolic port name request payload
217 */
218typedef struct spn {
219	fc_portid_t	spn_port_id;
220	uchar_t		spn_len;
221	/*
222	 * What follows here is the actual name
223	 * which is allocated on the fly during
224	 * packet allocation.
225	 */
226} ns_spn_t;
227
228/*
229 * Register port type request payload
230 */
231typedef struct rpt {
232	fc_portid_t	rpt_port_id;
233	fc_porttype_t	rpt_type;
234} ns_rpt_t;
235
236/*
237 * Register IP address request payload
238 */
239typedef struct rip {
240	la_wwn_t	rip_node_name;
241	uchar_t		rip_ip_addr[16];
242} ns_rip_t;
243
244/*
245 * Register Initial Process Associator request payload
246 */
247typedef struct ipa {
248	la_wwn_t	ipa_node_name;
249	uchar_t		ipa_value[8];
250} ns_ipa_t;
251
252/*
253 * Register Symbolic Node Name request payload
254 */
255typedef struct snn {
256	la_wwn_t	snn_node_name;
257	uchar_t		snn_len;
258	/*
259	 * What follows here is the actual name
260	 * which is allocated on the fly during
261	 * packet allocation.
262	 */
263} ns_snn_t;
264
265/*
266 * Remove all request payload
267 */
268typedef struct remall {
269	fc_portid_t	rem_port_id;
270} ns_remall_t;
271
272typedef fc_ct_header_t fc_reg_resp_t;
273typedef fc_ct_header_t fc_query_resp_t;
274
275typedef struct ns_req_gid_pt {
276	fc_porttype_t	port_type;
277} ns_req_gid_pt_t;
278
279typedef struct ns_resp_gid_pt {
280	fc_portid_t	gid_port_id;
281} ns_resp_gid_pt_t;
282
283typedef struct ns_req_gan {
284	fc_portid_t	pid;
285} ns_req_gan_t;
286
287typedef struct ns_resp_gan {
288	fc_porttype_t	gan_type_id;		/* type and id next */
289	la_wwn_t	gan_pwwn;		/* Port Name */
290	uchar_t		gan_spnlen;		/* Sym P Name Len */
291	char		gan_spname[255];	/* Sym Port name */
292
293	la_wwn_t	gan_nwwn;		/* Node Name */
294	uchar_t		gan_snnlen;		/* Sym N name Len */
295	char		gan_snname[255];	/* Sym Node name */
296
297	uchar_t		gan_ipa[8];		/* Initial Proc assoc */
298	uchar_t		gan_ip[16];		/* IP Address */
299	uint32_t	gan_cos;		/* Class of Service */
300
301	uint32_t	gan_fc4types[8];	/* FC-4 Types */
302} ns_resp_gan_t;
303
304typedef struct ns_req_gid_pn {
305	la_wwn_t	pwwn;
306} ns_req_gid_pn_t;
307
308typedef struct ns_resp_gid_pn {
309	fc_portid_t	pid;
310} ns_resp_gid_pn_t;
311
312typedef struct ns_req_gpn_id {
313	fc_portid_t	pid;
314} ns_req_gpn_id_t;
315
316typedef struct ns_resp_gpn_id {
317	la_wwn_t	pwwn;
318} ns_resp_gpn_id_t;
319
320typedef struct ns_req_gpt_id {
321	fc_portid_t	pid;
322} ns_req_gpt_id_t;
323
324typedef struct ns_resp_gpt_id {
325	fc_porttype_t	port_type;
326} ns_resp_gpt_id_t;
327
328#if	!defined(__lint)
329_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_resp_gpn_id))
330_NOTE(SCHEME_PROTECTS_DATA("unique per request", rxn_id))
331_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_req_gpn_id))
332_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_resp_gid_pn))
333_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_req_gid_pn))
334_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_resp_gan))
335_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_req_gan))
336_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_req_gid_pt))
337_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_req_gpt_id))
338_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_resp_gpt_id))
339_NOTE(SCHEME_PROTECTS_DATA("unique per request", remall))
340_NOTE(SCHEME_PROTECTS_DATA("unique per request", snn))
341_NOTE(SCHEME_PROTECTS_DATA("unique per request", ipa))
342_NOTE(SCHEME_PROTECTS_DATA("unique per request", rip))
343_NOTE(SCHEME_PROTECTS_DATA("unique per request", rpt))
344_NOTE(SCHEME_PROTECTS_DATA("unique per request", spn))
345_NOTE(SCHEME_PROTECTS_DATA("unique per request", rfc_type))
346_NOTE(SCHEME_PROTECTS_DATA("unique per request", rcos))
347#endif /* __lint */
348
349#ifdef	__cplusplus
350}
351#endif
352
353#endif	/* _SYS_FIBRE_CHANNEL_IMPL_FCGS2_H */
354