2 * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved.
3 * Copyright (c) 2007 Xsigo Systems Inc. All rights reserved.
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:
11 * Redistribution and use in source and binary forms, with or
12 * without modification, are permitted provided that the following
15 * - Redistributions of source code must retain the above
16 * copyright notice, this list of conditions and the following
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.
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
37 #endif /* HAVE_CONFIG_H */
44 #include <netinet/in.h>
47 #include <infiniband/common.h>
50 mad_dump_int(char *buf, int bufsz, void *val, int valsz)
54 snprintf(buf, bufsz, "%d", *(uint8_t *)val);
57 snprintf(buf, bufsz, "%d", *(uint16_t *)val);
61 snprintf(buf, bufsz, "%d", *(uint32_t *)val);
67 snprintf(buf, bufsz, "%" PRIu64, *(uint64_t *)val);
70 IBWARN("bad int sz %d", valsz);
76 mad_dump_uint(char *buf, int bufsz, void *val, int valsz)
80 snprintf(buf, bufsz, "%u", *(uint8_t *)val);
83 snprintf(buf, bufsz, "%u", *(uint16_t *)val);
87 snprintf(buf, bufsz, "%u", *(uint32_t *)val);
93 snprintf(buf, bufsz, "%" PRIu64, *(uint64_t *)val);
96 IBWARN("bad int sz %u", valsz);
102 mad_dump_hex(char *buf, int bufsz, void *val, int valsz)
106 snprintf(buf, bufsz, "0x%02x", *(uint8_t *)val);
109 snprintf(buf, bufsz, "0x%04x", *(uint16_t *)val);
112 snprintf(buf, bufsz, "0x%06x", *(uint32_t *)val & 0xffffff);
115 snprintf(buf, bufsz, "0x%08x", *(uint32_t *)val);
118 snprintf(buf, bufsz, "0x%010" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffllu);
121 snprintf(buf, bufsz, "0x%012" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffffllu);
124 snprintf(buf, bufsz, "0x%014" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffffffllu);
127 snprintf(buf, bufsz, "0x%016" PRIx64, *(uint64_t *)val);
130 IBWARN("bad int sz %d", valsz);
136 mad_dump_rhex(char *buf, int bufsz, void *val, int valsz)
140 snprintf(buf, bufsz, "%02x", *(uint8_t *)val);
143 snprintf(buf, bufsz, "%04x", *(uint16_t *)val);
146 snprintf(buf, bufsz, "%06x", *(uint32_t *)val & 0xffffff);
149 snprintf(buf, bufsz, "%08x", *(uint32_t *)val);
152 snprintf(buf, bufsz, "%010" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffllu);
155 snprintf(buf, bufsz, "%012" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffffllu);
158 snprintf(buf, bufsz, "%014" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffffffllu);
161 snprintf(buf, bufsz, "%016" PRIx64, *(uint64_t *)val);
164 IBWARN("bad int sz %d", valsz);
170 mad_dump_linkwidth(char *buf, int bufsz, void *val, int valsz)
172 int width = *(int *)val;
176 snprintf(buf, bufsz, "1X");
179 snprintf(buf, bufsz, "4X");
182 snprintf(buf, bufsz, "8X");
185 snprintf(buf, bufsz, "12X");
188 IBWARN("bad width %d", width);
194 dump_linkwidth(char *buf, int bufsz, int width)
199 n += snprintf(buf + n, bufsz - n, "1X or ");
200 if (n < bufsz && (width & 0x2))
201 n += snprintf(buf + n, bufsz - n, "4X or ");
202 if (n < bufsz && (width & 0x4))
203 n += snprintf(buf + n, bufsz - n, "8X or ");
204 if (n < bufsz && (width & 0x8))
205 n += snprintf(buf + n, bufsz - n, "12X or ");
209 else if (width == 0 || (width >> 4))
210 snprintf(buf + n, bufsz - n, "undefined (%d)", width);
216 mad_dump_linkwidthsup(char *buf, int bufsz, void *val, int valsz)
218 int width = *(int *)val;
220 dump_linkwidth(buf, bufsz, width);
232 snprintf(buf + strlen(buf), bufsz - strlen(buf),
239 mad_dump_linkwidthen(char *buf, int bufsz, void *val, int valsz)
241 int width = *(int *)val;
243 dump_linkwidth(buf, bufsz, width);
247 mad_dump_linkspeed(char *buf, int bufsz, void *val, int valsz)
249 int speed = *(int *)val;
253 snprintf(buf, bufsz, "2.5 Gbps");
256 snprintf(buf, bufsz, "5.0 Gbps");
259 snprintf(buf, bufsz, "10.0 Gbps");
262 snprintf(buf, bufsz, "undefined (%d)", speed);
268 dump_linkspeed(char *buf, int bufsz, int speed)
273 n += snprintf(buf + n, bufsz - n, "2.5 Gbps or ");
274 if (n < bufsz && (speed & 0x2))
275 n += snprintf(buf + n, bufsz - n, "5.0 Gbps or ");
276 if (n < bufsz && (speed & 0x4))
277 n += snprintf(buf + n, bufsz - n, "10.0 Gbps or ");
281 else if (speed == 0 || (speed >> 3)) {
282 n += snprintf(buf + n, bufsz - n, "undefined (%d)", speed);
285 } else if (bufsz > 3) {
298 snprintf(buf + n, bufsz - n, " (IBA extension)");
304 mad_dump_linkspeedsup(char *buf, int bufsz, void *val, int valsz)
306 int speed = *(int *)val;
308 dump_linkspeed(buf, bufsz, speed);
312 mad_dump_linkspeeden(char *buf, int bufsz, void *val, int valsz)
314 int speed = *(int *)val;
316 dump_linkspeed(buf, bufsz, speed);
320 mad_dump_portstate(char *buf, int bufsz, void *val, int valsz)
322 int state = *(int *)val;
326 snprintf(buf, bufsz, "NoChange");
329 snprintf(buf, bufsz, "Down");
332 snprintf(buf, bufsz, "Initialize");
335 snprintf(buf, bufsz, "Armed");
338 snprintf(buf, bufsz, "Active");
341 snprintf(buf, bufsz, "?(%d)", state);
346 mad_dump_linkdowndefstate(char *buf, int bufsz, void *val, int valsz)
348 int state = *(int *)val;
352 snprintf(buf, bufsz, "NoChange");
355 snprintf(buf, bufsz, "Sleep");
358 snprintf(buf, bufsz, "Polling");
361 snprintf(buf, bufsz, "?(%d)", state);
367 mad_dump_physportstate(char *buf, int bufsz, void *val, int valsz)
369 int state = *(int *)val;
373 snprintf(buf, bufsz, "NoChange");
376 snprintf(buf, bufsz, "Sleep");
379 snprintf(buf, bufsz, "Polling");
382 snprintf(buf, bufsz, "Disabled");
385 snprintf(buf, bufsz, "PortConfigurationTraining");
388 snprintf(buf, bufsz, "LinkUp");
391 snprintf(buf, bufsz, "LinkErrorRecovery");
394 snprintf(buf, bufsz, "PhyTest");
397 snprintf(buf, bufsz, "?(%d)", state);
402 mad_dump_mtu(char *buf, int bufsz, void *val, int valsz)
404 int mtu = *(int *)val;
408 snprintf(buf, bufsz, "256");
411 snprintf(buf, bufsz, "512");
414 snprintf(buf, bufsz, "1024");
417 snprintf(buf, bufsz, "2048");
420 snprintf(buf, bufsz, "4096");
423 snprintf(buf, bufsz, "?(%d)", mtu);
429 mad_dump_vlcap(char *buf, int bufsz, void *val, int valsz)
431 int vlcap = *(int *)val;
435 snprintf(buf, bufsz, "VL0");
438 snprintf(buf, bufsz, "VL0-1");
441 snprintf(buf, bufsz, "VL0-3");
444 snprintf(buf, bufsz, "VL0-7");
447 snprintf(buf, bufsz, "VL0-14");
450 snprintf(buf, bufsz, "?(%d)", vlcap);
455 mad_dump_opervls(char *buf, int bufsz, void *val, int valsz)
457 int opervls = *(int *)val;
461 snprintf(buf, bufsz, "No change");
464 snprintf(buf, bufsz, "VL0");
467 snprintf(buf, bufsz, "VL0-1");
470 snprintf(buf, bufsz, "VL0-3");
473 snprintf(buf, bufsz, "VL0-7");
476 snprintf(buf, bufsz, "VL0-14");
479 snprintf(buf, bufsz, "?(%d)", opervls);
484 mad_dump_portcapmask(char *buf, int bufsz, void *val, int valsz)
486 unsigned mask = *(unsigned *)val;
489 s += sprintf(s, "0x%x\n", mask);
491 s += sprintf(s, "\t\t\t\tIsSM\n");
493 s += sprintf(s, "\t\t\t\tIsNoticeSupported\n");
495 s += sprintf(s, "\t\t\t\tIsTrapSupported\n");
497 s += sprintf(s, "\t\t\t\tIsAutomaticMigrationSupported\n");
499 s += sprintf(s, "\t\t\t\tIsSLMappingSupported\n");
501 s += sprintf(s, "\t\t\t\tIsMKeyNVRAM\n");
503 s += sprintf(s, "\t\t\t\tIsPKeyNVRAM\n");
505 s += sprintf(s, "\t\t\t\tIsLedInfoSupported\n");
506 if (mask & (1 << 10))
507 s += sprintf(s, "\t\t\t\tIsSMdisabled\n");
508 if (mask & (1 << 11))
509 s += sprintf(s, "\t\t\t\tIsSystemImageGUIDsupported\n");
510 if (mask & (1 << 12))
511 s += sprintf(s, "\t\t\t\tIsPkeySwitchExternalPortTrapSupported\n");
512 if (mask & (1 << 16))
513 s += sprintf(s, "\t\t\t\tIsCommunicatonManagementSupported\n");
514 if (mask & (1 << 17))
515 s += sprintf(s, "\t\t\t\tIsSNMPTunnelingSupported\n");
516 if (mask & (1 << 18))
517 s += sprintf(s, "\t\t\t\tIsReinitSupported\n");
518 if (mask & (1 << 19))
519 s += sprintf(s, "\t\t\t\tIsDeviceManagementSupported\n");
520 if (mask & (1 << 20))
521 s += sprintf(s, "\t\t\t\tIsVendorClassSupported\n");
522 if (mask & (1 << 21))
523 s += sprintf(s, "\t\t\t\tIsDRNoticeSupported\n");
524 if (mask & (1 << 22))
525 s += sprintf(s, "\t\t\t\tIsCapabilityMaskNoticeSupported\n");
526 if (mask & (1 << 23))
527 s += sprintf(s, "\t\t\t\tIsBootManagementSupported\n");
528 if (mask & (1 << 24))
529 s += sprintf(s, "\t\t\t\tIsLinkRoundTripLatencySupported\n");
530 if (mask & (1 << 25))
531 s += sprintf(s, "\t\t\t\tIsClientRegistrationSupported\n");
532 if (mask & (1 << 26))
533 s += sprintf(s, "\t\t\t\tIsOtherLocalChangesNoticeSupported\n");
534 if (mask & (1 << 27))
535 s += sprintf(s, "\t\t\t\tIsLinkSpeedWidthPairsTableSupported\n");
542 mad_dump_bitfield(char *buf, int bufsz, void *val, int valsz)
544 snprintf(buf, bufsz, "0x%x", *(uint32_t *)val);
548 mad_dump_array(char *buf, int bufsz, void *val, int valsz)
550 uint8_t *p = val, *e;
556 for (p = val, e = p + valsz; p < e; p++, s += 2)
557 sprintf(s, "%02x", *p);
561 mad_dump_string(char *buf, int bufsz, void *val, int valsz)
566 snprintf(buf, valsz, "'%s'", (char *)val);
570 mad_dump_node_type(char *buf, int bufsz, void *val, int valsz)
572 int nodetype = *(int*)val;
576 snprintf(buf, bufsz, "Channel Adapter");
579 snprintf(buf, bufsz, "Switch");
582 snprintf(buf, bufsz, "Router");
585 snprintf(buf, bufsz, "?(%d)?", nodetype);
590 #define IB_MAX_NUM_VLS 16
591 #define IB_MAX_NUM_VLS_TO_U8 ((IB_MAX_NUM_VLS)/2)
593 typedef struct _ib_slvl_table {
594 uint8_t vl_by_sl_num[IB_MAX_NUM_VLS_TO_U8];
598 ib_slvl_get_i(ib_slvl_table_t *tbl, int i, uint8_t *vl)
600 *vl = (tbl->vl_by_sl_num[i >> 1] >> ((!(i&1)) << 2)) & 0xf;
603 #define IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK 32
605 typedef struct _ib_vl_arb_table {
609 } vl_entry[IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK];
610 } __attribute__((packed)) ib_vl_arb_table_t;
613 ib_vl_arb_get_vl(uint8_t res_vl, uint8_t *const vl )
619 mad_dump_sltovl(char *buf, int bufsz, void *val, int valsz)
621 ib_slvl_table_t* p_slvl_tbl = val;
624 n = snprintf(buf, bufsz, "|");
625 for (i = 0; i < 16; i++) {
626 ib_slvl_get_i(p_slvl_tbl, i, &vl);
627 n += snprintf(buf + n, bufsz - n, "%2u|", vl);
631 snprintf(buf + n, bufsz - n, "\n");
635 mad_dump_vlarbitration(char *buf, int bufsz, void *val, int num)
637 ib_vl_arb_table_t* p_vla_tbl = val;
641 num /= sizeof(p_vla_tbl->vl_entry[0]);
643 n = snprintf(buf, bufsz, "\nVL : |");
646 for (i = 0; i < num; i++) {
647 ib_vl_arb_get_vl(p_vla_tbl->vl_entry[i].res_vl, &vl);
648 n += snprintf(buf + n, bufsz - n, "0x%-2X|", vl);
653 n += snprintf(buf + n, bufsz - n, "\nWEIGHT: |");
656 for (i = 0; i < num; i++) {
657 n += snprintf(buf + n, bufsz - n, "0x%-2X|",
658 p_vla_tbl->vl_entry[i].weight);
663 snprintf(buf + n, bufsz - n, "\n");
667 _dump_fields(char *buf, int bufsz, void *data, int start, int end)
673 for (field = start; field < end && bufsz > 0; field++) {
674 mad_decode_field(data, field, val);
675 if (!mad_dump_field(field, s, bufsz, val))
689 mad_dump_nodedesc(char *buf, int bufsz, void *val, int valsz)
691 strncpy(buf, val, bufsz);
698 mad_dump_nodeinfo(char *buf, int bufsz, void *val, int valsz)
700 _dump_fields(buf, bufsz, val, IB_NODE_FIRST_F, IB_NODE_LAST_F);
704 mad_dump_portinfo(char *buf, int bufsz, void *val, int valsz)
706 _dump_fields(buf, bufsz, val, IB_PORT_FIRST_F, IB_PORT_LAST_F);
710 mad_dump_portstates(char *buf, int bufsz, void *val, int valsz)
712 _dump_fields(buf, bufsz, val, IB_PORT_STATE_F, IB_PORT_LINK_DOWN_DEF_F);
716 mad_dump_switchinfo(char *buf, int bufsz, void *val, int valsz)
718 _dump_fields(buf, bufsz, val, IB_SW_FIRST_F, IB_SW_LAST_F);
722 mad_dump_perfcounters(char *buf, int bufsz, void *val, int valsz)
724 _dump_fields(buf, bufsz, val, IB_PC_FIRST_F, IB_PC_LAST_F);
728 mad_dump_perfcounters_ext(char *buf, int bufsz, void *val, int valsz)
730 _dump_fields(buf, bufsz, val, IB_PC_EXT_FIRST_F, IB_PC_EXT_LAST_F);
733 /************************/
736 _mad_dump_val(ib_field_t *f, char *buf, int bufsz, void *val)
738 f->def_dump_fn(buf, bufsz, val, ALIGN(f->bitlen, 8) / 8);
745 _mad_dump_field(ib_field_t *f, char *name, char *buf, int bufsz, void *val)
751 return 0; /* buf too small */
758 memset(dots, '.', 32 - l);
762 n = snprintf(buf, bufsz, "%s:%s", name, dots);
763 _mad_dump_val(f, buf + n, bufsz - n, val);
770 _mad_dump(ib_mad_dump_fn *fn, char *name, void *val, int valsz)
772 ib_field_t f = { .def_dump_fn = fn, .bitlen = valsz * 8};
775 return printf("%s\n", _mad_dump_field(&f, name, buf, sizeof buf, val));
779 _mad_print_field(ib_field_t *f, char *name, void *val, int valsz)
781 return _mad_dump(f->def_dump_fn, name ? name : f->name, val, valsz ? valsz : ALIGN(f->bitlen, 8) / 8);