/* * Copyright (c) 2004-2009 Voltaire Inc. All rights reserved. * Copyright (c) 2007 Xsigo Systems Inc. All rights reserved. * Copyright (c) 2009-2011 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 2009 HNR Consulting. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ #include #include #include #include void mad_dump_int(char *buf, int bufsz, void *val, int valsz) { switch (valsz) { case 1: snprintf(buf, bufsz, "%d", *(uint32_t *) val & 0xff); break; case 2: snprintf(buf, bufsz, "%d", *(uint32_t *) val & 0xffff); break; case 3: case 4: snprintf(buf, bufsz, "%d", *(uint32_t *) val); break; case 5: case 6: case 7: case 8: snprintf(buf, bufsz, "%" PRIu64, *(uint64_t *) val); break; default: IBWARN("bad int sz %d", valsz); buf[0] = 0; } } void mad_dump_uint(char *buf, int bufsz, void *val, int valsz) { switch (valsz) { case 1: snprintf(buf, bufsz, "%u", *(uint32_t *) val & 0xff); break; case 2: snprintf(buf, bufsz, "%u", *(uint32_t *) val & 0xffff); break; case 3: case 4: snprintf(buf, bufsz, "%u", *(uint32_t *) val); break; case 5: case 6: case 7: case 8: snprintf(buf, bufsz, "%" PRIu64, *(uint64_t *) val); break; default: IBWARN("bad int sz %u", valsz); buf[0] = 0; } } void mad_dump_hex(char *buf, int bufsz, void *val, int valsz) { switch (valsz) { case 1: snprintf(buf, bufsz, "0x%02x", *(uint32_t *) val & 0xff); break; case 2: snprintf(buf, bufsz, "0x%04x", *(uint32_t *) val & 0xffff); break; case 3: snprintf(buf, bufsz, "0x%06x", *(uint32_t *) val & 0xffffff); break; case 4: snprintf(buf, bufsz, "0x%08x", *(uint32_t *) val); break; case 5: snprintf(buf, bufsz, "0x%010" PRIx64, *(uint64_t *) val & (uint64_t) 0xffffffffffULL); break; case 6: snprintf(buf, bufsz, "0x%012" PRIx64, *(uint64_t *) val & (uint64_t) 0xffffffffffffULL); break; case 7: snprintf(buf, bufsz, "0x%014" PRIx64, *(uint64_t *) val & (uint64_t) 0xffffffffffffffULL); break; case 8: snprintf(buf, bufsz, "0x%016" PRIx64, *(uint64_t *) val); break; default: IBWARN("bad int sz %d", valsz); buf[0] = 0; } } void mad_dump_rhex(char *buf, int bufsz, void *val, int valsz) { switch (valsz) { case 1: snprintf(buf, bufsz, "%02x", *(uint32_t *) val & 0xff); break; case 2: snprintf(buf, bufsz, "%04x", *(uint32_t *) val & 0xffff); break; case 3: snprintf(buf, bufsz, "%06x", *(uint32_t *) val & 0xffffff); break; case 4: snprintf(buf, bufsz, "%08x", *(uint32_t *) val); break; case 5: snprintf(buf, bufsz, "%010" PRIx64, *(uint64_t *) val & (uint64_t) 0xffffffffffULL); break; case 6: snprintf(buf, bufsz, "%012" PRIx64, *(uint64_t *) val & (uint64_t) 0xffffffffffffULL); break; case 7: snprintf(buf, bufsz, "%014" PRIx64, *(uint64_t *) val & (uint64_t) 0xffffffffffffffULL); break; case 8: snprintf(buf, bufsz, "%016" PRIx64, *(uint64_t *) val); break; default: IBWARN("bad int sz %d", valsz); buf[0] = 0; } } void mad_dump_linkwidth(char *buf, int bufsz, void *val, int valsz) { int width = *(int *)val; switch (width) { case 1: snprintf(buf, bufsz, "1X"); break; case 2: snprintf(buf, bufsz, "4X"); break; case 4: snprintf(buf, bufsz, "8X"); break; case 8: snprintf(buf, bufsz, "12X"); break; case 16: snprintf(buf, bufsz, "2X"); break; default: IBWARN("bad width %d", width); snprintf(buf, bufsz, "undefined (%d)", width); break; } } static void dump_linkwidth(char *buf, int bufsz, int width) { int n = 0; if (width & 0x1) n += snprintf(buf + n, bufsz - n, "1X or "); if (n < bufsz && (width & 0x2)) n += snprintf(buf + n, bufsz - n, "4X or "); if (n < bufsz && (width & 0x4)) n += snprintf(buf + n, bufsz - n, "8X or "); if (n < bufsz && (width & 0x8)) n += snprintf(buf + n, bufsz - n, "12X or "); if (n < bufsz && (width & 0x10)) n += snprintf(buf + n, bufsz - n, "2X or "); if (n >= bufsz) return; else if (width == 0 || (width >> 5)) snprintf(buf + n, bufsz - n, "undefined (%d)", width); else if (bufsz > 3) buf[n - 4] = '\0'; } void mad_dump_linkwidthsup(char *buf, int bufsz, void *val, int valsz) { int width = *(int *)val; dump_linkwidth(buf, bufsz, width); switch (width) { case 1: case 3: case 7: case 11: case 15: case 17: case 19: case 23: case 27: case 31: break; default: if (!(width >> 5)) snprintf(buf + strlen(buf), bufsz - strlen(buf), " (IBA extension)"); break; } } void mad_dump_linkwidthen(char *buf, int bufsz, void *val, int valsz) { int width = *(int *)val; dump_linkwidth(buf, bufsz, width); } void mad_dump_linkspeed(char *buf, int bufsz, void *val, int valsz) { int speed = *(int *)val; switch (speed) { case 0: snprintf(buf, bufsz, "Extended speed"); break; case 1: snprintf(buf, bufsz, "2.5 Gbps"); break; case 2: snprintf(buf, bufsz, "5.0 Gbps"); break; case 4: snprintf(buf, bufsz, "10.0 Gbps"); break; default: snprintf(buf, bufsz, "undefined (%d)", speed); break; } } static void dump_linkspeed(char *buf, int bufsz, int speed) { int n = 0; if (speed & 0x1) n += snprintf(buf + n, bufsz - n, "2.5 Gbps or "); if (n < bufsz && (speed & 0x2)) n += snprintf(buf + n, bufsz - n, "5.0 Gbps or "); if (n < bufsz && (speed & 0x4)) n += snprintf(buf + n, bufsz - n, "10.0 Gbps or "); if (n >= bufsz) return; else if (speed == 0 || (speed >> 3)) { n += snprintf(buf + n, bufsz - n, "undefined (%d)", speed); if (n >= bufsz) return; } else if (bufsz > 3) { buf[n - 4] = '\0'; n -= 4; } switch (speed) { case 1: case 3: case 5: case 7: break; default: if (!(speed >> 3)) snprintf(buf + n, bufsz - n, " (IBA extension)"); break; } } void mad_dump_linkspeedsup(char *buf, int bufsz, void *val, int valsz) { int speed = *(int *)val; dump_linkspeed(buf, bufsz, speed); } void mad_dump_linkspeeden(char *buf, int bufsz, void *val, int valsz) { int speed = *(int *)val; dump_linkspeed(buf, bufsz, speed); } void mad_dump_linkspeedext(char *buf, int bufsz, void *val, int valsz) { int speed = *(int *)val; switch (speed) { case 0: snprintf(buf, bufsz, "No Extended Speed"); break; case 1: snprintf(buf, bufsz, "14.0625 Gbps"); break; case 2: snprintf(buf, bufsz, "25.78125 Gbps"); break; case 4: snprintf(buf, bufsz, "53.125 Gbps"); break; case 8: snprintf(buf, bufsz, "106.25 Gbps"); break; default: snprintf(buf, bufsz, "undefined (%d)", speed); break; } } static void dump_linkspeedext(char *buf, int bufsz, int speed) { int n = 0; if (speed == 0) { sprintf(buf, "%d", speed); return; } if (speed & 0x1) n += snprintf(buf + n, bufsz - n, "14.0625 Gbps or "); if (n < bufsz && speed & 0x2) n += snprintf(buf + n, bufsz - n, "25.78125 Gbps or "); if (n < bufsz && speed & 0x4) n += snprintf(buf + n, bufsz - n, "53.125 Gbps or "); if (n < bufsz && speed & 0x8) n += snprintf(buf + n, bufsz - n, "106.25 Gbps or "); if (n >= bufsz) { if (bufsz > 3) buf[n - 4] = '\0'; return; } if (speed >> 4) { n += snprintf(buf + n, bufsz - n, "undefined (%d)", speed); return; } else if (bufsz > 3) buf[n - 4] = '\0'; } void mad_dump_linkspeedextsup(char *buf, int bufsz, void *val, int valsz) { int speed = *(int *)val; dump_linkspeedext(buf, bufsz, speed); } void mad_dump_linkspeedexten(char *buf, int bufsz, void *val, int valsz) { int speed = *(int *)val; if (speed == 30) { sprintf(buf, "%s", "Extended link speeds disabled"); return; } dump_linkspeedext(buf, bufsz, speed); } void mad_dump_linkspeedext2(char *buf, int bufsz, void *val, int valsz) { int speed = *(int *) val; switch (speed) { case 0: snprintf(buf, bufsz, "No Extended Speed 2"); break; case 1: snprintf(buf, bufsz, "212.5 Gbps"); break; default: snprintf(buf, bufsz, "undefined (%d)", speed); break; } } static void dump_linkspeedext2(char *buf, int bufsz, int speed) { int n = 0; if (speed == 0) { snprintf(buf, bufsz, "%d", speed); return; } if (speed & 0x1) snprintf(buf, bufsz, "212.5 Gbps"); if (n >= bufsz) return; if (speed >> 1) snprintf(buf + n, bufsz - n, " undefined (%d)", speed); } void mad_dump_linkspeedextsup2(char *buf, int bufsz, void *val, int valsz) { int speed = *(int *) val; dump_linkspeedext2(buf, bufsz, speed); } void mad_dump_linkspeedexten2(char *buf, int bufsz, void *val, int valsz) { int speed = *(int *) val; dump_linkspeedext2(buf, bufsz, speed); } void mad_dump_portstate(char *buf, int bufsz, void *val, int valsz) { int state = *(int *)val; switch (state) { case 0: snprintf(buf, bufsz, "NoChange"); break; case 1: snprintf(buf, bufsz, "Down"); break; case 2: snprintf(buf, bufsz, "Initialize"); break; case 3: snprintf(buf, bufsz, "Armed"); break; case 4: snprintf(buf, bufsz, "Active"); break; default: snprintf(buf, bufsz, "?(%d)", state); } } void mad_dump_linkdowndefstate(char *buf, int bufsz, void *val, int valsz) { int state = *(int *)val; switch (state) { case 0: snprintf(buf, bufsz, "NoChange"); break; case 1: snprintf(buf, bufsz, "Sleep"); break; case 2: snprintf(buf, bufsz, "Polling"); break; default: snprintf(buf, bufsz, "?(%d)", state); break; } } void mad_dump_physportstate(char *buf, int bufsz, void *val, int valsz) { int state = *(int *)val; switch (state) { case 0: snprintf(buf, bufsz, "NoChange"); break; case 1: snprintf(buf, bufsz, "Sleep"); break; case 2: snprintf(buf, bufsz, "Polling"); break; case 3: snprintf(buf, bufsz, "Disabled"); break; case 4: snprintf(buf, bufsz, "PortConfigurationTraining"); break; case 5: snprintf(buf, bufsz, "LinkUp"); break; case 6: snprintf(buf, bufsz, "LinkErrorRecovery"); break; case 7: snprintf(buf, bufsz, "PhyTest"); break; default: snprintf(buf, bufsz, "?(%d)", state); } } void mad_dump_mtu(char *buf, int bufsz, void *val, int valsz) { int mtu = *(int *)val; switch (mtu) { case 1: snprintf(buf, bufsz, "256"); break; case 2: snprintf(buf, bufsz, "512"); break; case 3: snprintf(buf, bufsz, "1024"); break; case 4: snprintf(buf, bufsz, "2048"); break; case 5: snprintf(buf, bufsz, "4096"); break; default: snprintf(buf, bufsz, "?(%d)", mtu); } } void mad_dump_vlcap(char *buf, int bufsz, void *val, int valsz) { int vlcap = *(int *)val; switch (vlcap) { case 1: snprintf(buf, bufsz, "VL0"); break; case 2: snprintf(buf, bufsz, "VL0-1"); break; case 3: snprintf(buf, bufsz, "VL0-3"); break; case 4: snprintf(buf, bufsz, "VL0-7"); break; case 5: snprintf(buf, bufsz, "VL0-14"); break; default: snprintf(buf, bufsz, "?(%d)", vlcap); } } void mad_dump_opervls(char *buf, int bufsz, void *val, int valsz) { int opervls = *(int *)val; switch (opervls) { case 0: snprintf(buf, bufsz, "No change"); break; case 1: snprintf(buf, bufsz, "VL0"); break; case 2: snprintf(buf, bufsz, "VL0-1"); break; case 3: snprintf(buf, bufsz, "VL0-3"); break; case 4: snprintf(buf, bufsz, "VL0-7"); break; case 5: snprintf(buf, bufsz, "VL0-14"); break; default: snprintf(buf, bufsz, "?(%d)", opervls); } } void mad_dump_portcapmask(char *buf, int bufsz, void *val, int valsz) { unsigned mask = *(unsigned *)val; char *s = buf; s += sprintf(s, "0x%x\n", mask); if (mask & (1 << 1)) s += sprintf(s, "\t\t\t\tIsSM\n"); if (mask & (1 << 2)) s += sprintf(s, "\t\t\t\tIsNoticeSupported\n"); if (mask & (1 << 3)) s += sprintf(s, "\t\t\t\tIsTrapSupported\n"); if (mask & (1 << 4)) s += sprintf(s, "\t\t\t\tIsOptionalIPDSupported\n"); if (mask & (1 << 5)) s += sprintf(s, "\t\t\t\tIsAutomaticMigrationSupported\n"); if (mask & (1 << 6)) s += sprintf(s, "\t\t\t\tIsSLMappingSupported\n"); if (mask & (1 << 7)) s += sprintf(s, "\t\t\t\tIsMKeyNVRAM\n"); if (mask & (1 << 8)) s += sprintf(s, "\t\t\t\tIsPKeyNVRAM\n"); if (mask & (1 << 9)) s += sprintf(s, "\t\t\t\tIsLedInfoSupported\n"); if (mask & (1 << 10)) s += sprintf(s, "\t\t\t\tIsSMdisabled\n"); if (mask & (1 << 11)) s += sprintf(s, "\t\t\t\tIsSystemImageGUIDsupported\n"); if (mask & (1 << 12)) s += sprintf(s, "\t\t\t\tIsPkeySwitchExternalPortTrapSupported\n"); if (mask & (1 << 14)) s += sprintf(s, "\t\t\t\tIsExtendedSpeedsSupported\n"); if (mask & (1 << 15)) s += sprintf(s, "\t\t\t\tIsCapabilityMask2Supported\n"); if (mask & (1 << 16)) s += sprintf(s, "\t\t\t\tIsCommunicatonManagementSupported\n"); if (mask & (1 << 17)) s += sprintf(s, "\t\t\t\tIsSNMPTunnelingSupported\n"); if (mask & (1 << 18)) s += sprintf(s, "\t\t\t\tIsReinitSupported\n"); if (mask & (1 << 19)) s += sprintf(s, "\t\t\t\tIsDeviceManagementSupported\n"); if (mask & (1 << 20)) s += sprintf(s, "\t\t\t\tIsVendorClassSupported\n"); if (mask & (1 << 21)) s += sprintf(s, "\t\t\t\tIsDRNoticeSupported\n"); if (mask & (1 << 22)) s += sprintf(s, "\t\t\t\tIsCapabilityMaskNoticeSupported\n"); if (mask & (1 << 23)) s += sprintf(s, "\t\t\t\tIsBootManagementSupported\n"); if (mask & (1 << 24)) s += sprintf(s, "\t\t\t\tIsLinkRoundTripLatencySupported\n"); if (mask & (1 << 25)) s += sprintf(s, "\t\t\t\tIsClientRegistrationSupported\n"); if (mask & (1 << 26)) s += sprintf(s, "\t\t\t\tIsOtherLocalChangesNoticeSupported\n"); if (mask & (1 << 27)) s += sprintf(s, "\t\t\t\tIsLinkSpeedWidthPairsTableSupported\n"); if (mask & (1 << 28)) s += sprintf(s, "\t\t\t\tIsVendorSpecificMadsTableSupported\n"); if (mask & (1 << 29)) s += sprintf(s, "\t\t\t\tIsMcastPkeyTrapSuppressionSupported\n"); if (mask & (1 << 30)) s += sprintf(s, "\t\t\t\tIsMulticastFDBTopSupported\n"); if (mask & ((1U) << 31)) s += sprintf(s, "\t\t\t\tIsHierarchyInfoSupported\n"); if (s != buf) *(--s) = 0; } void mad_dump_portcapmask2(char *buf, int bufsz, void *val, int valsz) { int mask = *(int *)val; char *s = buf; s += sprintf(s, "0x%x\n", mask); if (mask & (1 << 0)) s += sprintf(s, "\t\t\t\tIsSetNodeDescriptionSupported\n"); if (mask & (1 << 1)) s += sprintf(s, "\t\t\t\tIsPortInfoExtendedSupported\n"); if (mask & (1 << 2)) s += sprintf(s, "\t\t\t\tIsVirtualizationSupported\n"); if (mask & (1 << 3)) s += sprintf(s, "\t\t\t\tIsSwitchPortStateTableSupported\n"); if (mask & (1 << 4)) s += sprintf(s, "\t\t\t\tIsLinkWidth2xSupported\n"); if (mask & (1 << 5)) s += sprintf(s, "\t\t\t\tIsLinkSpeedHDRSupported\n"); if (mask & (1 << 6)) s += sprintf(s, "\t\t\t\tIsMKeyProtectBitsExtSupported\n"); if (mask & (1 << 7)) s += sprintf(s, "\t\t\t\tIsEnhancedTrap128Supported\n"); if (mask & (1 << 8)) s += sprintf(s, "\t\t\t\tIsPartitionTopSupported\n"); if (mask & (1 << 9)) s += sprintf(s, "\t\t\t\tIsEnhancedQoSArbiterSupported\n"); if (mask & (1 << 10)) s += sprintf(s, "\t\t\t\tIsLinkSpeedNDRSupported\n"); if (s != buf) *(--s) = 0; } void mad_dump_bitfield(char *buf, int bufsz, void *val, int valsz) { snprintf(buf, bufsz, "0x%x", *(uint32_t *) val); } void mad_dump_array(char *buf, int bufsz, void *val, int valsz) { uint8_t *p = val, *e; char *s = buf; if (bufsz < valsz * 2) valsz = bufsz / 2; for (p = val, e = p + valsz; p < e; p++, s += 2) sprintf(s, "%02x", *p); } void mad_dump_string(char *buf, int bufsz, void *val, int valsz) { if (bufsz < valsz) valsz = bufsz; snprintf(buf, valsz, "'%s'", (char *)val); } void mad_dump_node_type(char *buf, int bufsz, void *val, int valsz) { int nodetype = *(int *)val; switch (nodetype) { case 1: snprintf(buf, bufsz, "Channel Adapter"); break; case 2: snprintf(buf, bufsz, "Switch"); break; case 3: snprintf(buf, bufsz, "Router"); break; default: snprintf(buf, bufsz, "?(%d)?", nodetype); break; } } #define IB_MAX_NUM_VLS 16 #define IB_MAX_NUM_VLS_TO_U8 ((IB_MAX_NUM_VLS)/2) typedef struct _ib_slvl_table { uint8_t vl_by_sl_num[IB_MAX_NUM_VLS_TO_U8]; } ib_slvl_table_t; static inline void ib_slvl_get_i(ib_slvl_table_t * tbl, int i, uint8_t * vl) { *vl = (tbl->vl_by_sl_num[i >> 1] >> ((!(i & 1)) << 2)) & 0xf; } #define IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK 32 typedef struct _ib_vl_arb_table { struct { uint8_t res_vl; uint8_t weight; } vl_entry[IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK]; } ib_vl_arb_table_t; static inline void ib_vl_arb_get_vl(uint8_t res_vl, uint8_t * const vl) { *vl = res_vl & 0x0F; } void mad_dump_sltovl(char *buf, int bufsz, void *val, int valsz) { ib_slvl_table_t *p_slvl_tbl = val; uint8_t vl; int i, n = 0; n = snprintf(buf, bufsz, "|"); for (i = 0; i < 16; i++) { ib_slvl_get_i(p_slvl_tbl, i, &vl); n += snprintf(buf + n, bufsz - n, "%2u|", vl); if (n >= bufsz) break; } snprintf(buf + n, bufsz - n, "\n"); } void mad_dump_vlarbitration(char *buf, int bufsz, void *val, int num) { ib_vl_arb_table_t *p_vla_tbl = val; int i, n; uint8_t vl; num /= sizeof(p_vla_tbl->vl_entry[0]); n = snprintf(buf, bufsz, "\nVL : |"); if (n >= bufsz) return; for (i = 0; i < num; i++) { ib_vl_arb_get_vl(p_vla_tbl->vl_entry[i].res_vl, &vl); n += snprintf(buf + n, bufsz - n, "0x%-2X|", vl); if (n >= bufsz) return; } n += snprintf(buf + n, bufsz - n, "\nWEIGHT: |"); if (n >= bufsz) return; for (i = 0; i < num; i++) { n += snprintf(buf + n, bufsz - n, "0x%-2X|", p_vla_tbl->vl_entry[i].weight); if (n >= bufsz) return; } snprintf(buf + n, bufsz - n, "\n"); } static int _dump_fields(char *buf, int bufsz, void *data, int start, int end) { char val[64]; char *s = buf; int n, field; for (field = start; field < end && bufsz > 0; field++) { mad_decode_field(data, field, val); if (!mad_dump_field(field, s, bufsz-1, val)) return -1; n = strlen(s); s += n; *s++ = '\n'; *s = 0; n++; bufsz -= n; } return (int)(s - buf); } void mad_dump_fields(char *buf, int bufsz, void *val, int valsz, int start, int end) { _dump_fields(buf, bufsz, val, start, end); } void mad_dump_nodedesc(char *buf, int bufsz, void *val, int valsz) { strncpy(buf, val, bufsz); if (valsz < bufsz) buf[valsz] = 0; } void mad_dump_nodeinfo(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_NODE_FIRST_F, IB_NODE_LAST_F); } void mad_dump_portinfo(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PORT_FIRST_F, IB_PORT_LAST_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PORT_CAPMASK2_F, IB_PORT_LINK_SPEED_EXT_LAST_F); } void mad_dump_portstates(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_PORT_STATE_F, IB_PORT_LINK_DOWN_DEF_F); } void mad_dump_switchinfo(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_SW_FIRST_F, IB_SW_LAST_F); } void mad_dump_perfcounters(char *buf, int bufsz, void *val, int valsz) { int cnt, cnt2; cnt = _dump_fields(buf, bufsz, val, IB_PC_FIRST_F, IB_PC_VL15_DROPPED_F); if (cnt < 0) return; cnt2 = _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_QP1_DROP_F, IB_PC_QP1_DROP_F + 1); if (cnt2 < 0) return; _dump_fields(buf + cnt + cnt2, bufsz - cnt - cnt2, val, IB_PC_VL15_DROPPED_F, IB_PC_LAST_F); } void mad_dump_perfcounters_ext(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_FIRST_F, IB_PC_EXT_LAST_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_EXT_COUNTER_SELECT2_F, IB_PC_EXT_ERR_LAST_F); } void mad_dump_perfcounters_xmt_sl(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_XMT_DATA_SL_FIRST_F, IB_PC_XMT_DATA_SL_LAST_F); } void mad_dump_perfcounters_rcv_sl(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_RCV_DATA_SL_FIRST_F, IB_PC_RCV_DATA_SL_LAST_F); } void mad_dump_perfcounters_xmt_disc(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_XMT_INACT_DISC_F, IB_PC_XMT_DISC_LAST_F); } void mad_dump_perfcounters_rcv_err(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_RCV_LOCAL_PHY_ERR_F, IB_PC_RCV_ERR_LAST_F); } void mad_dump_portsamples_control(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_PSC_OPCODE_F, IB_PSC_LAST_F); } void mad_dump_portsamples_result(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_PSR_TAG_F, IB_PSR_LAST_F); } void mad_dump_port_ext_speeds_counters_rsfec_active(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_PESC_RSFEC_FIRST_F, IB_PESC_RSFEC_LAST_F); } void mad_dump_port_ext_speeds_counters(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_PESC_PORT_SELECT_F, IB_PESC_LAST_F); } void mad_dump_perfcounters_port_op_rcv_counters(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_PORT_OP_RCV_COUNTERS_FIRST_F, IB_PC_PORT_OP_RCV_COUNTERS_LAST_F); } void mad_dump_perfcounters_port_flow_ctl_counters(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_PORT_FLOW_CTL_COUNTERS_FIRST_F, IB_PC_PORT_FLOW_CTL_COUNTERS_LAST_F); } void mad_dump_perfcounters_port_vl_op_packet(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_PORT_VL_OP_PACKETS_FIRST_F, IB_PC_PORT_VL_OP_PACKETS_LAST_F); } void mad_dump_perfcounters_port_vl_op_data(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_PORT_VL_OP_DATA_FIRST_F, IB_PC_PORT_VL_OP_DATA_LAST_F); } void mad_dump_perfcounters_port_vl_xmit_flow_ctl_update_errors(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_PORT_VL_XMIT_FLOW_CTL_UPDATE_ERRORS_FIRST_F, IB_PC_PORT_VL_XMIT_FLOW_CTL_UPDATE_ERRORS_LAST_F); } void mad_dump_perfcounters_port_vl_xmit_wait_counters(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_PORT_VL_XMIT_WAIT_COUNTERS_FIRST_F, IB_PC_PORT_VL_XMIT_WAIT_COUNTERS_LAST_F); } void mad_dump_perfcounters_sw_port_vl_congestion(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_SW_PORT_VL_CONGESTION_FIRST_F, IB_PC_SW_PORT_VL_CONGESTION_LAST_F); } void mad_dump_perfcounters_rcv_con_ctrl(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_RCV_CON_CTRL_FIRST_F, IB_PC_RCV_CON_CTRL_LAST_F); } void mad_dump_perfcounters_sl_rcv_fecn(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_SL_RCV_FECN_FIRST_F, IB_PC_SL_RCV_FECN_LAST_F); } void mad_dump_perfcounters_sl_rcv_becn(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_SL_RCV_BECN_FIRST_F, IB_PC_SL_RCV_BECN_LAST_F); } void mad_dump_perfcounters_xmit_con_ctrl(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_XMIT_CON_CTRL_FIRST_F, IB_PC_XMIT_CON_CTRL_LAST_F); } void mad_dump_perfcounters_vl_xmit_time_cong(char *buf, int bufsz, void *val, int valsz) { int cnt; cnt = _dump_fields(buf, bufsz, val, IB_PC_EXT_PORT_SELECT_F, IB_PC_EXT_XMT_BYTES_F); if (cnt < 0) return; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PC_VL_XMIT_TIME_CONG_FIRST_F, IB_PC_VL_XMIT_TIME_CONG_LAST_F); } void mad_dump_mlnx_ext_port_info(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_MLNX_EXT_PORT_STATE_CHG_ENABLE_F, IB_MLNX_EXT_PORT_LAST_F); } void mad_dump_cc_congestioninfo(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CONGESTION_INFO_FIRST_F, IB_CC_CONGESTION_INFO_LAST_F); } void mad_dump_cc_congestionkeyinfo(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CONGESTION_KEY_INFO_FIRST_F, IB_CC_CONGESTION_KEY_INFO_LAST_F); } void mad_dump_cc_congestionlog(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CONGESTION_LOG_FIRST_F, IB_CC_CONGESTION_LOG_LAST_F); } void mad_dump_cc_congestionlogswitch(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CONGESTION_LOG_SWITCH_FIRST_F, IB_CC_CONGESTION_LOG_SWITCH_LAST_F); } void mad_dump_cc_congestionlogentryswitch(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CONGESTION_LOG_ENTRY_SWITCH_FIRST_F, IB_CC_CONGESTION_LOG_ENTRY_SWITCH_LAST_F); } void mad_dump_cc_congestionlogca(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CONGESTION_LOG_CA_FIRST_F, IB_CC_CONGESTION_LOG_CA_LAST_F); } void mad_dump_cc_congestionlogentryca(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CONGESTION_LOG_ENTRY_CA_FIRST_F, IB_CC_CONGESTION_LOG_ENTRY_CA_LAST_F); } void mad_dump_cc_switchcongestionsetting(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_SWITCH_CONGESTION_SETTING_FIRST_F, IB_CC_SWITCH_CONGESTION_SETTING_LAST_F); } void mad_dump_cc_switchportcongestionsettingelement(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_SWITCH_PORT_CONGESTION_SETTING_ELEMENT_FIRST_F, IB_CC_SWITCH_PORT_CONGESTION_SETTING_ELEMENT_LAST_F); } void mad_dump_cc_cacongestionsetting(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CA_CONGESTION_SETTING_FIRST_F, IB_CC_CA_CONGESTION_SETTING_LAST_F); } void mad_dump_cc_cacongestionentry(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CA_CONGESTION_ENTRY_FIRST_F, IB_CC_CA_CONGESTION_ENTRY_LAST_F); } void mad_dump_cc_congestioncontroltable(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CONGESTION_CONTROL_TABLE_FIRST_F, IB_CC_CONGESTION_CONTROL_TABLE_LAST_F); } void mad_dump_cc_congestioncontroltableentry(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_CONGESTION_CONTROL_TABLE_ENTRY_FIRST_F, IB_CC_CONGESTION_CONTROL_TABLE_ENTRY_LAST_F); } void mad_dump_cc_timestamp(char *buf, int bufsz, void *val, int valsz) { _dump_fields(buf, bufsz, val, IB_CC_TIMESTAMP_FIRST_F, IB_CC_TIMESTAMP_LAST_F); } void mad_dump_classportinfo(char *buf, int bufsz, void *val, int valsz) { /* no FIRST_F and LAST_F for CPI field enums, must do a hack */ _dump_fields(buf, bufsz, val, IB_CPI_BASEVER_F, IB_CPI_TRAP_QKEY_F + 1); } void mad_dump_portinfo_ext(char *buf, int bufsz, void *val, int valsz) { int cnt, n; cnt = _dump_fields(buf, bufsz, val, IB_PORT_EXT_FIRST_F, IB_PORT_EXT_LAST_F); if (cnt < 0) return; n = _dump_fields(buf + cnt, bufsz - cnt, val, IB_PORT_EXT_HDR_FEC_MODE_SUPPORTED_F, IB_PORT_EXT_HDR_FEC_MODE_LAST_F); if (n < 0) return; cnt += n; _dump_fields(buf + cnt, bufsz - cnt, val, IB_PORT_EXT_NDR_FEC_MODE_SUPPORTED_F, IB_PORT_EXT_NDR_FEC_MODE_LAST_F); } void xdump(FILE * file, const char *msg, void *p, int size) { #define HEX(x) ((x) < 10 ? '0' + (x) : 'a' + ((x) -10)) uint8_t *cp = p; int i; if (msg) fputs(msg, file); for (i = 0; i < size;) { fputc(HEX(*cp >> 4), file); fputc(HEX(*cp & 0xf), file); if (++i >= size) break; fputc(HEX(cp[1] >> 4), file); fputc(HEX(cp[1] & 0xf), file); if ((++i) % 16) fputc(' ', file); else fputc('\n', file); cp += 2; } if (i % 16) fputc('\n', file); }