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 */
|