Home | History | Annotate | Download | only in gpxe
      1 #ifndef _GPXE_IB_MAD_H
      2 #define _GPXE_IB_MAD_H
      3 
      4 /** @file
      5  *
      6  * Infiniband management datagrams
      7  *
      8  */
      9 
     10 FILE_LICENCE ( GPL2_OR_LATER );
     11 
     12 #include <stdint.h>
     13 #include <gpxe/ib_packet.h>
     14 
     15 /*****************************************************************************
     16  *
     17  * Subnet management MADs
     18  *
     19  *****************************************************************************
     20  */
     21 
     22 /** A subnet management header
     23  *
     24  * Defined in sections 14.2.1.1 and 14.2.1.2 of the IBA.
     25  */
     26 struct ib_smp_hdr {
     27 	uint64_t mkey;
     28 	uint16_t slid;
     29 	uint16_t dlid;
     30 	uint8_t reserved[28];
     31 } __attribute__ (( packed ));
     32 
     33 /** Subnet management class version */
     34 #define IB_SMP_CLASS_VERSION			1
     35 
     36 /** Subnet management direction bit
     37  *
     38  * This bit resides in the "status" field in the MAD header.
     39  */
     40 #define IB_SMP_STATUS_D_INBOUND			0x8000
     41 
     42 /* Subnet management attributes */
     43 #define IB_SMP_ATTR_NOTICE			0x0002
     44 #define IB_SMP_ATTR_NODE_DESC			0x0010
     45 #define IB_SMP_ATTR_NODE_INFO			0x0011
     46 #define IB_SMP_ATTR_SWITCH_INFO			0x0012
     47 #define IB_SMP_ATTR_GUID_INFO			0x0014
     48 #define IB_SMP_ATTR_PORT_INFO			0x0015
     49 #define IB_SMP_ATTR_PKEY_TABLE			0x0016
     50 #define IB_SMP_ATTR_SL_TO_VL_TABLE		0x0017
     51 #define IB_SMP_ATTR_VL_ARB_TABLE		0x0018
     52 #define IB_SMP_ATTR_LINEAR_FORWARD_TABLE	0x0019
     53 #define IB_SMP_ATTR_RANDOM_FORWARD_TABLE	0x001A
     54 #define IB_SMP_ATTR_MCAST_FORWARD_TABLE		0x001B
     55 #define IB_SMP_ATTR_SM_INFO			0x0020
     56 #define IB_SMP_ATTR_VENDOR_DIAG			0x0030
     57 #define IB_SMP_ATTR_LED_INFO			0x0031
     58 #define IB_SMP_ATTR_VENDOR_MASK			0xFF00
     59 
     60 /**
     61  * A Node Description attribute
     62  *
     63  * Defined in section 14.2.5.2 of the IBA
     64  */
     65 struct ib_node_desc {
     66 	char node_string[64];
     67 } __attribute__ (( packed ));
     68 
     69 /** A Node Information attribute
     70  *
     71  * Defined in section 14.2.5.3 of the IBA.
     72  */
     73 struct ib_node_info {
     74 	uint8_t base_version;
     75 	uint8_t class_version;
     76 	uint8_t node_type;
     77 	uint8_t num_ports;
     78 	struct ib_gid_half sys_guid;
     79 	struct ib_gid_half node_guid;
     80 	struct ib_gid_half port_guid;
     81 	uint16_t partition_cap;
     82 	uint16_t device_id;
     83 	uint32_t revision;
     84 	uint8_t local_port_num;
     85 	uint8_t vendor_id[3];
     86 } __attribute__ ((packed));
     87 
     88 #define IB_NODE_TYPE_HCA		0x01
     89 #define IB_NODE_TYPE_SWITCH		0x02
     90 #define IB_NODE_TYPE_ROUTER		0x03
     91 
     92 /** A GUID Information attribute
     93  *
     94  * Defined in section 14.2.5.5 of the IBA.
     95  */
     96 struct ib_guid_info {
     97 	uint8_t guid[8][8];
     98 } __attribute__ (( packed ));
     99 
    100 /** A Port Information attribute
    101  *
    102  * Defined in section 14.2.5.6 of the IBA.
    103  */
    104 struct ib_port_info {
    105 	uint64_t mkey;
    106 	uint8_t gid_prefix[8];
    107 	uint16_t lid;
    108 	uint16_t mastersm_lid;
    109 	uint32_t cap_mask;
    110 	uint16_t diag_code;
    111 	uint16_t mkey_lease_period;
    112 	uint8_t local_port_num;
    113 	uint8_t link_width_enabled;
    114 	uint8_t link_width_supported;
    115 	uint8_t link_width_active;
    116 	uint8_t link_speed_supported__port_state;
    117 	uint8_t port_phys_state__link_down_def_state;
    118 	uint8_t mkey_prot_bits__lmc;
    119 	uint8_t link_speed_active__link_speed_enabled;
    120 	uint8_t neighbour_mtu__mastersm_sl;
    121 	uint8_t vl_cap__init_type;
    122 	uint8_t vl_high_limit;
    123 	uint8_t vl_arbitration_high_cap;
    124 	uint8_t vl_arbitration_low_cap;
    125 	uint8_t init_type_reply__mtu_cap;
    126 	uint8_t vl_stall_count__hoq_life;
    127 	uint8_t operational_vls__enforcement;
    128 	uint16_t mkey_violations;
    129 	uint16_t pkey_violations;
    130 	uint16_t qkey_violations;
    131 	uint8_t guid_cap;
    132 	uint8_t client_reregister__subnet_timeout;
    133 	uint8_t resp_time_value;
    134 	uint8_t local_phy_errors__overrun_errors;
    135 	uint16_t max_credit_hint;
    136 	uint32_t link_round_trip_latency;
    137 } __attribute__ (( packed ));
    138 
    139 #define IB_LINK_WIDTH_1X		0x01
    140 #define IB_LINK_WIDTH_4X		0x02
    141 #define IB_LINK_WIDTH_8X		0x04
    142 #define IB_LINK_WIDTH_12X		0x08
    143 
    144 #define IB_LINK_SPEED_SDR		0x01
    145 #define IB_LINK_SPEED_DDR		0x02
    146 #define IB_LINK_SPEED_QDR		0x04
    147 
    148 #define IB_PORT_STATE_DOWN		0x01
    149 #define IB_PORT_STATE_INIT		0x02
    150 #define IB_PORT_STATE_ARMED		0x03
    151 #define IB_PORT_STATE_ACTIVE		0x04
    152 
    153 #define IB_PORT_PHYS_STATE_SLEEP	0x01
    154 #define IB_PORT_PHYS_STATE_POLLING	0x02
    155 
    156 #define IB_MTU_256			0x01
    157 #define IB_MTU_512			0x02
    158 #define IB_MTU_1024			0x03
    159 #define IB_MTU_2048			0x04
    160 #define IB_MTU_4096			0x05
    161 
    162 #define IB_VL_0				0x01
    163 #define IB_VL_0_1			0x02
    164 #define IB_VL_0_3			0x03
    165 #define IB_VL_0_7			0x04
    166 #define IB_VL_0_14			0x05
    167 
    168 /** A Partition Key Table attribute
    169  *
    170  * Defined in section 14.2.5.7 of the IBA.
    171  */
    172 struct ib_pkey_table {
    173 	uint16_t pkey[32];
    174 } __attribute__ (( packed ));
    175 
    176 /** A subnet management attribute */
    177 union ib_smp_data {
    178 	struct ib_node_desc node_desc;
    179 	struct ib_node_info node_info;
    180 	struct ib_guid_info guid_info;
    181 	struct ib_port_info port_info;
    182 	struct ib_pkey_table pkey_table;
    183 	uint8_t bytes[64];
    184 } __attribute__ (( packed ));
    185 
    186 /** A subnet management directed route path */
    187 struct ib_smp_dr_path {
    188 	uint8_t hops[64];
    189 } __attribute__ (( packed ));
    190 
    191 /** Subnet management MAD class-specific data */
    192 struct ib_smp_class_specific {
    193 	uint8_t hop_pointer;
    194 	uint8_t hop_count;
    195 } __attribute__ (( packed ));
    196 
    197 /*****************************************************************************
    198  *
    199  * Subnet administration MADs
    200  *
    201  *****************************************************************************
    202  */
    203 
    204 #define IB_SA_CLASS_VERSION			2
    205 
    206 #define IB_SA_METHOD_DELETE_RESP		0x95
    207 
    208 struct ib_rmpp_hdr {
    209 	uint32_t raw[3];
    210 } __attribute__ (( packed ));
    211 
    212 struct ib_sa_hdr {
    213 	uint32_t sm_key[2];
    214 	uint16_t reserved;
    215 	uint16_t attrib_offset;
    216 	uint32_t comp_mask[2];
    217 } __attribute__ (( packed ));
    218 
    219 #define IB_SA_ATTR_MC_MEMBER_REC		0x38
    220 #define IB_SA_ATTR_PATH_REC			0x35
    221 
    222 struct ib_path_record {
    223 	uint32_t reserved0[2];
    224 	struct ib_gid dgid;
    225 	struct ib_gid sgid;
    226 	uint16_t dlid;
    227 	uint16_t slid;
    228 	uint32_t hop_limit__flow_label__raw_traffic;
    229 	uint32_t pkey__numb_path__reversible__tclass;
    230 	uint8_t reserved1;
    231 	uint8_t reserved__sl;
    232 	uint8_t mtu_selector__mtu;
    233 	uint8_t rate_selector__rate;
    234 	uint32_t preference__packet_lifetime__packet_lifetime_selector;
    235 	uint32_t reserved2[35];
    236 } __attribute__ (( packed ));
    237 
    238 #define IB_SA_PATH_REC_DGID			(1<<2)
    239 #define IB_SA_PATH_REC_SGID			(1<<3)
    240 
    241 struct ib_mc_member_record {
    242 	struct ib_gid mgid;
    243 	struct ib_gid port_gid;
    244 	uint32_t qkey;
    245 	uint16_t mlid;
    246 	uint8_t mtu_selector__mtu;
    247 	uint8_t tclass;
    248 	uint16_t pkey;
    249 	uint8_t rate_selector__rate;
    250 	uint8_t packet_lifetime_selector__packet_lifetime;
    251 	uint32_t sl__flow_label__hop_limit;
    252 	uint8_t scope__join_state;
    253 	uint8_t proxy_join__reserved;
    254 	uint16_t reserved0;
    255 	uint32_t reserved1[37];
    256 } __attribute__ (( packed ));
    257 
    258 #define IB_SA_MCMEMBER_REC_MGID			(1<<0)
    259 #define IB_SA_MCMEMBER_REC_PORT_GID		(1<<1)
    260 #define IB_SA_MCMEMBER_REC_QKEY			(1<<2)
    261 #define IB_SA_MCMEMBER_REC_MLID			(1<<3)
    262 #define IB_SA_MCMEMBER_REC_MTU_SELECTOR		(1<<4)
    263 #define IB_SA_MCMEMBER_REC_MTU			(1<<5)
    264 #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS	(1<<6)
    265 #define IB_SA_MCMEMBER_REC_PKEY			(1<<7)
    266 #define IB_SA_MCMEMBER_REC_RATE_SELECTOR	(1<<8)
    267 #define IB_SA_MCMEMBER_REC_RATE			(1<<9)
    268 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR	(1<<10)
    269 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME	(1<<11)
    270 #define IB_SA_MCMEMBER_REC_SL			(1<<12)
    271 #define IB_SA_MCMEMBER_REC_FLOW_LABEL		(1<<13)
    272 #define IB_SA_MCMEMBER_REC_HOP_LIMIT		(1<<14)
    273 #define IB_SA_MCMEMBER_REC_SCOPE		(1<<15)
    274 #define IB_SA_MCMEMBER_REC_JOIN_STATE		(1<<16)
    275 #define IB_SA_MCMEMBER_REC_PROXY_JOIN		(1<<17)
    276 
    277 union ib_sa_data {
    278 	struct ib_path_record path_record;
    279 	struct ib_mc_member_record mc_member_record;
    280 } __attribute__ (( packed ));
    281 
    282 /*****************************************************************************
    283  *
    284  * Communication management MADs
    285  *
    286  *****************************************************************************
    287  */
    288 
    289 /** Communication management class version */
    290 #define IB_CM_CLASS_VERSION			2
    291 
    292 /* Communication management attributes */
    293 #define IB_CM_ATTR_CLASS_PORT_INFO		0x0001
    294 #define IB_CM_ATTR_CONNECT_REQUEST		0x0010
    295 #define IB_CM_ATTR_MSG_RCPT_ACK			0x0011
    296 #define IB_CM_ATTR_CONNECT_REJECT		0x0012
    297 #define IB_CM_ATTR_CONNECT_REPLY		0x0013
    298 #define IB_CM_ATTR_READY_TO_USE			0x0014
    299 #define IB_CM_ATTR_DISCONNECT_REQUEST		0x0015
    300 #define IB_CM_ATTR_DISCONNECT_REPLY		0x0016
    301 #define IB_CM_ATTR_SERVICE_ID_RES_REQ		0x0016
    302 #define IB_CM_ATTR_SERVICE_ID_RES_REQ_RESP	0x0018
    303 #define IB_CM_ATTR_LOAD_ALTERNATE_PATH		0x0019
    304 #define IB_CM_ATTR_ALTERNATE_PATH_RESPONSE	0x001a
    305 
    306 /** Communication management common fields */
    307 struct ib_cm_common {
    308 	/** Local communication ID */
    309 	uint32_t local_id;
    310 	/** Remote communication ID */
    311 	uint32_t remote_id;
    312 	/** Reserved */
    313 	uint8_t reserved[224];
    314 } __attribute__ (( packed ));
    315 
    316 /** A communication management path */
    317 struct ib_cm_path {
    318 	/** Local port LID */
    319 	uint16_t local_lid;
    320 	/** Remote port LID */
    321 	uint16_t remote_lid;
    322 	/** Local port GID */
    323 	struct ib_gid local_gid;
    324 	/** Remote port GID */
    325 	struct ib_gid remote_gid;
    326 	/** Flow label and rate */
    327 	uint32_t flow_label__rate;
    328 	/** Traffic class */
    329 	uint8_t tc;
    330 	/** Hop limit */
    331 	uint8_t hop_limit;
    332 	/** SL and subnet local*/
    333 	uint8_t sl__subnet_local;
    334 	/** Local ACK timeout */
    335 	uint8_t local_ack_timeout;
    336 } __attribute__ (( packed ));
    337 
    338 /** A communication management connection request
    339  *
    340  * Defined in section 12.6.5 of the IBA.
    341  */
    342 struct ib_cm_connect_request {
    343 	/** Local communication ID */
    344 	uint32_t local_id;
    345 	/** Reserved */
    346 	uint32_t reserved0[1];
    347 	/** Service ID */
    348 	struct ib_gid_half service_id;
    349 	/** Local CA GUID */
    350 	struct ib_gid_half local_ca;
    351 	/** Reserved */
    352 	uint32_t reserved1[1];
    353 	/** Local queue key */
    354 	uint32_t local_qkey;
    355 	/** Local QPN and responder resources*/
    356 	uint32_t local_qpn__responder_resources;
    357 	/** Local EECN and initiator depth */
    358 	uint32_t local_eecn__initiator_depth;
    359 	/** Remote EECN, remote CM response timeout, transport service
    360 	 * type, EE flow control
    361 	 */
    362 	uint32_t remote_eecn__remote_timeout__service_type__ee_flow_ctrl;
    363 	/** Starting PSN, local CM response timeout and retry count */
    364 	uint32_t starting_psn__local_timeout__retry_count;
    365 	/** Partition key */
    366 	uint16_t pkey;
    367 	/** Path packet payload MTU, RDC exists, RNR retry count */
    368 	uint8_t payload_mtu__rdc_exists__rnr_retry;
    369 	/** Max CM retries and SRQ */
    370 	uint8_t max_cm_retries__srq;
    371 	/** Primary path */
    372 	struct ib_cm_path primary;
    373 	/** Alternate path */
    374 	struct ib_cm_path alternate;
    375 	/** Private data */
    376 	uint8_t private_data[92];
    377 } __attribute__ (( packed ));
    378 
    379 /** CM transport types */
    380 #define IB_CM_TRANSPORT_RC		0
    381 #define IB_CM_TRANSPORT_UC		1
    382 #define IB_CM_TRANSPORT_RD		2
    383 
    384 /** A communication management connection rejection
    385  *
    386  * Defined in section 12.6.7 of the IBA.
    387  */
    388 struct ib_cm_connect_reject {
    389 	/** Local communication ID */
    390 	uint32_t local_id;
    391 	/** Remote communication ID */
    392 	uint32_t remote_id;
    393 	/** Message rejected */
    394 	uint8_t message;
    395 	/** Reject information length */
    396 	uint8_t info_len;
    397 	/** Rejection reason */
    398 	uint16_t reason;
    399 	/** Additional rejection information */
    400 	uint8_t info[72];
    401 	/** Private data */
    402 	uint8_t private_data[148];
    403 } __attribute__ (( packed ));
    404 
    405 /** CM rejection reasons */
    406 #define IB_CM_REJECT_BAD_SERVICE_ID	8
    407 #define IB_CM_REJECT_STALE_CONN		10
    408 #define IB_CM_REJECT_CONSUMER		28
    409 
    410 /** A communication management connection reply
    411  *
    412  * Defined in section 12.6.8 of the IBA.
    413  */
    414 struct ib_cm_connect_reply {
    415 	/** Local communication ID */
    416 	uint32_t local_id;
    417 	/** Remote communication ID */
    418 	uint32_t remote_id;
    419 	/** Local queue key */
    420 	uint32_t local_qkey;
    421 	/** Local QPN */
    422 	uint32_t local_qpn;
    423 	/** Local EECN */
    424 	uint32_t local_eecn;
    425 	/** Starting PSN */
    426 	uint32_t starting_psn;
    427 	/** Responder resources */
    428 	uint8_t responder_resources;
    429 	/** Initiator depth */
    430 	uint8_t initiator_depth;
    431 	/** Target ACK delay, failover accepted, and end-to-end flow control */
    432 	uint8_t target_ack_delay__failover_accepted__ee_flow_ctrl;
    433 	/** RNR retry count, SRQ */
    434 	uint8_t rnr_retry__srq;
    435 	/** Local CA GUID */
    436 	struct ib_gid_half local_ca;
    437 	/** Private data */
    438 	uint8_t private_data[196];
    439 } __attribute__ (( packed ));
    440 
    441 /** A communication management ready to use reply
    442  *
    443  * Defined in section 12.6.9 of the IBA.
    444  */
    445 struct ib_cm_ready_to_use {
    446 	/** Local communication ID */
    447 	uint32_t local_id;
    448 	/** Remote communication ID */
    449 	uint32_t remote_id;
    450 	/** Private data */
    451 	uint8_t private_data[224];
    452 } __attribute__ (( packed ));
    453 
    454 /** A communication management attribute */
    455 union ib_cm_data {
    456 	struct ib_cm_common common;
    457 	struct ib_cm_connect_request connect_request;
    458 	struct ib_cm_connect_reject connect_reject;
    459 	struct ib_cm_connect_reply connect_reply;
    460 	struct ib_cm_ready_to_use ready_to_use;
    461 	uint8_t bytes[232];
    462 } __attribute__ (( packed ));
    463 
    464 /*****************************************************************************
    465  *
    466  * MADs
    467  *
    468  *****************************************************************************
    469  */
    470 
    471 /** Management datagram class_specific data */
    472 union ib_mad_class_specific {
    473 	uint16_t raw;
    474 	struct ib_smp_class_specific smp;
    475 } __attribute__ (( packed ));
    476 
    477 /** A management datagram common header
    478  *
    479  * Defined in section 13.4.2 of the IBA.
    480  */
    481 struct ib_mad_hdr {
    482 	uint8_t base_version;
    483 	uint8_t mgmt_class;
    484 	uint8_t class_version;
    485 	uint8_t method;
    486 	uint16_t status;
    487 	union ib_mad_class_specific class_specific;
    488 	uint32_t tid[2];
    489 	uint16_t attr_id;
    490 	uint8_t reserved[2];
    491 	uint32_t attr_mod;
    492 } __attribute__ (( packed ));
    493 
    494 /* Management base version */
    495 #define IB_MGMT_BASE_VERSION			1
    496 
    497 /* Management classes */
    498 #define IB_MGMT_CLASS_SUBN_LID_ROUTED		0x01
    499 #define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE	0x81
    500 #define IB_MGMT_CLASS_SUBN_ADM			0x03
    501 #define IB_MGMT_CLASS_PERF_MGMT			0x04
    502 #define IB_MGMT_CLASS_BM			0x05
    503 #define IB_MGMT_CLASS_DEVICE_MGMT		0x06
    504 #define IB_MGMT_CLASS_CM			0x07
    505 #define IB_MGMT_CLASS_SNMP			0x08
    506 #define IB_MGMT_CLASS_VENDOR_RANGE2_START	0x30
    507 #define IB_MGMT_CLASS_VENDOR_RANGE2_END		0x4f
    508 
    509 #define IB_MGMT_CLASS_MASK			0x7f
    510 
    511 /* Management methods */
    512 #define IB_MGMT_METHOD_GET			0x01
    513 #define IB_MGMT_METHOD_SET			0x02
    514 #define IB_MGMT_METHOD_GET_RESP			0x81
    515 #define IB_MGMT_METHOD_SEND			0x03
    516 #define IB_MGMT_METHOD_TRAP			0x05
    517 #define IB_MGMT_METHOD_REPORT			0x06
    518 #define IB_MGMT_METHOD_REPORT_RESP		0x86
    519 #define IB_MGMT_METHOD_TRAP_REPRESS		0x07
    520 #define IB_MGMT_METHOD_DELETE			0x15
    521 
    522 /* Status codes */
    523 #define IB_MGMT_STATUS_OK			0x0000
    524 #define IB_MGMT_STATUS_BAD_VERSION		0x0001
    525 #define IB_MGMT_STATUS_UNSUPPORTED_METHOD	0x0002
    526 #define IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR	0x0003
    527 #define IB_MGMT_STATUS_INVALID_VALUE		0x0004
    528 
    529 /** A subnet management MAD */
    530 struct ib_mad_smp {
    531 	struct ib_mad_hdr mad_hdr;
    532 	struct ib_smp_hdr smp_hdr;
    533 	union ib_smp_data smp_data;
    534 	struct ib_smp_dr_path initial_path;
    535 	struct ib_smp_dr_path return_path;
    536 } __attribute__ (( packed ));
    537 
    538 /** A subnet administration MAD */
    539 struct ib_mad_sa {
    540 	struct ib_mad_hdr mad_hdr;
    541 	struct ib_rmpp_hdr rmpp_hdr;
    542 	struct ib_sa_hdr sa_hdr;
    543 	union ib_sa_data sa_data;
    544 } __attribute__ (( packed ));
    545 
    546 /** A communication management MAD */
    547 struct ib_mad_cm {
    548 	struct ib_mad_hdr mad_hdr;
    549 	union ib_cm_data cm_data;
    550 } __attribute__ (( packed ));
    551 
    552 /** A management datagram */
    553 union ib_mad {
    554 	struct ib_mad_hdr hdr;
    555 	struct ib_mad_smp smp;
    556 	struct ib_mad_sa sa;
    557 	struct ib_mad_cm cm;
    558 	uint8_t bytes[256];
    559 } __attribute__ (( packed ));
    560 
    561 #endif /* _GPXE_IB_MAD_H */
    562