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