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 /*
23  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 #ifndef _SYS_IB_EOIB_FIP_H
27 #define	_SYS_IB_EOIB_FIP_H
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 #include <sys/ethernet.h>
34 #include <sys/ib/ib_types.h>
35 
36 /*
37  * Sizes of various objects in FIP headers
38  */
39 #define	FIP_VENDOR_LEN			8
40 #define	FIP_GUID_LEN			8
41 #define	FIP_SYSNAME_LEN			32
42 #define	FIP_PORTNAME_LEN		8
43 #define	FIP_MGID_PREFIX_LEN		5
44 #define	FIP_VNIC_NAME_LEN		16
45 #define	FIP_VHUBID_LEN			3
46 
47 /*
48  * EoIB Pkeys and Qkeys
49  */
50 #define	EIB_ADMIN_PKEY			0xFFFF
51 #define	EIB_FIP_QKEY			0x80020002
52 #define	EIB_DATA_QKEY			0x80020003
53 
54 /*
55  * EoIB Advertise and Solicit MCG GUIDs
56  */
57 #define	EIB_GUID_ADVERTISE_PREFIX	0xFF12E01B00060000
58 #define	EIB_GUID_SOLICIT_PREFIX		0xFF12E01B00070000
59 
60 /*
61  * FIP_Protocol_Version
62  */
63 #define	FIP_PROTO_VERSION		0
64 typedef struct fip_proto_s {
65 	uint8_t		pr_version;
66 	uint8_t		pr_reserved[3];
67 } fip_proto_t;
68 
69 /*
70  * Basic FIP Header: Opcodes and subcodes for EoIB
71  */
72 #define	FIP_OPCODE_EOIB			0xFFF9
73 
74 #define	FIP_SUBCODE_H_SOLICIT		0x1
75 #define	FIP_SUBCODE_G_ADVERTISE		0x2
76 #define	FIP_SUBCODE_H_VNIC_LOGIN	0x3
77 #define	FIP_SUBCODE_G_VNIC_LOGIN_ACK	0x4
78 #define	FIP_SUBCODE_H_VNIC_LOGOUT	0x5
79 #define	FIP_SUBCODE_G_VHUB_UPDATE	0x6
80 #define	FIP_SUBCODE_G_VHUB_TABLE	0x7
81 #define	FIP_SUBCODE_H_KEEP_ALIVE	0x8
82 
83 /*
84  * Basic FIP Header: Flags relevant to EoIB
85  */
86 #define	FIP_BHFLAG_GWAVAIL		0x4
87 #define	FIP_BHFLAG_SLCTMSG		0x2
88 
89 /*
90  * FIP_Basic_Header
91  */
92 #define	FIP_DESC_TYPE_VENDOR_ID		13
93 #define	FIP_DESC_LEN_VENDOR_ID		3
94 typedef struct fip_basic_hdr_s {
95 	uint16_t	hd_opcode;
96 	uint8_t		hd_reserved1;
97 	uint8_t		hd_subcode;
98 	uint16_t	hd_desc_list_len;
99 	uint16_t	hd_flags;
100 	uint8_t		hd_type;
101 	uint8_t		hd_len;
102 	uint8_t		hd_reserved2[2];
103 	uint8_t		hd_vendor_id[FIP_VENDOR_LEN];
104 } fip_basic_hdr_t;
105 
106 #define	FIP_IBA_QPN_MASK		0x00FFFFFF
107 #define	FIP_IBA_PORTID_MASK		0x0FFF
108 #define	FIP_IBA_SL_MASK			0xF000
109 #define	FIP_IBA_SL_SHIFT		12
110 
111 /*
112  * FIP_Descriptor_Infiniband_Address
113  */
114 #define	FIP_DESC_TYPE_IBA		240
115 #define	FIP_DESC_LEN_IBA		7
116 typedef struct fip_desc_iba_s {
117 	uint8_t		ia_type;
118 	uint8_t		ia_len;
119 	uint8_t		ia_reserved[2];
120 	uint8_t		ia_vendor_id[FIP_VENDOR_LEN];
121 	uint32_t	ia_qpn;
122 	uint16_t	ia_sl_portid;
123 	uint16_t	ia_lid;
124 	uint8_t		ia_guid[FIP_GUID_LEN];
125 } fip_desc_iba_t;
126 
127 /*
128  * FIP Solicitation Control Message:
129  *
130  * 	FIP_Protocol_Version
131  * 	FIP_Basic_Header
132  * 	FIP_Descriptor_Infiniband_Address
133  */
134 typedef struct fip_solicit_s {
135 	fip_proto_t	sl_proto_version;
136 	fip_basic_hdr_t	sl_fip_hdr;
137 	fip_desc_iba_t	sl_iba;
138 } fip_solicit_t;
139 
140 /*
141  * FIP_Descriptor_EoIB_Gateway_Information
142  */
143 #define	FIP_DESC_TYPE_EOIB_GW_INFO	241
144 #define	FIP_DESC_LEN_EOIB_GW_INFO	4
145 typedef struct fip_desc_gwinfo_s {
146 	uint8_t		gi_type;
147 	uint8_t		gi_len;
148 	uint8_t		gi_reserved1[2];
149 	uint8_t		gi_vendor_id[FIP_VENDOR_LEN];
150 	uint8_t		gi_flags;
151 	uint8_t		gi_reserved2;
152 	uint16_t	gi_rss_qpn_num_net_vnics;
153 } fip_desc_gwinfo_t;
154 
155 #define	FIP_GWI_HOST_ADMIND_VNICS_MASK	0x80
156 #define	FIP_GWI_NUM_NET_VNICS_MASK	0x0FFF
157 #define	FIP_GWI_RSS_QPN_MASK		0xF000
158 #define	FIP_GWI_RSS_QPN_SHIFT		12
159 
160 /*
161  * FIP_Descriptor_Gateway_Identifier
162  */
163 #define	FIP_DESC_TYPE_GW_ID		248
164 #define	FIP_DESC_LEN_GW_ID		15
165 typedef struct fip_desc_gwid_s {
166 	uint8_t		id_type;
167 	uint8_t		id_len;
168 	uint8_t		id_reserved[2];
169 	uint8_t		id_vendor_id[FIP_VENDOR_LEN];
170 	uint8_t		id_guid[FIP_GUID_LEN];
171 	uint8_t		id_sysname[FIP_SYSNAME_LEN];
172 	uint8_t		id_portname[FIP_PORTNAME_LEN];
173 } fip_desc_gwid_t;
174 
175 /*
176  * FIP_Descriptor_Keep_Alive_Parameters
177  */
178 #define	FIP_DESC_TYPE_KEEP_ALIVE	249
179 #define	FIP_DESC_LEN_KEEP_ALIVE		6
180 typedef struct fip_desc_keepalive_s {
181 	uint8_t		ka_type;
182 	uint8_t		ka_len;
183 	uint8_t		ka_reserved[2];
184 	uint8_t		ka_vendor_id[FIP_VENDOR_LEN];
185 	uint32_t	ka_gw_adv_period;
186 	uint32_t	ka_gw_ka_period;
187 	uint32_t	ka_vnic_ka_period;
188 } fip_desc_keepalive_t;
189 
190 /*
191  * FIP Advertise Control Message:
192  *
193  * 	FIP_Protocol_Version
194  * 	FIP_Basic_Header
195  * 	FIP_Descriptor_Infiniband_Address
196  * 	FIP_Descriptor_EoIB_Gateway_Information
197  *	FIP_Descriptor_Gateway_Identifier
198  *	FIP_Descriptor_Keep_Alive_Parameters
199  */
200 typedef struct fip_advertise_s {
201 	fip_proto_t		ad_proto_version;
202 	fip_basic_hdr_t		ad_fip_header;
203 	fip_desc_iba_t		ad_iba;
204 	fip_desc_gwinfo_t	ad_gwinfo;
205 	fip_desc_gwid_t		ad_gwid;
206 	fip_desc_keepalive_t	ad_keep_alive;
207 } fip_advertise_t;
208 
209 /*
210  * FIP_Descriptor_vNIC_Login
211  */
212 #define	FIP_DESC_TYPE_VNIC_LOGIN	242
213 #define	FIP_DESC_LEN_VNIC_LOGIN		13
214 typedef struct fip_desc_vnic_login_s {
215 	uint8_t			vl_type;
216 	uint8_t			vl_len;
217 	uint8_t			vl_reserved1[2];
218 	uint8_t			vl_vendor_id[FIP_VENDOR_LEN];
219 	uint16_t		vl_mtu;
220 	uint16_t		vl_vnic_id;
221 	uint16_t		vl_flags_vlan;
222 	uint8_t			vl_mac[ETHERADDRL];
223 	uint8_t			vl_gw_mgid_prefix[FIP_MGID_PREFIX_LEN];
224 	uint8_t			vl_reserved2;
225 	uint8_t			vl_flags_rss;
226 	uint8_t			vl_n_mac_mcgid;
227 	uint32_t		vl_syndrome_ctl_qpn;
228 	uint8_t			vl_vnic_name[FIP_VNIC_NAME_LEN];
229 } fip_desc_vnic_login_t;
230 
231 /*
232  * Flags, masks and error codes for FIP_Descriptor_vNIC_Login
233  */
234 #define	FIP_VL_VNIC_ID_MSBIT		0x8000
235 #define	FIP_VL_FLAGS_V			0x8000
236 #define	FIP_VL_FLAGS_M			0x4000
237 #define	FIP_VL_FLAGS_VP			0x2000
238 #define	FIP_VL_FLAGS_H			0x1000
239 #define	FIP_VL_VLAN_MASK		0x0FFF
240 #define	FIP_VL_RSS_MASK			0x10
241 #define	FIP_VL_N_RSS_MCGID_MASK		0x0F
242 #define	FIP_VL_N_MAC_MCGID_MASK		0x3F
243 #define	FIP_VL_CTL_QPN_MASK		0x00FFFFFF
244 
245 #define	FIP_VL_SYN_MASK			0xFF000000
246 #define	FIP_VL_SYN_SHIFT		24
247 
248 #define	FIP_VL_SYN_SUCCESS		0
249 #define	FIP_VL_SYN_REJECTED		1
250 #define	FIP_VL_SYN_GW_NO_RESOURCE	2
251 #define	FIP_VL_SYN_NO_MORE_NWK_ADDRS	3
252 #define	FIP_VL_SYN_UNKNOWN_HOST		4
253 #define	FIP_VL_SYN_UNSUPP_PARAM		5
254 
255 /*
256  * FIP_Descriptor_Partition
257  */
258 #define	FIP_DESC_TYPE_PARTITION		246
259 #define	FIP_DESC_LEN_PARTITION		4
260 typedef struct fip_desc_partition_s {
261 	uint8_t			pn_type;
262 	uint8_t			pn_len;
263 	uint8_t			pn_reserved1[2];
264 	uint8_t			pn_vendor_id[FIP_VENDOR_LEN];
265 	uint8_t			pn_reserved2[2];
266 	uint16_t		pn_pkey;
267 } fip_desc_partition_t;
268 
269 /*
270  * FIP Login Control Message:
271  *
272  * 	FIP_Protocol_Version
273  * 	FIP_Basic_Header
274  * 	FIP_Descriptor_Infiniband_Address
275  * 	FIP_Descriptor_vNIC_Login
276  */
277 typedef struct fip_login_s {
278 	fip_proto_t		lg_proto_version;
279 	fip_basic_hdr_t		lg_fip_header;
280 	fip_desc_iba_t		lg_iba;
281 	fip_desc_vnic_login_t	lg_vnic_login;
282 } fip_login_t;
283 
284 /*
285  * FIP Login ACK Control Message:
286  *
287  * 	FIP_Protocol_Version
288  * 	FIP_Basic_Header
289  * 	FIP_Descriptor_Infiniband_Address
290  * 	FIP_Descriptor_vNIC_Login
291  *	FIP_Descriptor_Partition
292  */
293 typedef struct fip_login_ack_s {
294 	fip_proto_t		ak_proto_version;
295 	fip_basic_hdr_t		ak_fip_header;
296 	fip_desc_iba_t		ak_iba;
297 	fip_desc_vnic_login_t	ak_vnic_login;
298 	fip_desc_partition_t	ak_vhub_partition;
299 } fip_login_ack_t;
300 
301 /*
302  * FIP_Descriptor_vNIC_Identity
303  */
304 #define	FIP_DESC_TYPE_VNIC_IDENTITY	245
305 #define	FIP_DESC_LEN_VNIC_IDENTITY	13
306 typedef struct fip_desc_vnic_identity_s {
307 	uint8_t			vi_type;
308 	uint8_t			vi_len;
309 	uint8_t			vi_reserved1[2];
310 	uint8_t			vi_vendor_id[FIP_VENDOR_LEN];
311 	uint32_t		vi_flags_vhub_id;
312 	uint32_t		vi_tusn;
313 	uint16_t		vi_vnic_id;
314 	uint8_t			vi_mac[ETHERADDRL];
315 	uint8_t			vi_port_guid[FIP_GUID_LEN];
316 	uint8_t			vi_vnic_name[FIP_VNIC_NAME_LEN];
317 } fip_desc_vnic_identity_t;
318 
319 #define	FIP_VI_FLAG_U		0x80000000
320 #define	FIP_VI_FLAG_R		0x40000000
321 #define	FIP_VI_FLAG_VP		0x01000000
322 
323 /*
324  * FIP Keep Alive Control Message:
325  *
326  *	FIP_Protocol_Version
327  *	FIP_Basic_Header
328  *	FIP_Descriptor_vNIC_Identity
329  */
330 typedef struct fip_keep_alive_s {
331 	fip_proto_t			ka_proto_version;
332 	fip_basic_hdr_t			ka_fip_header;
333 	fip_desc_vnic_identity_t	ka_vnic_identity;
334 } fip_keep_alive_t;
335 
336 /*
337  * FIP_vHUB_Table_Entry
338  */
339 typedef struct fip_vhub_table_entry_s {
340 	uint8_t			te_v_rss_type;
341 	uint8_t			te_reserved1;
342 	uint8_t			te_mac[ETHERADDRL];
343 	uint32_t		te_qpn;
344 	uint8_t			te_reserved2;
345 	uint8_t			te_sl;
346 	uint16_t		te_lid;
347 } fip_vhub_table_entry_t;
348 
349 #define	FIP_TE_VALID			0x80
350 #define	FIP_TE_RSS			0x40
351 
352 #define	FIP_TE_TYPE_MASK		0x0F
353 #define	FIP_TE_TYPE_VNIC		0x00
354 #define	FIP_TE_TYPE_GATEWAY		0x01
355 #define	FIP_TE_TYPE_UNICAST_MISS	0x02
356 #define	FIP_TE_TYPE_MULTICAST_ENTRY	0x03
357 #define	FIP_TE_TYPE_VHUB_MULTICAST	0x04
358 
359 #define	FIP_TE_SL_MASK			0x0F
360 #define	FIP_TE_QPN_MASK			0x00FFFFFF
361 
362 #define	FIP_VHUB_TABLE_ENTRY_SZ		(sizeof (fip_vhub_table_entry_t))
363 #define	FIP_VHUB_TABLE_ENTRY_WORDS	(FIP_VHUB_TABLE_ENTRY_SZ >> 2)
364 
365 /*
366  * FIP_Descriptor_vHUB_Update
367  */
368 #define	FIP_DESC_TYPE_VHUB_UPDATE	243
369 #define	FIP_DESC_LEN_VHUB_UPDATE	9
370 typedef struct fip_desc_vhub_update_s {
371 	uint8_t			up_type;
372 	uint8_t			up_len;
373 	uint8_t			up_reserved1[2];
374 	uint8_t			up_vendor_id[FIP_VENDOR_LEN];
375 	uint32_t		up_eport_vp_vhub_id;
376 	uint32_t		up_tusn;
377 	fip_vhub_table_entry_t	up_tbl_entry;
378 } fip_desc_vhub_update_t;
379 
380 #define	FIP_UP_VP_SHIFT			24
381 #define	FIP_UP_VP_MASK			0x1
382 #define	FIP_UP_EPORT_STATE_SHIFT	28
383 #define	FIP_UP_EPORT_STATE_MASK		0x3
384 #define	FIP_UP_VHUB_ID_MASK		0x00FFFFFF
385 
386 #define	FIP_EPORT_DOWN			0x0
387 #define	FIP_EPORT_UP			0x1
388 
389 /*
390  * FIP_Descriptor_vHUB_Table
391  */
392 #define	FIP_DESC_TYPE_VHUB_TABLE	244
393 typedef struct fip_desc_vhub_table_s {
394 	uint8_t			tb_type;
395 	uint8_t			tb_len;
396 	uint8_t			tb_reserved1[2];
397 	uint8_t			tb_vendor_id[FIP_VENDOR_LEN];
398 	uint32_t		tb_flags_vhub_id;
399 	uint32_t		tb_tusn;
400 	uint8_t			tb_hdr;
401 	uint8_t			tb_reserved2;
402 	uint16_t		tb_table_size;
403 	/*
404 	 * FIP_vHUB_Table_Entry
405 	 * FIP_vHUB_Table_Entry
406 	 * .
407 	 * .
408 	 * .
409 	 * uint32_t Checksum
410 	 */
411 } fip_desc_vhub_table_t;
412 
413 #define	FIP_TB_FLAGS_VP_SHIFT		24
414 #define	FIP_TB_FLAGS_VP_MASK		0x1
415 
416 #define	FIP_TB_VHUB_ID_MASK		0x00FFFFFF
417 
418 #define	FIP_TB_HDR_MIDDLE		0x00
419 #define	FIP_TB_HDR_FIRST		0x40
420 #define	FIP_TB_HDR_LAST			0x80
421 #define	FIP_TB_HDR_ONLY			0xC0
422 
423 #define	FIP_DESC_VHUB_TABLE_SZ		(sizeof (fip_desc_vhub_table_t))
424 #define	FIP_DESC_VHUB_TABLE_WORDS	(FIP_DESC_VHUB_TABLE_SZ >> 2)
425 
426 /*
427  * FIP vHUB Table Message:
428  *
429  * 	FIP_Protocol_Version
430  * 	FIP_Basic_Header
431  * 	FIP_Descriptor_vHUB_Table
432  */
433 typedef struct fip_vhub_table_s {
434 	fip_proto_t		vt_proto_version;
435 	fip_basic_hdr_t		vt_fip_header;
436 	fip_desc_vhub_table_t	vt_vhub_table;
437 } fip_vhub_table_t;
438 
439 /*
440  * FIP vHUB Update Message:
441  *
442  * 	FIP_Protocol_Version
443  * 	FIP_Basic_Header
444  * 	FIP_Descriptor_vHUB_Update
445  */
446 typedef struct fip_vhub_update_s {
447 	fip_proto_t		vu_proto_version;
448 	fip_basic_hdr_t		vu_fip_header;
449 	fip_desc_vhub_update_t	vu_vhub_update;
450 } fip_vhub_update_t;
451 
452 /*
453  * Just a generic container to handle either type of VHUB
454  * messages
455  */
456 typedef struct fip_vhub_pkt_s {
457 	fip_proto_t		hb_proto_version;
458 	fip_basic_hdr_t		hb_fip_header;
459 } fip_vhub_pkt_t;
460 
461 #ifdef __cplusplus
462 }
463 #endif
464 
465 #endif	/* _SYS_IB_EOIB_FIP_H */
466