1 #ifndef _IPXE_IB_MAD_H
2 #define _IPXE_IB_MAD_H
3 
4 /** @file
5  *
6  * Infiniband management datagrams
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 
12 #include <stdint.h>
13 #include <ipxe/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 	union ib_guid sys_guid;
79 	union ib_guid node_guid;
80 	union ib_guid 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 #define IB_LINK_SPEED_FDR10		0x08
148 #define IB_LINK_SPEED_FDR		0x10
149 #define IB_LINK_SPEED_EDR		0x20
150 
151 #define IB_PORT_STATE_DOWN		0x01
152 #define IB_PORT_STATE_INIT		0x02
153 #define IB_PORT_STATE_ARMED		0x03
154 #define IB_PORT_STATE_ACTIVE		0x04
155 
156 #define IB_PORT_PHYS_STATE_SLEEP	0x01
157 #define IB_PORT_PHYS_STATE_POLLING	0x02
158 
159 #define IB_MTU_256			0x01
160 #define IB_MTU_512			0x02
161 #define IB_MTU_1024			0x03
162 #define IB_MTU_2048			0x04
163 #define IB_MTU_4096			0x05
164 
165 #define IB_VL_0				0x01
166 #define IB_VL_0_1			0x02
167 #define IB_VL_0_3			0x03
168 #define IB_VL_0_7			0x04
169 #define IB_VL_0_14			0x05
170 
171 /** A Partition Key Table attribute
172  *
173  * Defined in section 14.2.5.7 of the IBA.
174  */
175 struct ib_pkey_table {
176 	uint16_t pkey[32];
177 } __attribute__ (( packed ));
178 
179 /** A subnet management attribute */
180 union ib_smp_data {
181 	struct ib_node_desc node_desc;
182 	struct ib_node_info node_info;
183 	struct ib_guid_info guid_info;
184 	struct ib_port_info port_info;
185 	struct ib_pkey_table pkey_table;
186 	uint8_t bytes[64];
187 } __attribute__ (( packed ));
188 
189 /** A subnet management directed route path */
190 struct ib_smp_dr_path {
191 	uint8_t hops[64];
192 } __attribute__ (( packed ));
193 
194 /** Subnet management MAD class-specific data */
195 struct ib_smp_class_specific {
196 	uint8_t hop_pointer;
197 	uint8_t hop_count;
198 } __attribute__ (( packed ));
199 
200 /*****************************************************************************
201  *
202  * Subnet administration MADs
203  *
204  *****************************************************************************
205  */
206 
207 #define IB_SA_CLASS_VERSION			2
208 
209 #define IB_SA_METHOD_DELETE_RESP		0x95
210 
211 struct ib_rmpp_hdr {
212 	uint32_t raw[3];
213 } __attribute__ (( packed ));
214 
215 struct ib_sa_hdr {
216 	uint32_t sm_key[2];
217 	uint16_t reserved;
218 	uint16_t attrib_offset;
219 	uint32_t comp_mask[2];
220 } __attribute__ (( packed ));
221 
222 #define IB_SA_ATTR_SERVICE_REC			0x31
223 #define IB_SA_ATTR_PATH_REC			0x35
224 #define IB_SA_ATTR_MC_MEMBER_REC		0x38
225 
226 struct ib_service_record {
227 	uint64_t id;
228 	union ib_gid gid;
229 	uint16_t pkey;
230 	uint16_t reserved;
231 	uint32_t lease;
232 	uint8_t key[16];
233 	char name[64];
234 	uint8_t data8[16];
235 	uint16_t data16[8];
236 	uint32_t data32[4];
237 	uint64_t data64[2];
238 } __attribute__ (( packed ));
239 
240 #define IB_SA_SERVICE_REC_NAME			(1<<6)
241 
242 struct ib_path_record {
243 	uint32_t reserved0[2];
244 	union ib_gid dgid;
245 	union ib_gid sgid;
246 	uint16_t dlid;
247 	uint16_t slid;
248 	uint32_t hop_limit__flow_label__raw_traffic;
249 	uint32_t pkey__numb_path__reversible__tclass;
250 	uint8_t reserved1;
251 	uint8_t reserved__sl;
252 	uint8_t mtu_selector__mtu;
253 	uint8_t rate_selector__rate;
254 	uint32_t preference__packet_lifetime__packet_lifetime_selector;
255 	uint32_t reserved2[35];
256 } __attribute__ (( packed ));
257 
258 #define IB_SA_PATH_REC_DGID			(1<<2)
259 #define IB_SA_PATH_REC_SGID			(1<<3)
260 
261 struct ib_mc_member_record {
262 	union ib_gid mgid;
263 	union ib_gid port_gid;
264 	uint32_t qkey;
265 	uint16_t mlid;
266 	uint8_t mtu_selector__mtu;
267 	uint8_t tclass;
268 	uint16_t pkey;
269 	uint8_t rate_selector__rate;
270 	uint8_t packet_lifetime_selector__packet_lifetime;
271 	uint32_t sl__flow_label__hop_limit;
272 	uint8_t scope__join_state;
273 	uint8_t proxy_join__reserved;
274 	uint16_t reserved0;
275 	uint32_t reserved1[37];
276 } __attribute__ (( packed ));
277 
278 #define IB_SA_MCMEMBER_REC_MGID			(1<<0)
279 #define IB_SA_MCMEMBER_REC_PORT_GID		(1<<1)
280 #define IB_SA_MCMEMBER_REC_QKEY			(1<<2)
281 #define IB_SA_MCMEMBER_REC_MLID			(1<<3)
282 #define IB_SA_MCMEMBER_REC_MTU_SELECTOR		(1<<4)
283 #define IB_SA_MCMEMBER_REC_MTU			(1<<5)
284 #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS	(1<<6)
285 #define IB_SA_MCMEMBER_REC_PKEY			(1<<7)
286 #define IB_SA_MCMEMBER_REC_RATE_SELECTOR	(1<<8)
287 #define IB_SA_MCMEMBER_REC_RATE			(1<<9)
288 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR	(1<<10)
289 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME	(1<<11)
290 #define IB_SA_MCMEMBER_REC_SL			(1<<12)
291 #define IB_SA_MCMEMBER_REC_FLOW_LABEL		(1<<13)
292 #define IB_SA_MCMEMBER_REC_HOP_LIMIT		(1<<14)
293 #define IB_SA_MCMEMBER_REC_SCOPE		(1<<15)
294 #define IB_SA_MCMEMBER_REC_JOIN_STATE		(1<<16)
295 #define IB_SA_MCMEMBER_REC_PROXY_JOIN		(1<<17)
296 
297 union ib_sa_data {
298 	struct ib_service_record service_record;
299 	struct ib_path_record path_record;
300 	struct ib_mc_member_record mc_member_record;
301 } __attribute__ (( packed ));
302 
303 /*****************************************************************************
304  *
305  * Communication management MADs
306  *
307  *****************************************************************************
308  */
309 
310 /** Communication management class version */
311 #define IB_CM_CLASS_VERSION			2
312 
313 /* Communication management attributes */
314 #define IB_CM_ATTR_CLASS_PORT_INFO		0x0001
315 #define IB_CM_ATTR_CONNECT_REQUEST		0x0010
316 #define IB_CM_ATTR_MSG_RCPT_ACK			0x0011
317 #define IB_CM_ATTR_CONNECT_REJECT		0x0012
318 #define IB_CM_ATTR_CONNECT_REPLY		0x0013
319 #define IB_CM_ATTR_READY_TO_USE			0x0014
320 #define IB_CM_ATTR_DISCONNECT_REQUEST		0x0015
321 #define IB_CM_ATTR_DISCONNECT_REPLY		0x0016
322 #define IB_CM_ATTR_SERVICE_ID_RES_REQ		0x0016
323 #define IB_CM_ATTR_SERVICE_ID_RES_REQ_RESP	0x0018
324 #define IB_CM_ATTR_LOAD_ALTERNATE_PATH		0x0019
325 #define IB_CM_ATTR_ALTERNATE_PATH_RESPONSE	0x001a
326 
327 /** Communication management common fields */
328 struct ib_cm_common {
329 	/** Local communication ID */
330 	uint32_t local_id;
331 	/** Remote communication ID */
332 	uint32_t remote_id;
333 	/** Reserved */
334 	uint8_t reserved[224];
335 } __attribute__ (( packed ));
336 
337 /** A communication management path */
338 struct ib_cm_path {
339 	/** Local port LID */
340 	uint16_t local_lid;
341 	/** Remote port LID */
342 	uint16_t remote_lid;
343 	/** Local port GID */
344 	union ib_gid local_gid;
345 	/** Remote port GID */
346 	union ib_gid remote_gid;
347 	/** Flow label and rate */
348 	uint32_t flow_label__rate;
349 	/** Traffic class */
350 	uint8_t tc;
351 	/** Hop limit */
352 	uint8_t hop_limit;
353 	/** SL and subnet local*/
354 	uint8_t sl__subnet_local;
355 	/** Local ACK timeout */
356 	uint8_t local_ack_timeout;
357 } __attribute__ (( packed ));
358 
359 /** A communication management connection request
360  *
361  * Defined in section 12.6.5 of the IBA.
362  */
363 struct ib_cm_connect_request {
364 	/** Local communication ID */
365 	uint32_t local_id;
366 	/** Reserved */
367 	uint32_t reserved0[1];
368 	/** Service ID */
369 	union ib_guid service_id;
370 	/** Local CA GUID */
371 	union ib_guid local_ca;
372 	/** Reserved */
373 	uint32_t reserved1[1];
374 	/** Local queue key */
375 	uint32_t local_qkey;
376 	/** Local QPN and responder resources*/
377 	uint32_t local_qpn__responder_resources;
378 	/** Local EECN and initiator depth */
379 	uint32_t local_eecn__initiator_depth;
380 	/** Remote EECN, remote CM response timeout, transport service
381 	 * type, EE flow control
382 	 */
383 	uint32_t remote_eecn__remote_timeout__service_type__ee_flow_ctrl;
384 	/** Starting PSN, local CM response timeout and retry count */
385 	uint32_t starting_psn__local_timeout__retry_count;
386 	/** Partition key */
387 	uint16_t pkey;
388 	/** Path packet payload MTU, RDC exists, RNR retry count */
389 	uint8_t payload_mtu__rdc_exists__rnr_retry;
390 	/** Max CM retries and SRQ */
391 	uint8_t max_cm_retries__srq;
392 	/** Primary path */
393 	struct ib_cm_path primary;
394 	/** Alternate path */
395 	struct ib_cm_path alternate;
396 	/** Private data */
397 	uint8_t private_data[92];
398 } __attribute__ (( packed ));
399 
400 /** CM transport types */
401 #define IB_CM_TRANSPORT_RC		0
402 #define IB_CM_TRANSPORT_UC		1
403 #define IB_CM_TRANSPORT_RD		2
404 
405 /** A communication management connection rejection
406  *
407  * Defined in section 12.6.7 of the IBA.
408  */
409 struct ib_cm_connect_reject {
410 	/** Local communication ID */
411 	uint32_t local_id;
412 	/** Remote communication ID */
413 	uint32_t remote_id;
414 	/** Message rejected */
415 	uint8_t message;
416 	/** Reject information length */
417 	uint8_t info_len;
418 	/** Rejection reason */
419 	uint16_t reason;
420 	/** Additional rejection information */
421 	uint8_t info[72];
422 	/** Private data */
423 	uint8_t private_data[148];
424 } __attribute__ (( packed ));
425 
426 /** CM rejection reasons */
427 #define IB_CM_REJECT_BAD_SERVICE_ID	8
428 #define IB_CM_REJECT_STALE_CONN		10
429 #define IB_CM_REJECT_CONSUMER		28
430 
431 /** A communication management connection reply
432  *
433  * Defined in section 12.6.8 of the IBA.
434  */
435 struct ib_cm_connect_reply {
436 	/** Local communication ID */
437 	uint32_t local_id;
438 	/** Remote communication ID */
439 	uint32_t remote_id;
440 	/** Local queue key */
441 	uint32_t local_qkey;
442 	/** Local QPN */
443 	uint32_t local_qpn;
444 	/** Local EECN */
445 	uint32_t local_eecn;
446 	/** Starting PSN */
447 	uint32_t starting_psn;
448 	/** Responder resources */
449 	uint8_t responder_resources;
450 	/** Initiator depth */
451 	uint8_t initiator_depth;
452 	/** Target ACK delay, failover accepted, and end-to-end flow control */
453 	uint8_t target_ack_delay__failover_accepted__ee_flow_ctrl;
454 	/** RNR retry count, SRQ */
455 	uint8_t rnr_retry__srq;
456 	/** Local CA GUID */
457 	union ib_guid local_ca;
458 	/** Private data */
459 	uint8_t private_data[196];
460 } __attribute__ (( packed ));
461 
462 /** A communication management ready to use reply
463  *
464  * Defined in section 12.6.9 of the IBA.
465  */
466 struct ib_cm_ready_to_use {
467 	/** Local communication ID */
468 	uint32_t local_id;
469 	/** Remote communication ID */
470 	uint32_t remote_id;
471 	/** Private data */
472 	uint8_t private_data[224];
473 } __attribute__ (( packed ));
474 
475 /** A communication management disconnection request
476  *
477  * Defined in section 12.6.10 of the IBA.
478  */
479 struct ib_cm_disconnect_request {
480 	/** Local communication ID */
481 	uint32_t local_id;
482 	/** Remote communication ID */
483 	uint32_t remote_id;
484 	/** Remote QPN/EECN */
485 	uint32_t remote_qpn_eecn;
486 	/** Private data */
487 	uint8_t private_data[220];
488 } __attribute__ (( packed ));
489 
490 /** A communication management disconnection reply
491  *
492  * Defined in section 12.6.11 of the IBA.
493  */
494 struct ib_cm_disconnect_reply {
495 	/** Local communication ID */
496 	uint32_t local_id;
497 	/** Remote communication ID */
498 	uint32_t remote_id;
499 	/** Private data */
500 	uint8_t private_data[224];
501 } __attribute__ (( packed ));
502 
503 /** A communication management attribute */
504 union ib_cm_data {
505 	struct ib_cm_common common;
506 	struct ib_cm_connect_request connect_request;
507 	struct ib_cm_connect_reject connect_reject;
508 	struct ib_cm_connect_reply connect_reply;
509 	struct ib_cm_ready_to_use ready_to_use;
510 	struct ib_cm_disconnect_request disconnect_request;
511 	struct ib_cm_disconnect_reply disconnect_reply;
512 	uint8_t bytes[232];
513 } __attribute__ (( packed ));
514 
515 /*****************************************************************************
516  *
517  * MADs
518  *
519  *****************************************************************************
520  */
521 
522 /** Management datagram class_specific data */
523 union ib_mad_class_specific {
524 	uint16_t raw;
525 	struct ib_smp_class_specific smp;
526 } __attribute__ (( packed ));
527 
528 /** A management datagram transaction identifier */
529 struct ib_mad_tid {
530 	uint32_t high;
531 	uint32_t low;
532 } __attribute__ (( packed ));
533 
534 /** A management datagram common header
535  *
536  * Defined in section 13.4.2 of the IBA.
537  */
538 struct ib_mad_hdr {
539 	uint8_t base_version;
540 	uint8_t mgmt_class;
541 	uint8_t class_version;
542 	uint8_t method;
543 	uint16_t status;
544 	union ib_mad_class_specific class_specific;
545 	struct ib_mad_tid tid;
546 	uint16_t attr_id;
547 	uint8_t reserved[2];
548 	uint32_t attr_mod;
549 } __attribute__ (( packed ));
550 
551 /* Management base version */
552 #define IB_MGMT_BASE_VERSION			1
553 
554 /* Management classes */
555 #define IB_MGMT_CLASS_SUBN_LID_ROUTED		0x01
556 #define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE	0x81
557 #define IB_MGMT_CLASS_SUBN_ADM			0x03
558 #define IB_MGMT_CLASS_PERF_MGMT			0x04
559 #define IB_MGMT_CLASS_BM			0x05
560 #define IB_MGMT_CLASS_DEVICE_MGMT		0x06
561 #define IB_MGMT_CLASS_CM			0x07
562 #define IB_MGMT_CLASS_SNMP			0x08
563 #define IB_MGMT_CLASS_VENDOR_RANGE2_START	0x30
564 #define IB_MGMT_CLASS_VENDOR_RANGE2_END		0x4f
565 
566 #define IB_MGMT_CLASS_MASK			0x7f
567 
568 /* Management methods */
569 #define IB_MGMT_METHOD_GET			0x01
570 #define IB_MGMT_METHOD_SET			0x02
571 #define IB_MGMT_METHOD_GET_RESP			0x81
572 #define IB_MGMT_METHOD_SEND			0x03
573 #define IB_MGMT_METHOD_TRAP			0x05
574 #define IB_MGMT_METHOD_REPORT			0x06
575 #define IB_MGMT_METHOD_REPORT_RESP		0x86
576 #define IB_MGMT_METHOD_TRAP_REPRESS		0x07
577 #define IB_MGMT_METHOD_DELETE			0x15
578 
579 /* Status codes */
580 #define IB_MGMT_STATUS_OK			0x0000
581 #define IB_MGMT_STATUS_BAD_VERSION		0x0001
582 #define IB_MGMT_STATUS_UNSUPPORTED_METHOD	0x0002
583 #define IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR	0x0003
584 #define IB_MGMT_STATUS_INVALID_VALUE		0x0004
585 
586 /** A subnet management MAD */
587 struct ib_mad_smp {
588 	struct ib_mad_hdr mad_hdr;
589 	struct ib_smp_hdr smp_hdr;
590 	union ib_smp_data smp_data;
591 	struct ib_smp_dr_path initial_path;
592 	struct ib_smp_dr_path return_path;
593 } __attribute__ (( packed ));
594 
595 /** A subnet administration MAD */
596 struct ib_mad_sa {
597 	struct ib_mad_hdr mad_hdr;
598 	struct ib_rmpp_hdr rmpp_hdr;
599 	struct ib_sa_hdr sa_hdr;
600 	union ib_sa_data sa_data;
601 } __attribute__ (( packed ));
602 
603 /** A communication management MAD */
604 struct ib_mad_cm {
605 	struct ib_mad_hdr mad_hdr;
606 	union ib_cm_data cm_data;
607 } __attribute__ (( packed ));
608 
609 /** A management datagram */
610 union ib_mad {
611 	struct ib_mad_hdr hdr;
612 	struct ib_mad_smp smp;
613 	struct ib_mad_sa sa;
614 	struct ib_mad_cm cm;
615 	uint8_t bytes[256];
616 } __attribute__ (( packed ));
617 
618 #endif /* _IPXE_IB_MAD_H */
619