summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/fibre-channel/impl/fcgs2.h
blob: b18419299c7c5a1392bee73994dc4f92d791e817 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_FIBRE_CHANNEL_IMPL_FCGS2_H
#define	_SYS_FIBRE_CHANNEL_IMPL_FCGS2_H


#include <sys/note.h>

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * A device handle describes the characterics of a device
 * Node. Each device handle also contains information
 * on the serveral different ports it is discovered on.
 *
 * Classification of Name Server Objects
 *
 * +-----------------------------------+---------------------------+
 * |  Device (node) Specific           |  Port Specific            |
 * +-----------------------------------+---------------------------+
 * |  Node Name (NN)                   | Port type (PT)            |
 * |  Symbolic Node Name Length        | Port Id (ID)              |
 * |  Symbloic Node Name(SNN)          | Symbolic Port Name length |
 * |  Initial Process associator(IPA)  | Symbolic Port Name (SPN)  |
 * |                                   | Class of Service (CS)     |
 * |                                   | fc4 types (FT)            |
 * |                                   | IP Address (IP)           |
 * +-----------------------------------+---------------------------+
 *
 * The above classification causes some inconvenience in not having
 * the ability to directly copy all the nameserver objects into a
 * contiguous piece of memory. But we'll live with it.
 */

#define	CT_REV			0x01	/* Common Transport revision */

/* FCS types */
#define	FCSTYPE_KEYSERVICE	0xF7
#define	FCSTYPE_ALIAS		0xF8
#define	FCSTYPE_MGMTSERVICE	0xFA
#define	FCSTYPE_TIMESERVICE	0xFB
#define	FCSTYPE_DIRECTORY	0xFC
#define	FCSTYEP_FABRIC		0xFD

/*
 * FCS subtypes for Directory Service
 */
#define	FCSSUB_DS_NAME_SERVER		0x02	/* Zoned Name Server */
#define	FCSSUB_DS_IPADDR_SERVER		0x03	/* IP Address Server */

/*
 * FCS subtypes for Management Service
 */
#define	FCSSUB_MS_CONFIG_SERVER		0x01	/* Fabric Config Server */
#define	FCSSUB_MS_UNZONED_NAME_SERVER	0x02	/* Unzoned Name Server */
#define	FCSSUB_MS_ZONE_SERVER		0x03	/* Fabric Zone Server */

/*
 * FCS subtypes for Time Service
 */
#define	FCSSUB_TS_TIME_SERVER		0x01	/* Time Server */

/*
 * FCS subtypes for Alias Service
 */
#define	FCSSUB_AS_ALIAS_SERVER		0x01	/* Alias Server */

/*
 * FCS subtypes for Key Service
 */
#define	FCSSUB_KS_KEY_SERVER		0x00	/* Key Distribution Server */

/* FC-CT response codes */
#define	FS_RJT_IU		0x8001
#define	FS_ACC_IU		0x8002

/* FS_RJT Reason Codes */
#define	FSRJT_BADCMD		0x01	/* Invalid command code */
#define	FSRJT_BADVER		0x02	/* Invalid version level */
#define	FSRJT_LOGICALERR	0x03	/* Logical error */
#define	FSRJT_BADSIZE		0x04	/* Invalid IU size */
#define	FSRJT_BUSY		0x05	/* Logical busy */
#define	FSRJT_PROTOCOLERR	0x07	/* Protocol error */
#define	FSRJT_CMDFAILED		0x08	/* Unable to perform command */
#define	FSRJT_UNSUPP		0x0b	/* Command not supported */
#define	FSRJT_VENDOR		0xff	/* vendor unique error */

/* Name Service Command Codes */
#define	NS_GA_NXT		0x0100	/* Get All next */
#define	NS_GPN_ID		0x0112	/* Get Port Name */
#define	NS_GNN_ID		0x0113	/* Get Node Name */
#define	NS_GCS_ID		0x0114	/* Get Class Of service */
#define	NS_GFT_ID		0x0117	/* Get FC-4 Types */
#define	NS_GSPN_ID		0x0118	/* Get Sym Port name */
#define	NS_GPT_ID		0x011A	/* Get Port Type */
#define	NS_GID_PN		0x0121	/* Get port id for PN */
#define	NS_GID_NN		0x0131	/* Get port id for NN */
#define	NS_GIP_NN		0x0135	/* Get IP address */
#define	NS_GIPA_NN		0x0136	/* Get I.P.A */
#define	NS_GSNN_NN		0x0139	/* Get Sym Node name */
#define	NS_GNN_IP		0x0153	/* Get Node name for IP */
#define	NS_GIPA_IP		0x0156	/* Get I.P.A for IP */
#define	NS_GID_FT		0x0171	/* Get port Id for FC-4 type */
#define	NS_GID_PT		0x01A1	/* Get port Id for type */
#define	NS_RPN_ID		0x0212	/* Reg port name */
#define	NS_RNN_ID		0x0213	/* Reg node name */
#define	NS_RCS_ID		0x0214	/* Reg C.O.S */
#define	NS_RFT_ID		0x0217	/* Reg FC-4 Types */
#define	NS_RSPN_ID		0x0218	/* Reg Sym Port name */
#define	NS_RPT_ID		0x021A	/* Reg Port Type */
#define	NS_RIP_NN		0x0235	/* Reg I.P address */
#define	NS_RIPA_NN		0x0236	/* Reg I.P.A */
#define	NS_RSNN_NN		0x0239	/* Reg Sym Node name */
#define	NS_DA_ID		0x0300	/* De-Register all */

/* Name service reject explanation codes */
#define	NSRJTX_NONE		0x00	/* No additional explanation */
#define	NSRJTX_PORTNOTREG	0x01	/* Port ID not registered */
#define	NSRJTX_PWWNNOTREG	0x02	/* Port Name not registered */
#define	NSRJTX_NWWNNOTREG	0x03	/* Node Name not registered */
#define	NSRJTX_CoSNOTREG	0x04	/* Class of Service no registered */
#define	NSRJTX_IPNOTREG		0x05	/* IP Address not registered */
#define	NSRJTX_IPANOTREG	0x06	/* Initial Proc. Assoc not reg. */
#define	NSRJTX_FC4NOTREG	0x07	/* FC$ types not registered */
#define	NSRJTX_SPNNOTREG	0x08	/* Symbolic port name not registered */
#define	NSRJTX_SNNNOTREG	0x09	/* Symbolic node name not registered */
#define	NSRJTX_TYPENOTREG	0x0a	/* Port type not registered */
#define	NSRJTX_NOPERM		0x10	/* Access denied */
#define	NSRJTX_BADPORTID	0x11	/* Unacceptable port ID */
#define	NSRJTX_DBEMPTY		0x12	/* Data base empty */

/* Management Service Command Codes */
#define	MS_GIEL		0x0101	/* Get Interconnect Element List */

#define	FC_NS_CLASSF		0x01
#define	FC_NS_CLASS1		0x02
#define	FC_NS_CLASS2		0x04
#define	FC_NS_CLASS3		0x08
#define	FC_NS_CLASS4		0x10
#define	FC_NS_CLASS5		0x20
#define	FC_NS_CLASS6		0x40

#define	FC_NS_PORT_UNKNOWN	0x00
#define	FC_NS_PORT_N		0x01
#define	FC_NS_PORT_NL		0x02
#define	FC_NS_PORT_F_NL		0x03
#define	FC_NS_PORT_NX		0x7F
#define	FC_NS_PORT_F		0x81
#define	FC_NS_PORT_FL		0x82
#define	FC_NS_PORT_E		0x84

#define	FC_IS_CMD_A_QUERY(cmd)	((cmd) >= NS_GA_NXT && (cmd) <= NS_GID_PT)
#define	FC_IS_CMD_A_REG(cmd)	((cmd) >= NS_RPN_ID && (cmd) <= NS_DA_ID)
#define	NS_GAN_RESP_LEN		(sizeof (ns_resp_gan_t))

/*
 * SCR registration function codes
 */
#define	FC_SCR_FABRIC_REGISTRATION	0x01
#define	FC_SCR_NPORT_REGISTRATION	0x02
#define	FC_SCR_FULL_REGISTRATION	0x03
#define	FC_SCR_CLEAR_REGISTRATION	0xFF

/*
 * Register port/node name request payload
 *
 * 'x' means either P (port) or N (node)
 */
typedef struct rxn_id {
	fc_portid_t	rxn_port_id;	/* Port Identfier */
	la_wwn_t	rxn_xname;		/* Port/Node Name */
} ns_rxn_req_t;

/*
 * Register Class of service request payload
 */
typedef struct rcos {
	fc_portid_t	rcos_port_id;
	uint32_t	rcos_cos;
} ns_rcos_t;

/*
 * Register FC-4 TYPEs request payload
 */
typedef struct rfc_type {
	fc_portid_t	rfc_port_id;
	uchar_t		rfc_types[32];	/* bit map of ULP types */
} ns_rfc_type_t;

/*
 * Register symbolic port name request payload
 */
typedef struct spn {
	fc_portid_t	spn_port_id;
	uchar_t		spn_len;
	/*
	 * What follows here is the actual name
	 * which is allocated on the fly during
	 * packet allocation.
	 */
} ns_spn_t;

/*
 * Register port type request payload
 */
typedef struct rpt {
	fc_portid_t	rpt_port_id;
	fc_porttype_t	rpt_type;
} ns_rpt_t;

/*
 * Register IP address request payload
 */
typedef struct rip {
	la_wwn_t	rip_node_name;
	uchar_t		rip_ip_addr[16];
} ns_rip_t;

/*
 * Register Initial Process Associator request payload
 */
typedef struct ipa {
	la_wwn_t	ipa_node_name;
	uchar_t		ipa_value[8];
} ns_ipa_t;

/*
 * Register Symbolic Node Name request payload
 */
typedef struct snn {
	la_wwn_t	snn_node_name;
	uchar_t		snn_len;
	/*
	 * What follows here is the actual name
	 * which is allocated on the fly during
	 * packet allocation.
	 */
} ns_snn_t;

/*
 * Remove all request payload
 */
typedef struct remall {
	fc_portid_t	rem_port_id;
} ns_remall_t;

typedef fc_ct_header_t fc_reg_resp_t;
typedef fc_ct_header_t fc_query_resp_t;

typedef struct ns_req_gid_pt {
	fc_porttype_t	port_type;
} ns_req_gid_pt_t;

typedef struct ns_resp_gid_pt {
	fc_portid_t	gid_port_id;
} ns_resp_gid_pt_t;

typedef struct ns_req_gan {
	fc_portid_t	pid;
} ns_req_gan_t;

typedef struct ns_resp_gan {
	fc_porttype_t	gan_type_id;		/* type and id next */
	la_wwn_t	gan_pwwn;		/* Port Name */
	uchar_t		gan_spnlen;		/* Sym P Name Len */
	char		gan_spname[255];	/* Sym Port name */

	la_wwn_t	gan_nwwn;		/* Node Name */
	uchar_t		gan_snnlen;		/* Sym N name Len */
	char		gan_snname[255];	/* Sym Node name */

	uchar_t		gan_ipa[8];		/* Initial Proc assoc */
	uchar_t		gan_ip[16];		/* IP Address */
	uint32_t	gan_cos;		/* Class of Service */

	uint32_t	gan_fc4types[8];	/* FC-4 Types */
} ns_resp_gan_t;

typedef struct ns_req_gid_pn {
	la_wwn_t	pwwn;
} ns_req_gid_pn_t;

typedef struct ns_resp_gid_pn {
	fc_portid_t	pid;
} ns_resp_gid_pn_t;

typedef struct ns_req_gpn_id {
	fc_portid_t	pid;
} ns_req_gpn_id_t;

typedef struct ns_resp_gpn_id {
	la_wwn_t	pwwn;
} ns_resp_gpn_id_t;

typedef struct ns_req_gpt_id {
	fc_portid_t	pid;
} ns_req_gpt_id_t;

typedef struct ns_resp_gpt_id {
	fc_porttype_t	port_type;
} ns_resp_gpt_id_t;

#if	!defined(__lint)
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_resp_gpn_id))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", rxn_id))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_req_gpn_id))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_resp_gid_pn))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_req_gid_pn))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_resp_gan))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_req_gan))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_req_gid_pt))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_req_gpt_id))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ns_resp_gpt_id))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", remall))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", snn))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ipa))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", rip))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", rpt))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", spn))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", rfc_type))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", rcos))
#endif /* __lint */

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_FIBRE_CHANNEL_IMPL_FCGS2_H */