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