root/usr/src/uts/common/sys/ib/clients/eoib/fip.h
/*
 * 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_FIP_H
#define _SYS_IB_EOIB_FIP_H

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/ethernet.h>
#include <sys/ib/ib_types.h>

/*
 * Sizes of various objects in FIP headers
 */
#define FIP_VENDOR_LEN                  8
#define FIP_GUID_LEN                    8
#define FIP_SYSNAME_LEN                 32
#define FIP_PORTNAME_LEN                8
#define FIP_MGID_PREFIX_LEN             5
#define FIP_VNIC_NAME_LEN               16
#define FIP_VHUBID_LEN                  3

/*
 * EoIB Pkeys and Qkeys
 */
#define EIB_ADMIN_PKEY                  0xFFFF
#define EIB_FIP_QKEY                    0x80020002
#define EIB_DATA_QKEY                   0x80020003

/*
 * EoIB Advertise and Solicit MCG GUIDs
 */
#define EIB_GUID_ADVERTISE_PREFIX       0xFF12E01B00060000
#define EIB_GUID_SOLICIT_PREFIX         0xFF12E01B00070000

/*
 * FIP_Protocol_Version
 */
#define FIP_PROTO_VERSION               0
typedef struct fip_proto_s {
        uint8_t         pr_version;
        uint8_t         pr_reserved[3];
} fip_proto_t;

/*
 * Basic FIP Header: Opcodes and subcodes for EoIB
 */
#define FIP_OPCODE_EOIB                 0xFFF9

#define FIP_SUBCODE_H_SOLICIT           0x1
#define FIP_SUBCODE_G_ADVERTISE         0x2
#define FIP_SUBCODE_H_VNIC_LOGIN        0x3
#define FIP_SUBCODE_G_VNIC_LOGIN_ACK    0x4
#define FIP_SUBCODE_H_VNIC_LOGOUT       0x5
#define FIP_SUBCODE_G_VHUB_UPDATE       0x6
#define FIP_SUBCODE_G_VHUB_TABLE        0x7
#define FIP_SUBCODE_H_KEEP_ALIVE        0x8

/*
 * Basic FIP Header: Flags relevant to EoIB
 */
#define FIP_BHFLAG_GWAVAIL              0x4
#define FIP_BHFLAG_SLCTMSG              0x2

/*
 * FIP_Basic_Header
 */
#define FIP_DESC_TYPE_VENDOR_ID         13
#define FIP_DESC_LEN_VENDOR_ID          3
typedef struct fip_basic_hdr_s {
        uint16_t        hd_opcode;
        uint8_t         hd_reserved1;
        uint8_t         hd_subcode;
        uint16_t        hd_desc_list_len;
        uint16_t        hd_flags;
        uint8_t         hd_type;
        uint8_t         hd_len;
        uint8_t         hd_reserved2[2];
        uint8_t         hd_vendor_id[FIP_VENDOR_LEN];
} fip_basic_hdr_t;

#define FIP_IBA_QPN_MASK                0x00FFFFFF
#define FIP_IBA_PORTID_MASK             0x0FFF
#define FIP_IBA_SL_MASK                 0xF000
#define FIP_IBA_SL_SHIFT                12

/*
 * FIP_Descriptor_Infiniband_Address
 */
#define FIP_DESC_TYPE_IBA               240
#define FIP_DESC_LEN_IBA                7
typedef struct fip_desc_iba_s {
        uint8_t         ia_type;
        uint8_t         ia_len;
        uint8_t         ia_reserved[2];
        uint8_t         ia_vendor_id[FIP_VENDOR_LEN];
        uint32_t        ia_qpn;
        uint16_t        ia_sl_portid;
        uint16_t        ia_lid;
        uint8_t         ia_guid[FIP_GUID_LEN];
} fip_desc_iba_t;

/*
 * FIP Solicitation Control Message:
 *
 *      FIP_Protocol_Version
 *      FIP_Basic_Header
 *      FIP_Descriptor_Infiniband_Address
 */
typedef struct fip_solicit_s {
        fip_proto_t     sl_proto_version;
        fip_basic_hdr_t sl_fip_hdr;
        fip_desc_iba_t  sl_iba;
} fip_solicit_t;

/*
 * FIP_Descriptor_EoIB_Gateway_Information
 */
#define FIP_DESC_TYPE_EOIB_GW_INFO      241
#define FIP_DESC_LEN_EOIB_GW_INFO       4
typedef struct fip_desc_gwinfo_s {
        uint8_t         gi_type;
        uint8_t         gi_len;
        uint8_t         gi_reserved1[2];
        uint8_t         gi_vendor_id[FIP_VENDOR_LEN];
        uint8_t         gi_flags;
        uint8_t         gi_reserved2;
        uint16_t        gi_rss_qpn_num_net_vnics;
} fip_desc_gwinfo_t;

#define FIP_GWI_HOST_ADMIND_VNICS_MASK  0x80
#define FIP_GWI_NUM_NET_VNICS_MASK      0x0FFF
#define FIP_GWI_RSS_QPN_MASK            0xF000
#define FIP_GWI_RSS_QPN_SHIFT           12

/*
 * FIP_Descriptor_Gateway_Identifier
 */
#define FIP_DESC_TYPE_GW_ID             248
#define FIP_DESC_LEN_GW_ID              15
typedef struct fip_desc_gwid_s {
        uint8_t         id_type;
        uint8_t         id_len;
        uint8_t         id_reserved[2];
        uint8_t         id_vendor_id[FIP_VENDOR_LEN];
        uint8_t         id_guid[FIP_GUID_LEN];
        uint8_t         id_sysname[FIP_SYSNAME_LEN];
        uint8_t         id_portname[FIP_PORTNAME_LEN];
} fip_desc_gwid_t;

/*
 * FIP_Descriptor_Keep_Alive_Parameters
 */
#define FIP_DESC_TYPE_KEEP_ALIVE        249
#define FIP_DESC_LEN_KEEP_ALIVE         6
typedef struct fip_desc_keepalive_s {
        uint8_t         ka_type;
        uint8_t         ka_len;
        uint8_t         ka_reserved[2];
        uint8_t         ka_vendor_id[FIP_VENDOR_LEN];
        uint32_t        ka_gw_adv_period;
        uint32_t        ka_gw_ka_period;
        uint32_t        ka_vnic_ka_period;
} fip_desc_keepalive_t;

/*
 * FIP Advertise Control Message:
 *
 *      FIP_Protocol_Version
 *      FIP_Basic_Header
 *      FIP_Descriptor_Infiniband_Address
 *      FIP_Descriptor_EoIB_Gateway_Information
 *      FIP_Descriptor_Gateway_Identifier
 *      FIP_Descriptor_Keep_Alive_Parameters
 */
typedef struct fip_advertise_s {
        fip_proto_t             ad_proto_version;
        fip_basic_hdr_t         ad_fip_header;
        fip_desc_iba_t          ad_iba;
        fip_desc_gwinfo_t       ad_gwinfo;
        fip_desc_gwid_t         ad_gwid;
        fip_desc_keepalive_t    ad_keep_alive;
} fip_advertise_t;

/*
 * FIP_Descriptor_vNIC_Login
 */
#define FIP_DESC_TYPE_VNIC_LOGIN        242
#define FIP_DESC_LEN_VNIC_LOGIN         13
typedef struct fip_desc_vnic_login_s {
        uint8_t                 vl_type;
        uint8_t                 vl_len;
        uint8_t                 vl_reserved1[2];
        uint8_t                 vl_vendor_id[FIP_VENDOR_LEN];
        uint16_t                vl_mtu;
        uint16_t                vl_vnic_id;
        uint16_t                vl_flags_vlan;
        uint8_t                 vl_mac[ETHERADDRL];
        uint8_t                 vl_gw_mgid_prefix[FIP_MGID_PREFIX_LEN];
        uint8_t                 vl_reserved2;
        uint8_t                 vl_flags_rss;
        uint8_t                 vl_n_mac_mcgid;
        uint32_t                vl_syndrome_ctl_qpn;
        uint8_t                 vl_vnic_name[FIP_VNIC_NAME_LEN];
} fip_desc_vnic_login_t;

/*
 * Flags, masks and error codes for FIP_Descriptor_vNIC_Login
 */
#define FIP_VL_VNIC_ID_MSBIT            0x8000
#define FIP_VL_FLAGS_V                  0x8000
#define FIP_VL_FLAGS_M                  0x4000
#define FIP_VL_FLAGS_VP                 0x2000
#define FIP_VL_FLAGS_H                  0x1000
#define FIP_VL_VLAN_MASK                0x0FFF
#define FIP_VL_RSS_MASK                 0x10
#define FIP_VL_N_RSS_MCGID_MASK         0x0F
#define FIP_VL_N_MAC_MCGID_MASK         0x3F
#define FIP_VL_CTL_QPN_MASK             0x00FFFFFF

#define FIP_VL_SYN_MASK                 0xFF000000
#define FIP_VL_SYN_SHIFT                24

#define FIP_VL_SYN_SUCCESS              0
#define FIP_VL_SYN_REJECTED             1
#define FIP_VL_SYN_GW_NO_RESOURCE       2
#define FIP_VL_SYN_NO_MORE_NWK_ADDRS    3
#define FIP_VL_SYN_UNKNOWN_HOST         4
#define FIP_VL_SYN_UNSUPP_PARAM         5

/*
 * FIP_Descriptor_Partition
 */
#define FIP_DESC_TYPE_PARTITION         246
#define FIP_DESC_LEN_PARTITION          4
typedef struct fip_desc_partition_s {
        uint8_t                 pn_type;
        uint8_t                 pn_len;
        uint8_t                 pn_reserved1[2];
        uint8_t                 pn_vendor_id[FIP_VENDOR_LEN];
        uint8_t                 pn_reserved2[2];
        uint16_t                pn_pkey;
} fip_desc_partition_t;

/*
 * FIP Login Control Message:
 *
 *      FIP_Protocol_Version
 *      FIP_Basic_Header
 *      FIP_Descriptor_Infiniband_Address
 *      FIP_Descriptor_vNIC_Login
 */
typedef struct fip_login_s {
        fip_proto_t             lg_proto_version;
        fip_basic_hdr_t         lg_fip_header;
        fip_desc_iba_t          lg_iba;
        fip_desc_vnic_login_t   lg_vnic_login;
} fip_login_t;

/*
 * FIP Login ACK Control Message:
 *
 *      FIP_Protocol_Version
 *      FIP_Basic_Header
 *      FIP_Descriptor_Infiniband_Address
 *      FIP_Descriptor_vNIC_Login
 *      FIP_Descriptor_Partition
 */
typedef struct fip_login_ack_s {
        fip_proto_t             ak_proto_version;
        fip_basic_hdr_t         ak_fip_header;
        fip_desc_iba_t          ak_iba;
        fip_desc_vnic_login_t   ak_vnic_login;
        fip_desc_partition_t    ak_vhub_partition;
} fip_login_ack_t;

/*
 * FIP_Descriptor_vNIC_Identity
 */
#define FIP_DESC_TYPE_VNIC_IDENTITY     245
#define FIP_DESC_LEN_VNIC_IDENTITY      13
typedef struct fip_desc_vnic_identity_s {
        uint8_t                 vi_type;
        uint8_t                 vi_len;
        uint8_t                 vi_reserved1[2];
        uint8_t                 vi_vendor_id[FIP_VENDOR_LEN];
        uint32_t                vi_flags_vhub_id;
        uint32_t                vi_tusn;
        uint16_t                vi_vnic_id;
        uint8_t                 vi_mac[ETHERADDRL];
        uint8_t                 vi_port_guid[FIP_GUID_LEN];
        uint8_t                 vi_vnic_name[FIP_VNIC_NAME_LEN];
} fip_desc_vnic_identity_t;

#define FIP_VI_FLAG_U           0x80000000
#define FIP_VI_FLAG_R           0x40000000
#define FIP_VI_FLAG_VP          0x01000000

/*
 * FIP Keep Alive Control Message:
 *
 *      FIP_Protocol_Version
 *      FIP_Basic_Header
 *      FIP_Descriptor_vNIC_Identity
 */
typedef struct fip_keep_alive_s {
        fip_proto_t                     ka_proto_version;
        fip_basic_hdr_t                 ka_fip_header;
        fip_desc_vnic_identity_t        ka_vnic_identity;
} fip_keep_alive_t;

/*
 * FIP_vHUB_Table_Entry
 */
typedef struct fip_vhub_table_entry_s {
        uint8_t                 te_v_rss_type;
        uint8_t                 te_reserved1;
        uint8_t                 te_mac[ETHERADDRL];
        uint32_t                te_qpn;
        uint8_t                 te_reserved2;
        uint8_t                 te_sl;
        uint16_t                te_lid;
} fip_vhub_table_entry_t;

#define FIP_TE_VALID                    0x80
#define FIP_TE_RSS                      0x40

#define FIP_TE_TYPE_MASK                0x0F
#define FIP_TE_TYPE_VNIC                0x00
#define FIP_TE_TYPE_GATEWAY             0x01
#define FIP_TE_TYPE_UNICAST_MISS        0x02
#define FIP_TE_TYPE_MULTICAST_ENTRY     0x03
#define FIP_TE_TYPE_VHUB_MULTICAST      0x04

#define FIP_TE_SL_MASK                  0x0F
#define FIP_TE_QPN_MASK                 0x00FFFFFF

#define FIP_VHUB_TABLE_ENTRY_SZ         (sizeof (fip_vhub_table_entry_t))
#define FIP_VHUB_TABLE_ENTRY_WORDS      (FIP_VHUB_TABLE_ENTRY_SZ >> 2)

/*
 * FIP_Descriptor_vHUB_Update
 */
#define FIP_DESC_TYPE_VHUB_UPDATE       243
#define FIP_DESC_LEN_VHUB_UPDATE        9
typedef struct fip_desc_vhub_update_s {
        uint8_t                 up_type;
        uint8_t                 up_len;
        uint8_t                 up_reserved1[2];
        uint8_t                 up_vendor_id[FIP_VENDOR_LEN];
        uint32_t                up_eport_vp_vhub_id;
        uint32_t                up_tusn;
        fip_vhub_table_entry_t  up_tbl_entry;
} fip_desc_vhub_update_t;

#define FIP_UP_VP_SHIFT                 24
#define FIP_UP_VP_MASK                  0x1
#define FIP_UP_EPORT_STATE_SHIFT        28
#define FIP_UP_EPORT_STATE_MASK         0x3
#define FIP_UP_VHUB_ID_MASK             0x00FFFFFF

#define FIP_EPORT_DOWN                  0x0
#define FIP_EPORT_UP                    0x1

/*
 * FIP_Descriptor_vHUB_Table
 */
#define FIP_DESC_TYPE_VHUB_TABLE        244
typedef struct fip_desc_vhub_table_s {
        uint8_t                 tb_type;
        uint8_t                 tb_len;
        uint8_t                 tb_reserved1[2];
        uint8_t                 tb_vendor_id[FIP_VENDOR_LEN];
        uint32_t                tb_flags_vhub_id;
        uint32_t                tb_tusn;
        uint8_t                 tb_hdr;
        uint8_t                 tb_reserved2;
        uint16_t                tb_table_size;
        /*
         * FIP_vHUB_Table_Entry
         * FIP_vHUB_Table_Entry
         * .
         * .
         * .
         * uint32_t Checksum
         */
} fip_desc_vhub_table_t;

#define FIP_TB_FLAGS_VP_SHIFT           24
#define FIP_TB_FLAGS_VP_MASK            0x1

#define FIP_TB_VHUB_ID_MASK             0x00FFFFFF

#define FIP_TB_HDR_MIDDLE               0x00
#define FIP_TB_HDR_FIRST                0x40
#define FIP_TB_HDR_LAST                 0x80
#define FIP_TB_HDR_ONLY                 0xC0

#define FIP_DESC_VHUB_TABLE_SZ          (sizeof (fip_desc_vhub_table_t))
#define FIP_DESC_VHUB_TABLE_WORDS       (FIP_DESC_VHUB_TABLE_SZ >> 2)

/*
 * FIP vHUB Table Message:
 *
 *      FIP_Protocol_Version
 *      FIP_Basic_Header
 *      FIP_Descriptor_vHUB_Table
 */
typedef struct fip_vhub_table_s {
        fip_proto_t             vt_proto_version;
        fip_basic_hdr_t         vt_fip_header;
        fip_desc_vhub_table_t   vt_vhub_table;
} fip_vhub_table_t;

/*
 * FIP vHUB Update Message:
 *
 *      FIP_Protocol_Version
 *      FIP_Basic_Header
 *      FIP_Descriptor_vHUB_Update
 */
typedef struct fip_vhub_update_s {
        fip_proto_t             vu_proto_version;
        fip_basic_hdr_t         vu_fip_header;
        fip_desc_vhub_update_t  vu_vhub_update;
} fip_vhub_update_t;

/*
 * Just a generic container to handle either type of VHUB
 * messages
 */
typedef struct fip_vhub_pkt_s {
        fip_proto_t             hb_proto_version;
        fip_basic_hdr_t         hb_fip_header;
} fip_vhub_pkt_t;

#ifdef __cplusplus
}
#endif

#endif  /* _SYS_IB_EOIB_FIP_H */