summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/ib/clients/eoib/eib.h
blob: 6af767eebb329efcab7874999698250abd7f33b3 (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
/*
 * 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 (c) 2010, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _SYS_IB_EOIB_EIB_H
#define	_SYS_IB_EOIB_EIB_H

#ifdef __cplusplus
extern "C" {
#endif

/*
 *
 * EoIB Encapsulation Header Layout
 *
 *  31 30 29 28 27 26 25 24     22 21 20 ... 16 15                      0
 * +-----+-----+-----+-----+--+---+--+---------+-------------------------+
 * | sig | ver | TCP | IP  |  |fcs|ms| segment |       segment id        |
 * |     |     | chk | chk |  |   |  | offset  |                         |
 * +-----+-----+-----+-----+--+---+--+---------+-------------------------+
 *
 */
#define	EIB_ENCAP_HDR_SZ		4

#define	EIB_ENCAP_SIGN_MASK		0x3
#define	EIB_ENCAP_SIGN_SHIFT		30
#define	EIB_ENCAP_VER_MASK		0x3
#define	EIB_ENCAP_VER_SHIFT		28
#define	EIB_ENCAP_TCPCHK_MASK		0x3
#define	EIB_ENCAP_TCPCHK_SHIFT		26
#define	EIB_ENCAP_IPCHK_MASK		0x3
#define	EIB_ENCAP_IPCHK_SHIFT		24
#define	EIB_ENCAP_FCS_B_SHIFT		22
#define	EIB_ENCAP_MS_B_SHIFT		21
#define	EIB_ENCAP_SEGOFF_MASK		0x1F
#define	EIB_ENCAP_SEGOFF_SHIFT		16
#define	EIB_ENCAP_SEGID_MASK		0xFFFF

/*
 * Bit fields values definitions
 */
#define	EIB_EH_SIGNATURE		3
#define	EIB_EH_VERSION			0
#define	EIB_EH_CSUM_UNKNOWN		0
#define	EIB_EH_TCPCSUM_OK		1
#define	EIB_EH_UDPCSUM_OK		2
#define	EIB_EH_CSUM_BAD			3
#define	EIB_EH_IPCSUM_OK		1

/*
 * Some shortcuts
 */
#define	EIB_TX_ENCAP_HDR		0xC0000000
#define	EIB_RX_ENCAP_TCPIP_OK		0xC5000000
#define	EIB_RX_ENCAP_UDPIP_OK		0xC9000000

/*
 * Driver name
 */
#define	EIB_DRV_NAME			"eoib"

/*
 * Currently, the gateway responds to login requests on the qpn that carried
 * the solication request, rather than on the qpn that carried the login
 * request.  This means that EoIB nexus receives the acknowledgements from
 * gateways to login requests made by the individual EoIB instances, and must
 * pass this login ack information back to the appropriate EoIB instance.
 *
 * Now, the only field in the login ack packet that could identify the
 * individual EoIB instance is the vNIC id field, but this is a 16-bit field,
 * with the MSB reserved to indicate whether the mac/vlan is host-managed
 * or gateway-managed.  This leaves us with just 15-bits to encode the EoIB
 * device instance and its Solaris vnic instance.  For now, we divide this
 * field as a 6-bit vnic instance number (max Solaris vnics is 64) and a
 * 9-bit device instance number (max EoIB pseudo-NICs in a system is 512).
 *
 * The long-term solution is to get the gateway to respond directly to the
 * login requestor, so the requestor can use all 15-bits to identify its
 * Solaris vnic instance (max 32K) and leave the device instance limit to
 * the system limit.
 */
#define	EIB_DVI_SHIFT			6
#define	EIB_DVI_MASK			0x1FF
#define	EIB_VNI_MASK			0x03F

#define	EIB_VNIC_INSTANCE(id)		((id) & EIB_VNI_MASK)
#define	EIB_DEVI_INSTANCE(id)		(((id) >> EIB_DVI_SHIFT) & EIB_DVI_MASK)
#define	EIB_VNIC_ID(dvi, vni)		\
	((((dvi) & EIB_DVI_MASK) << EIB_DVI_SHIFT) | ((vni) & EIB_VNI_MASK))

/*
 * Making VHUB_ID from vlan and portid
 */
#define	EIB_VHUB_ID(portid, vlan)	\
	((((uint_t)(portid) & 0xfff) << 12) | ((uint_t)(vlan) & 0xfff))

/*
 * NDI Events that individual EoIB instance will be interested in
 */
#define	EIB_NDI_EVENT_GW_AVAILABLE	"SUNW,eoib:gateway-available"
#define	EIB_NDI_EVENT_LOGIN_ACK		"SUNW,eoib:vnic-login-ack"
#define	EIB_NDI_EVENT_GW_INFO_UPDATE	"SUNW,eoib:gateway-info-update"

/*
 * Properties for each eoib node created
 */
#define	EIB_PROP_HCA_GUID		"hca-guid"
#define	EIB_PROP_HCA_PORTNUM		"hca-port#"
#define	EIB_PROP_GW_SYS_GUID		"gw-system-guid"
#define	EIB_PROP_GW_GUID		"gw-guid"
#define	EIB_PROP_GW_SN_PREFIX		"gw-sn-prefix"
#define	EIB_PROP_GW_ADV_PERIOD		"gw-adv-period"
#define	EIB_PROP_GW_KA_PERIOD		"gw-ka-period"
#define	EIB_PROP_VNIC_KA_PERIOD		"vnic-ka-period"
#define	EIB_PROP_GW_CTRL_QPN		"gw-ctrl-qpn"
#define	EIB_PROP_GW_LID			"gw-lid"
#define	EIB_PROP_GW_PORTID		"gw-portid"
#define	EIB_PROP_GW_NUM_NET_VNICS	"gw-num-net-vnics"
#define	EIB_PROP_GW_AVAILABLE		"gw-available?"
#define	EIB_PROP_GW_HOST_VNICS		"gw-host-vnics?"
#define	EIB_PROP_GW_SL			"gw-sl"
#define	EIB_PROP_GW_N_RSS_QPN		"gw-n-rss-qpn"
#define	EIB_PROP_GW_SYS_NAME		"gw-system-name"
#define	EIB_PROP_GW_PORT_NAME		"gw-port-name"
#define	EIB_PROP_GW_VENDOR_ID		"gw-vendor-id"

/*
 * Gateway information passed by eibnx to eoib.  The lengths of character
 * strings should be longer than what is defined for these objects in fip.h,
 * to accomodate the terminating null.
 */
#define	EIB_GW_SYSNAME_LEN		40
#define	EIB_GW_PORTNAME_LEN		12
#define	EIB_GW_VENDOR_LEN		12

typedef struct eib_gw_info_s {
	ib_guid_t	gi_system_guid;
	ib_guid_t	gi_guid;
	ib_sn_prefix_t	gi_sn_prefix;
	uint32_t	gi_adv_period;
	uint32_t	gi_ka_period;
	uint32_t	gi_vnic_ka_period;
	ib_qpn_t	gi_ctrl_qpn;
	ib_lid_t	gi_lid;
	uint16_t	gi_portid;
	uint16_t	gi_num_net_vnics;
	uint8_t		gi_flag_available;
	uint8_t		gi_is_host_adm_vnics;
	uint8_t		gi_sl;
	uint8_t		gi_n_rss_qpn;
	uint8_t		gi_system_name[EIB_GW_SYSNAME_LEN];
	uint8_t		gi_port_name[EIB_GW_PORTNAME_LEN];
	uint8_t		gi_vendor_id[EIB_GW_VENDOR_LEN];
} eib_gw_info_t;

/*
 * Softint priority levels to use for data and control/admin cq handling
 * in EoIB leaf and nexus drivers
 */
#define	EIB_SOFTPRI_DATA		(DDI_INTR_SOFTPRI_MIN)
#define	EIB_SOFTPRI_CTL			(DDI_INTR_SOFTPRI_MIN + 1)
#define	EIB_SOFTPRI_ADM			(DDI_INTR_SOFTPRI_MIN + 1)

#ifdef __cplusplus
}
#endif

#endif	/* _SYS_IB_EOIB_EIB_H */