| #ifndef _GPXE_IB_MAD_H |
| #define _GPXE_IB_MAD_H |
| |
| /** @file |
| * |
| * Infiniband management datagrams |
| * |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER ); |
| |
| #include <stdint.h> |
| #include <gpxe/ib_packet.h> |
| |
| /***************************************************************************** |
| * |
| * Subnet management MADs |
| * |
| ***************************************************************************** |
| */ |
| |
| /** A subnet management header |
| * |
| * Defined in sections 14.2.1.1 and 14.2.1.2 of the IBA. |
| */ |
| struct ib_smp_hdr { |
| uint64_t mkey; |
| uint16_t slid; |
| uint16_t dlid; |
| uint8_t reserved[28]; |
| } __attribute__ (( packed )); |
| |
| /** Subnet management class version */ |
| #define IB_SMP_CLASS_VERSION 1 |
| |
| /** Subnet management direction bit |
| * |
| * This bit resides in the "status" field in the MAD header. |
| */ |
| #define IB_SMP_STATUS_D_INBOUND 0x8000 |
| |
| /* Subnet management attributes */ |
| #define IB_SMP_ATTR_NOTICE 0x0002 |
| #define IB_SMP_ATTR_NODE_DESC 0x0010 |
| #define IB_SMP_ATTR_NODE_INFO 0x0011 |
| #define IB_SMP_ATTR_SWITCH_INFO 0x0012 |
| #define IB_SMP_ATTR_GUID_INFO 0x0014 |
| #define IB_SMP_ATTR_PORT_INFO 0x0015 |
| #define IB_SMP_ATTR_PKEY_TABLE 0x0016 |
| #define IB_SMP_ATTR_SL_TO_VL_TABLE 0x0017 |
| #define IB_SMP_ATTR_VL_ARB_TABLE 0x0018 |
| #define IB_SMP_ATTR_LINEAR_FORWARD_TABLE 0x0019 |
| #define IB_SMP_ATTR_RANDOM_FORWARD_TABLE 0x001A |
| #define IB_SMP_ATTR_MCAST_FORWARD_TABLE 0x001B |
| #define IB_SMP_ATTR_SM_INFO 0x0020 |
| #define IB_SMP_ATTR_VENDOR_DIAG 0x0030 |
| #define IB_SMP_ATTR_LED_INFO 0x0031 |
| #define IB_SMP_ATTR_VENDOR_MASK 0xFF00 |
| |
| /** |
| * A Node Description attribute |
| * |
| * Defined in section 14.2.5.2 of the IBA |
| */ |
| struct ib_node_desc { |
| char node_string[64]; |
| } __attribute__ (( packed )); |
| |
| /** A Node Information attribute |
| * |
| * Defined in section 14.2.5.3 of the IBA. |
| */ |
| struct ib_node_info { |
| uint8_t base_version; |
| uint8_t class_version; |
| uint8_t node_type; |
| uint8_t num_ports; |
| struct ib_gid_half sys_guid; |
| struct ib_gid_half node_guid; |
| struct ib_gid_half port_guid; |
| uint16_t partition_cap; |
| uint16_t device_id; |
| uint32_t revision; |
| uint8_t local_port_num; |
| uint8_t vendor_id[3]; |
| } __attribute__ ((packed)); |
| |
| #define IB_NODE_TYPE_HCA 0x01 |
| #define IB_NODE_TYPE_SWITCH 0x02 |
| #define IB_NODE_TYPE_ROUTER 0x03 |
| |
| /** A GUID Information attribute |
| * |
| * Defined in section 14.2.5.5 of the IBA. |
| */ |
| struct ib_guid_info { |
| uint8_t guid[8][8]; |
| } __attribute__ (( packed )); |
| |
| /** A Port Information attribute |
| * |
| * Defined in section 14.2.5.6 of the IBA. |
| */ |
| struct ib_port_info { |
| uint64_t mkey; |
| uint8_t gid_prefix[8]; |
| uint16_t lid; |
| uint16_t mastersm_lid; |
| uint32_t cap_mask; |
| uint16_t diag_code; |
| uint16_t mkey_lease_period; |
| uint8_t local_port_num; |
| uint8_t link_width_enabled; |
| uint8_t link_width_supported; |
| uint8_t link_width_active; |
| uint8_t link_speed_supported__port_state; |
| uint8_t port_phys_state__link_down_def_state; |
| uint8_t mkey_prot_bits__lmc; |
| uint8_t link_speed_active__link_speed_enabled; |
| uint8_t neighbour_mtu__mastersm_sl; |
| uint8_t vl_cap__init_type; |
| uint8_t vl_high_limit; |
| uint8_t vl_arbitration_high_cap; |
| uint8_t vl_arbitration_low_cap; |
| uint8_t init_type_reply__mtu_cap; |
| uint8_t vl_stall_count__hoq_life; |
| uint8_t operational_vls__enforcement; |
| uint16_t mkey_violations; |
| uint16_t pkey_violations; |
| uint16_t qkey_violations; |
| uint8_t guid_cap; |
| uint8_t client_reregister__subnet_timeout; |
| uint8_t resp_time_value; |
| uint8_t local_phy_errors__overrun_errors; |
| uint16_t max_credit_hint; |
| uint32_t link_round_trip_latency; |
| } __attribute__ (( packed )); |
| |
| #define IB_LINK_WIDTH_1X 0x01 |
| #define IB_LINK_WIDTH_4X 0x02 |
| #define IB_LINK_WIDTH_8X 0x04 |
| #define IB_LINK_WIDTH_12X 0x08 |
| |
| #define IB_LINK_SPEED_SDR 0x01 |
| #define IB_LINK_SPEED_DDR 0x02 |
| #define IB_LINK_SPEED_QDR 0x04 |
| |
| #define IB_PORT_STATE_DOWN 0x01 |
| #define IB_PORT_STATE_INIT 0x02 |
| #define IB_PORT_STATE_ARMED 0x03 |
| #define IB_PORT_STATE_ACTIVE 0x04 |
| |
| #define IB_PORT_PHYS_STATE_SLEEP 0x01 |
| #define IB_PORT_PHYS_STATE_POLLING 0x02 |
| |
| #define IB_MTU_256 0x01 |
| #define IB_MTU_512 0x02 |
| #define IB_MTU_1024 0x03 |
| #define IB_MTU_2048 0x04 |
| #define IB_MTU_4096 0x05 |
| |
| #define IB_VL_0 0x01 |
| #define IB_VL_0_1 0x02 |
| #define IB_VL_0_3 0x03 |
| #define IB_VL_0_7 0x04 |
| #define IB_VL_0_14 0x05 |
| |
| /** A Partition Key Table attribute |
| * |
| * Defined in section 14.2.5.7 of the IBA. |
| */ |
| struct ib_pkey_table { |
| uint16_t pkey[32]; |
| } __attribute__ (( packed )); |
| |
| /** A subnet management attribute */ |
| union ib_smp_data { |
| struct ib_node_desc node_desc; |
| struct ib_node_info node_info; |
| struct ib_guid_info guid_info; |
| struct ib_port_info port_info; |
| struct ib_pkey_table pkey_table; |
| uint8_t bytes[64]; |
| } __attribute__ (( packed )); |
| |
| /** A subnet management directed route path */ |
| struct ib_smp_dr_path { |
| uint8_t hops[64]; |
| } __attribute__ (( packed )); |
| |
| /** Subnet management MAD class-specific data */ |
| struct ib_smp_class_specific { |
| uint8_t hop_pointer; |
| uint8_t hop_count; |
| } __attribute__ (( packed )); |
| |
| /***************************************************************************** |
| * |
| * Subnet administration MADs |
| * |
| ***************************************************************************** |
| */ |
| |
| #define IB_SA_CLASS_VERSION 2 |
| |
| #define IB_SA_METHOD_DELETE_RESP 0x95 |
| |
| struct ib_rmpp_hdr { |
| uint32_t raw[3]; |
| } __attribute__ (( packed )); |
| |
| struct ib_sa_hdr { |
| uint32_t sm_key[2]; |
| uint16_t reserved; |
| uint16_t attrib_offset; |
| uint32_t comp_mask[2]; |
| } __attribute__ (( packed )); |
| |
| #define IB_SA_ATTR_MC_MEMBER_REC 0x38 |
| #define IB_SA_ATTR_PATH_REC 0x35 |
| |
| struct ib_path_record { |
| uint32_t reserved0[2]; |
| struct ib_gid dgid; |
| struct ib_gid sgid; |
| uint16_t dlid; |
| uint16_t slid; |
| uint32_t hop_limit__flow_label__raw_traffic; |
| uint32_t pkey__numb_path__reversible__tclass; |
| uint8_t reserved1; |
| uint8_t reserved__sl; |
| uint8_t mtu_selector__mtu; |
| uint8_t rate_selector__rate; |
| uint32_t preference__packet_lifetime__packet_lifetime_selector; |
| uint32_t reserved2[35]; |
| } __attribute__ (( packed )); |
| |
| #define IB_SA_PATH_REC_DGID (1<<2) |
| #define IB_SA_PATH_REC_SGID (1<<3) |
| |
| struct ib_mc_member_record { |
| struct ib_gid mgid; |
| struct ib_gid port_gid; |
| uint32_t qkey; |
| uint16_t mlid; |
| uint8_t mtu_selector__mtu; |
| uint8_t tclass; |
| uint16_t pkey; |
| uint8_t rate_selector__rate; |
| uint8_t packet_lifetime_selector__packet_lifetime; |
| uint32_t sl__flow_label__hop_limit; |
| uint8_t scope__join_state; |
| uint8_t proxy_join__reserved; |
| uint16_t reserved0; |
| uint32_t reserved1[37]; |
| } __attribute__ (( packed )); |
| |
| #define IB_SA_MCMEMBER_REC_MGID (1<<0) |
| #define IB_SA_MCMEMBER_REC_PORT_GID (1<<1) |
| #define IB_SA_MCMEMBER_REC_QKEY (1<<2) |
| #define IB_SA_MCMEMBER_REC_MLID (1<<3) |
| #define IB_SA_MCMEMBER_REC_MTU_SELECTOR (1<<4) |
| #define IB_SA_MCMEMBER_REC_MTU (1<<5) |
| #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS (1<<6) |
| #define IB_SA_MCMEMBER_REC_PKEY (1<<7) |
| #define IB_SA_MCMEMBER_REC_RATE_SELECTOR (1<<8) |
| #define IB_SA_MCMEMBER_REC_RATE (1<<9) |
| #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR (1<<10) |
| #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME (1<<11) |
| #define IB_SA_MCMEMBER_REC_SL (1<<12) |
| #define IB_SA_MCMEMBER_REC_FLOW_LABEL (1<<13) |
| #define IB_SA_MCMEMBER_REC_HOP_LIMIT (1<<14) |
| #define IB_SA_MCMEMBER_REC_SCOPE (1<<15) |
| #define IB_SA_MCMEMBER_REC_JOIN_STATE (1<<16) |
| #define IB_SA_MCMEMBER_REC_PROXY_JOIN (1<<17) |
| |
| union ib_sa_data { |
| struct ib_path_record path_record; |
| struct ib_mc_member_record mc_member_record; |
| } __attribute__ (( packed )); |
| |
| /***************************************************************************** |
| * |
| * Communication management MADs |
| * |
| ***************************************************************************** |
| */ |
| |
| /** Communication management class version */ |
| #define IB_CM_CLASS_VERSION 2 |
| |
| /* Communication management attributes */ |
| #define IB_CM_ATTR_CLASS_PORT_INFO 0x0001 |
| #define IB_CM_ATTR_CONNECT_REQUEST 0x0010 |
| #define IB_CM_ATTR_MSG_RCPT_ACK 0x0011 |
| #define IB_CM_ATTR_CONNECT_REJECT 0x0012 |
| #define IB_CM_ATTR_CONNECT_REPLY 0x0013 |
| #define IB_CM_ATTR_READY_TO_USE 0x0014 |
| #define IB_CM_ATTR_DISCONNECT_REQUEST 0x0015 |
| #define IB_CM_ATTR_DISCONNECT_REPLY 0x0016 |
| #define IB_CM_ATTR_SERVICE_ID_RES_REQ 0x0016 |
| #define IB_CM_ATTR_SERVICE_ID_RES_REQ_RESP 0x0018 |
| #define IB_CM_ATTR_LOAD_ALTERNATE_PATH 0x0019 |
| #define IB_CM_ATTR_ALTERNATE_PATH_RESPONSE 0x001a |
| |
| /** Communication management common fields */ |
| struct ib_cm_common { |
| /** Local communication ID */ |
| uint32_t local_id; |
| /** Remote communication ID */ |
| uint32_t remote_id; |
| /** Reserved */ |
| uint8_t reserved[224]; |
| } __attribute__ (( packed )); |
| |
| /** A communication management path */ |
| struct ib_cm_path { |
| /** Local port LID */ |
| uint16_t local_lid; |
| /** Remote port LID */ |
| uint16_t remote_lid; |
| /** Local port GID */ |
| struct ib_gid local_gid; |
| /** Remote port GID */ |
| struct ib_gid remote_gid; |
| /** Flow label and rate */ |
| uint32_t flow_label__rate; |
| /** Traffic class */ |
| uint8_t tc; |
| /** Hop limit */ |
| uint8_t hop_limit; |
| /** SL and subnet local*/ |
| uint8_t sl__subnet_local; |
| /** Local ACK timeout */ |
| uint8_t local_ack_timeout; |
| } __attribute__ (( packed )); |
| |
| /** A communication management connection request |
| * |
| * Defined in section 12.6.5 of the IBA. |
| */ |
| struct ib_cm_connect_request { |
| /** Local communication ID */ |
| uint32_t local_id; |
| /** Reserved */ |
| uint32_t reserved0[1]; |
| /** Service ID */ |
| struct ib_gid_half service_id; |
| /** Local CA GUID */ |
| struct ib_gid_half local_ca; |
| /** Reserved */ |
| uint32_t reserved1[1]; |
| /** Local queue key */ |
| uint32_t local_qkey; |
| /** Local QPN and responder resources*/ |
| uint32_t local_qpn__responder_resources; |
| /** Local EECN and initiator depth */ |
| uint32_t local_eecn__initiator_depth; |
| /** Remote EECN, remote CM response timeout, transport service |
| * type, EE flow control |
| */ |
| uint32_t remote_eecn__remote_timeout__service_type__ee_flow_ctrl; |
| /** Starting PSN, local CM response timeout and retry count */ |
| uint32_t starting_psn__local_timeout__retry_count; |
| /** Partition key */ |
| uint16_t pkey; |
| /** Path packet payload MTU, RDC exists, RNR retry count */ |
| uint8_t payload_mtu__rdc_exists__rnr_retry; |
| /** Max CM retries and SRQ */ |
| uint8_t max_cm_retries__srq; |
| /** Primary path */ |
| struct ib_cm_path primary; |
| /** Alternate path */ |
| struct ib_cm_path alternate; |
| /** Private data */ |
| uint8_t private_data[92]; |
| } __attribute__ (( packed )); |
| |
| /** CM transport types */ |
| #define IB_CM_TRANSPORT_RC 0 |
| #define IB_CM_TRANSPORT_UC 1 |
| #define IB_CM_TRANSPORT_RD 2 |
| |
| /** A communication management connection rejection |
| * |
| * Defined in section 12.6.7 of the IBA. |
| */ |
| struct ib_cm_connect_reject { |
| /** Local communication ID */ |
| uint32_t local_id; |
| /** Remote communication ID */ |
| uint32_t remote_id; |
| /** Message rejected */ |
| uint8_t message; |
| /** Reject information length */ |
| uint8_t info_len; |
| /** Rejection reason */ |
| uint16_t reason; |
| /** Additional rejection information */ |
| uint8_t info[72]; |
| /** Private data */ |
| uint8_t private_data[148]; |
| } __attribute__ (( packed )); |
| |
| /** CM rejection reasons */ |
| #define IB_CM_REJECT_BAD_SERVICE_ID 8 |
| #define IB_CM_REJECT_STALE_CONN 10 |
| #define IB_CM_REJECT_CONSUMER 28 |
| |
| /** A communication management connection reply |
| * |
| * Defined in section 12.6.8 of the IBA. |
| */ |
| struct ib_cm_connect_reply { |
| /** Local communication ID */ |
| uint32_t local_id; |
| /** Remote communication ID */ |
| uint32_t remote_id; |
| /** Local queue key */ |
| uint32_t local_qkey; |
| /** Local QPN */ |
| uint32_t local_qpn; |
| /** Local EECN */ |
| uint32_t local_eecn; |
| /** Starting PSN */ |
| uint32_t starting_psn; |
| /** Responder resources */ |
| uint8_t responder_resources; |
| /** Initiator depth */ |
| uint8_t initiator_depth; |
| /** Target ACK delay, failover accepted, and end-to-end flow control */ |
| uint8_t target_ack_delay__failover_accepted__ee_flow_ctrl; |
| /** RNR retry count, SRQ */ |
| uint8_t rnr_retry__srq; |
| /** Local CA GUID */ |
| struct ib_gid_half local_ca; |
| /** Private data */ |
| uint8_t private_data[196]; |
| } __attribute__ (( packed )); |
| |
| /** A communication management ready to use reply |
| * |
| * Defined in section 12.6.9 of the IBA. |
| */ |
| struct ib_cm_ready_to_use { |
| /** Local communication ID */ |
| uint32_t local_id; |
| /** Remote communication ID */ |
| uint32_t remote_id; |
| /** Private data */ |
| uint8_t private_data[224]; |
| } __attribute__ (( packed )); |
| |
| /** A communication management attribute */ |
| union ib_cm_data { |
| struct ib_cm_common common; |
| struct ib_cm_connect_request connect_request; |
| struct ib_cm_connect_reject connect_reject; |
| struct ib_cm_connect_reply connect_reply; |
| struct ib_cm_ready_to_use ready_to_use; |
| uint8_t bytes[232]; |
| } __attribute__ (( packed )); |
| |
| /***************************************************************************** |
| * |
| * MADs |
| * |
| ***************************************************************************** |
| */ |
| |
| /** Management datagram class_specific data */ |
| union ib_mad_class_specific { |
| uint16_t raw; |
| struct ib_smp_class_specific smp; |
| } __attribute__ (( packed )); |
| |
| /** A management datagram common header |
| * |
| * Defined in section 13.4.2 of the IBA. |
| */ |
| struct ib_mad_hdr { |
| uint8_t base_version; |
| uint8_t mgmt_class; |
| uint8_t class_version; |
| uint8_t method; |
| uint16_t status; |
| union ib_mad_class_specific class_specific; |
| uint32_t tid[2]; |
| uint16_t attr_id; |
| uint8_t reserved[2]; |
| uint32_t attr_mod; |
| } __attribute__ (( packed )); |
| |
| /* Management base version */ |
| #define IB_MGMT_BASE_VERSION 1 |
| |
| /* Management classes */ |
| #define IB_MGMT_CLASS_SUBN_LID_ROUTED 0x01 |
| #define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE 0x81 |
| #define IB_MGMT_CLASS_SUBN_ADM 0x03 |
| #define IB_MGMT_CLASS_PERF_MGMT 0x04 |
| #define IB_MGMT_CLASS_BM 0x05 |
| #define IB_MGMT_CLASS_DEVICE_MGMT 0x06 |
| #define IB_MGMT_CLASS_CM 0x07 |
| #define IB_MGMT_CLASS_SNMP 0x08 |
| #define IB_MGMT_CLASS_VENDOR_RANGE2_START 0x30 |
| #define IB_MGMT_CLASS_VENDOR_RANGE2_END 0x4f |
| |
| #define IB_MGMT_CLASS_MASK 0x7f |
| |
| /* Management methods */ |
| #define IB_MGMT_METHOD_GET 0x01 |
| #define IB_MGMT_METHOD_SET 0x02 |
| #define IB_MGMT_METHOD_GET_RESP 0x81 |
| #define IB_MGMT_METHOD_SEND 0x03 |
| #define IB_MGMT_METHOD_TRAP 0x05 |
| #define IB_MGMT_METHOD_REPORT 0x06 |
| #define IB_MGMT_METHOD_REPORT_RESP 0x86 |
| #define IB_MGMT_METHOD_TRAP_REPRESS 0x07 |
| #define IB_MGMT_METHOD_DELETE 0x15 |
| |
| /* Status codes */ |
| #define IB_MGMT_STATUS_OK 0x0000 |
| #define IB_MGMT_STATUS_BAD_VERSION 0x0001 |
| #define IB_MGMT_STATUS_UNSUPPORTED_METHOD 0x0002 |
| #define IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR 0x0003 |
| #define IB_MGMT_STATUS_INVALID_VALUE 0x0004 |
| |
| /** A subnet management MAD */ |
| struct ib_mad_smp { |
| struct ib_mad_hdr mad_hdr; |
| struct ib_smp_hdr smp_hdr; |
| union ib_smp_data smp_data; |
| struct ib_smp_dr_path initial_path; |
| struct ib_smp_dr_path return_path; |
| } __attribute__ (( packed )); |
| |
| /** A subnet administration MAD */ |
| struct ib_mad_sa { |
| struct ib_mad_hdr mad_hdr; |
| struct ib_rmpp_hdr rmpp_hdr; |
| struct ib_sa_hdr sa_hdr; |
| union ib_sa_data sa_data; |
| } __attribute__ (( packed )); |
| |
| /** A communication management MAD */ |
| struct ib_mad_cm { |
| struct ib_mad_hdr mad_hdr; |
| union ib_cm_data cm_data; |
| } __attribute__ (( packed )); |
| |
| /** A management datagram */ |
| union ib_mad { |
| struct ib_mad_hdr hdr; |
| struct ib_mad_smp smp; |
| struct ib_mad_sa sa; |
| struct ib_mad_cm cm; |
| uint8_t bytes[256]; |
| } __attribute__ (( packed )); |
| |
| #endif /* _GPXE_IB_MAD_H */ |