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