libibmad: updated based on merge feedback
[mirror/winof/.git] / ulp / libibmad / include / infiniband / mad.h
1 /*
2  * Copyright (c) 2004-2007 Voltaire Inc.  All rights reserved.
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the
8  * OpenIB.org BSD license below:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *
18  *      - Redistributions in binary form must reproduce the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer in the documentation and/or other materials
21  *        provided with the distribution.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30  * SOFTWARE.
31  *
32  */
33 #ifndef _MAD_H_
34 #define _MAD_H_
35
36 #include <string.h>\r
37 #include <stdlib.h>\r
38 #include <stdio.h>\r
39 #include <sys/types.h>\r
40
41 #include <infiniband/mad_osd.h>
42
43 #ifdef __cplusplus
44 #  define BEGIN_C_DECLS extern "C" {
45 #  define END_C_DECLS   }
46 #else /* !__cplusplus */
47 #  define BEGIN_C_DECLS
48 #  define END_C_DECLS
49 #endif /* __cplusplus */
50
51 BEGIN_C_DECLS
52
53 #define IB_SUBNET_PATH_HOPS_MAX 64
54 #define IB_DEFAULT_SUBN_PREFIX  0xfe80000000000000ULL
55 #define IB_DEFAULT_QP1_QKEY     0x80010000
56
57 #define IB_MAD_SIZE             256
58
59 #define IB_SMP_DATA_OFFS        64
60 #define IB_SMP_DATA_SIZE        64
61
62 #define IB_VENDOR_RANGE1_DATA_OFFS      24
63 #define IB_VENDOR_RANGE1_DATA_SIZE      (IB_MAD_SIZE - IB_VENDOR_RANGE1_DATA_OFFS)
64
65 #define IB_VENDOR_RANGE2_DATA_OFFS      40
66 #define IB_VENDOR_RANGE2_DATA_SIZE      (IB_MAD_SIZE - IB_VENDOR_RANGE2_DATA_OFFS)
67
68 #define IB_SA_DATA_SIZE         200
69 #define IB_SA_DATA_OFFS         56
70
71 #define IB_PC_DATA_OFFS         64
72 #define IB_PC_DATA_SZ           (IB_MAD_SIZE - IB_PC_DATA_OFFS)
73
74 #define IB_SA_MCM_RECSZ         53
75 #define IB_SA_PR_RECSZ          64
76
77 enum MAD_CLASSES {
78         IB_SMI_CLASS =          0x1,
79         IB_SMI_DIRECT_CLASS =   0x81,
80         IB_SA_CLASS =           0x3,
81         IB_PERFORMANCE_CLASS =  0x4,
82         IB_BOARD_MGMT_CLASS =   0x5,
83         IB_DEVICE_MGMT_CLASS =  0x6,
84         IB_CM_CLASS =           0x7,
85         IB_SNMP_CLASS =         0x8,
86         IB_VENDOR_RANGE1_START_CLASS = 0x9,
87         IB_VENDOR_RANGE1_END_CLASS = 0x0f,
88         IB_CC_CLASS =           0x21,
89         IB_VENDOR_RANGE2_START_CLASS = 0x30,
90         IB_VENDOR_RANGE2_END_CLASS = 0x4f,
91 };
92
93 enum MAD_METHODS {
94         IB_MAD_METHOD_GET =             0x1,
95         IB_MAD_METHOD_SET =             0x2,
96         IB_MAD_METHOD_GET_RESPONSE =    0x81,
97
98         IB_MAD_METHOD_SEND =            0x3,
99         IB_MAD_METHOD_TRAP =            0x5,
100         IB_MAD_METHOD_TRAP_REPRESS =    0x7,
101
102         IB_MAD_METHOD_REPORT =          0x6,
103         IB_MAD_METHOD_REPORT_RESPONSE = 0x86,
104         IB_MAD_METHOD_GET_TABLE =       0x12,
105         IB_MAD_METHOD_GET_TABLE_RESPONSE = 0x92,
106         IB_MAD_METHOD_GET_TRACE_TABLE = 0x13,
107         IB_MAD_METHOD_GET_TRACE_TABLE_RESPONSE = 0x93,
108         IB_MAD_METHOD_GETMULTI =        0x14,
109         IB_MAD_METHOD_GETMULTI_RESPONSE = 0x94,
110         IB_MAD_METHOD_DELETE =          0x15,
111         IB_MAD_METHOD_DELETE_RESPONSE = 0x95,
112
113         IB_MAD_RESPONSE =               0x80,
114 };
115
116 enum MAD_ATTR_ID {
117         CLASS_PORT_INFO = 0x1,
118         NOTICE = 0x2,
119         INFORM_INFO = 0x3,
120 };
121
122 enum SMI_ATTR_ID {
123         IB_ATTR_NODE_DESC = 0x10,
124         IB_ATTR_NODE_INFO = 0x11,
125         IB_ATTR_SWITCH_INFO = 0x12,
126         IB_ATTR_GUID_INFO = 0x14,
127         IB_ATTR_PORT_INFO = 0x15,
128         IB_ATTR_PKEY_TBL = 0x16,
129         IB_ATTR_SLVL_TABLE = 0x17,
130         IB_ATTR_VL_ARBITRATION = 0x18,
131         IB_ATTR_LINEARFORWTBL = 0x19,
132         IB_ATTR_MULTICASTFORWTBL = 0x1b,
133         IB_ATTR_SMINFO = 0x20,
134
135         IB_ATTR_LAST
136 };
137
138 enum SA_ATTR_ID {
139         IB_SA_ATTR_NOTICE = 0x02,
140         IB_SA_ATTR_INFORMINFO = 0x03,
141         IB_SA_ATTR_PORTINFORECORD = 0x12,
142         IB_SA_ATTR_LINKRECORD = 0x20,
143         IB_SA_ATTR_SERVICERECORD = 0x31,
144         IB_SA_ATTR_PATHRECORD = 0x35,
145         IB_SA_ATTR_MCRECORD = 0x38,
146         IB_SA_ATTR_MULTIPATH = 0x3a,
147
148         IB_SA_ATTR_LAST
149 };
150
151 enum GSI_ATTR_ID {
152         IB_GSI_PORT_SAMPLES_CONTROL = 0x10,
153         IB_GSI_PORT_SAMPLES_RESULT = 0x11,
154         IB_GSI_PORT_COUNTERS = 0x12,
155         IB_GSI_PORT_COUNTERS_EXT = 0x1D,
156
157         IB_GSI_ATTR_LAST
158 };
159
160 #define IB_VENDOR_OPENIB_PING_CLASS     (IB_VENDOR_RANGE2_START_CLASS + 2)
161 #define IB_VENDOR_OPENIB_SYSSTAT_CLASS  (IB_VENDOR_RANGE2_START_CLASS + 3)
162 #define IB_OPENIB_OUI                   (0x001405)
163
164 typedef uint8_t ibmad_gid_t[16];
165 #ifdef USE_DEPRECATED_IB_GID_T
166 typedef ibmad_gid_t ib_gid_t __attribute__((deprecated));
167 #endif
168
169 typedef struct {
170         int cnt;
171         uint8_t p[IB_SUBNET_PATH_HOPS_MAX];
172         uint16_t drslid;
173         uint16_t drdlid;
174 } ib_dr_path_t;
175
176 typedef struct {
177         unsigned id;
178         unsigned mod;
179 } ib_attr_t;
180
181 typedef struct {
182         int mgtclass;
183         int method;
184         ib_attr_t attr;
185         uint32_t rstatus;       /* return status */
186         int dataoffs;
187         int datasz;
188         uint64_t mkey;
189         uint64_t trid;  /* used for out mad if nonzero, return real val */
190         uint64_t mask;  /* for sa mads */
191         unsigned recsz; /* for sa mads (attribute offset) */
192         int timeout;
193         uint32_t oui;   /* for vendor range 2 mads */
194 } ib_rpc_t;
195
196 typedef struct portid {
197         int lid;                /* lid or 0 if directed route */
198         ib_dr_path_t drpath;
199         int grh_present;        /* flag */
200         ibmad_gid_t gid;
201         uint32_t qp;
202         uint32_t qkey;
203         uint8_t sl;
204         unsigned pkey_idx;
205 } ib_portid_t;
206
207 typedef void (ib_mad_dump_fn)(char *buf, int bufsz, void *val, int valsz);
208
209 #define IB_FIELD_NAME_LEN       32
210
211 typedef struct ib_field {
212         int bitoffs;
213         int bitlen;
214         char name[IB_FIELD_NAME_LEN];
215         ib_mad_dump_fn *def_dump_fn;
216 } ib_field_t;
217
218 enum MAD_FIELDS {
219         IB_NO_FIELD,
220
221         IB_GID_PREFIX_F,
222         IB_GID_GUID_F,
223
224         /* first MAD word (0-3 bytes) */
225         IB_MAD_METHOD_F,
226         IB_MAD_RESPONSE_F,
227         IB_MAD_CLASSVER_F,
228         IB_MAD_MGMTCLASS_F,
229         IB_MAD_BASEVER_F,
230
231         /* second MAD word (4-7 bytes) */
232         IB_MAD_STATUS_F,
233
234         /* DRSMP only */
235         IB_DRSMP_HOPCNT_F,
236         IB_DRSMP_HOPPTR_F,
237         IB_DRSMP_STATUS_F,
238         IB_DRSMP_DIRECTION_F,
239
240         /* words 3,4,5,6 (8-23 bytes) */
241         IB_MAD_TRID_F,
242         IB_MAD_ATTRID_F,
243         IB_MAD_ATTRMOD_F,
244
245         /* word 7,8 (24-31 bytes) */
246         IB_MAD_MKEY_F,
247
248         /* word 9 (32-37 bytes) */
249         IB_DRSMP_DRSLID_F,
250         IB_DRSMP_DRDLID_F,
251
252         /* word 10,11 (36-43 bytes) */
253         IB_SA_MKEY_F,
254
255         /* word 12 (44-47 bytes) */
256         IB_SA_ATTROFFS_F,
257
258         /* word 13,14 (48-55 bytes) */
259         IB_SA_COMPMASK_F,
260
261         /* word 13,14 (56-255 bytes) */
262         IB_SA_DATA_F,
263
264         /* bytes 64 - 127 */
265         IB_SM_DATA_F,
266
267         /* bytes 64 - 256 */
268         IB_GS_DATA_F,
269
270         /* bytes 128 - 191 */
271         IB_DRSMP_PATH_F,
272
273         /* bytes 192 - 255 */
274         IB_DRSMP_RPATH_F,
275
276         /*
277          * PortInfo fields:
278          */
279         IB_PORT_FIRST_F,
280         IB_PORT_MKEY_F = IB_PORT_FIRST_F,
281         IB_PORT_GID_PREFIX_F,
282         IB_PORT_LID_F,
283         IB_PORT_SMLID_F,
284         IB_PORT_CAPMASK_F,
285         IB_PORT_DIAG_F,
286         IB_PORT_MKEY_LEASE_F,
287         IB_PORT_LOCAL_PORT_F,
288         IB_PORT_LINK_WIDTH_ENABLED_F,
289         IB_PORT_LINK_WIDTH_SUPPORTED_F,
290         IB_PORT_LINK_WIDTH_ACTIVE_F,
291         IB_PORT_LINK_SPEED_SUPPORTED_F,
292         IB_PORT_STATE_F,
293         IB_PORT_PHYS_STATE_F,
294         IB_PORT_LINK_DOWN_DEF_F,
295         IB_PORT_MKEY_PROT_BITS_F,
296         IB_PORT_LMC_F,
297         IB_PORT_LINK_SPEED_ACTIVE_F,
298         IB_PORT_LINK_SPEED_ENABLED_F,
299         IB_PORT_NEIGHBOR_MTU_F,
300         IB_PORT_SMSL_F,
301         IB_PORT_VL_CAP_F,
302         IB_PORT_INIT_TYPE_F,
303         IB_PORT_VL_HIGH_LIMIT_F,
304         IB_PORT_VL_ARBITRATION_HIGH_CAP_F,
305         IB_PORT_VL_ARBITRATION_LOW_CAP_F,
306         IB_PORT_INIT_TYPE_REPLY_F,
307         IB_PORT_MTU_CAP_F,
308         IB_PORT_VL_STALL_COUNT_F,
309         IB_PORT_HOQ_LIFE_F,
310         IB_PORT_OPER_VLS_F,
311         IB_PORT_PART_EN_INB_F,
312         IB_PORT_PART_EN_OUTB_F,
313         IB_PORT_FILTER_RAW_INB_F,
314         IB_PORT_FILTER_RAW_OUTB_F,
315         IB_PORT_MKEY_VIOL_F,
316         IB_PORT_PKEY_VIOL_F,
317         IB_PORT_QKEY_VIOL_F,
318         IB_PORT_GUID_CAP_F,
319         IB_PORT_CLIENT_REREG_F,
320         IB_PORT_SUBN_TIMEOUT_F,
321         IB_PORT_RESP_TIME_VAL_F,
322         IB_PORT_LOCAL_PHYS_ERR_F,
323         IB_PORT_OVERRUN_ERR_F,
324         IB_PORT_MAX_CREDIT_HINT_F,
325         IB_PORT_LINK_ROUND_TRIP_F,
326         IB_PORT_LAST_F,
327
328         /*
329          * NodeInfo fields:
330          */
331         IB_NODE_FIRST_F,
332         IB_NODE_BASE_VERS_F = IB_NODE_FIRST_F,
333         IB_NODE_CLASS_VERS_F,
334         IB_NODE_TYPE_F,
335         IB_NODE_NPORTS_F,
336         IB_NODE_SYSTEM_GUID_F,
337         IB_NODE_GUID_F,
338         IB_NODE_PORT_GUID_F,
339         IB_NODE_PARTITION_CAP_F,
340         IB_NODE_DEVID_F,
341         IB_NODE_REVISION_F,
342         IB_NODE_LOCAL_PORT_F,
343         IB_NODE_VENDORID_F,
344         IB_NODE_LAST_F,
345
346         /*
347          * SwitchInfo fields:
348          */
349         IB_SW_FIRST_F,
350         IB_SW_LINEAR_FDB_CAP_F = IB_SW_FIRST_F,
351         IB_SW_RANDOM_FDB_CAP_F,
352         IB_SW_MCAST_FDB_CAP_F,
353         IB_SW_LINEAR_FDB_TOP_F,
354         IB_SW_DEF_PORT_F,
355         IB_SW_DEF_MCAST_PRIM_F,
356         IB_SW_DEF_MCAST_NOT_PRIM_F,
357         IB_SW_LIFE_TIME_F,
358         IB_SW_STATE_CHANGE_F,
359         IB_SW_LIDS_PER_PORT_F,
360         IB_SW_PARTITION_ENFORCE_CAP_F,
361         IB_SW_PARTITION_ENF_INB_F,
362         IB_SW_PARTITION_ENF_OUTB_F,
363         IB_SW_FILTER_RAW_INB_F,
364         IB_SW_FILTER_RAW_OUTB_F,
365         IB_SW_ENHANCED_PORT0_F,
366         IB_SW_LAST_F,
367
368         /*
369          * SwitchLinearForwardingTable fields:
370          */
371         IB_LINEAR_FORW_TBL_F,
372
373         /*
374          * SwitchMulticastForwardingTable fields:
375          */
376         IB_MULTICAST_FORW_TBL_F,
377
378         /*
379          * NodeDescription fields:
380          */
381         IB_NODE_DESC_F,
382
383         /*
384          * Notice/Trap fields
385          */
386         IB_NOTICE_IS_GENERIC_F,
387         IB_NOTICE_TYPE_F,
388         IB_NOTICE_PRODUCER_F,
389         IB_NOTICE_TRAP_NUMBER_F,
390         IB_NOTICE_ISSUER_LID_F,
391         IB_NOTICE_TOGGLE_F,
392         IB_NOTICE_COUNT_F,
393         IB_NOTICE_DATA_DETAILS_F,
394         IB_NOTICE_DATA_LID_F,
395         IB_NOTICE_DATA_144_LID_F,
396         IB_NOTICE_DATA_144_CAPMASK_F,
397
398         /*
399          * GS Performance
400          */
401         IB_PC_FIRST_F,
402         IB_PC_PORT_SELECT_F = IB_PC_FIRST_F,
403         IB_PC_COUNTER_SELECT_F,
404         IB_PC_ERR_SYM_F,
405         IB_PC_LINK_RECOVERS_F,
406         IB_PC_LINK_DOWNED_F,
407         IB_PC_ERR_RCV_F,
408         IB_PC_ERR_PHYSRCV_F,
409         IB_PC_ERR_SWITCH_REL_F,
410         IB_PC_XMT_DISCARDS_F,
411         IB_PC_ERR_XMTCONSTR_F,
412         IB_PC_ERR_RCVCONSTR_F,
413         IB_PC_ERR_LOCALINTEG_F,
414         IB_PC_ERR_EXCESS_OVR_F,
415         IB_PC_VL15_DROPPED_F,
416         IB_PC_XMT_BYTES_F,
417         IB_PC_RCV_BYTES_F,
418         IB_PC_XMT_PKTS_F,
419         IB_PC_RCV_PKTS_F,
420         IB_PC_LAST_F,
421
422         /*
423          * SMInfo
424          */
425         IB_SMINFO_GUID_F,
426         IB_SMINFO_KEY_F,
427         IB_SMINFO_ACT_F,
428         IB_SMINFO_PRIO_F,
429         IB_SMINFO_STATE_F,
430
431         /*
432          * SA RMPP
433          */
434         IB_SA_RMPP_VERS_F,
435         IB_SA_RMPP_TYPE_F,
436         IB_SA_RMPP_RESP_F,
437         IB_SA_RMPP_FLAGS_F,
438         IB_SA_RMPP_STATUS_F,
439
440         /* data1 */
441         IB_SA_RMPP_D1_F,
442         IB_SA_RMPP_SEGNUM_F,
443         /* data2 */
444         IB_SA_RMPP_D2_F,
445         IB_SA_RMPP_LEN_F,               /* DATA: Payload len */
446         IB_SA_RMPP_NEWWIN_F,            /* ACK: new window last */
447
448         /*
449          * SA Multi Path rec
450          */
451         IB_SA_MP_NPATH_F,
452         IB_SA_MP_NSRC_F,
453         IB_SA_MP_NDEST_F,
454         IB_SA_MP_GID0_F,
455
456         /*
457          * SA Path rec
458          */
459         IB_SA_PR_DGID_F,
460         IB_SA_PR_SGID_F,
461         IB_SA_PR_DLID_F,
462         IB_SA_PR_SLID_F,
463         IB_SA_PR_NPATH_F,
464
465         /*
466          * MC Member rec
467          */
468         IB_SA_MCM_MGID_F,
469         IB_SA_MCM_PORTGID_F,
470         IB_SA_MCM_QKEY_F,
471         IB_SA_MCM_MLID_F,
472         IB_SA_MCM_SL_F,
473         IB_SA_MCM_MTU_F,
474         IB_SA_MCM_RATE_F,
475         IB_SA_MCM_TCLASS_F,
476         IB_SA_MCM_PKEY_F,
477         IB_SA_MCM_FLOW_LABEL_F,
478         IB_SA_MCM_JOIN_STATE_F,
479         IB_SA_MCM_PROXY_JOIN_F,
480
481         /*
482          * Service record
483          */
484         IB_SA_SR_ID_F,
485         IB_SA_SR_GID_F,
486         IB_SA_SR_PKEY_F,
487         IB_SA_SR_LEASE_F,
488         IB_SA_SR_KEY_F,
489         IB_SA_SR_NAME_F,
490         IB_SA_SR_DATA_F,
491
492         /*
493          * ATS SM record - within SA_SR_DATA
494          */
495         IB_ATS_SM_NODE_ADDR_F,
496         IB_ATS_SM_MAGIC_KEY_F,
497         IB_ATS_SM_NODE_TYPE_F,
498         IB_ATS_SM_NODE_NAME_F,
499
500         /*
501          * SLTOVL MAPPING TABLE
502          */
503         IB_SLTOVL_MAPPING_TABLE_F,
504
505         /*
506          * VL ARBITRATION TABLE
507          */
508         IB_VL_ARBITRATION_TABLE_F,
509
510         /*
511          * IB vendor class range 2
512          */
513         IB_VEND2_OUI_F,
514         IB_VEND2_DATA_F,
515
516         /*
517          * PortCountersExtended
518          */
519         IB_PC_EXT_FIRST_F,
520         IB_PC_EXT_PORT_SELECT_F = IB_PC_EXT_FIRST_F,
521         IB_PC_EXT_COUNTER_SELECT_F,
522         IB_PC_EXT_XMT_BYTES_F,
523         IB_PC_EXT_RCV_BYTES_F,
524         IB_PC_EXT_XMT_PKTS_F,
525         IB_PC_EXT_RCV_PKTS_F,
526         IB_PC_EXT_XMT_UPKTS_F,
527         IB_PC_EXT_RCV_UPKTS_F,
528         IB_PC_EXT_XMT_MPKTS_F,
529         IB_PC_EXT_RCV_MPKTS_F,
530         IB_PC_EXT_LAST_F,
531
532         /*
533          * GUIDInfo fields
534          */
535         IB_GUID_GUID0_F,
536
537         IB_FIELD_LAST_  /* must be last */
538 };
539
540 /*
541  * SA RMPP section
542  */
543 enum RMPP_TYPE_ENUM {
544         IB_RMPP_TYPE_NONE,
545         IB_RMPP_TYPE_DATA,
546         IB_RMPP_TYPE_ACK,
547         IB_RMPP_TYPE_STOP,
548         IB_RMPP_TYPE_ABORT,
549 };
550
551 enum RMPP_FLAGS_ENUM {
552         IB_RMPP_FLAG_ACTIVE = 1 << 0,
553         IB_RMPP_FLAG_FIRST = 1 << 1,
554         IB_RMPP_FLAG_LAST = 1 << 2,
555 };
556
557 typedef struct {
558         int type;
559         int flags;
560         int status;
561         union {
562                 uint32_t u;
563                 uint32_t segnum;
564         } d1;
565         union {
566                 uint32_t u;
567                 uint32_t len;
568                 uint32_t newwin;
569         } d2;
570 } ib_rmpp_hdr_t;
571
572 enum SA_SIZES_ENUM {
573         SA_HEADER_SZ = 20,
574 };
575
576 typedef struct ib_sa_call {
577         unsigned attrid;
578         unsigned mod;
579         uint64_t mask;
580         unsigned method;
581
582         uint64_t trid;  /* used for out mad if nonzero, return real val */
583         unsigned recsz; /* return field */
584         ib_rmpp_hdr_t rmpp;
585 } ib_sa_call_t;
586
587 typedef struct ib_vendor_call {
588         unsigned method;
589         unsigned mgmt_class;
590         unsigned attrid;
591         unsigned mod;
592         uint32_t oui;
593         unsigned timeout;
594         ib_rmpp_hdr_t rmpp;
595 } ib_vendor_call_t;
596
597 #define IB_MIN_UCAST_LID        1
598 #define IB_MAX_UCAST_LID        (0xc000-1)
599 #define IB_MIN_MCAST_LID        0xc000
600 #define IB_MAX_MCAST_LID        (0xffff-1)
601
602 #define IB_LID_VALID(lid)       ((lid) >= IB_MIN_UCAST_LID && lid <= IB_MAX_UCAST_LID)
603 #define IB_MLID_VALID(lid)      ((lid) >= IB_MIN_MCAST_LID && lid <= IB_MAX_MCAST_LID)
604
605 #define MAD_DEF_RETRIES         3
606 #define MAD_DEF_TIMEOUT_MS      1000
607
608 enum {
609         IB_DEST_LID,
610         IB_DEST_DRPATH,
611         IB_DEST_GUID,
612         IB_DEST_DRSLID,
613 };
614
615 enum {
616         IB_NODE_CA = 1,
617         IB_NODE_SWITCH,
618         IB_NODE_ROUTER,
619         NODE_RNIC,
620
621         IB_NODE_MAX = NODE_RNIC
622 };
623
624 /******************************************************************************/
625
626 /* portid.c */
627 MAD_EXPORT char * portid2str(ib_portid_t *portid);
628 MAD_EXPORT int  portid2portnum(ib_portid_t *portid);
629 MAD_EXPORT int  str2drpath(ib_dr_path_t *path, char *routepath, int drslid, int drdlid);
630 MAD_EXPORT char * drpath2str(ib_dr_path_t *path, char *dstr, size_t dstr_size);
631
632 static inline int
633 ib_portid_set(ib_portid_t *portid, int lid, int qp, int qkey)
634 {
635         portid->lid = lid;
636         portid->qp = qp;
637         portid->qkey = qkey;
638         portid->grh_present = 0;
639
640         return 0;
641 }
642
643 /* fields.c */
644 MAD_EXPORT uint32_t mad_get_field(void *buf, int base_offs, int field);
645 MAD_EXPORT void mad_set_field(void *buf, int base_offs, int field, uint32_t val);
646 /* field must be byte aligned */
647 MAD_EXPORT uint64_t mad_get_field64(void *buf, int base_offs, int field);
648 MAD_EXPORT void mad_set_field64(void *buf, int base_offs, int field, uint64_t val);
649 MAD_EXPORT void mad_set_array(void *buf, int base_offs, int field, void *val);
650 MAD_EXPORT void mad_get_array(void *buf, int base_offs, int field, void *val);
651 MAD_EXPORT void mad_decode_field(uint8_t *buf, int field, void *val);
652 MAD_EXPORT void mad_encode_field(uint8_t *buf, int field, void *val);
653 MAD_EXPORT int mad_print_field(int field, const char *name, void *val);
654 MAD_EXPORT char *mad_dump_field(int field, char *buf, int bufsz, void *val);
655 MAD_EXPORT char *mad_dump_val(int field, char *buf, int bufsz, void *val);
656
657 /* mad.c */
658 MAD_EXPORT void *mad_encode(void *buf, ib_rpc_t *rpc, ib_dr_path_t *drpath, void *data);
659 MAD_EXPORT uint64_t mad_trid(void);
660 MAD_EXPORT int mad_build_pkt(void *umad, ib_rpc_t *rpc, ib_portid_t *dport, ib_rmpp_hdr_t *rmpp, void *data);
661
662 /* register.c */
663 MAD_EXPORT int  mad_register_port_client(int port_id, int mgmt, uint8_t rmpp_version);
664 MAD_EXPORT int  mad_register_client(int mgmt, uint8_t rmpp_version);
665 MAD_EXPORT int  mad_register_server(int mgmt, uint8_t rmpp_version,
666                             long method_mask[16/sizeof(long)],
667                             uint32_t class_oui);
668 MAD_EXPORT int  mad_class_agent(int mgmt);
669 MAD_EXPORT int  mad_agent_class(int agent);
670
671 /* serv.c */
672 MAD_EXPORT int  mad_send(ib_rpc_t *rpc, ib_portid_t *dport, ib_rmpp_hdr_t *rmpp,
673                  void *data);
674 MAD_EXPORT void * mad_receive(void *umad, int timeout);
675 MAD_EXPORT int  mad_respond(void *umad, ib_portid_t *portid, uint32_t rstatus);
676 MAD_EXPORT void * mad_alloc(void);
677 MAD_EXPORT void mad_free(void *umad);
678
679 /* vendor.c */
680 MAD_EXPORT uint8_t *ib_vendor_call(void *data, ib_portid_t *portid,
681                                    ib_vendor_call_t *call);
682
683 static inline int
684 mad_is_vendor_range1(int mgmt)
685 {
686         return mgmt >= 0x9 && mgmt <= 0xf;
687 }
688
689 static inline int
690 mad_is_vendor_range2(int mgmt)
691 {
692         return mgmt >= 0x30 && mgmt <= 0x4f;
693 }
694
695 /* rpc.c */
696 MAD_EXPORT int  madrpc_portid(void);
697 MAD_EXPORT int  madrpc_set_retries(int retries);
698 MAD_EXPORT int  madrpc_set_timeout(int timeout);
699 void * madrpc(ib_rpc_t *rpc, ib_portid_t *dport, void *payload, void *rcvdata);
700 void * madrpc_rmpp(ib_rpc_t *rpc, ib_portid_t *dport, ib_rmpp_hdr_t *rmpp,
701                     void *data);
702 MAD_EXPORT void madrpc_init(char *dev_name, int dev_port, int *mgmt_classes,
703                     int num_classes);
704 void    madrpc_save_mad(void *madbuf, int len);
705 MAD_EXPORT void madrpc_show_errors(int set);
706
707 void * mad_rpc_open_port(char *dev_name, int dev_port, int *mgmt_classes,
708                           int num_classes);
709 void    mad_rpc_close_port(void *ibmad_port);
710 void * mad_rpc(const void *ibmad_port, ib_rpc_t *rpc, ib_portid_t *dport,
711                 void *payload, void *rcvdata);
712 void * mad_rpc_rmpp(const void *ibmad_port, ib_rpc_t *rpc, ib_portid_t *dport,
713                      ib_rmpp_hdr_t *rmpp, void *data);
714
715 /* smp.c */
716 MAD_EXPORT uint8_t * smp_query(void *buf, ib_portid_t *id, unsigned attrid, unsigned mod,
717                     unsigned timeout);
718 MAD_EXPORT uint8_t * smp_set(void *buf, ib_portid_t *id, unsigned attrid, unsigned mod,
719                   unsigned timeout);
720 uint8_t * smp_query_via(void *buf, ib_portid_t *id, unsigned attrid,
721                         unsigned mod, unsigned timeout, const void *srcport);
722 uint8_t * smp_set_via(void *buf, ib_portid_t *id, unsigned attrid, unsigned mod,
723                       unsigned timeout, const void *srcport);
724
725 /* sa.c */
726 uint8_t * sa_call(void *rcvbuf, ib_portid_t *portid, ib_sa_call_t *sa,
727                   unsigned timeout);
728 uint8_t * sa_rpc_call(const void *ibmad_port, void *rcvbuf, ib_portid_t *portid,
729                       ib_sa_call_t *sa, unsigned timeout);
730 MAD_EXPORT int  ib_path_query(ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t *sm_id,
731                       void *buf);       /* returns lid */
732 int     ib_path_query_via(const void *srcport, ibmad_gid_t srcgid,
733                           ibmad_gid_t destgid, ib_portid_t *sm_id, void *buf);
734
735 /* resolve.c */
736 MAD_EXPORT int  ib_resolve_smlid(ib_portid_t *sm_id, int timeout);
737 MAD_EXPORT int  ib_resolve_portid_str(ib_portid_t *portid, char *addr_str,
738                               int dest_type, ib_portid_t *sm_id);
739 MAD_EXPORT int  ib_resolve_self(ib_portid_t *portid, int *portnum, ibmad_gid_t *gid);
740
741 int     ib_resolve_smlid_via(ib_portid_t *sm_id, int timeout,
742                              const void *srcport);
743 int     ib_resolve_guid_via(ib_portid_t *portid, uint64_t *guid,
744                             ib_portid_t *sm_id, int timeout,
745                             const void *srcport);
746 int     ib_resolve_portid_str_via(ib_portid_t *portid, char *addr_str,
747                                   int dest_type, ib_portid_t *sm_id,
748                                   const void *srcport);
749 int     ib_resolve_self_via(ib_portid_t *portid, int *portnum, ibmad_gid_t *gid,
750                             const void *srcport);
751
752 /* gs.c */
753 MAD_EXPORT uint8_t *perf_classportinfo_query(void *rcvbuf, ib_portid_t *dest, int port,
754                                   unsigned timeout);
755 MAD_EXPORT uint8_t *port_performance_query(void *rcvbuf, ib_portid_t *dest, int port,
756                                 unsigned timeout);
757 MAD_EXPORT uint8_t *port_performance_reset(void *rcvbuf, ib_portid_t *dest, int port,
758                                 unsigned mask, unsigned timeout);
759 MAD_EXPORT uint8_t *port_performance_ext_query(void *rcvbuf, ib_portid_t *dest, int port,
760                                     unsigned timeout);
761 MAD_EXPORT uint8_t *port_performance_ext_reset(void *rcvbuf, ib_portid_t *dest, int port,
762                                     unsigned mask, unsigned timeout);
763 MAD_EXPORT uint8_t *port_samples_control_query(void *rcvbuf, ib_portid_t *dest, int port,
764                                     unsigned timeout);
765 MAD_EXPORT uint8_t *port_samples_result_query(void *rcvbuf, ib_portid_t *dest, int port,
766                                    unsigned timeout);
767
768 uint8_t *perf_classportinfo_query_via(void *rcvbuf, ib_portid_t *dest, int port,
769                                   unsigned timeout, const void *srcport);
770 uint8_t *port_performance_query_via(void *rcvbuf, ib_portid_t *dest, int port,
771                                 unsigned timeout, const void *srcport);
772 uint8_t *port_performance_reset_via(void *rcvbuf, ib_portid_t *dest, int port,
773                                 unsigned mask, unsigned timeout, const void *srcport);
774 uint8_t *port_performance_ext_query_via(void *rcvbuf, ib_portid_t *dest, int port,
775                                     unsigned timeout, const void *srcport);
776 uint8_t *port_performance_ext_reset_via(void *rcvbuf, ib_portid_t *dest, int port,
777                                     unsigned mask, unsigned timeout, const void *srcport);
778 uint8_t *port_samples_control_query_via(void *rcvbuf, ib_portid_t *dest, int port,
779                                     unsigned timeout, const void *srcport);
780 uint8_t *port_samples_result_query_via(void *rcvbuf, ib_portid_t *dest, int port,
781                                    unsigned timeout, const void *srcport);
782 /* dump.c */
783 MAD_EXPORT ib_mad_dump_fn
784         mad_dump_int, mad_dump_uint, mad_dump_hex, mad_dump_rhex,
785         mad_dump_bitfield, mad_dump_array, mad_dump_string,
786         mad_dump_linkwidth, mad_dump_linkwidthsup, mad_dump_linkwidthen,
787         mad_dump_linkdowndefstate,
788         mad_dump_linkspeed, mad_dump_linkspeedsup, mad_dump_linkspeeden,
789         mad_dump_portstate, mad_dump_portstates,
790         mad_dump_physportstate, mad_dump_portcapmask,
791         mad_dump_mtu, mad_dump_vlcap, mad_dump_opervls,
792         mad_dump_node_type,
793         mad_dump_sltovl, mad_dump_vlarbitration,
794         mad_dump_nodedesc, mad_dump_nodeinfo, mad_dump_portinfo, mad_dump_switchinfo,
795         mad_dump_perfcounters, mad_dump_perfcounters_ext;
796
797 extern int ibdebug;
798
799 #if __BYTE_ORDER == __LITTLE_ENDIAN
800 #ifndef ntohll
801 static inline uint64_t ntohll(uint64_t x) {
802         return bswap_64(x);
803 }
804 #endif
805 #ifndef htonll
806 static inline uint64_t htonll(uint64_t x) {
807         return bswap_64(x);
808 }
809 #endif
810 #elif __BYTE_ORDER == __BIG_ENDIAN
811 #ifndef ntohll
812 static inline uint64_t ntohll(uint64_t x) {
813         return x;
814 }
815 #endif
816 #ifndef htonll
817 static inline uint64_t htonll(uint64_t x) {
818         return x;
819 }
820 #endif
821 #endif  /* __BYTE_ORDER == __BIG_ENDIAN */
822
823 /* Misc. macros: */
824 /** align value \a l to \a size (ceil) */
825 #define ALIGN(l, size) (((l) + ((size) - 1)) / (size) * (size))
826
827 /** printf style warning MACRO, includes name of function and pid */
828 #define IBWARN(fmt, ...) fprintf(stdout, "ibwarn: [%d] %s: "fmt"\n", getpid(), __func__, ## __VA_ARGS__);
829
830 /** printf style abort MACRO, includes name of function and pid */
831 #define IBPANIC(fmt, ...) do { \
832         fprintf(stdout, "ibpanic: [%d] %s: " fmt ": %m\n", getpid(), __func__, ## __VA_ARGS__); \
833         exit(-1); \
834 } while(0)
835
836 void xdump(FILE *file, char *msg, void *p, int size);
837
838 END_C_DECLS
839
840 #endif /* _MAD_H_ */