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
30extern "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
64typedef 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
94typedef 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
116typedef 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 */
134typedef 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
145typedef 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
165typedef 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
180typedef 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 */
200typedef 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
214typedef 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
260typedef 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 */
277typedef 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 */
293typedef 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
306typedef 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 */
330typedef 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 */
339typedef 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
370typedef 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
393typedef 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 */
433typedef 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 */
446typedef 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 */
456typedef 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