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