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