ib-mgmt:
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Wed, 30 Sep 2009 21:56:11 +0000 (21:56 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Wed, 30 Sep 2009 21:56:11 +0000 (21:56 +0000)
update to commit 0abb828175450b873521d4917c3edb0a7b57c337
plus fixes to build that are submitted back upstream

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2477 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

38 files changed:
tools/infiniband-diags/include/ibdiag_common.h
tools/infiniband-diags/src/ibaddr.c
tools/infiniband-diags/src/ibdiag_common.c
tools/infiniband-diags/src/iblinkinfo.c
tools/infiniband-diags/src/ibnetdiscover.c
tools/infiniband-diags/src/ibping.c
tools/infiniband-diags/src/ibportstate.c
tools/infiniband-diags/src/ibqueryerrors.c
tools/infiniband-diags/src/ibroute.c
tools/infiniband-diags/src/ibsendtrap.c
tools/infiniband-diags/src/ibstat.c
tools/infiniband-diags/src/ibsysstat.c
tools/infiniband-diags/src/ibtracert.c
tools/infiniband-diags/src/mcm_rereg_test.c
tools/infiniband-diags/src/perfquery.c
tools/infiniband-diags/src/saquery.c
tools/infiniband-diags/src/sminfo.c
tools/infiniband-diags/src/smpdump.c
tools/infiniband-diags/src/smpquery.c
tools/infiniband-diags/src/vendstat.c
ulp/libibmad/include/infiniband/mad.h
ulp/libibmad/src/bm.c
ulp/libibmad/src/dump.c
ulp/libibmad/src/fields.c
ulp/libibmad/src/gs.c
ulp/libibmad/src/libibmad.map
ulp/libibmad/src/mad.c
ulp/libibmad/src/mad_internal.h
ulp/libibmad/src/resolve.c
ulp/libibmad/src/rpc.c
ulp/libibmad/src/sa.c
ulp/libibmad/src/serv.c
ulp/libibmad/src/vendor.c
ulp/libibnetdisc/include/infiniband/ibnetdisc.h
ulp/libibnetdisc/src/chassis.c
ulp/libibnetdisc/src/chassis.h
ulp/libibnetdisc/src/ibnetdisc.c
ulp/libibnetdisc/src/internal.h

index 5c74b07..f2d548f 100644 (file)
@@ -65,10 +65,11 @@ struct ibdiag_opt {
        const char *description;
 };
 
-extern int ibdiag_process_opts(int argc, char * const argv[], void *context,
+extern int ibdiag_process_opts(int argc, char *const argv[], void *context,
                               const char *exclude_common_str,
                               const struct ibdiag_opt custom_opts[],
-                              int (*custom_handler)(void *cxt, int val, char *optarg),
+                              int (*custom_handler) (void *cxt, int val,
+                                                     char *optarg),
                               const char *usage_args,
                               const char *usage_examples[]);
 extern void ibdiag_show_usage();
index 7909a52..b5f867a 100644 (file)
@@ -33,7 +33,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <stdlib.h>
 
 struct ibmad_port *srcport;
 
-static int
-ib_resolve_addr(ib_portid_t *portid, int portnum, int show_lid, int show_gid)
+static int ib_resolve_addr(ib_portid_t * portid, int portnum, int show_lid,
+                          int show_gid)
 {
-       char   gid_str[INET6_ADDRSTRLEN];
+       char gid_str[INET6_ADDRSTRLEN];
        uint8_t portinfo[64];
        uint8_t nodeinfo[64];
        uint64_t guid, prefix;
@@ -61,7 +61,8 @@ ib_resolve_addr(ib_portid_t *portid, int portnum, int show_lid, int show_gid)
        if (!smp_query_via(nodeinfo, portid, IB_ATTR_NODE_INFO, 0, 0, srcport))
                return -1;
 
-       if (!smp_query_via(portinfo, portid, IB_ATTR_PORT_INFO, portnum, 0, srcport))
+       if (!smp_query_via(portinfo, portid, IB_ATTR_PORT_INFO, portnum, 0,
+                          srcport))
                return -1;
 
        mad_decode_field(portinfo, IB_PORT_LID_F, &portid->lid);
@@ -74,13 +75,15 @@ ib_resolve_addr(ib_portid_t *portid, int portnum, int show_lid, int show_gid)
 
        if (show_gid) {
                printf("GID %s ", inet_ntop(AF_INET6, gid, gid_str,
-                       sizeof gid_str));
+                                           sizeof gid_str));
        }
 
        if (show_lid > 0)
-               printf("LID start 0x%x end 0x%x", portid->lid, portid->lid + (1 << lmc) - 1);
+               printf("LID start 0x%x end 0x%x", portid->lid,
+                      portid->lid + (1 << lmc) - 1);
        else if (show_lid < 0)
-               printf("LID start %d end %d", portid->lid, portid->lid + (1 << lmc) - 1);
+               printf("LID start %d end %d", portid->lid,
+                      portid->lid + (1 << lmc) - 1);
        printf("\n");
        return 0;
 }
@@ -107,15 +110,16 @@ static int process_opt(void *context, int ch, char *optarg)
 
 int main(int argc, char **argv)
 {
-       int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
-       ib_portid_t portid = {0};
+       int mgmt_classes[3] =
+           { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS };
+       ib_portid_t portid = { 0 };
        int port = 0;
 
        const struct ibdiag_opt opts[] = {
-               { "gid_show", 'g', 0, NULL, "show gid address only"},
-               { "lid_show", 'l', 0, NULL, "show lid range only"},
-               { "Lid_show", 'L', 0, NULL, "show lid range (in decimal) only"},
-               { 0 }
+               {"gid_show", 'g', 0, NULL, "show gid address only"},
+               {"lid_show", 'l', 0, NULL, "show lid range only"},
+               {"Lid_show", 'L', 0, NULL, "show lid range (in decimal) only"},
+               {0}
        };
        char usage_args[] = "[<lid|dr_path|guid>]";
        const char *usage_examples[] = {
@@ -146,7 +150,7 @@ int main(int argc, char **argv)
 
        if (argc) {
                if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                                               ibd_sm_id, srcport) < 0)
+                                             ibd_sm_id, srcport) < 0)
                        IBERROR("can't resolve destination port %s", argv[0]);
        } else {
                if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0)
index 4ffa3f0..3dd1295 100644 (file)
@@ -60,7 +60,7 @@ enum MAD_DEST ibd_dest_type = IB_DEST_LID;
 ib_portid_t *ibd_sm_id;
 int ibd_timeout;
 
-static ib_portid_t sm_portid = {0};
+static ib_portid_t sm_portid = { 0 };
 
 static const char *prog_name;
 static const char *prog_args;
@@ -70,7 +70,8 @@ static const struct ibdiag_opt *opts_map[256];
 
 const static char *get_build_version(void)
 {
-       return "BUILD VERSION: " IBDIAG_VERSION " Build date: " __DATE__ " " __TIME__;
+       return "BUILD VERSION: " IBDIAG_VERSION " Build date: " __DATE__ " "
+           __TIME__;
 }
 
 static void pretty_print(int start, int width, const char *str)
@@ -79,7 +80,7 @@ static void pretty_print(int start, int width, const char *str)
        const char *p, *e;
 
        while (1) {
-               while(isspace(*str))
+               while (isspace(*str))
                        str++;
                p = str;
                do {
@@ -92,7 +93,7 @@ static void pretty_print(int start, int width, const char *str)
                }
                if (e - str == 1)
                        e = p;
-               fprintf(stderr, "%.*s\n%*s", e - str, str, start, "");
+               fprintf(stderr, "%.*s\n%*s", (int)(e - str), str, start, "");
                str = e;
        }
 }
@@ -116,7 +117,8 @@ void ibdiag_show_usage()
                        n += fprintf(stderr, " %s",
                                     io->arg_tmpl ? io->arg_tmpl : "<val>");
                if (io->description && *io->description) {
-                       n += fprintf(stderr, "%*s  ", 24 - n > 0 ? 24 - n : 0, "");
+                       n += fprintf(stderr, "%*s  ", 24 - n > 0 ? 24 - n : 0,
+                                    "");
                        pretty_print(n, 74, io->description);
                }
                fprintf(stderr, "\n");
@@ -180,8 +182,9 @@ static int process_opt(int ch, char *optarg)
        case 's':
                /* srcport is not required when resolving via IB_DEST_LID */
                if (ib_resolve_portid_str_via(&sm_portid, optarg, IB_DEST_LID,
-                               0, NULL) < 0)
-                       IBERROR("cannot resolve SM destination port %s", optarg);
+                                             0, NULL) < 0)
+                       IBERROR("cannot resolve SM destination port %s",
+                               optarg);
                ibd_sm_id = &sm_portid;
                break;
        default:
@@ -192,20 +195,20 @@ static int process_opt(int ch, char *optarg)
 }
 
 static const struct ibdiag_opt common_opts[] = {
-       { "Ca", 'C', 1, "<ca>", "Ca name to use"},
-       { "Port", 'P', 1, "<port>", "Ca port number to use"},
-       { "Direct", 'D', 0, NULL, "use Direct address argument"},
-       { "Lid", 'L', 0, NULL, "use LID address argument"},
-       { "Guid", 'G', 0, NULL, "use GUID address argument"},
-       { "timeout", 't', 1, "<ms>", "timeout in ms"},
-       { "sm_port", 's', 1, "<lid>", "SM port lid" },
-       { "errors", 'e', 0, NULL, "show send and receive errors" },
-       { "verbose", 'v', 0, NULL, "increase verbosity level" },
-       { "debug", 'd', 0, NULL, "raise debug level" },
-       { "usage", 'u', 0, NULL, "usage message" },
-       { "help", 'h', 0, NULL, "help message" },
-       { "version", 'V', 0, NULL, "show version" },
-       { 0 }
+       {"Ca", 'C', 1, "<ca>", "Ca name to use"},
+       {"Port", 'P', 1, "<port>", "Ca port number to use"},
+       {"Direct", 'D', 0, NULL, "use Direct address argument"},
+       {"Lid", 'L', 0, NULL, "use LID address argument"},
+       {"Guid", 'G', 0, NULL, "use GUID address argument"},
+       {"timeout", 't', 1, "<ms>", "timeout in ms"},
+       {"sm_port", 's', 1, "<lid>", "SM port lid"},
+       {"errors", 'e', 0, NULL, "show send and receive errors"},
+       {"verbose", 'v', 0, NULL, "increase verbosity level"},
+       {"debug", 'd', 0, NULL, "raise debug level"},
+       {"usage", 'u', 0, NULL, "usage message"},
+       {"help", 'h', 0, NULL, "help message"},
+       {"version", 'V', 0, NULL, "show version"},
+       {0}
 };
 
 static void make_opt(struct option *l, const struct ibdiag_opt *o,
@@ -231,7 +234,7 @@ static struct option *make_long_opts(const char *exclude_str,
                for (o = custom_opts; o->name; o++)
                        n++;
 
-       long_opts = malloc((sizeof(common_opts)/sizeof(common_opts[0]) + n) *
+       long_opts = malloc((sizeof(common_opts) / sizeof(common_opts[0]) + n) *
                           sizeof(*long_opts));
        if (!long_opts)
                return NULL;
@@ -257,18 +260,19 @@ static void make_str_opts(const struct option *o, char *p, unsigned size)
 {
        unsigned i, n = 0;
 
-       for (n = 0; o->name  && n + 2 + o->has_arg < size; o++) {
-               p[n++] = (char) o->val;
-               for (i = 0; i < (unsigned) o->has_arg; i++)
+       for (n = 0; o->name && n + 2 + o->has_arg < size; o++) {
+               p[n++] = (char)o->val;
+               for (i = 0; i < (unsigned)o->has_arg; i++)
                        p[n++] = ':';
        }
        p[n] = '\0';
 }
 
-int ibdiag_process_opts(int argc, char * const argv[], void *cxt,
+int ibdiag_process_opts(int argc, char *const argv[], void *cxt,
                        const char *exclude_common_str,
                        const struct ibdiag_opt custom_opts[],
-                       int (*custom_handler)(void *cxt, int val, char *optarg),
+                       int (*custom_handler) (void *cxt, int val,
+                                              char *optarg),
                        const char *usage_args, const char *usage_examples[])
 {
        char str_opts[1024];
@@ -286,7 +290,7 @@ int ibdiag_process_opts(int argc, char * const argv[], void *cxt,
 
        while (1) {
                int ch = getopt_long(argc, argv, str_opts, long_opts, NULL);
-               if ( ch == -1 )
+               if (ch == -1)
                        break;
                o = opts_map[ch];
                if (!o)
index cf38ecb..29c4352 100644 (file)
@@ -35,7 +35,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #define _GNU_SOURCE
 #include <stdio.h>
 #include <complib/cl_nodenamemap.h>
 #include <infiniband/ibnetdisc.h>
 
-char *argv0 = "iblinkinfotest";
-static FILE *f;
+#include "ibdiag_common.h"
 
 static char *node_name_map_file = NULL;
 static nn_map_t *node_name_map = NULL;
 
-static int timeout_ms = 500;
+static uint64_t guid = 0;
+static char *guid_str = NULL;
+static char *dr_path = NULL;
+static int all = 0;
+static int hops = 0;
 
 static int down_links_only = 0;
 static int line_mode = 0;
 static int add_sw_settings = 0;
 static int print_port_guids = 0;
 
-static unsigned int
-get_max(unsigned int num)
+static unsigned int get_max(unsigned int num)
 {
-       unsigned int v = num; // 32-bit word to find the log base 2 of
-       unsigned r = 0; // r will be lg(v)
+       unsigned int v = num;   // 32-bit word to find the log base 2 of
+       unsigned r = 0;         // r will be lg(v)
 
-       while (v >>= 1) // unroll for more speed...
+       while (v >>= 1)         // unroll for more speed...
        {
                r++;
        }
@@ -78,41 +80,39 @@ get_max(unsigned int num)
        return (1 << r);
 }
 
-void
-get_msg(char *width_msg, char *speed_msg, int msg_size, ibnd_port_t *port)
+void get_msg(char *width_msg, char *speed_msg, int msg_size, ibnd_port_t * port)
 {
        char buf[64];
        uint32_t max_speed = 0;
 
        uint32_t max_width = get_max(mad_get_field(port->info, 0,
-                                       IB_PORT_LINK_WIDTH_SUPPORTED_F)
-                               & mad_get_field(port->remoteport->info, 0,
-                                       IB_PORT_LINK_WIDTH_SUPPORTED_F));
+                                                  IB_PORT_LINK_WIDTH_SUPPORTED_F)
+                                    & mad_get_field(port->remoteport->info, 0,
+                                                    IB_PORT_LINK_WIDTH_SUPPORTED_F));
        if ((max_width & mad_get_field(port->info, 0,
-                               IB_PORT_LINK_WIDTH_ACTIVE_F)) == 0) {
+                                      IB_PORT_LINK_WIDTH_ACTIVE_F)) == 0) {
                // we are not at the max supported width
                // print what we could be at.
                snprintf(width_msg, msg_size, "Could be %s",
-                       mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F,
-                               buf, 64, &max_width));
+                        mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F,
+                                     buf, 64, &max_width));
        }
 
        max_speed = get_max(mad_get_field(port->info, 0,
-                                       IB_PORT_LINK_SPEED_SUPPORTED_F)
-                               & mad_get_field(port->remoteport->info, 0,
-                                       IB_PORT_LINK_SPEED_SUPPORTED_F));
+                                         IB_PORT_LINK_SPEED_SUPPORTED_F)
+                           & mad_get_field(port->remoteport->info, 0,
+                                           IB_PORT_LINK_SPEED_SUPPORTED_F));
        if ((max_speed & mad_get_field(port->info, 0,
-                               IB_PORT_LINK_SPEED_ACTIVE_F)) == 0) {
+                                      IB_PORT_LINK_SPEED_ACTIVE_F)) == 0) {
                // we are not at the max supported speed
                // print what we could be at.
                snprintf(speed_msg, msg_size, "Could be %s",
-                       mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F,
-                               buf, 64, &max_speed));
+                        mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F,
+                                     buf, 64, &max_speed));
        }
 }
 
-void
-print_port(ibnd_node_t *node, ibnd_port_t *port)
+void print_port(ibnd_node_t * node, ibnd_port_t * port)
 {
        char width[64], speed[64], state[64], physstate[64];
        char remote_guid_str[256];
@@ -139,23 +139,28 @@ print_port(ibnd_node_t *node, ibnd_port_t *port)
        speed_msg[0] = '\0';
 
        n = snprintf(link_str, 256, "(%3s %s %6s/%8s)",
-               mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F, width, 64, &iwidth),
-               mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, speed, 64, &ispeed),
-               mad_dump_val(IB_PORT_STATE_F, state, 64, &istate),
-               mad_dump_val(IB_PORT_PHYS_STATE_F, physstate, 64, &iphystate));
+                    mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F, width, 64,
+                                 &iwidth),
+                    mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, speed, 64,
+                                 &ispeed), mad_dump_val(IB_PORT_STATE_F, state,
+                                                        64, &istate),
+                    mad_dump_val(IB_PORT_PHYS_STATE_F, physstate, 64,
+                                 &iphystate));
 
        if (add_sw_settings)
-               snprintf(link_str+n, 256-n,
-                       " (HOQ:%d VL_Stall:%d)",
-                       mad_get_field(port->info, 0, IB_PORT_HOQ_LIFE_F),
-                       mad_get_field(port->info, 0, IB_PORT_VL_STALL_COUNT_F));
+               snprintf(link_str + n, 256 - n, " (HOQ:%d VL_Stall:%d)",
+                        mad_get_field(port->info, 0, IB_PORT_HOQ_LIFE_F),
+                        mad_get_field(port->info, 0,
+                                      IB_PORT_VL_STALL_COUNT_F));
 
        if (port->remoteport) {
-               char *remap = remap_node_name(node_name_map, port->remoteport->node->guid,
-                               port->remoteport->node->nodedesc);
+               char *remap =
+                   remap_node_name(node_name_map, port->remoteport->node->guid,
+                                   port->remoteport->node->nodedesc);
 
                if (port->remoteport->ext_portnum)
-                       snprintf(ext_port_str, 256, "%d", port->remoteport->ext_portnum);
+                       snprintf(ext_port_str, 256, "%d",
+                                port->remoteport->ext_portnum);
                else
                        ext_port_str[0] = '\0';
 
@@ -163,23 +168,21 @@ print_port(ibnd_node_t *node, ibnd_port_t *port)
 
                if (line_mode) {
                        if (print_port_guids)
-                               snprintf(remote_guid_str, 256, "0x%016"PRIx64" ",
-                                       port->remoteport->guid);
+                               snprintf(remote_guid_str, 256,
+                                        "0x%016" PRIx64 " ",
+                                        port->remoteport->guid);
                        else
-                               snprintf(remote_guid_str, 256, "0x%016"PRIx64" ",
-                                       port->remoteport->node->guid);
+                               snprintf(remote_guid_str, 256,
+                                        "0x%016" PRIx64 " ",
+                                        port->remoteport->node->guid);
                }
 
-               snprintf(remote_str, 256,
-                       "%s%6d %4d[%2s] \"%s\" (%s %s)\n",
-                       remote_guid_str,
-                       port->remoteport->base_lid ?  port->remoteport->base_lid :
-                               port->remoteport->node->smalid,
-                       port->remoteport->portnum,
-                       ext_port_str,
-                       remap,
-                       width_msg,
-                       speed_msg);
+               snprintf(remote_str, 256, "%s%6d %4d[%2s] \"%s\" (%s %s)\n",
+                        remote_guid_str, port->remoteport->base_lid ?
+                        port->remoteport->base_lid :
+                        port->remoteport->node->smalid,
+                        port->remoteport->portnum, ext_port_str, remap,
+                        width_msg, speed_msg);
                free(remap);
        } else
                snprintf(remote_str, 256, "           [  ] \"\" ( )\n");
@@ -191,31 +194,33 @@ print_port(ibnd_node_t *node, ibnd_port_t *port)
 
        if (line_mode) {
                char *remap = remap_node_name(node_name_map, node->guid,
-                                       node->nodedesc);
-               printf("0x%016"PRIx64" \"%30s\" ", node->guid, remap);
+                                             node->nodedesc);
+               printf("0x%016" PRIx64 " \"%30s\" ", node->guid, remap);
                free(remap);
        } else
                printf("      ");
 
        printf("%6d %4d[%2s] ==%s==>  %s",
-               node->smalid, port->portnum, ext_port_str, link_str, remote_str);
+              node->smalid, port->portnum, ext_port_str, link_str, remote_str);
 }
 
-void
-print_switch(ibnd_node_t *node, void *user_data)
+void print_switch(ibnd_node_t * node, void *user_data)
 {
        int i = 0;
        int head_print = 0;
-       char *remap = remap_node_name(node_name_map, node->guid, node->nodedesc);
+       char *remap =
+           remap_node_name(node_name_map, node->guid, node->nodedesc);
 
        for (i = 1; i <= node->numports; i++) {
                ibnd_port_t *port = node->ports[i];
                if (!port)
                        continue;
                if (!down_links_only ||
-                               mad_get_field(port->info, 0, IB_PORT_STATE_F) == IB_LINK_DOWN) {
+                   mad_get_field(port->info, 0,
+                                 IB_PORT_STATE_F) == IB_LINK_DOWN) {
                        if (!head_print && !line_mode) {
-                               printf("Switch 0x%016"PRIx64" %s:\n", node->guid, remap);
+                               printf("Switch 0x%016" PRIx64 " %s:\n",
+                                      node->guid, remap);
                                head_print = 1;
                        }
                        print_port(node, port);
@@ -224,186 +229,154 @@ print_switch(ibnd_node_t *node, void *user_data)
        free(remap);
 }
 
-void
-usage(void)
+static int process_opt(void *context, int ch, char *optarg)
 {
-       fprintf(stderr,
-               "Usage: %s [-hclp -S <guid> -D <direct route> -C <ca_name> -P <ca_port>]\n"
-               "   Report link speed and connection for each port of each switch which is active\n"
-               "   -h This help message\n"
-               "   -S <guid> output only the node specified by guid\n"
-               "   -D <direct route> print only node specified by <direct route>\n"
-               "   -f <dr_path> specify node to start \"from\"\n"
-               "   -n <hops> Number of hops to include away from specified node\n"
-               "   -d print only down links\n"
-               "   -l (line mode) print all information for each link on each line\n"
-               "   -p print additional switch settings (PktLifeTime,HoqLife,VLStallCount)\n"
-
-
-               "   -t <timeout_ms> timeout for any single fabric query\n"
-               "   -s show progress during scan\n"
-               "   --node-name-map <map_file> use specified node name map\n"
-
-               "   -C <ca_name> use selected Channel Adaptor name for queries\n"
-               "   -P <ca_port> use selected channel adaptor port for queries\n"
-               "   -g print port guids instead of node guids\n"
-               "   --debug print debug messages\n"
-               "   -R (this option is obsolete and does nothing)\n"
-               ,
-                       argv0);
-       exit(-1);
+       switch (ch) {
+       case 1:
+               node_name_map_file = strdup(optarg);
+               break;
+       case 'S':
+               guid_str = optarg;
+               guid = (uint64_t) strtoull(guid_str, 0, 0);
+               break;
+       case 'D':
+               dr_path = strdup(optarg);
+               break;
+       case 'a':
+               all = 1;
+               break;
+       case 'n':
+               hops = (int)strtol(optarg, NULL, 0);
+               break;
+       case 'd':
+               down_links_only = 1;
+               break;
+       case 'l':
+               line_mode = 1;
+               break;
+       case 'p':
+               add_sw_settings = 1;
+               break;
+       case 'g':
+               print_port_guids = 1;
+               break;
+       case 'R':               /* nop */
+               break;
+       default:
+               return -1;
+       }
+
+       return 0;
 }
 
-int
-main(int argc, char **argv)
+int main(int argc, char **argv)
 {
        int rc = 0;
-       char *ca = 0;
-       int ca_port = 0;
+       int resolved = -1;
        ibnd_fabric_t *fabric = NULL;
-       uint64_t guid = 0;
-       char *guid_str = NULL;
-       char *dr_path = NULL;
-       char *from = NULL;
-       int hops = 0;
-       ib_portid_t port_id = {0};
-
        struct ibmad_port *ibmad_port;
-       int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
-
-       static char const str_opts[] = "S:D:n:C:P:t:sldgphuf:R";
-       static const struct option long_opts[] = {
-               { "S", 1, 0, 'S'},
-               { "D", 1, 0, 'D'},
-               { "num-hops", 1, 0, 'n'},
-               { "down-links-only", 0, 0, 'd'},
-               { "line-mode", 0, 0, 'l'},
-               { "ca-name", 1, 0, 'C'},
-               { "ca-port", 1, 0, 'P'},
-               { "timeout", 1, 0, 't'},
-               { "show", 0, 0, 's'},
-               { "print-port-guids", 0, 0, 'g'},
-               { "print-additional", 0, 0, 'p'},
-               { "help", 0, 0, 'h'},
-               { "usage", 0, 0, 'u'},
-               { "node-name-map", 1, 0, 1},
-               { "debug", 0, 0, 2},
-               { "compat", 0, 0, 3},
-               { "from", 1, 0, 'f'},
-               { "R", 0, 0, 'R'},
-               { 0 }
+       ib_portid_t port_id = { 0 };
+       int mgmt_classes[3] =
+           { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS };
+
+       const struct ibdiag_opt opts[] = {
+               {"node-name-map", 1, 1, "<file>", "node name map file"},
+               {"switch", 'S', 1, "<switch_guid>",
+                "query only <switch_guid> (hex format)"},
+               {"Direct", 'D', 1, "<dr_path>",
+                "query only node specified by <dr_path>"},
+               {"all", 'a', 0, NULL,
+                "print all switches found in a partial fabric scan"},
+               {"hops", 'n', 1, "<hops>",
+                "Number of hops to include away from specified node"},
+               {"down", 'd', 0, NULL, "print only down links"},
+               {"line", 'l', 0, NULL,
+                "(line mode) print all information for each link on a single line"},
+               {"additional", 'p', 0, NULL,
+                "print additional switch settings (PktLifeTime, HoqLife, VLStallCount)"},
+               {"portguids", 'g', 0, NULL,
+                "print port guids instead of node guids"},
+               {"GNDN", 'R', 0, NULL,
+                "(This option is obsolete and does nothing)"},
+               {0}
        };
+       char usage_args[] = "";
+
+       ibdiag_process_opts(argc, argv, NULL, "SDandlpgRGL", opts, process_opt,
+                           usage_args, NULL);
 
-       f = stdout;
-
-       argv0 = argv[0];
-
-       while (1) {
-               int ch = getopt_long(argc, argv, str_opts, long_opts, NULL);
-               if ( ch == -1 )
-                       break;
-               switch(ch) {
-               case 1:
-                       node_name_map_file = strdup(optarg);
-                       break;
-               case 2:
-                       ibnd_debug(1);
-                       break;
-               case 'f':
-                       from = strdup(optarg);
-                       break;
-               case 'C':
-                       ca = strdup(optarg);
-                       break;
-               case 'P':
-                       ca_port = strtoul(optarg, 0, 0);
-                       break;
-               case 'D':
-                       dr_path = strdup(optarg);
-                       break;
-               case 'n':
-                       hops = (int)strtol(optarg, NULL, 0);
-                       break;
-               case 'd':
-                       down_links_only = 1;
-                       break;
-               case 'l':
-                       line_mode = 1;
-                       break;
-               case 't':
-                       timeout_ms = strtoul(optarg, 0, 0);
-                       break;
-               case 's':
-                       ibnd_show_progress(1);
-                       break;
-               case 'g':
-                       print_port_guids = 1;
-                       break;
-               case 'S':
-                       guid_str = optarg;
-                       guid = (uint64_t)strtoull(guid_str, 0, 0);
-                       break;
-               case 'p':
-                       add_sw_settings = 1;
-                       break;
-               case 'R':
-                       /* GNDN */
-                       break;
-               default:
-                       usage();
-                       break;
-               }
-       }
        argc -= optind;
        argv += optind;
 
-       if (argc && !(f = fopen(argv[0], "w")))
-               fprintf(stderr, "can't open file %s for writing", argv[0]);
+       if (ibverbose)
+               ibnd_debug(1);
 
-       ibmad_port = mad_rpc_open_port(ca, ca_port, mgmt_classes, 3);
+       ibmad_port = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 3);
        if (!ibmad_port) {
-               fprintf(stderr, "Failed to open %s port %d", ca, ca_port);
+               fprintf(stderr, "Failed to open %s port %d", ibd_ca,
+                       ibd_ca_port);
                exit(1);
        }
 
+       if (ibd_timeout)
+               mad_rpc_set_timeout(ibmad_port, ibd_timeout);
+
        node_name_map = open_node_name_map(node_name_map_file);
 
-       if (from) {
+       if (dr_path) {
                /* only scan part of the fabric */
-               str2drpath(&(port_id.drpath), from, 0, 0);
-               if ((fabric = ibnd_discover_fabric(ibmad_port, timeout_ms, &port_id, hops)) == NULL) {
-                       fprintf(stderr, "discover failed\n");
-                       rc = 1;
-                       goto close_port;
-               }
-               guid = 0;
+               if ((resolved =
+                    ib_resolve_portid_str_via(&port_id, dr_path,
+                                              IB_DEST_DRPATH, NULL,
+                                              ibmad_port)) < 0)
+                       IBWARN("Failed to resolve %s; attempting full scan\n",
+                              dr_path);
        } else if (guid_str) {
-               if (ib_resolve_portid_str_via(&port_id, guid_str, IB_DEST_GUID,
-                               NULL, ibmad_port) >= 0) {
-                       if ((fabric = ibnd_discover_fabric(ibmad_port,
-                                       timeout_ms, &port_id, 1)) == NULL)
-                               IBWARN("Single node discover failed; attempting full scan\n");
-               } else
+               if ((resolved =
+                    ib_resolve_portid_str_via(&port_id, guid_str, IB_DEST_GUID,
+                                              NULL, ibmad_port)) < 0)
                        IBWARN("Failed to resolve %s; attempting full scan\n",
-                               guid_str);
+                              guid_str);
        }
 
-       if (!fabric) /* do a full scan */
-               if ((fabric = ibnd_discover_fabric(ibmad_port, timeout_ms, NULL, -1)) == NULL) {
+       if (resolved >= 0)
+               if ((fabric = ibnd_discover_fabric(ibmad_port, &port_id,
+                                                  hops)) == NULL)
+                       IBWARN
+                           ("Single node discover failed; attempting full scan\n");
+
+       if (!fabric)
+               if ((fabric =
+                    ibnd_discover_fabric(ibmad_port, NULL, -1)) == NULL) {
                        fprintf(stderr, "discover failed\n");
                        rc = 1;
                        goto close_port;
                }
 
-       if (guid) {
+       if (!all && guid_str) {
                ibnd_node_t *sw = ibnd_find_node_guid(fabric, guid);
-               print_switch(sw, NULL);
-       } else if (dr_path) {
-               ibnd_node_t *sw = ibnd_find_node_dr(fabric, dr_path);
-               print_switch(sw, NULL);
-       } else {
-               ibnd_iter_nodes_type(fabric, print_switch, IB_NODE_SWITCH, NULL);
-       }
+               if (sw)
+                       print_switch(sw, NULL);
+               else
+                       fprintf(stderr, "Failed to find switch: %s\n",
+                               guid_str);
+       } else if (!all && dr_path) {
+               ibnd_node_t *sw = NULL;
+               uint8_t ni[IB_SMP_DATA_SIZE];
+
+               if (!smp_query_via(ni, &port_id, IB_ATTR_NODE_INFO, 0,
+                                  ibd_timeout, ibmad_port))
+                       return -1;
+               mad_decode_field(ni, IB_NODE_GUID_F, &(guid));
+
+               sw = ibnd_find_node_guid(fabric, guid);
+               if (sw)
+                       print_switch(sw, NULL);
+               else
+                       fprintf(stderr, "Failed to find switch: %s\n", dr_path);
+       } else
+               ibnd_iter_nodes_type(fabric, print_switch, IB_NODE_SWITCH,
+                                    NULL);
 
        ibnd_destroy_fabric(fabric);
 
index 1799618..ce9affc 100644 (file)
@@ -35,7 +35,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #define _GNU_SOURCE
 #include <stdio.h>
 
 struct ibmad_port *srcport;
 
-static int timeout = 2000;             /* ms */
 static FILE *f;
 
 static char *node_name_map_file = NULL;
 static nn_map_t *node_name_map = NULL;
 
+static int report_max_hops = 0;
+
 /**
  * Define our own conversion functions to maintain compatibility with the old
  * ibnetdiscover which did not use the ibmad conversion functions.
@@ -104,23 +105,24 @@ char *dump_linkwidth_compat(uint32_t width)
        return ("??");
 }
 
-static inline const char*
-ports_nt_str_compat(ibnd_node_t *node)
+static inline const char *ports_nt_str_compat(ibnd_node_t * node)
 {
-       switch(node->type) {
-       case IB_NODE_SWITCH: return "SW";
-       case IB_NODE_CA:     return "CA";
-       case IB_NODE_ROUTER: return "RT";
+       switch (node->type) {
+       case IB_NODE_SWITCH:
+               return "SW";
+       case IB_NODE_CA:
+               return "CA";
+       case IB_NODE_ROUTER:
+               return "RT";
        }
        return "??";
 }
 
-char *
-node_name(ibnd_node_t *node)
+char *node_name(ibnd_node_t * node)
 {
        static char buf[256];
 
-       switch(node->type) {
+       switch (node->type) {
        case IB_NODE_SWITCH:
                sprintf(buf, "\"%s", "S");
                break;
@@ -134,19 +136,18 @@ node_name(ibnd_node_t *node)
                sprintf(buf, "\"%s", "?");
                break;
        }
-       sprintf(buf+2, "-%016" PRIx64 "\"", node->guid);
+       sprintf(buf + 2, "-%016" PRIx64 "\"", node->guid);
 
        return buf;
 }
 
-void
-list_node(ibnd_node_t *node, void *user_data)
+void list_node(ibnd_node_t * node, void *user_data)
 {
        char *node_type;
        char *nodename = remap_node_name(node_name_map, node->guid,
                                         node->nodedesc);
 
-       switch(node->type) {
+       switch (node->type) {
        case IB_NODE_SWITCH:
                node_type = "Switch";
                break;
@@ -160,17 +161,17 @@ list_node(ibnd_node_t *node, void *user_data)
                node_type = "???";
                break;
        }
-       fprintf(f, "%s\t : 0x%016" PRIx64 " ports %d devid 0x%x vendid 0x%x \"%s\"\n",
-               node_type, node->guid, node->numports,
-               mad_get_field(node->info, 0, IB_NODE_DEVID_F),
-               mad_get_field(node->info, 0, IB_NODE_VENDORID_F),
-               nodename);
+       fprintf(f,
+               "%s\t : 0x%016" PRIx64
+               " ports %d devid 0x%x vendid 0x%x \"%s\"\n", node_type,
+               node->guid, node->numports, mad_get_field(node->info, 0,
+                                                         IB_NODE_DEVID_F),
+               mad_get_field(node->info, 0, IB_NODE_VENDORID_F), nodename);
 
        free(nodename);
 }
 
-void
-list_nodes(ibnd_fabric_t *fabric, int list)
+void list_nodes(ibnd_fabric_t * fabric, int list)
 {
        if (list & LIST_CA_NODE)
                ibnd_iter_nodes_type(fabric, list_node, IB_NODE_CA, NULL);
@@ -180,10 +181,10 @@ list_nodes(ibnd_fabric_t *fabric, int list)
                ibnd_iter_nodes_type(fabric, list_node, IB_NODE_ROUTER, NULL);
 }
 
-void
-out_ids(ibnd_node_t *node, int group, char *chname)
+void out_ids(ibnd_node_t * node, int group, char *chname)
 {
-       uint64_t sysimgguid = mad_get_field64(node->info, 0, IB_NODE_SYSTEM_GUID_F);
+       uint64_t sysimgguid =
+           mad_get_field64(node->info, 0, IB_NODE_SYSTEM_GUID_F);
 
        fprintf(f, "\nvendid=0x%x\ndevid=0x%x\n",
                mad_get_field(node->info, 0, IB_NODE_VENDORID_F),
@@ -196,13 +197,13 @@ out_ids(ibnd_node_t *node, int group, char *chname)
                        fprintf(f, " (%s)", clean_nodedesc(chname));
                if (ibnd_is_xsigo_tca(node->guid) && node->ports[1] &&
                    node->ports[1]->remoteport)
-                       fprintf(f, " slot %d", node->ports[1]->remoteport->portnum);
+                       fprintf(f, " slot %d",
+                               node->ports[1]->remoteport->portnum);
        }
        fprintf(f, "\n");
 }
 
-uint64_t
-out_chassis(ibnd_fabric_t *fabric, unsigned char chassisnum)
+uint64_t out_chassis(ibnd_fabric_t * fabric, unsigned char chassisnum)
 {
        uint64_t guid;
 
@@ -214,17 +215,18 @@ out_chassis(ibnd_fabric_t *fabric, unsigned char chassisnum)
        return guid;
 }
 
-void
-out_switch(ibnd_node_t *node, int group, char *chname)
+void out_switch(ibnd_node_t * node, int group, char *chname)
 {
        char *str;
-       char  str2[256];
+       char str2[256];
        char *nodename = NULL;
 
        out_ids(node, group, chname);
        fprintf(f, "switchguid=0x%" PRIx64, node->guid);
-       fprintf(f, "(%" PRIx64 ")", mad_get_field64(node->info, 0, IB_NODE_PORT_GUID_F));
+       fprintf(f, "(%" PRIx64 ")",
+               mad_get_field64(node->info, 0, IB_NODE_PORT_GUID_F));
        if (group) {
+               fprintf(f, "\t# ");
                str = ibnd_get_chassis_type(node);
                if (str)
                        fprintf(f, "%s ", str);
@@ -243,14 +245,13 @@ out_switch(ibnd_node_t *node, int group, char *chname)
        free(nodename);
 }
 
-void
-out_ca(ibnd_node_t *node, int group, char *chname)
+void out_ca(ibnd_node_t * node, int group, char *chname)
 {
        char *node_type;
        char *node_type2;
 
        out_ids(node, group, chname);
-       switch(node->type) {
+       switch (node->type) {
        case IB_NODE_CA:
                node_type = "ca";
                node_type2 = "Ca";
@@ -275,22 +276,20 @@ out_ca(ibnd_node_t *node, int group, char *chname)
 }
 
 #define OUT_BUFFER_SIZE 16
-static char *
-out_ext_port(ibnd_port_t *port, int group)
+static char *out_ext_port(ibnd_port_t * port, int group)
 {
        static char mapping[OUT_BUFFER_SIZE];
 
        if (group && port->ext_portnum != 0) {
                snprintf(mapping, OUT_BUFFER_SIZE,
-                       "[ext %d]", port->ext_portnum);
+                        "[ext %d]", port->ext_portnum);
                return (mapping);
        }
 
        return (NULL);
 }
 
-void
-out_switch_port(ibnd_port_t *port, int group)
+void out_switch_port(ibnd_port_t * port, int group)
 {
        char *ext_port_str = NULL;
        char *rem_nodename = NULL;
@@ -299,7 +298,8 @@ out_switch_port(ibnd_port_t *port, int group)
        uint32_t ispeed = mad_get_field(port->info, 0,
                                        IB_PORT_LINK_SPEED_ACTIVE_F);
 
-       DEBUG("port %p:%d remoteport %p\n", port, port->portnum, port->remoteport);
+       DEBUG("port %p:%d remoteport %p\n", port, port->portnum,
+             port->remoteport);
        fprintf(f, "[%d]", port->portnum);
 
        ext_port_str = out_ext_port(port, group);
@@ -319,10 +319,9 @@ out_switch_port(ibnd_port_t *port, int group)
        fprintf(f, "\t\t# \"%s\" lid %d %s%s",
                rem_nodename,
                port->remoteport->node->type == IB_NODE_SWITCH ?
-                       port->remoteport->node->smalid :
-                       port->remoteport->base_lid,
-                       dump_linkwidth_compat(iwidth),
-                       dump_linkspeed_compat(ispeed));
+               port->remoteport->node->smalid :
+               port->remoteport->base_lid,
+               dump_linkwidth_compat(iwidth), dump_linkspeed_compat(ispeed));
 
        if (ibnd_is_xsigo_tca(port->remoteport->guid))
                fprintf(f, " slot %d", port->portnum);
@@ -333,8 +332,7 @@ out_switch_port(ibnd_port_t *port, int group)
        free(rem_nodename);
 }
 
-void
-out_ca_port(ibnd_port_t *port, int group)
+void out_ca_port(ibnd_port_t * port, int group)
 {
        char *str = NULL;
        char *rem_nodename = NULL;
@@ -361,22 +359,19 @@ out_ca_port(ibnd_port_t *port, int group)
        fprintf(f, "\t\t# lid %d lmc %d \"%s\" lid %d %s%s\n",
                port->base_lid, port->lmc, rem_nodename,
                port->remoteport->node->type == IB_NODE_SWITCH ?
-                       port->remoteport->node->smalid :
-                       port->remoteport->base_lid,
-               dump_linkwidth_compat(iwidth),
-               dump_linkspeed_compat(ispeed));
+               port->remoteport->node->smalid :
+               port->remoteport->base_lid,
+               dump_linkwidth_compat(iwidth), dump_linkspeed_compat(ispeed));
 
        free(rem_nodename);
 }
 
-
 struct iter_user_data {
        int group;
        int skip_chassis_nodes;
 };
 
-static void
-switch_iter_func(ibnd_node_t *node, void *iter_user_data)
+static void switch_iter_func(ibnd_node_t * node, void *iter_user_data)
 {
        ibnd_port_t *port;
        int p = 0;
@@ -385,7 +380,8 @@ switch_iter_func(ibnd_node_t *node, void *iter_user_data)
        DEBUG("SWITCH: node %p\n", node);
 
        /* skip chassis based switches if flagged */
-       if (data->skip_chassis_nodes && node->chassis && node->chassis->chassisnum)
+       if (data->skip_chassis_nodes && node->chassis
+           && node->chassis->chassisnum)
                return;
 
        out_switch(node, data->group, NULL);
@@ -396,8 +392,7 @@ switch_iter_func(ibnd_node_t *node, void *iter_user_data)
        }
 }
 
-static void
-ca_iter_func(ibnd_node_t *node, void *iter_user_data)
+static void ca_iter_func(ibnd_node_t * node, void *iter_user_data)
 {
        ibnd_port_t *port;
        int p = 0;
@@ -416,8 +411,7 @@ ca_iter_func(ibnd_node_t *node, void *iter_user_data)
        }
 }
 
-static void
-router_iter_func(ibnd_node_t *node, void *iter_user_data)
+static void router_iter_func(ibnd_node_t * node, void *iter_user_data)
 {
        ibnd_port_t *port;
        int p = 0;
@@ -425,8 +419,7 @@ router_iter_func(ibnd_node_t *node, void *iter_user_data)
 
        DEBUG("RT: node %p\n", node);
        /* Now, skip chassis based RTs */
-       if (data->group && node->chassis &&
-           node->chassis->chassisnum)
+       if (data->group && node->chassis && node->chassis->chassisnum)
                return;
        out_ca(node, data->group, NULL);
        for (p = 1; p <= node->numports; p++) {
@@ -436,8 +429,7 @@ router_iter_func(ibnd_node_t *node, void *iter_user_data)
        }
 }
 
-int
-dump_topology(int group, ibnd_fabric_t *fabric)
+int dump_topology(int group, ibnd_fabric_t * fabric)
 {
        ibnd_node_t *node;
        ibnd_port_t *port;
@@ -448,10 +440,13 @@ dump_topology(int group, ibnd_fabric_t *fabric)
        struct iter_user_data iter_user_data;
 
        fprintf(f, "#\n# Topology file: generated on %s#\n", ctime(&t));
-       fprintf(f, "# Max of %d hops discovered\n", fabric->maxhops_discovered);
+       if (report_max_hops)
+               fprintf(f, "# Reported max hops discovered: %d\n",
+                       fabric->maxhops_discovered);
        fprintf(f, "# Initiated from node %016" PRIx64 " port %016" PRIx64 "\n",
                fabric->from_node->guid,
-               mad_get_field64(fabric->from_node->info, 0, IB_NODE_PORT_GUID_F));
+               mad_get_field64(fabric->from_node->info, 0,
+                               IB_NODE_PORT_GUID_F));
 
        /* Make pass on switches */
        if (group) {
@@ -471,10 +466,12 @@ dump_topology(int group, ibnd_fabric_t *fabric)
  */
                        if (ibnd_is_xsigo_guid(chguid)) {
                                for (node = ch->nodes; node;
-                                               node = node->next_chassis_node) {
+                                    node = node->next_chassis_node) {
                                        if (ibnd_is_xsigo_hca(node->guid)) {
                                                chname = node->nodedesc;
-                                               fprintf(f, "Hostname: %s\n", clean_nodedesc(node->nodedesc));
+                                               fprintf(f, "Hostname: %s\n",
+                                                       clean_nodedesc(node->
+                                                                      nodedesc));
                                        }
                                }
                        }
@@ -482,22 +479,32 @@ dump_topology(int group, ibnd_fabric_t *fabric)
                        fprintf(f, "\n# Spine Nodes");
                        for (n = 1; n <= SPINES_MAX_NUM; n++) {
                                if (ch->spinenode[n]) {
-                                       out_switch(ch->spinenode[n], group, chname);
-                                       for (p = 1; p <= ch->spinenode[n]->numports; p++) {
-                                               port = ch->spinenode[n]->ports[p];
+                                       out_switch(ch->spinenode[n], group,
+                                                  chname);
+                                       for (p = 1;
+                                            p <= ch->spinenode[n]->numports;
+                                            p++) {
+                                               port =
+                                                   ch->spinenode[n]->ports[p];
                                                if (port && port->remoteport)
-                                                       out_switch_port(port, group);
+                                                       out_switch_port(port,
+                                                                       group);
                                        }
                                }
                        }
                        fprintf(f, "\n# Line Nodes");
                        for (n = 1; n <= LINES_MAX_NUM; n++) {
                                if (ch->linenode[n]) {
-                                       out_switch(ch->linenode[n], group, chname);
-                                       for (p = 1; p <= ch->linenode[n]->numports; p++) {
-                                               port = ch->linenode[n]->ports[p];
+                                       out_switch(ch->linenode[n], group,
+                                                  chname);
+                                       for (p = 1;
+                                            p <= ch->linenode[n]->numports;
+                                            p++) {
+                                               port =
+                                                   ch->linenode[n]->ports[p];
                                                if (port && port->remoteport)
-                                                       out_switch_port(port, group);
+                                                       out_switch_port(port,
+                                                                       group);
                                        }
                                }
                        }
@@ -510,7 +517,8 @@ dump_topology(int group, ibnd_fabric_t *fabric)
                                        for (p = 1; p <= node->numports; p++) {
                                                port = node->ports[p];
                                                if (port && port->remoteport)
-                                                       out_switch_port(port, group);
+                                                       out_switch_port(port,
+                                                                       group);
                                        }
                                }
 
@@ -524,15 +532,15 @@ dump_topology(int group, ibnd_fabric_t *fabric)
                                        for (p = 1; p <= node->numports; p++) {
                                                port = node->ports[p];
                                                if (port && port->remoteport)
-                                                       out_ca_port(port, group);
+                                                       out_ca_port(port,
+                                                                   group);
                                        }
                                }
                        }
 
                }
 
-
-       } else { /* !group */
+       } else {                /* !group */
                iter_user_data.group = group;
                iter_user_data.skip_chassis_nodes = 0;
                ibnd_iter_nodes_type(fabric, switch_iter_func,
@@ -562,7 +570,7 @@ dump_topology(int group, ibnd_fabric_t *fabric)
        return i;
 }
 
-void dump_ports_report (ibnd_node_t *node, void *user_data)
+void dump_ports_report(ibnd_node_t * node, void *user_data)
 {
        int p = 0;
        ibnd_port_t *port = NULL;
@@ -573,13 +581,14 @@ void dump_ports_report (ibnd_node_t *node, void *user_data)
                uint32_t iwidth, ispeed;
                if (port == NULL)
                        continue;
-               iwidth = mad_get_field(port->info, 0, IB_PORT_LINK_WIDTH_ACTIVE_F);
-               ispeed = mad_get_field(port->info, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
-               fprintf(stdout,
-                       "%2s %5d %2d 0x%016" PRIx64 " %s %s",
+               iwidth =
+                   mad_get_field(port->info, 0, IB_PORT_LINK_WIDTH_ACTIVE_F);
+               ispeed =
+                   mad_get_field(port->info, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
+               fprintf(stdout, "%2s %5d %2d 0x%016" PRIx64 " %s %s",
                        ports_nt_str_compat(node),
-                       node->type == IB_NODE_SWITCH ?
-                               node->smalid : port->base_lid,
+                       node->type ==
+                       IB_NODE_SWITCH ? node->smalid : port->base_lid,
                        port->portnum, port->guid,
                        dump_linkwidth_compat(iwidth),
                        dump_linkspeed_compat(ispeed));
@@ -589,8 +598,8 @@ void dump_ports_report (ibnd_node_t *node, void *user_data)
                                " ( '%s' - '%s' )\n",
                                ports_nt_str_compat(port->remoteport->node),
                                port->remoteport->node->type == IB_NODE_SWITCH ?
-                                       port->remoteport->node->smalid :
-                                       port->remoteport->base_lid,
+                               port->remoteport->node->smalid :
+                               port->remoteport->base_lid,
                                port->remoteport->portnum,
                                port->remoteport->guid, port->node->nodedesc,
                                port->remoteport->node->nodedesc);
@@ -628,6 +637,9 @@ static int process_opt(void *context, int ch, char *optarg)
        case 'p':
                ports_report = 1;
                break;
+       case 'm':
+               report_max_hops = 1;
+               break;
        default:
                return -1;
        }
@@ -640,18 +652,20 @@ int main(int argc, char **argv)
        ibnd_fabric_t *fabric = NULL;
 
        struct ibmad_port *ibmad_port;
-       int mgmt_classes[2] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS};
+       int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
 
        const struct ibdiag_opt opts[] = {
-               { "show", 's', 0, NULL, "show more information" },
-               { "list", 'l', 0, NULL, "list of connected nodes" },
-               { "grouping", 'g', 0, NULL, "show grouping" },
-               { "Hca_list", 'H', 0, NULL, "list of connected CAs" },
-               { "Switch_list", 'S', 0, NULL, "list of connected switches" },
-               { "Router_list", 'R', 0, NULL, "list of connected routers" },
-               { "node-name-map", 1, 1, "<file>", "node name map file" },
-               { "ports", 'p', 0, NULL, "obtain a ports report" },
-               { 0 }
+               {"show", 's', 0, NULL, "show more information"},
+               {"list", 'l', 0, NULL, "list of connected nodes"},
+               {"grouping", 'g', 0, NULL, "show grouping"},
+               {"Hca_list", 'H', 0, NULL, "list of connected CAs"},
+               {"Switch_list", 'S', 0, NULL, "list of connected switches"},
+               {"Router_list", 'R', 0, NULL, "list of connected routers"},
+               {"node-name-map", 1, 1, "<file>", "node name map file"},
+               {"ports", 'p', 0, NULL, "obtain a ports report"},
+               {"max_hops", 'm', 0, NULL,
+                "report max hops discovered by the library"},
+               {0}
        };
        char usage_args[] = "[topology-file]";
 
@@ -663,9 +677,6 @@ int main(int argc, char **argv)
        argc -= optind;
        argv += optind;
 
-       if (ibd_timeout)
-               timeout = ibd_timeout;
-
        if (ibverbose)
                ibnd_debug(1);
 
@@ -673,18 +684,19 @@ int main(int argc, char **argv)
        if (!ibmad_port)
                IBERROR("Failed to open %s port %d", ibd_ca, ibd_ca_port);
 
+       if (ibd_timeout)
+               mad_rpc_set_timeout(ibmad_port, ibd_timeout);
+
        if (argc && !(f = fopen(argv[0], "w")))
                IBERROR("can't open file %s for writing", argv[0]);
 
        node_name_map = open_node_name_map(node_name_map_file);
 
-       if ((fabric = ibnd_discover_fabric(ibmad_port, ibd_timeout, NULL, -1)) == NULL)
+       if ((fabric = ibnd_discover_fabric(ibmad_port, NULL, -1)) == NULL)
                IBERROR("discover failed\n");
 
        if (ports_report)
-               ibnd_iter_nodes(fabric,
-                               dump_ports_report,
-                               NULL);
+               ibnd_iter_nodes(fabric, dump_ports_report, NULL);
        else if (list)
                list_nodes(fabric, list);
        else
index 7da48e2..446259d 100644 (file)
@@ -33,7 +33,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -53,8 +53,7 @@ struct ibmad_port *srcport;
 static char host_and_domain[IB_VENDOR_RANGE2_DATA_SIZE];
 static char last_host[IB_VENDOR_RANGE2_DATA_SIZE];
 
-static void
-get_host_and_domain(char *data, int sz)
+static void get_host_and_domain(char *data, int sz)
 {
        char *s = data;
        int n;
@@ -62,7 +61,7 @@ get_host_and_domain(char *data, int sz)
        if (gethostname(s, sz) < 0)
                snprintf(s, sz, "?hostname?");
 
-       s[sz-1] = 0;
+       s[sz - 1] = 0;
        if ((n = strlen(s)) >= sz)
                return;
        s[n] = '.';
@@ -75,8 +74,7 @@ get_host_and_domain(char *data, int sz)
                s[-1] = 0;      /* no domain */
 }
 
-static char *
-ibping_serv(void)
+static char *ibping_serv(void)
 {
        void *umad;
        void *mad;
@@ -103,10 +101,9 @@ ibping_serv(void)
        return 0;
 }
 
-static uint64_t
-ibping(ib_portid_t *portid, int quiet)
+static uint64_t ibping(ib_portid_t * portid, int quiet)
 {
-       char data[IB_VENDOR_RANGE2_DATA_SIZE] = {0};
+       char data[IB_VENDOR_RANGE2_DATA_SIZE] = { 0 };
        ib_vendor_call_t call;
        uint64_t start, rtt;
 
@@ -132,14 +129,14 @@ ibping(ib_portid_t *portid, int quiet)
 
        if (!quiet)
                printf("Pong from %s (%s): time %" PRIu64 ".%03" PRIu64 " ms\n",
-                       data, portid2str(portid), rtt/1000, rtt%1000);
+                      data, portid2str(portid), rtt / 1000, rtt % 1000);
 
        return rtt;
 }
 
 static uint64_t minrtt = ~0ull, maxrtt, total_rtt;
 static uint64_t start, total_time, replied, lost, ntrans;
-static ib_portid_t portid = {0};
+static ib_portid_t portid = { 0 };
 
 void __cdecl report(int sig)
 {
@@ -147,16 +144,18 @@ void __cdecl report(int sig)
 
        DEBUG("out due signal %d", sig);
 
-       printf("\n--- %s (%s) ibping statistics ---\n", last_host, portid2str(&portid));
-       printf("%" PRIu64 " packets transmitted, %" PRIu64 " received, %" PRIu64 "%% packet loss, time %" PRIu64 " ms\n",
-               ntrans, replied,
-               (lost != 0) ?  lost * 100 / ntrans : 0, total_time / 1000);
-       printf("rtt min/avg/max = %" PRIu64 ".%03" PRIu64 "/%" PRIu64 ".%03" PRIu64 "/%" PRIu64 ".%03" PRIu64 " ms\n",
-               minrtt == ~0ull ? 0 : minrtt/1000,
-               minrtt == ~0ull ? 0 : minrtt%1000,
-               replied ? total_rtt/replied/1000 : 0,
-               replied ? (total_rtt/replied)%1000 : 0,
-               maxrtt/1000, maxrtt%1000);
+       printf("\n--- %s (%s) ibping statistics ---\n", last_host,
+              portid2str(&portid));
+       printf("%" PRIu64 " packets transmitted, %" PRIu64 " received, %" PRIu64
+              "%% packet loss, time %" PRIu64 " ms\n", ntrans, replied,
+              (lost != 0) ? lost * 100 / ntrans : 0, total_time / 1000);
+       printf("rtt min/avg/max = %" PRIu64 ".%03" PRIu64 "/%" PRIu64 ".%03"
+              PRIu64 "/%" PRIu64 ".%03" PRIu64 " ms\n",
+              minrtt == ~0ull ? 0 : minrtt / 1000,
+              minrtt == ~0ull ? 0 : minrtt % 1000,
+              replied ? total_rtt / replied / 1000 : 0,
+              replied ? (total_rtt / replied) % 1000 : 0, maxrtt / 1000,
+              maxrtt % 1000);
 
        exit(0);
 }
@@ -187,17 +186,18 @@ static int process_opt(void *context, int ch, char *optarg)
 
 int main(int argc, char **argv)
 {
-       int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
+       int mgmt_classes[3] =
+           { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS };
        int ping_class = IB_VENDOR_OPENIB_PING_CLASS;
        uint64_t rtt;
        char *err;
 
        const struct ibdiag_opt opts[] = {
-               { "count", 'c', 1, "<num>", "stop after count packets" },
-               { "flood", 'f', 0, NULL, "flood destination" },
-               { "oui", 'o', 1, NULL, "use specified OUI number" },
-               { "Server", 'S', 0, NULL, "start in server mode" },
-               { 0 }
+               {"count", 'c', 1, "<num>", "stop after count packets"},
+               {"flood", 'f', 0, NULL, "flood destination"},
+               {"oui", 'o', 1, NULL, "use specified OUI number"},
+               {"Server", 'S', 0, NULL, "start in server mode"},
+               {0}
        };
        char usage_args[] = "<dest lid|guid>";
 
@@ -216,7 +216,8 @@ int main(int argc, char **argv)
 
        if (server) {
                if (mad_register_server_via(ping_class, 0, 0, oui, srcport) < 0)
-                       IBERROR("can't serve class %d on this port", ping_class);
+                       IBERROR("can't serve class %d on this port",
+                               ping_class);
 
                get_host_and_domain(host_and_domain, sizeof host_and_domain);
 
@@ -226,10 +227,11 @@ int main(int argc, char **argv)
        }
 
        if (mad_register_client_via(ping_class, 0, srcport) < 0)
-               IBERROR("can't register ping class %d on this port", ping_class);
+               IBERROR("can't register ping class %d on this port",
+                       ping_class);
 
        if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                                       ibd_sm_id, srcport) < 0)
+                                     ibd_sm_id, srcport) < 0)
                IBERROR("can't resolve destination port %s", argv[0]);
 
        signal(SIGINT, report);
index 65c9ca1..55e1dd5 100644 (file)
@@ -33,7 +33,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -50,8 +50,7 @@ struct ibmad_port *srcport;
 
 /*******************************************/
 
-static int
-get_node_info(ib_portid_t *dest, uint8_t *data)
+static int get_node_info(ib_portid_t * dest, uint8_t * data)
 {
        int node_type;
 
@@ -65,8 +64,8 @@ get_node_info(ib_portid_t *dest, uint8_t *data)
                return 1;
 }
 
-static int
-get_port_info(ib_portid_t *dest, uint8_t *data, int portnum, int port_op)
+static int get_port_info(ib_portid_t * dest, uint8_t * data, int portnum,
+                        int port_op)
 {
        char buf[2048];
        char val[64];
@@ -77,35 +76,44 @@ get_port_info(ib_portid_t *dest, uint8_t *data, int portnum, int port_op)
        if (port_op != 4) {
                mad_dump_portstates(buf, sizeof buf, data, sizeof data);
                mad_decode_field(data, IB_PORT_LINK_WIDTH_SUPPORTED_F, val);
-               mad_dump_field(IB_PORT_LINK_WIDTH_SUPPORTED_F, buf + strlen(buf), sizeof buf - strlen(buf), val);
-               sprintf(buf+strlen(buf), "%s", "\n");
+               mad_dump_field(IB_PORT_LINK_WIDTH_SUPPORTED_F,
+                              buf + strlen(buf), sizeof buf - strlen(buf),
+                              val);
+               sprintf(buf + strlen(buf), "%s", "\n");
                mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F, val);
-               mad_dump_field(IB_PORT_LINK_WIDTH_ENABLED_F, buf + strlen(buf), sizeof buf - strlen(buf), val);
-               sprintf(buf+strlen(buf), "%s", "\n");
+               mad_dump_field(IB_PORT_LINK_WIDTH_ENABLED_F, buf + strlen(buf),
+                              sizeof buf - strlen(buf), val);
+               sprintf(buf + strlen(buf), "%s", "\n");
                mad_decode_field(data, IB_PORT_LINK_WIDTH_ACTIVE_F, val);
-               mad_dump_field(IB_PORT_LINK_WIDTH_ACTIVE_F, buf + strlen(buf), sizeof buf - strlen(buf), val);
-               sprintf(buf+strlen(buf), "%s", "\n");
+               mad_dump_field(IB_PORT_LINK_WIDTH_ACTIVE_F, buf + strlen(buf),
+                              sizeof buf - strlen(buf), val);
+               sprintf(buf + strlen(buf), "%s", "\n");
                mad_decode_field(data, IB_PORT_LINK_SPEED_SUPPORTED_F, val);
-               mad_dump_field(IB_PORT_LINK_SPEED_SUPPORTED_F, buf + strlen(buf), sizeof buf - strlen(buf), val);
-               sprintf(buf+strlen(buf), "%s", "\n");
+               mad_dump_field(IB_PORT_LINK_SPEED_SUPPORTED_F,
+                              buf + strlen(buf), sizeof buf - strlen(buf),
+                              val);
+               sprintf(buf + strlen(buf), "%s", "\n");
                mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F, val);
-               mad_dump_field(IB_PORT_LINK_SPEED_ENABLED_F, buf + strlen(buf), sizeof buf - strlen(buf), val);
-               sprintf(buf+strlen(buf), "%s", "\n");
+               mad_dump_field(IB_PORT_LINK_SPEED_ENABLED_F, buf + strlen(buf),
+                              sizeof buf - strlen(buf), val);
+               sprintf(buf + strlen(buf), "%s", "\n");
                mad_decode_field(data, IB_PORT_LINK_SPEED_ACTIVE_F, val);
-               mad_dump_field(IB_PORT_LINK_SPEED_ACTIVE_F, buf + strlen(buf), sizeof buf - strlen(buf), val);
-               sprintf(buf+strlen(buf), "%s", "\n");
+               mad_dump_field(IB_PORT_LINK_SPEED_ACTIVE_F, buf + strlen(buf),
+                              sizeof buf - strlen(buf), val);
+               sprintf(buf + strlen(buf), "%s", "\n");
        } else {
                mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F, val);
-               mad_dump_field(IB_PORT_LINK_SPEED_ENABLED_F, buf, sizeof buf, val);
-               sprintf(buf+strlen(buf), "%s", "\n");
+               mad_dump_field(IB_PORT_LINK_SPEED_ENABLED_F, buf, sizeof buf,
+                              val);
+               sprintf(buf + strlen(buf), "%s", "\n");
        }
 
        printf("# Port info: %s port %d\n%s", portid2str(dest), portnum, buf);
        return 0;
 }
 
-static int
-set_port_info(ib_portid_t *dest, uint8_t *data, int portnum, int port_op)
+static int set_port_info(ib_portid_t * dest, uint8_t * data, int portnum,
+                        int port_op)
 {
        char buf[2048];
        char val[64];
@@ -117,8 +125,9 @@ set_port_info(ib_portid_t *dest, uint8_t *data, int portnum, int port_op)
                mad_dump_portstates(buf, sizeof buf, data, sizeof data);
        else {
                mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F, val);
-               mad_dump_field(IB_PORT_LINK_SPEED_ENABLED_F, buf, sizeof buf, val);
-               sprintf(buf+strlen(buf), "%s", "\n");
+               mad_dump_field(IB_PORT_LINK_SPEED_ENABLED_F, buf, sizeof buf,
+                              val);
+               sprintf(buf + strlen(buf), "%s", "\n");
        }
 
        printf("\nAfter PortInfo set:\n");
@@ -126,8 +135,7 @@ set_port_info(ib_portid_t *dest, uint8_t *data, int portnum, int port_op)
        return 0;
 }
 
-static int
-get_link_width(int lwe, int lws)
+static int get_link_width(int lwe, int lws)
 {
        if (lwe == 255)
                return lws;
@@ -135,8 +143,7 @@ get_link_width(int lwe, int lws)
                return lwe;
 }
 
-static int
-get_link_speed(int lse, int lss)
+static int get_link_speed(int lse, int lss)
 {
        if (lse == 15)
                return lss;
@@ -144,78 +151,82 @@ get_link_speed(int lse, int lss)
                return lse;
 }
 
-static void
-validate_width(int width, int peerwidth, int lwa)
+static void validate_width(int width, int peerwidth, int lwa)
 {
-       if ((width & 0x8) && (peerwidth & 0x8)) {
+       if ((width & peerwidth & 0x8)) {
                if (lwa != 8)
-                       IBWARN("Peer ports operating at active width %d rather than 8 (12x)", lwa);
-       } else {
-               if ((width & 0x4) && (peerwidth & 0x4)) {
-                       if (lwa != 4)
-                               IBWARN("Peer ports operating at active width %d rather than 4 (8x)", lwa);
-               } else {
-                       if ((width & 0x2) && (peerwidth & 0x2)) {
-                               if (lwa != 2)
-                                       IBWARN("Peer ports operating at active width %d rather than 2 (4x)", lwa);
-                       } else {
-                               if ((width & 0x1) && (peerwidth & 0x1)) {
-                                       if (lwa != 1)
-                                               IBWARN("Peer ports operating at active width %d rather than 1 (1x)", lwa);
-                               }
-                       }
-               }
+                       IBWARN
+                           ("Peer ports operating at active width %d rather than 8 (12x)",
+                            lwa);
+       } else if ((width & peerwidth & 0x4)) {
+               if (lwa != 4)
+                       IBWARN
+                           ("Peer ports operating at active width %d rather than 4 (8x)",
+                            lwa);
+       } else if ((width & peerwidth & 0x2)) {
+               if (lwa != 2)
+                       IBWARN
+                           ("Peer ports operating at active width %d rather than 2 (4x)",
+                            lwa);
+       } else if ((width & peerwidth & 0x1)) {
+               if (lwa != 1)
+                       IBWARN
+                           ("Peer ports operating at active width %d rather than 1 (1x)",
+                            lwa);
        }
 }
 
-static void
-validate_speed(int speed, int peerspeed, int lsa)
+static void validate_speed(int speed, int peerspeed, int lsa)
 {
-       if ((speed & 0x4) && (peerspeed & 0x4)) {
+       if ((speed & peerspeed & 0x4)) {
                if (lsa != 4)
-                       IBWARN("Peer ports operating at active speed %d rather than  4 (10.0 Gbps)", lsa);
-       } else {
-               if ((speed & 0x2) && (peerspeed & 0x2)) {
-                       if (lsa != 2)
-                               IBWARN("Peer ports operating at active speed %d rather than 2 (5.0 Gbps)", lsa);
-               } else {
-                       if ((speed & 0x1) && (peerspeed & 0x1)) {
-                               if (lsa != 1)
-                                       IBWARN("Peer ports operating at active speed %d rather than 1 (2.5 Gbps)", lsa);
-                       }
-               }
+                       IBWARN
+                           ("Peer ports operating at active speed %d rather than  4 (10.0 Gbps)",
+                            lsa);
+       } else if ((speed & peerspeed & 0x2)) {
+               if (lsa != 2)
+                       IBWARN
+                           ("Peer ports operating at active speed %d rather than 2 (5.0 Gbps)",
+                            lsa);
+       } else if ((speed & peerspeed & 0x1)) {
+               if (lsa != 1)
+                       IBWARN
+                           ("Peer ports operating at active speed %d rather than 1 (2.5 Gbps)",
+                            lsa);
        }
 }
 
 int main(int argc, char **argv)
 {
-       int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
-       ib_portid_t portid = {0};
+       int mgmt_classes[3] =
+           { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS };
+       ib_portid_t portid = { 0 };
        int err;
        int port_op = 0;        /* default to query */
        int speed = 15;
        int is_switch = 1;
        int state, physstate, lwe, lws, lwa, lse, lss, lsa;
-       int peerlocalportnum, peerlwe, peerlws, peerlwa, peerlse, peerlss, peerlsa;
-       int width, peerwidth, peerspeed;
+       int peerlocalportnum, peerlwe, peerlws, peerlwa, peerlse, peerlss,
+           peerlsa;
+       int width = 255, peerwidth, peerspeed;
        uint8_t data[IB_SMP_DATA_SIZE];
-       ib_portid_t peerportid = {0};
+       ib_portid_t peerportid = { 0 };
        int portnum = 0;
-       ib_portid_t selfportid = {0};
+       ib_portid_t selfportid = { 0 };
        int selfport = 0;
 
        char usage_args[] = "<dest dr_path|lid|guid> <portnum> [<op>]\n"
-               "\nSupported ops: enable, disable, reset, speed, query";
+           "\nSupported ops: enable, disable, reset, speed, width, query";
        const char *usage_examples[] = {
                "3 1 disable\t\t\t# by lid",
                "-G 0x2C9000100D051 1 enable\t# by guid",
                "-D 0 1\t\t\t# (query) by direct route",
                "3 1 reset\t\t\t# by lid",
                "3 1 speed 1\t\t\t# by lid",
+               "3 1 width 1\t\t\t# by lid",
                NULL
        };
 
-
        ibdiag_process_opts(argc, argv, NULL, NULL, NULL, NULL,
                            usage_args, usage_examples);
 
@@ -230,9 +241,12 @@ int main(int argc, char **argv)
                IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port);
 
        if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                               ibd_sm_id, srcport) < 0)
+                                     ibd_sm_id, srcport) < 0)
                IBERROR("can't resolve destination port %s", argv[0]);
 
+       if (argc > 1)
+               portnum = strtol(argv[1], 0, 0);
+
        /* First, make sure it is a switch port if it is a "set" */
        if (argc >= 3) {
                if (!strcmp(argv[2], "enable"))
@@ -243,12 +257,22 @@ int main(int argc, char **argv)
                        port_op = 3;
                else if (!strcmp(argv[2], "speed")) {
                        if (argc < 4)
-                               IBERROR("speed requires an additional parameter");
+                               IBERROR
+                                   ("speed requires an additional parameter");
                        port_op = 4;
                        /* Parse speed value */
                        speed = strtoul(argv[3], 0, 0);
                        if (speed > 15)
                                IBERROR("invalid speed value %d", speed);
+               } else if (!strcmp(argv[2], "width")) {
+                       if (argc < 4)
+                               IBERROR
+                                   ("width requires an additional parameter");
+                       port_op = 5;
+                       /* Parse width value */
+                       width = strtoul(argv[3], 0, 0);
+                       if (width > 15 && width != 255)
+                               IBERROR("invalid width value %d", width);
                }
        }
 
@@ -258,13 +282,10 @@ int main(int argc, char **argv)
        if (err) {              /* not switch */
                if (port_op == 0)       /* query op */
                        is_switch = 0;
-               else if (port_op != 4)  /* other than speed op */
-                       IBERROR("smp query nodeinfo: Node type not switch");
+               else if (port_op == 2)  /* disable */
+                       IBERROR("Node type not switch - disable not allowed");
        }
 
-       if (argc-1 > 0)
-               portnum = strtol(argv[1], 0, 0);
-
        if (port_op)
                printf("Initial PortInfo:\n");
        else
@@ -275,13 +296,21 @@ int main(int argc, char **argv)
 
        /* Only if one of the "set" options is chosen */
        if (port_op) {
-               if (port_op == 1)               /* Enable port */
+               if ((port_op == 1) || (port_op == 3)) { /* Enable or Reset port */
                        mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 2);        /* Polling */
-               else if ((port_op == 2) || (port_op == 3)) { /* Disable port */
-                       mad_set_field(data, 0, IB_PORT_STATE_F, 1);             /* Down */
-                       mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 3);        /* Disabled */
+                       mad_set_field(data, 0, IB_PORT_STATE_F, 0);     /* No Change */
+               } else if (port_op == 2) {      /* Disable port */
+                       printf("Disable may be irreversible\n");
+                       mad_set_field(data, 0, IB_PORT_STATE_F, 1);     /* Down */
+                       mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 3);        /* Disabled */
                } else if (port_op == 4) {      /* Set speed */
-                       mad_set_field(data, 0, IB_PORT_LINK_SPEED_ENABLED_F, speed);
+                       mad_set_field(data, 0, IB_PORT_LINK_SPEED_ENABLED_F,
+                                     speed);
+                       mad_set_field(data, 0, IB_PORT_STATE_F, 0);
+                       mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 0);
+               } else if (port_op == 5) {      /* Set width */
+                       mad_set_field(data, 0, IB_PORT_LINK_WIDTH_ENABLED_F,
+                                     width);
                        mad_set_field(data, 0, IB_PORT_STATE_F, 0);
                        mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 0);
                }
@@ -289,74 +318,77 @@ int main(int argc, char **argv)
                err = set_port_info(&portid, data, portnum, port_op);
                if (err < 0)
                        IBERROR("smp set portinfo failed");
+               /* query op - only compare peer port if switch port, exclude SP0 */
+       } else if (is_switch && portnum) {
+               /* Now, make sure PortState is Active */
+               /* Or is PortPhysicalState LinkUp sufficient ? */
+               mad_decode_field(data, IB_PORT_STATE_F, &state);
+               mad_decode_field(data, IB_PORT_PHYS_STATE_F, &physstate);
+               if (state == 4) {       /* Active */
+                       mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F,
+                                        &lwe);
+                       mad_decode_field(data, IB_PORT_LINK_WIDTH_SUPPORTED_F,
+                                        &lws);
+                       mad_decode_field(data, IB_PORT_LINK_WIDTH_ACTIVE_F,
+                                        &lwa);
+                       mad_decode_field(data, IB_PORT_LINK_SPEED_SUPPORTED_F,
+                                        &lss);
+                       mad_decode_field(data, IB_PORT_LINK_SPEED_ACTIVE_F,
+                                        &lsa);
+                       mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F,
+                                        &lse);
+
+                       /* Setup portid for peer port */
+                       memcpy(&peerportid, &portid, sizeof(peerportid));
+                       peerportid.drpath.cnt = 1;
+                       peerportid.drpath.p[1] = (uint8_t) portnum;
+
+                       /* Set DrSLID to local lid */
+                       if (ib_resolve_self_via(&selfportid,
+                                               &selfport, 0, srcport) < 0)
+                               IBERROR("could not resolve self");
+                       peerportid.drpath.drslid = (uint16_t) selfportid.lid;
+                       peerportid.drpath.drdlid = 0xffff;
+
+                       /* Get peer port NodeInfo to obtain peer port number */
+                       err = get_node_info(&peerportid, data);
+                       if (err < 0)
+                               IBERROR("smp query nodeinfo failed");
 
-               if (port_op == 3) {     /* Reset port - so also enable */
-                       mad_set_field(data, 0, IB_PORT_PHYS_STATE_F, 2);        /* Polling */
-                       err = set_port_info(&portid, data, portnum, port_op);
+                       mad_decode_field(data, IB_NODE_LOCAL_PORT_F,
+                                        &peerlocalportnum);
+
+                       printf("Peer PortInfo:\n");
+                       /* Get peer port characteristics */
+                       err =
+                           get_port_info(&peerportid, data, peerlocalportnum,
+                                         port_op);
                        if (err < 0)
-                               IBERROR("smp set portinfo failed");
-               }
-       } else {        /* query op */
-               /* only compare peer port if switch port */
-               if (is_switch) {
-                       /* First, exclude SP0 */
-                       if (portnum) {
-                               /* Now, make sure PortState is Active */
-                               /* Or is PortPhysicalState LinkUp sufficient ? */
-                               mad_decode_field(data, IB_PORT_STATE_F, &state);
-                               mad_decode_field(data, IB_PORT_PHYS_STATE_F, &physstate);
-                               if (state == 4) {       /* Active */
-                                       mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F, &lwe );
-                                       mad_decode_field(data, IB_PORT_LINK_WIDTH_SUPPORTED_F, &lws);
-                                       mad_decode_field(data, IB_PORT_LINK_WIDTH_ACTIVE_F, &lwa);
-                                       mad_decode_field(data, IB_PORT_LINK_SPEED_SUPPORTED_F, &lss);
-                                       mad_decode_field(data, IB_PORT_LINK_SPEED_ACTIVE_F, &lsa);
-                                       mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F, &lse);
-
-                                       /* Setup portid for peer port */
-                                       memcpy(&peerportid, &portid, sizeof(peerportid));
-                                       peerportid.drpath.cnt = 1;
-                                       peerportid.drpath.p[1] = (uint8_t) portnum;
-
-                                       /* Set DrSLID to local lid */
-                                       if (ib_resolve_self_via(&selfportid,
-                                                       &selfport, 0, srcport) < 0)
-                                               IBERROR("could not resolve self");
-                                       peerportid.drpath.drslid = (uint16_t) selfportid.lid;
-                                       peerportid.drpath.drdlid = 0xffff;
-
-                                       /* Get peer port NodeInfo to obtain peer port number */
-                                       err = get_node_info(&peerportid, data);
-                                       if (err < 0)
-                                               IBERROR("smp query nodeinfo failed");
-
-                                       mad_decode_field(data, IB_NODE_LOCAL_PORT_F, &peerlocalportnum);
-
-                                       printf("Peer PortInfo:\n");
-                                       /* Get peer port characteristics */
-                                       err = get_port_info(&peerportid, data, peerlocalportnum, port_op);
-                                       if (err < 0)
-                                               IBERROR("smp query peer portinfofailed");
-
-                                       mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F, &peerlwe );
-                                       mad_decode_field(data, IB_PORT_LINK_WIDTH_SUPPORTED_F, &peerlws);
-                                       mad_decode_field(data, IB_PORT_LINK_WIDTH_ACTIVE_F, &peerlwa);
-                                       mad_decode_field(data, IB_PORT_LINK_SPEED_SUPPORTED_F, &peerlss);
-                                       mad_decode_field(data, IB_PORT_LINK_SPEED_ACTIVE_F, &peerlsa);
-                                       mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F, &peerlse);
-
-                                       /* Now validate peer port characteristics */
-                                       /* Examine Link Width */
-                                       width = get_link_width(lwe, lws);
-                                       peerwidth = get_link_width(peerlwe, peerlws);
-                                       validate_width(width, peerwidth, lwa);
-
-                                       /* Examine Link Speed */
-                                       speed = get_link_speed(lse, lss);
-                                       peerspeed = get_link_speed(peerlse, peerlss);
-                                       validate_speed(speed, peerspeed, lsa);
-                               }
-                       }
+                               IBERROR("smp query peer portinfo failed");
+
+                       mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F,
+                                        &peerlwe);
+                       mad_decode_field(data, IB_PORT_LINK_WIDTH_SUPPORTED_F,
+                                        &peerlws);
+                       mad_decode_field(data, IB_PORT_LINK_WIDTH_ACTIVE_F,
+                                        &peerlwa);
+                       mad_decode_field(data, IB_PORT_LINK_SPEED_SUPPORTED_F,
+                                        &peerlss);
+                       mad_decode_field(data, IB_PORT_LINK_SPEED_ACTIVE_F,
+                                        &peerlsa);
+                       mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F,
+                                        &peerlse);
+
+                       /* Now validate peer port characteristics */
+                       /* Examine Link Width */
+                       width = get_link_width(lwe, lws);
+                       peerwidth = get_link_width(peerlwe, peerlws);
+                       validate_width(width, peerwidth, lwa);
+
+                       /* Examine Link Speed */
+                       speed = get_link_speed(lse, lss);
+                       peerspeed = get_link_speed(peerlse, peerlss);
+                       validate_speed(speed, peerspeed, lsa);
                }
        }
 
index 525af70..e67d338 100644 (file)
@@ -35,7 +35,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #define _GNU_SOURCE
 #include <stdio.h>
@@ -59,20 +59,24 @@ static char *node_name_map_file = NULL;
 static nn_map_t *node_name_map = NULL;
 int data_counters = 0;
 int port_config = 0;
-uint64_t switch_guid = 0;
-char *switch_guid_str = NULL;
+uint64_t node_guid = 0;
+char *node_guid_str = NULL;
 int sup_total = 0;
 enum MAD_FIELDS *suppressed_fields = NULL;
 char *dr_path = NULL;
-int all_nodes = 0;
+uint8_t node_type_to_print = 0;
 
-static unsigned int
-get_max(unsigned int num)
+#define PRINT_SWITCH 0x1
+#define PRINT_CA     0x2
+#define PRINT_ROUTER 0x4
+#define PRINT_ALL 0xFF /* all nodes default flag */
+
+static unsigned int get_max(unsigned int num)
 {
-       unsigned int v = num; // 32-bit word to find the log base 2 of
-       unsigned r = 0; // r will be lg(v)
+       unsigned int v = num;   // 32-bit word to find the log base 2 of
+       unsigned r = 0;         // r will be lg(v)
 
-       while (v >>= 1) // unroll for more speed...
+       while (v >>= 1)         // unroll for more speed...
        {
                r++;
        }
@@ -80,41 +84,40 @@ get_max(unsigned int num)
        return (1 << r);
 }
 
-static void
-get_msg(char *width_msg, char *speed_msg, int msg_size, ibnd_port_t *port)
+static void get_msg(char *width_msg, char *speed_msg, int msg_size,
+                   ibnd_port_t * port)
 {
        char buf[64];
        uint32_t max_speed = 0;
 
        uint32_t max_width = get_max(mad_get_field(port->info, 0,
-                                       IB_PORT_LINK_WIDTH_SUPPORTED_F)
-                               & mad_get_field(port->remoteport->info, 0,
-                                       IB_PORT_LINK_WIDTH_SUPPORTED_F));
+                                                  IB_PORT_LINK_WIDTH_SUPPORTED_F)
+                                    & mad_get_field(port->remoteport->info, 0,
+                                                    IB_PORT_LINK_WIDTH_SUPPORTED_F));
        if ((max_width & mad_get_field(port->info, 0,
-                               IB_PORT_LINK_WIDTH_ACTIVE_F)) == 0) {
+                                      IB_PORT_LINK_WIDTH_ACTIVE_F)) == 0) {
                // we are not at the max supported width
                // print what we could be at.
                snprintf(width_msg, msg_size, "Could be %s",
-                       mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F,
-                               buf, 64, &max_width));
+                        mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F,
+                                     buf, 64, &max_width));
        }
 
        max_speed = get_max(mad_get_field(port->info, 0,
-                                       IB_PORT_LINK_SPEED_SUPPORTED_F)
-                               & mad_get_field(port->remoteport->info, 0,
-                                       IB_PORT_LINK_SPEED_SUPPORTED_F));
+                                         IB_PORT_LINK_SPEED_SUPPORTED_F)
+                           & mad_get_field(port->remoteport->info, 0,
+                                           IB_PORT_LINK_SPEED_SUPPORTED_F));
        if ((max_speed & mad_get_field(port->info, 0,
-                               IB_PORT_LINK_SPEED_ACTIVE_F)) == 0) {
+                                      IB_PORT_LINK_SPEED_ACTIVE_F)) == 0) {
                // we are not at the max supported speed
                // print what we could be at.
                snprintf(speed_msg, msg_size, "Could be %s",
-                       mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F,
-                               buf, 64, &max_speed));
+                        mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F,
+                                     buf, 64, &max_speed));
        }
 }
 
-static void
-print_port_config(ibnd_node_t *node, int portnum)
+static void print_port_config(ibnd_node_t * node, int portnum)
 {
        char width[64], speed[64], state[64], physstate[64];
        char remote_str[256];
@@ -140,32 +143,31 @@ print_port_config(ibnd_node_t *node, int portnum)
        speed_msg[0] = '\0';
 
        snprintf(link_str, 256, "(%3s %s %6s/%8s)",
-               mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F, width, 64, &iwidth),
-               mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, speed, 64, &ispeed),
-               mad_dump_val(IB_PORT_STATE_F, state, 64, &istate),
-               mad_dump_val(IB_PORT_PHYS_STATE_F, physstate, 64, &iphystate));
+                mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F, width, 64, &iwidth),
+                mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, speed, 64, &ispeed),
+                mad_dump_val(IB_PORT_STATE_F, state, 64, &istate),
+                mad_dump_val(IB_PORT_PHYS_STATE_F, physstate, 64, &iphystate));
 
        if (port->remoteport) {
-               char *remap = remap_node_name(node_name_map, port->remoteport->node->guid,
-                               port->remoteport->node->nodedesc);
+               char *remap =
+                   remap_node_name(node_name_map, port->remoteport->node->guid,
+                                   port->remoteport->node->nodedesc);
 
                if (port->remoteport->ext_portnum)
-                       snprintf(ext_port_str, 256, "%d", port->remoteport->ext_portnum);
+                       snprintf(ext_port_str, 256, "%d",
+                                port->remoteport->ext_portnum);
                else
                        ext_port_str[0] = '\0';
 
                get_msg(width_msg, speed_msg, 256, port);
 
                snprintf(remote_str, 256,
-                       "0x%016"PRIx64" %6d %4d[%2s] \"%s\" (%s %s)\n",
-                       port->remoteport->node->guid,
-                       port->remoteport->base_lid ?  port->remoteport->base_lid :
-                               port->remoteport->node->smalid,
-                       port->remoteport->portnum,
-                       ext_port_str,
-                       remap,
-                       width_msg,
-                       speed_msg);
+                        "0x%016" PRIx64 " %6d %4d[%2s] \"%s\" (%s %s)\n",
+                        port->remoteport->node->guid,
+                        port->remoteport->base_lid ? port->remoteport->
+                        base_lid : port->remoteport->node->smalid,
+                        port->remoteport->portnum, ext_port_str, remap,
+                        width_msg, speed_msg);
                free(remap);
        } else
                snprintf(remote_str, 256, "           [  ] \"\" ( )\n");
@@ -181,11 +183,10 @@ print_port_config(ibnd_node_t *node, int portnum)
                printf("       Link info: %6d", port->base_lid);
 
        printf("%4d[%2s] ==%s==>  %s",
-               port->portnum, ext_port_str, link_str, remote_str);
+              port->portnum, ext_port_str, link_str, remote_str);
 }
 
-static int
-suppress(enum MAD_FIELDS field)
+static int suppress(enum MAD_FIELDS field)
 {
        int i = 0;
        if (suppressed_fields)
@@ -196,8 +197,7 @@ suppress(enum MAD_FIELDS field)
        return (0);
 }
 
-static void
-report_suppressed(void)
+static void report_suppressed(void)
 {
        int i = 0;
        if (suppressed_fields) {
@@ -209,8 +209,8 @@ report_suppressed(void)
        }
 }
 
-static void
-print_results(ibnd_node_t *node, uint8_t *pc, int portnum, int *header_printed)
+static void print_results(ibnd_node_t * node, uint8_t * pc, int portnum,
+                         int *header_printed)
 {
        char buf[1024];
        char *str = buf;
@@ -224,14 +224,15 @@ print_results(ibnd_node_t *node, uint8_t *pc, int portnum, int *header_printed)
 
                mad_decode_field(pc, i, (void *)&val);
                if (val)
-                       n += snprintf(str+n, 1024-n, " [%s == %d]",
-                               mad_field_name(i), val);
+                       n += snprintf(str + n, 1024 - n, " [%s == %d]",
+                                     mad_field_name(i), val);
        }
 
        if (!suppress(IB_PC_XMT_WAIT_F)) {
                mad_decode_field(pc, IB_PC_XMT_WAIT_F, (void *)&val);
                if (val)
-                       n += snprintf(str+n, 1024-n, " [%s == %d]", mad_field_name(i), val);
+                       n += snprintf(str + n, 1024 - n, " [%s == %d]",
+                                     mad_field_name(i), val);
        }
 
        /* if we found errors. */
@@ -241,30 +242,35 @@ print_results(ibnd_node_t *node, uint8_t *pc, int portnum, int *header_printed)
                                uint64_t val64 = 0;
                                mad_decode_field(pc, i, (void *)&val64);
                                if (val64)
-                                       n += snprintf(str+n, 1024-n, " [%s == %"PRId64"]",
-                                               mad_field_name(i), val64);
+                                       n += snprintf(str + n, 1024 - n,
+                                                     " [%s == %" PRId64 "]",
+                                                     mad_field_name(i), val64);
                        }
 
                if (!*header_printed) {
-                       char *nodename = remap_node_name(node_name_map, node->guid, node->nodedesc);
-                       printf("Errors for 0x%" PRIx64 " \"%s\"\n", node->guid, nodename);
+                       char *nodename =
+                           remap_node_name(node_name_map, node->guid,
+                                           node->nodedesc);
+                       printf("Errors for 0x%" PRIx64 " \"%s\"\n", node->guid,
+                              nodename);
                        *header_printed = 1;
                        free(nodename);
                }
 
-               printf("   GUID 0x%" PRIx64 " port %d:%s\n", node->guid, portnum, str);
+               printf("   GUID 0x%" PRIx64 " port %d:%s\n", node->guid,
+                      portnum, str);
                if (port_config)
                        print_port_config(node, portnum);
        }
 }
 
-static void
-print_port(ibnd_node_t *node, int portnum, int *header_printed)
+static void print_port(ibnd_node_t * node, int portnum, int *header_printed)
 {
        uint8_t pc[1024];
        uint16_t cap_mask;
-       ib_portid_t portid = {0};
-       char *nodename = remap_node_name(node_name_map, node->guid, node->nodedesc);
+       ib_portid_t portid = { 0 };
+       char *nodename =
+           remap_node_name(node_name_map, node->guid, node->nodedesc);
 
        if (node->type == IB_NODE_SWITCH)
                ib_portid_set(&portid, node->smalid, 0, 0);
@@ -275,17 +281,16 @@ print_port(ibnd_node_t *node, int portnum, int *header_printed)
        if (!pma_query_via(pc, &portid, portnum, ibd_timeout, CLASS_PORT_INFO,
                           ibmad_port)) {
                IBWARN("classportinfo query failed on %s, %s port %d",
-                       nodename, portid2str(&portid), portnum);
+                      nodename, portid2str(&portid), portnum);
                goto cleanup;
        }
        /* ClassPortInfo should be supported as part of libibmad */
        memcpy(&cap_mask, pc + 2, sizeof(cap_mask));    /* CapabilityMask */
 
        if (!pma_query_via(pc, &portid, portnum, ibd_timeout,
-                               IB_GSI_PORT_COUNTERS,
-                               ibmad_port)) {
+                          IB_GSI_PORT_COUNTERS, ibmad_port)) {
                IBWARN("IB_GSI_PORT_COUNTERS query failed on %s, %s port %d\n",
-                       nodename, portid2str(&portid), portnum);
+                      nodename, portid2str(&portid), portnum);
                goto cleanup;
        }
        if (!(cap_mask & 0x1000)) {
@@ -299,14 +304,26 @@ cleanup:
        free(nodename);
 }
 
-void
-print_node(ibnd_node_t *node, void *user_data)
+void print_node(ibnd_node_t * node, void *user_data)
 {
        int header_printed = 0;
        int p = 0;
        int startport = 1;
+       int type = 0;
 
-       if (!all_nodes && node->type != IB_NODE_SWITCH)
+       switch (node->type) {
+       case IB_NODE_SWITCH:
+               type = PRINT_SWITCH;
+               break;
+       case IB_NODE_CA:
+               type = PRINT_CA;
+               break;
+       case IB_NODE_ROUTER:
+               type = PRINT_ROUTER;
+               break;
+       }
+
+       if ((type & node_type_to_print) == 0)
                return;
 
        if (node->type == IB_NODE_SWITCH && node->smaenhsp0)
@@ -319,16 +336,14 @@ print_node(ibnd_node_t *node, void *user_data)
        }
 }
 
-static void
-add_suppressed(enum MAD_FIELDS field)
+static void add_suppressed(enum MAD_FIELDS field)
 {
        suppressed_fields = realloc(suppressed_fields, sizeof(enum MAD_FIELDS));
        suppressed_fields[sup_total] = field;
        sup_total++;
 }
 
-static void
-calculate_suppressed_fields(char *str)
+static void calculate_suppressed_fields(char *str)
 {
        enum MAD_FIELDS f;
        char *val, *lasts = NULL;
@@ -364,11 +379,18 @@ static int process_opt(void *context, int ch, char *optarg)
                data_counters++;
                break;
        case 3:
-               all_nodes++;
+               node_type_to_print |= PRINT_SWITCH;
+               break;
+       case 4:
+               node_type_to_print |= PRINT_CA;
                break;
+       case 5:
+               node_type_to_print |= PRINT_ROUTER;
+               break;
+       case 'G':
        case 'S':
-               switch_guid_str = optarg;
-               switch_guid = strtoull(optarg, 0, 0);
+               node_guid_str = optarg;
+               node_guid = strtoull(optarg, 0, 0);
                break;
        case 'D':
                dr_path = strdup(optarg);
@@ -376,7 +398,7 @@ static int process_opt(void *context, int ch, char *optarg)
        case 'r':
                port_config++;
                break;
-       case 'R': /* nop */
+       case 'R':               /* nop */
                break;
        default:
                return -1;
@@ -385,34 +407,49 @@ static int process_opt(void *context, int ch, char *optarg)
        return 0;
 }
 
-int
-main(int argc, char **argv)
+int main(int argc, char **argv)
 {
+       int resolved = -1;
+       ib_portid_t portid = { 0 };
        int rc = 0;
        ibnd_fabric_t *fabric = NULL;
 
-       int mgmt_classes[4] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS, IB_PERFORMANCE_CLASS};
+       int mgmt_classes[4] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS,
+               IB_PERFORMANCE_CLASS
+       };
 
        const struct ibdiag_opt opts[] = {
-               { "suppress", 's', 1, "<err1,err2,...>", "suppress errors listed" },
-               { "suppress-common", 'c', 0, NULL, "suppress some of the common counters" },
-               { "node-name-map", 1, 1, "<file>", "node name map file" },
-               { "switch", 'S', 1, "<switch_guid>", "query only <switch_guid> (hex format)"},
-               { "Direct", 'D', 1, "<dr_path>", "query only switch specified by <dr_path>"},
-               { "report-port", 'r', 0, NULL, "report port configuration information"},
-               { "GNDN", 'R', 0, NULL, "(This option is obsolete and does nothing)"},
-               { "data", 2, 0, NULL, "include the data counters in the output"},
-               { "all", 3, 0, NULL, "output all nodes (not just switches)"},
-               { 0 }
+               {"suppress", 's', 1, "<err1,err2,...>",
+                "suppress errors listed"},
+               {"suppress-common", 'c', 0, NULL,
+                "suppress some of the common counters"},
+               {"node-name-map", 1, 1, "<file>", "node name map file"},
+               {"node-guid", 'G', 1, "<node_guid>", "query only <node_guid>"},
+               {"", 'S', 1, "<node_guid>",
+                "Same as \"-G\" for backward compatibility"},
+               {"Direct", 'D', 1, "<dr_path>",
+                "query only switch specified by <dr_path>"},
+               {"report-port", 'r', 0, NULL,
+                "report port configuration information"},
+               {"GNDN", 'R', 0, NULL,
+                "(This option is obsolete and does nothing)"},
+               {"data", 2, 0, NULL, "include the data counters in the output"},
+               {"switch", 3, 0, NULL, "print data for switches only"},
+               {"ca", 4, 0, NULL, "print data for CA's only"},
+               {"router", 5, 0, NULL, "print data for routers only"},
+               {0}
        };
        char usage_args[] = "";
 
-       ibdiag_process_opts(argc, argv, "sDLG", "snSrR", opts, process_opt,
+       ibdiag_process_opts(argc, argv, NULL, "scnSrRDGL", opts, process_opt,
                            usage_args, NULL);
 
        argc -= optind;
        argv += optind;
 
+       if (!node_type_to_print)
+               node_type_to_print = PRINT_ALL;
+
        if (ibverbose)
                ibnd_debug(1);
 
@@ -420,22 +457,36 @@ main(int argc, char **argv)
        if (!ibmad_port)
                IBERROR("Failed to open port; %s:%d\n", ibd_ca, ibd_ca_port);
 
-       node_name_map = open_node_name_map(node_name_map_file);
+       if (ibd_timeout)
+               mad_rpc_set_timeout(ibmad_port, ibd_timeout);
 
-       if (switch_guid) {
-               /* limit the scan the fabric around the target */
-               ib_portid_t portid = {0};
+       node_name_map = open_node_name_map(node_name_map_file);
 
-               if (ib_resolve_portid_str_via(&portid, switch_guid_str, IB_DEST_GUID,
-                                       ibd_sm_id, ibmad_port) >= 0) {
-                       if ((fabric = ibnd_discover_fabric(ibmad_port, ibd_timeout, &portid, 1)) == NULL)
-                               IBWARN("Single node discover failed; attempting full scan\n");
-               } else
-                       IBWARN("Failed to resolve %s; attempting full scan\n", switch_guid_str);
+       /* limit the scan the fabric around the target */
+       if (dr_path) {
+               if ((resolved =
+                    ib_resolve_portid_str_via(&portid, dr_path, IB_DEST_DRPATH,
+                                              NULL, ibmad_port)) < 0)
+                       IBWARN("Failed to resolve %s; attempting full scan\n",
+                              dr_path);
+       } else if (node_guid_str) {
+               if ((resolved =
+                    ib_resolve_portid_str_via(&portid, node_guid_str,
+                                              IB_DEST_GUID, ibd_sm_id,
+                                              ibmad_port)) < 0)
+                       IBWARN("Failed to resolve %s; attempting full scan\n",
+                              node_guid_str);
        }
 
-       if (!fabric) /* do a full scan */
-               if ((fabric = ibnd_discover_fabric(ibmad_port, ibd_timeout, NULL, -1)) == NULL) {
+       if (resolved >= 0)
+               if ((fabric = ibnd_discover_fabric(ibmad_port, &portid,
+                                                  0)) == NULL)
+                       IBWARN
+                           ("Single node discover failed; attempting full scan\n");
+
+       if (!fabric)            /* do a full scan */
+               if ((fabric =
+                    ibnd_discover_fabric(ibmad_port, NULL, -1)) == NULL) {
                        fprintf(stderr, "discover failed\n");
                        rc = 1;
                        goto close_port;
@@ -443,12 +494,27 @@ main(int argc, char **argv)
 
        report_suppressed();
 
-       if (switch_guid) {
-               ibnd_node_t *node = ibnd_find_node_guid(fabric, switch_guid);
-               print_node(node, NULL);
+       if (node_guid_str) {
+               ibnd_node_t *node = ibnd_find_node_guid(fabric, node_guid);
+               if (node)
+                       print_node(node, NULL);
+               else
+                       fprintf(stderr, "Failed to find node: %s\n",
+                               node_guid_str);
        } else if (dr_path) {
                ibnd_node_t *node = ibnd_find_node_dr(fabric, dr_path);
-               print_node(node, NULL);
+               uint8_t ni[IB_SMP_DATA_SIZE];
+
+               if (!smp_query_via(ni, &portid, IB_ATTR_NODE_INFO, 0,
+                                  ibd_timeout, ibmad_port))
+                       return -1;
+               mad_decode_field(ni, IB_NODE_GUID_F, &(node_guid));
+
+               node = ibnd_find_node_guid(fabric, node_guid);
+               if (node)
+                       print_node(node, NULL);
+               else
+                       fprintf(stderr, "Failed to find node: %s\n", dr_path);
        } else
                ibnd_iter_nodes(fabric, print_node, NULL);
 
index 31b8e4c..dd4858f 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
+ * Copyright (c) 2009 Mellanox Technologies LTD.  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
@@ -33,7 +34,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -55,11 +56,10 @@ static int brief, dump_all, multicast;
 
 /*******************************************/
 
-char *
-check_switch(ib_portid_t *portid, unsigned int *nports, uint64_t *guid,
-            uint8_t *sw, char *nd)
+char *check_switch(ib_portid_t * portid, unsigned int *nports, uint64_t * guid,
+                  uint8_t * sw, char *nd)
 {
-       uint8_t ni[IB_SMP_DATA_SIZE] = {0};
+       uint8_t ni[IB_SMP_DATA_SIZE] = { 0 };
        int type;
 
        DEBUG("checking node type");
@@ -87,9 +87,8 @@ check_switch(ib_portid_t *portid, unsigned int *nports, uint64_t *guid,
 
 #define IB_MLIDS_IN_BLOCK      (IB_SMP_DATA_SIZE/2)
 
-int
-dump_mlid(char *str, int strlen, unsigned mlid, unsigned nports,
-         uint16_t mft[16][IB_MLIDS_IN_BLOCK])
+int dump_mlid(char *str, int strlen, unsigned mlid, unsigned nports,
+             uint16_t mft[16][IB_MLIDS_IN_BLOCK])
 {
        uint16_t mask;
        unsigned i, chunk, bit, nonzero = 0;
@@ -98,7 +97,7 @@ dump_mlid(char *str, int strlen, unsigned mlid, unsigned nports,
                int n = 0;
                unsigned chunks = ALIGN(nports + 1, 16) / 16;
                for (i = 0; i < chunks; i++) {
-                       mask = ntohs(mft[i][mlid%IB_MLIDS_IN_BLOCK]);
+                       mask = ntohs(mft[i][mlid % IB_MLIDS_IN_BLOCK]);
                        if (mask)
                                nonzero++;
                        n += snprintf(str + n, strlen - n, "%04hx", mask);
@@ -117,76 +116,87 @@ dump_mlid(char *str, int strlen, unsigned mlid, unsigned nports,
                chunk = i / 16;
                bit = i % 16;
 
-               mask = ntohs(mft[chunk][mlid%IB_MLIDS_IN_BLOCK]);
+               mask = ntohs(mft[chunk][mlid % IB_MLIDS_IN_BLOCK]);
                if (mask)
                        nonzero++;
-               str[i*2] = (mask & (1 << bit)) ? 'x' : ' ';
-               str[i*2+1] = ' ';
+               str[i * 2] = (mask & (1 << bit)) ? 'x' : ' ';
+               str[i * 2 + 1] = ' ';
        }
        if (!nonzero && !dump_all) {
                str[0] = 0;
                return 0;
        }
-       str[i*2] = 0;
+       str[i * 2] = 0;
        return i * 2;
 }
 
 uint16_t mft[16][IB_MLIDS_IN_BLOCK];
 
-char *
-dump_multicast_tables(ib_portid_t *portid, unsigned startlid, unsigned endlid)
+char *dump_multicast_tables(ib_portid_t * portid, unsigned startlid,
+                           unsigned endlid)
 {
-       char nd[IB_SMP_DATA_SIZE] = {0};
-       uint8_t sw[IB_SMP_DATA_SIZE] = {0};
+       char nd[IB_SMP_DATA_SIZE] = { 0 };
+       uint8_t sw[IB_SMP_DATA_SIZE] = { 0 };
        char str[512];
        char *s;
        uint64_t nodeguid;
        uint32_t mod;
-       unsigned block, i, j, e, nports, cap, chunks, startblock, lastblock;
+       unsigned block, i, j, e, nports, cap, chunks, startblock, lastblock,
+                top;
        int n = 0;
 
        if ((s = check_switch(portid, &nports, &nodeguid, sw, nd)))
                return s;
 
        mad_decode_field(sw, IB_SW_MCAST_FDB_CAP_F, &cap);
+       mad_decode_field(sw, IB_SW_MCAST_FDB_TOP_F, &top);
 
        if (!endlid || endlid > IB_MIN_MCAST_LID + cap - 1)
                endlid = IB_MIN_MCAST_LID + cap - 1;
+       if (!dump_all && top && top < endlid) {
+               if (top < IB_MIN_MCAST_LID - 1)
+                       IBWARN("illegal top mlid %x", top);
+               else
+                       endlid = top;
+       }
 
        if (!startlid)
                startlid = IB_MIN_MCAST_LID;
-
-       if (startlid < IB_MIN_MCAST_LID) {
-               IBWARN("illegal start mlid %x, set to %x", startlid, IB_MIN_MCAST_LID);
+       else if (startlid < IB_MIN_MCAST_LID) {
+               IBWARN("illegal start mlid %x, set to %x", startlid,
+                      IB_MIN_MCAST_LID);
                startlid = IB_MIN_MCAST_LID;
        }
 
        if (endlid > IB_MAX_MCAST_LID) {
-               IBWARN("illegal end mlid %x, truncate to %x", endlid, IB_MAX_MCAST_LID);
+               IBWARN("illegal end mlid %x, truncate to %x", endlid,
+                      IB_MAX_MCAST_LID);
                endlid = IB_MAX_MCAST_LID;
        }
 
-       printf("Multicast mlids [0x%x-0x%x] of switch %s guid 0x%016" PRIx64 " (%s):\n",
-               startlid, endlid, portid2str(portid), nodeguid, clean_nodedesc(nd));
+       printf("Multicast mlids [0x%x-0x%x] of switch %s guid 0x%016" PRIx64
+              " (%s):\n", startlid, endlid, portid2str(portid), nodeguid,
+              clean_nodedesc(nd));
 
        if (brief)
                printf(" MLid       Port Mask\n");
        else {
                if (nports > 9) {
                        for (i = 0, s = str; i <= nports; i++) {
-                               *s++ = (i%10) ? ' ' : '0' + i/10;
+                               *s++ = (i % 10) ? ' ' : '0' + i / 10;
                                *s++ = ' ';
                        }
                        *s = 0;
                        printf("            %s\n", str);
                }
                for (i = 0, s = str; i <= nports; i++)
-                       s += sprintf(s, "%d ", i%10);
+                       s += sprintf(s, "%d ", i % 10);
                printf("     Ports: %s\n", str);
                printf(" MLid\n");
        }
        if (ibverbose)
-               printf("Switch muticast mlids capability is 0x%d\n", cap);
+               printf("Switch multicast mlid capability is %d top is 0x%x\n",
+                      cap, top);
 
        chunks = ALIGN(nports + 1, 16) / 16;
 
@@ -194,11 +204,14 @@ dump_multicast_tables(ib_portid_t *portid, unsigned startlid, unsigned endlid)
        lastblock = endlid / IB_MLIDS_IN_BLOCK;
        for (block = startblock; block <= lastblock; block++) {
                for (j = 0; j < chunks; j++) {
-                       mod = (block - IB_MIN_MCAST_LID/IB_MLIDS_IN_BLOCK) | (j << 28);
-
-                       DEBUG("reading block %x chunk %d mod %x", block, j, mod);
-                       if (!smp_query_via(mft + j, portid,
-                                       IB_ATTR_MULTICASTFORWTBL, mod, 0, srcport))
+                       mod = (block - IB_MIN_MCAST_LID / IB_MLIDS_IN_BLOCK)
+                           | (j << 28);
+
+                       DEBUG("reading block %x chunk %d mod %x", block, j,
+                             mod);
+                       if (!smp_query_via
+                           (mft + j, portid, IB_ATTR_MULTICASTFORWTBL, mod, 0,
+                            srcport))
                                return "multicast forwarding table get failed";
                }
 
@@ -221,13 +234,12 @@ dump_multicast_tables(ib_portid_t *portid, unsigned startlid, unsigned endlid)
        return 0;
 }
 
-int
-dump_lid(char *str, int strlen, int lid, int valid)
+int dump_lid(char *str, int strlen, int lid, int valid)
 {
-       char nd[IB_SMP_DATA_SIZE] = {0};
-       uint8_t ni[IB_SMP_DATA_SIZE] = {0};
-       uint8_t pi[IB_SMP_DATA_SIZE] = {0};
-       ib_portid_t lidport = {0};
+       char nd[IB_SMP_DATA_SIZE] = { 0 };
+       uint8_t ni[IB_SMP_DATA_SIZE] = { 0 };
+       uint8_t pi[IB_SMP_DATA_SIZE] = { 0 };
+       ib_portid_t lidport = { 0 };
        static int last_port_lid, base_port_lid;
        char ntype[50], sguid[30], desc[64];
        static uint64_t portguid;
@@ -240,7 +252,8 @@ dump_lid(char *str, int strlen, int lid, int valid)
 
        if (lid <= last_port_lid) {
                if (!valid)
-                       return snprintf(str, strlen, ": (path #%d - illegal port)",
+                       return snprintf(str, strlen,
+                                       ": (path #%d - illegal port)",
                                        lid - base_port_lid);
                else if (!portguid)
                        return snprintf(str, strlen,
@@ -252,7 +265,8 @@ dump_lid(char *str, int strlen, int lid, int valid)
                                        ": (path #%d out of %d: portguid %s)",
                                        lid - base_port_lid + 1,
                                        last_port_lid - base_port_lid + 1,
-                                       mad_dump_val(IB_NODE_PORT_GUID_F, sguid, sizeof sguid, &portguid));
+                                       mad_dump_val(IB_NODE_PORT_GUID_F, sguid,
+                                                    sizeof sguid, &portguid));
                }
        }
 
@@ -279,13 +293,15 @@ dump_lid(char *str, int strlen, int lid, int valid)
        }
 
        return snprintf(str, strlen, ": (%s portguid %s: %s)",
-               mad_dump_val(IB_NODE_TYPE_F, ntype, sizeof ntype, &type),
-               mad_dump_val(IB_NODE_PORT_GUID_F, sguid, sizeof sguid, &portguid),
-               mad_dump_val(IB_NODE_DESC_F, desc, sizeof desc, clean_nodedesc(nd)));
+                       mad_dump_val(IB_NODE_TYPE_F, ntype, sizeof ntype,
+                                    &type), mad_dump_val(IB_NODE_PORT_GUID_F,
+                                                         sguid, sizeof sguid,
+                                                         &portguid),
+                       mad_dump_val(IB_NODE_DESC_F, desc, sizeof desc,
+                                    clean_nodedesc(nd)));
 }
 
-char *
-dump_unicast_tables(ib_portid_t *portid, int startlid, int endlid)
+char *dump_unicast_tables(ib_portid_t * portid, int startlid, int endlid)
 {
        char lft[IB_SMP_DATA_SIZE];
        char nd[IB_SMP_DATA_SIZE];
@@ -305,12 +321,14 @@ dump_unicast_tables(ib_portid_t *portid, int startlid, int endlid)
                endlid = top;
 
        if (endlid > IB_MAX_UCAST_LID) {
-               IBWARN("ilegal lft top %d, truncate to %d", endlid, IB_MAX_UCAST_LID);
+               IBWARN("illegal lft top %d, truncate to %d", endlid,
+                      IB_MAX_UCAST_LID);
                endlid = IB_MAX_UCAST_LID;
        }
 
-       printf("Unicast lids [0x%x-0x%x] of switch %s guid 0x%016" PRIx64 " (%s):\n",
-               startlid, endlid, portid2str(portid), nodeguid, clean_nodedesc(nd));
+       printf("Unicast lids [0x%x-0x%x] of switch %s guid 0x%016" PRIx64
+              " (%s):\n", startlid, endlid, portid2str(portid), nodeguid,
+              clean_nodedesc(nd));
 
        DEBUG("Switch top is 0x%x\n", top);
 
@@ -321,7 +339,7 @@ dump_unicast_tables(ib_portid_t *portid, int startlid, int endlid)
        for (block = startblock; block <= endblock; block++) {
                DEBUG("reading block %d", block);
                if (!smp_query_via(lft, portid, IB_ATTR_LINEARFORWTBL, block,
-                               0, srcport))
+                                  0, srcport))
                        return "linear forwarding table get failed";
                i = block * IB_SMP_DATA_SIZE;
                e = i + IB_SMP_DATA_SIZE;
@@ -330,7 +348,7 @@ dump_unicast_tables(ib_portid_t *portid, int startlid, int endlid)
                if (e > endlid + 1)
                        e = endlid + 1;
 
-               for (;i < e; i++) {
+               for (; i < e; i++) {
                        unsigned outport = lft[i % IB_SMP_DATA_SIZE];
                        unsigned valid = (outport <= nports);
 
@@ -366,16 +384,18 @@ static int process_opt(void *context, int ch, char *optarg)
 
 int main(int argc, char **argv)
 {
-       int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
-       ib_portid_t portid = {0};
+       int mgmt_classes[3] =
+           { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS };
+       ib_portid_t portid = { 0 };
        unsigned startlid = 0, endlid = 0;
        char *err;
 
        const struct ibdiag_opt opts[] = {
-               { "all", 'a', 0, NULL, "show all lids, even invalid entries" },
-               { "no_dests", 'n', 0, NULL, "do not try to resolve destinations" },
-               { "Multicast", 'M', 0, NULL, "show multicast forwarding tables" },
-               { 0 }
+               {"all", 'a', 0, NULL, "show all lids, even invalid entries"},
+               {"no_dests", 'n', 0, NULL,
+                "do not try to resolve destinations"},
+               {"Multicast", 'M', 0, NULL, "show multicast forwarding tables"},
+               {0}
        };
        char usage_args[] = "[<dest dr_path|lid|guid> [<startlid> [<endlid>]]]";
        const char *usage_examples[] = {
@@ -416,7 +436,7 @@ int main(int argc, char **argv)
                if (ib_resolve_self_via(&portid, 0, 0, srcport) < 0)
                        IBERROR("can't resolve self addr");
        } else if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                       ibd_sm_id, srcport) < 0)
+                                            ibd_sm_id, srcport) < 0)
                IBERROR("can't resolve destination port %s", argv[1]);
 
        if (multicast)
index ac8dcf4..1de3d99 100644 (file)
@@ -53,30 +53,54 @@ struct ibmad_port *srcport;
 /* for local link integrity */
 int error_port = 1;
 
-static uint16_t get_node_type(ib_portid_t *port)
+static uint16_t get_node_type(ib_portid_t * port)
 {
        uint16_t node_type = IB_NODE_TYPE_CA;
        uint8_t data[IB_SMP_DATA_SIZE];
 
        if (smp_query_via(data, port, IB_ATTR_NODE_INFO, 0, 0, srcport))
-               node_type = (uint16_t)mad_get_field(data, 0, IB_NODE_TYPE_F);
+               node_type = (uint16_t) mad_get_field(data, 0, IB_NODE_TYPE_F);
        return node_type;
 }
 
-static void build_trap144(ib_mad_notice_attr_t * n, ib_portid_t *port)
+static uint32_t get_cap_mask(ib_portid_t * port)
+{
+       uint8_t data[IB_SMP_DATA_SIZE];
+       uint32_t cap_mask = 0;
+
+       if (smp_query_via(data, port, IB_ATTR_PORT_INFO, 0, 0, srcport))
+               cap_mask = (uint32_t) mad_get_field(data, 0, IB_PORT_CAPMASK_F);
+       return cap_mask;
+}
+
+static void build_trap144_local(ib_mad_notice_attr_t * n, ib_portid_t * port)
 {
        n->generic_type = 0x80 | IB_NOTICE_TYPE_INFO;
        n->g_or_v.generic.prod_type_lsb = cl_hton16(get_node_type(port));
        n->g_or_v.generic.trap_num = cl_hton16(144);
        n->issuer_lid = cl_hton16((uint16_t) port->lid);
        n->data_details.ntc_144.lid = n->issuer_lid;
+       n->data_details.ntc_144.new_cap_mask = cl_hton32(get_cap_mask(port));
        n->data_details.ntc_144.local_changes =
            TRAP_144_MASK_OTHER_LOCAL_CHANGES;
+}
+
+static void build_trap144_nodedesc(ib_mad_notice_attr_t * n, ib_portid_t * port)
+{
+       build_trap144_local(n, port);
        n->data_details.ntc_144.change_flgs =
            TRAP_144_MASK_NODE_DESCRIPTION_CHANGE;
 }
 
-static void build_trap129(ib_mad_notice_attr_t * n, ib_portid_t *port)
+static void build_trap144_linkspeed(ib_mad_notice_attr_t * n,
+                                   ib_portid_t * port)
+{
+       build_trap144_local(n, port);
+       n->data_details.ntc_144.change_flgs =
+           TRAP_144_MASK_LINK_SPEED_ENABLE_CHANGE;
+}
+
+static void build_trap129(ib_mad_notice_attr_t * n, ib_portid_t * port)
 {
        n->generic_type = 0x80 | IB_NOTICE_TYPE_URGENT;
        n->g_or_v.generic.prod_type_lsb = cl_hton16(get_node_type(port));
@@ -121,8 +145,9 @@ typedef struct _trap_def {
        void (*build_func) (ib_mad_notice_attr_t *, ib_portid_t *);
 } trap_def_t;
 
-trap_def_t traps[3] = {
-       {"node_desc_change", build_trap144},
+static const trap_def_t traps[] = {
+       {"node_desc_change", build_trap144_nodedesc},
+       {"link_speed_enabled_change", build_trap144_linkspeed},
        {"local_link_integrity", build_trap129},
        {NULL, NULL}
 };
index 06f39ae..9752de8 100644 (file)
@@ -35,7 +35,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <inttypes.h>
 #include <string.h>
@@ -57,18 +57,25 @@ static char *node_type_str[] = {
        "iWARP RNIC"
 };
 
-static void
-ca_dump(umad_ca_t *ca)
+static void ca_dump(umad_ca_t * ca)
 {
        if (!ca->node_type)
                return;
-       printf("%s '%s'\n", ((unsigned)ca->node_type <= IB_NODE_MAX ? node_type_str[ca->node_type] : "???"), ca->ca_name);
-       printf("\t%s type: %s\n", ((unsigned)ca->node_type <= IB_NODE_MAX ? node_type_str[ca->node_type] : "???"),ca->ca_type);
+       printf("%s '%s'\n",
+              ((unsigned)ca->node_type <=
+               IB_NODE_MAX ? node_type_str[ca->node_type] : "???"),
+              ca->ca_name);
+       printf("\t%s type: %s\n",
+              ((unsigned)ca->node_type <=
+               IB_NODE_MAX ? node_type_str[ca->node_type] : "???"),
+              ca->ca_type);
        printf("\tNumber of ports: %d\n", ca->numports);
        printf("\tFirmware version: %s\n", ca->fw_ver);
        printf("\tHardware version: %s\n", ca->hw_ver);
-       printf("\tNode GUID: 0x%016llx\n", (long long unsigned)ntohll(ca->node_guid));
-       printf("\tSystem image GUID: 0x%016llx\n", (long long unsigned)ntohll(ca->system_guid));
+       printf("\tNode GUID: 0x%016llx\n",
+              (long long unsigned)ntohll(ca->node_guid));
+       printf("\tSystem image GUID: 0x%016llx\n",
+              (long long unsigned)ntohll(ca->system_guid));
 }
 
 static char *port_state_str[] = {
@@ -90,8 +97,7 @@ static char *port_phy_state_str[] = {
        "PhyTest"
 };
 
-static int
-port_dump(umad_port_t *port, int alone)
+static int port_dump(umad_port_t * port, int alone)
 {
        char *pre = "";
        char *hdrpre = "";
@@ -105,19 +111,23 @@ port_dump(umad_port_t *port, int alone)
        }
 
        printf("%sPort %d:\n", hdrpre, port->portnum);
-       printf("%sState: %s\n", pre, (unsigned)port->state <= 4 ? port_state_str[port->state] : "???");
-       printf("%sPhysical state: %s\n", pre, (unsigned)port->state <= 7 ? port_phy_state_str[port->phys_state] : "???");
+       printf("%sState: %s\n", pre,
+              (unsigned)port->state <=
+              4 ? port_state_str[port->state] : "???");
+       printf("%sPhysical state: %s\n", pre,
+              (unsigned)port->state <=
+              7 ? port_phy_state_str[port->phys_state] : "???");
        printf("%sRate: %d\n", pre, port->rate);
        printf("%sBase lid: %d\n", pre, port->base_lid);
        printf("%sLMC: %d\n", pre, port->lmc);
        printf("%sSM lid: %d\n", pre, port->sm_lid);
        printf("%sCapability mask: 0x%08x\n", pre, ntohl(port->capmask));
-       printf("%sPort GUID: 0x%016llx\n", pre, (long long unsigned)ntohll(port->port_guid));
+       printf("%sPort GUID: 0x%016llx\n", pre,
+              (long long unsigned)ntohll(port->port_guid));
        return 0;
 }
 
-static int
-ca_stat(char *ca_name, int portnum, int no_ports)
+static int ca_stat(char *ca_name, int portnum, int no_ports)
 {
        umad_ca_t ca;
        int r;
@@ -131,11 +141,16 @@ ca_stat(char *ca_name, int portnum, int no_ports)
        if (!no_ports && portnum >= 0) {
                if (portnum > ca.numports || !ca.ports[portnum]) {
                        IBWARN("%s: '%s' has no port number %d - max (%d)",
-                               ((unsigned)ca.node_type <= IB_NODE_MAX ? node_type_str[ca.node_type] : "???"),
-                               ca_name, portnum, ca.numports);
+                              ((unsigned)ca.node_type <=
+                               IB_NODE_MAX ? node_type_str[ca.
+                                                           node_type] : "???"),
+                              ca_name, portnum, ca.numports);
                        return -1;
                }
-               printf("%s: '%s'\n", ((unsigned)ca.node_type <= IB_NODE_MAX ? node_type_str[ca.node_type] : "???"), ca.ca_name);
+               printf("%s: '%s'\n",
+                      ((unsigned)ca.node_type <=
+                       IB_NODE_MAX ? node_type_str[ca.node_type] : "???"),
+                      ca.ca_name);
                port_dump(ca.ports[portnum], 1);
                return 0;
        }
@@ -152,21 +167,23 @@ ca_stat(char *ca_name, int portnum, int no_ports)
        return 0;
 }
 
-static int
-ports_list(char names[][UMAD_CA_NAME_LEN], int n)
+static int ports_list(char names[][UMAD_CA_NAME_LEN], int n)
 {
        uint64_t guids[64];
        int found, ports, i;
 
        for (i = 0, found = 0; i < n && found < 64; i++) {
-               if ((ports = umad_get_ca_portguids(names[i], guids + found, 64 - found)) < 0)
+               if ((ports =
+                    umad_get_ca_portguids(names[i], guids + found,
+                                          64 - found)) < 0)
                        return -1;
                found += ports;
        }
 
        for (i = 0; i < found; i++)
                if (guids[i])
-                       printf("0x%016llx\n", (long long unsigned)ntohll(guids[i]));
+                       printf("0x%016llx\n",
+                              (long long unsigned)ntohll(guids[i]));
        return found;
 }
 
@@ -197,10 +214,10 @@ int main(int argc, char *argv[])
        int n, i;
 
        const struct ibdiag_opt opts[] = {
-               { "list_of_cas", 'l', 0, NULL, "list all IB devices" },
-               { "short", 's', 0, NULL, "short output" },
-               { "port_list", 'p', 0, NULL, "show port list" },
-               { 0 }
+               {"list_of_cas", 'l', 0, NULL, "list all IB devices"},
+               {"short", 's', 0, NULL, "short output"},
+               {"port_list", 'p', 0, NULL, "show port list"},
+               {0}
        };
        char usage_args[] = "<ca_name> [portnum]";
        const char *usage_examples[] = {
@@ -250,9 +267,8 @@ int main(int argc, char *argv[])
        for (i = 0; i < n; i++) {
                if (list_only)
                        printf("%s\n", names[i]);
-               else
-                       if (ca_stat(names[i], -1, short_format) < 0)
-                               IBPANIC("stat of IB device '%s' failed", names[i]);
+               else if (ca_stat(names[i], -1, short_format) < 0)
+                       IBPANIC("stat of IB device '%s' failed", names[i]);
        }
 
        return 0;
index 03c0515..e5f8f1b 100644 (file)
@@ -33,7 +33,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -66,8 +66,8 @@ static int host_ncpu;
 
 static int server_respond(void *umad, int size)
 {
-       ib_rpc_t rpc = {0};
-       ib_rmpp_hdr_t rmpp = {0};
+       ib_rpc_t rpc = { 0 };
+       ib_rmpp_hdr_t rmpp = { 0 };
        ib_portid_t rport;
        uint8_t *mad = umad_get_mad(umad);
        ib_mad_addr_t *mad_addr;
@@ -124,14 +124,14 @@ static int mk_reply(int attr, void *data, int sz)
        case IB_HOSTINFO_ATTR:
                if (gethostname(s, sz) < 0)
                        snprintf(s, sz, "?hostname?");
-               s[sz-1] = 0;
+               s[sz - 1] = 0;
                if ((n = strlen(s)) >= sz - 1) {
                        ret = sz;
                        break;
                }
                s[n] = '.';
-               s += n+1;
-               sz -= n+1;
+               s += n + 1;
+               sz -= n + 1;
                ret += n + 1;
                if (getdomainname(s, sz) < 0)
                        snprintf(s, sz, "?domainname?");
@@ -186,8 +186,10 @@ static char *ibsystat_serv(void)
 
                DEBUG("got packet: attr 0x%x mod 0x%x", attr, mod);
 
-               size = mk_reply(attr, (uint8_t *) mad + IB_VENDOR_RANGE2_DATA_OFFS,
-                               sizeof(buf) - umad_size() - IB_VENDOR_RANGE2_DATA_OFFS);
+               size =
+                   mk_reply(attr, (uint8_t *) mad + IB_VENDOR_RANGE2_DATA_OFFS,
+                            sizeof(buf) - umad_size() -
+                            IB_VENDOR_RANGE2_DATA_OFFS);
 
                if (server_respond(umad, IB_VENDOR_RANGE2_DATA_OFFS + size) < 0)
                        DEBUG("respond failed");
@@ -197,8 +199,7 @@ static char *ibsystat_serv(void)
        return 0;
 }
 
-static int
-match_attr(char *str)
+static int match_attr(char *str)
 {
        if (!strcmp(str, "ping"))
                return IB_PING_ATTR;
@@ -209,7 +210,7 @@ match_attr(char *str)
        return -1;
 }
 
-static char *ibsystat(ib_portid_t *portid, int attr)
+static char *ibsystat(ib_portid_t * portid, int attr)
 {
        ib_rpc_t rpc = { 0 };
        int fd, agent, timeout, len;
@@ -255,10 +256,9 @@ static char *ibsystat(ib_portid_t *portid, int attr)
        return 0;
 }
 
-int
-build_cpuinfo(void)
+int build_cpuinfo(void)
 {
-       char line[1024] = {0}, *s, *e;
+       char line[1024] = { 0 }, *s, *e;
        FILE *f;
        int ncpu = 0;
 
@@ -281,9 +281,9 @@ build_cpuinfo(void)
                if ((e = strchr(s, '\n')))
                        *e = 0;
                if (!strncmp(line, "model name\t", 11))
-                       cpus[ncpu-1].model = strdup(s+1);
+                       cpus[ncpu - 1].model = strdup(s + 1);
                else if (!strncmp(line, "cpu MHz\t", 8))
-                       cpus[ncpu-1].mhz = strdup(s+1);
+                       cpus[ncpu - 1].mhz = strdup(s + 1);
        }
 
        fclose(f);
@@ -312,16 +312,17 @@ static int process_opt(void *context, int ch, char *optarg)
 
 int main(int argc, char **argv)
 {
-       int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
+       int mgmt_classes[3] =
+           { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS };
        int sysstat_class = IB_VENDOR_OPENIB_SYSSTAT_CLASS;
-       ib_portid_t portid = {0};
+       ib_portid_t portid = { 0 };
        int attr = IB_PING_ATTR;
        char *err;
 
        const struct ibdiag_opt opts[] = {
-               { "oui", 'o', 1, NULL, "use specified OUI number" },
-               { "Server", 'S', 0, NULL, "start in server mode" },
-               { 0 }
+               {"oui", 'o', 1, NULL, "use specified OUI number"},
+               {"Server", 'S', 0, NULL, "start in server mode"},
+               {0}
        };
        char usage_args[] = "<dest lid|guid> [<op>]";
 
@@ -342,13 +343,15 @@ int main(int argc, char **argv)
                IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port);
 
        if (server) {
-               if (mad_register_server_via(sysstat_class, 1, 0, oui, srcport) < 0)
+               if (mad_register_server_via(sysstat_class, 1, 0, oui, srcport) <
+                   0)
                        IBERROR("can't serve class %d", sysstat_class);
 
                host_ncpu = build_cpuinfo();
 
                if ((err = ibsystat_serv()))
-                       IBERROR("ibssystat to %s: %s", portid2str(&portid), err);
+                       IBERROR("ibssystat to %s: %s", portid2str(&portid),
+                               err);
                exit(0);
        }
 
@@ -356,7 +359,7 @@ int main(int argc, char **argv)
                IBERROR("can't register to sysstat class %d", sysstat_class);
 
        if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                       ibd_sm_id, srcport) < 0)
+                                     ibd_sm_id, srcport) < 0)
                IBERROR("can't resolve destination port %s", argv[0]);
 
        if ((err = ibsystat(&portid, attr)))
index a887157..92160c4 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  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
@@ -33,7 +34,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #define _GNU_SOURCE
 #include <stdio.h>
@@ -112,8 +113,7 @@ struct Node {
 Node *nodesdist[MAXHOPS];
 uint64_t target_portguid;
 
-static int
-get_node(Node *node, Port *port, ib_portid_t *portid)
+static int get_node(Node * node, Port * port, ib_portid_t * portid)
 {
        void *pi = port->portinfo, *ni = node->nodeinfo, *nd = node->nodedesc;
        char *s, *e;
@@ -144,51 +144,49 @@ get_node(Node *node, Port *port, ib_portid_t *portid)
        mad_decode_field(pi, IB_PORT_LMC_F, &port->lmc);
        mad_decode_field(pi, IB_PORT_STATE_F, &port->state);
 
-       DEBUG("portid %s: got node %" PRIx64 " '%s'", portid2str(portid), node->nodeguid, node->nodedesc);
+       DEBUG("portid %s: got node %" PRIx64 " '%s'", portid2str(portid),
+             node->nodeguid, node->nodedesc);
        return 0;
 }
 
-static int
-switch_lookup(Switch *sw, ib_portid_t *portid, int lid)
+static int switch_lookup(Switch * sw, ib_portid_t * portid, int lid)
 {
        void *si = sw->switchinfo, *fdb = sw->fdb;
 
-       if (!smp_query_via(si, portid, IB_ATTR_SWITCH_INFO, 0, timeout, srcport))
+       if (!smp_query_via(si, portid, IB_ATTR_SWITCH_INFO, 0, timeout,
+                          srcport))
                return -1;
 
        mad_decode_field(si, IB_SW_LINEAR_FDB_CAP_F, &sw->linearcap);
        mad_decode_field(si, IB_SW_LINEAR_FDB_TOP_F, &sw->linearFDBtop);
 
-       if (lid > sw->linearcap && lid > sw->linearFDBtop)
+       if (lid >= sw->linearcap && lid > sw->linearFDBtop)
                return -1;
 
        if (!smp_query_via(fdb, portid, IB_ATTR_LINEARFORWTBL, lid / 64,
-                       timeout, srcport))
+                          timeout, srcport))
                return -1;
 
        DEBUG("portid %s: forward lid %d to port %d",
-               portid2str(portid), lid, sw->fdb[lid % 64]);
+             portid2str(portid), lid, sw->fdb[lid % 64]);
        return sw->fdb[lid % 64];
 }
 
-static int
-sameport(Port *a, Port *b)
+static int sameport(Port * a, Port * b)
 {
        return a->portguid == b->portguid || (force && a->lid == b->lid);
 }
 
-static int
-extend_dpath(ib_dr_path_t *path, int nextport)
+static int extend_dpath(ib_dr_path_t * path, int nextport)
 {
-       if (path->cnt+2 >= sizeof(path->p))
+       if (path->cnt + 2 >= sizeof(path->p))
                return -1;
        ++path->cnt;
        path->p[path->cnt] = (uint8_t) nextport;
        return path->cnt;
 }
 
-static void
-dump_endnode(int dump, char *prompt, Node *node, Port *port)
+static void dump_endnode(int dump, char *prompt, Node * node, Port * port)
 {
        char *nodename = NULL;
 
@@ -201,44 +199,44 @@ dump_endnode(int dump, char *prompt, Node *node, Port *port)
                return;
        }
 
-       nodename = remap_node_name(node_name_map, node->nodeguid, node->nodedesc);
+       nodename =
+           remap_node_name(node_name_map, node->nodeguid, node->nodedesc);
 
        fprintf(f, "%s %s {0x%016" PRIx64 "} portnum %d lid %u-%u \"%s\"\n",
                prompt,
                (node->type <= IB_NODE_MAX ? node_type_str[node->type] : "???"),
-               node->nodeguid, node->type == IB_NODE_SWITCH ? 0 : port->portnum,
-               port->lid, port->lid + (1 << port->lmc) - 1,
-               nodename);
+               node->nodeguid,
+               node->type == IB_NODE_SWITCH ? 0 : port->portnum, port->lid,
+               port->lid + (1 << port->lmc) - 1, nodename);
 
        free(nodename);
 }
 
-static void
-dump_route(int dump, Node *node, int outport, Port *port)
+static void dump_route(int dump, Node * node, int outport, Port * port)
 {
        char *nodename = NULL;
 
        if (!dump && !ibverbose)
                return;
 
-       nodename = remap_node_name(node_name_map, node->nodeguid, node->nodedesc);
+       nodename =
+           remap_node_name(node_name_map, node->nodeguid, node->nodedesc);
 
        if (dump == 1)
                fprintf(f, "[%d] -> {0x%016" PRIx64 "}[%d]\n",
                        outport, port->portguid, port->portnum);
        else
-               fprintf(f, "[%d] -> %s port {0x%016" PRIx64 "}[%d] lid %u-%u \"%s\"\n",
-                       outport,
-                       (node->type <= IB_NODE_MAX ? node_type_str[node->type] : "???"),
-                       port->portguid, port->portnum,
-                       port->lid, port->lid + (1 << port->lmc) - 1,
-                       nodename);
+               fprintf(f, "[%d] -> %s port {0x%016" PRIx64
+                       "}[%d] lid %u-%u \"%s\"\n", outport,
+                       (node->type <=
+                        IB_NODE_MAX ? node_type_str[node->type] : "???"),
+                       port->portguid, port->portnum, port->lid,
+                       port->lid + (1 << port->lmc) - 1, nodename);
 
        free(nodename);
 }
 
-static int
-find_route(ib_portid_t *from, ib_portid_t *to, int dump)
+static int find_route(ib_portid_t * from, ib_portid_t * to, int dump)
 {
        Node *node, fromnode, tonode, nextnode;
        Port *port, fromport, toport, nextport;
@@ -282,7 +280,8 @@ find_route(ib_portid_t *from, ib_portid_t *to, int dump)
                                goto badpath;
 
                        if (get_node(&nextnode, &nextport, from) < 0) {
-                               IBWARN("can't reach port at %s", portid2str(from));
+                               IBWARN("can't reach port at %s",
+                                      portid2str(from));
                                return -1;
                        }
                        if (outport == 0) {
@@ -297,8 +296,10 @@ find_route(ib_portid_t *from, ib_portid_t *to, int dump)
 
                        DEBUG("ca or router node");
                        if (!sameport(port, &fromport)) {
-                               IBWARN("can't continue: reached CA or router port %" PRIx64 ", lid %d",
-                                       port->portguid, port->lid);
+                               IBWARN
+                                   ("can't continue: reached CA or router port %"
+                                    PRIx64 ", lid %d", port->portguid,
+                                    port->lid);
                                return -1;
                        }
                        /* we are at CA or router "from" - go one hop back to (hopefully) a switch */
@@ -307,16 +308,19 @@ find_route(ib_portid_t *from, ib_portid_t *to, int dump)
                                from->drpath.cnt--;
                        } else {
                                ca_src = 1;
-                               if (portnum && extend_dpath(&from->drpath, portnum) < 0)
+                               if (portnum
+                                   && extend_dpath(&from->drpath, portnum) < 0)
                                        goto badpath;
                        }
                        if (get_node(&nextnode, &nextport, from) < 0) {
-                               IBWARN("can't reach port at %s", portid2str(from));
+                               IBWARN("can't reach port at %s",
+                                      portid2str(from));
                                return -1;
                        }
                        /* fix port num to be seen from the CA or router side */
                        if (!ca_src)
-                               nextport.portnum = from->drpath.p[from->drpath.cnt+1];
+                               nextport.portnum =
+                                   from->drpath.p[from->drpath.cnt + 1];
                }
                port = &nextport;
                if (port->state != 4)
@@ -335,22 +339,22 @@ find_route(ib_portid_t *from, ib_portid_t *to, int dump)
 
 badport:
        IBWARN("Bad port state found: node \"%s\" port %d state %d",
-               clean_nodedesc(node->nodedesc), portnum, port->state);
+              clean_nodedesc(node->nodedesc), portnum, port->state);
        return -1;
 badoutport:
        IBWARN("Bad out port state found: node \"%s\" outport %d state %d",
-               clean_nodedesc(node->nodedesc), outport, port->state);
+              clean_nodedesc(node->nodedesc), outport, port->state);
        return -1;
 badtbl:
-       IBWARN("Bad forwarding table entry found at: node \"%s\" lid entry %d is %d (top %d)",
-               clean_nodedesc(node->nodedesc), to->lid, outport, sw.linearFDBtop);
+       IBWARN
+           ("Bad forwarding table entry found at: node \"%s\" lid entry %d is %d (top %d)",
+            clean_nodedesc(node->nodedesc), to->lid, outport, sw.linearFDBtop);
        return -1;
 badpath:
        IBWARN("Direct path too long!");
        return -1;
 }
 
-
 /**************************
  * MC span part
  */
@@ -358,12 +362,11 @@ badpath:
 #define HASHGUID(guid)         ((uint32_t)(((uint32_t)(guid) * 101) ^ ((uint32_t)((guid) >> 32) * 103)))
 #define HTSZ 137
 
-static int
-insert_node(Node *new)
+static int insert_node(Node * new)
 {
        static Node *nodestbl[HTSZ];
        int hash = HASHGUID(new->nodeguid) % HTSZ;
-       Node *node ;
+       Node *node;
 
        for (node = nodestbl[hash]; node; node = node->htnext)
                if (node->nodeguid == new->nodeguid) {
@@ -377,8 +380,7 @@ insert_node(Node *new)
        return 0;
 }
 
-static int
-get_port(Port *port, int portnum, ib_portid_t *portid)
+static int get_port(Port * port, int portnum, ib_portid_t * portid)
 {
        char portinfo[64];
        void *pi = portinfo;
@@ -386,7 +388,7 @@ get_port(Port *port, int portnum, ib_portid_t *portid)
        port->portnum = portnum;
 
        if (!smp_query_via(pi, portid, IB_ATTR_PORT_INFO, portnum, timeout,
-                       srcport))
+                          srcport))
                return -1;
 
        mad_decode_field(pi, IB_PORT_LID_F, &port->lid);
@@ -395,22 +397,21 @@ get_port(Port *port, int portnum, ib_portid_t *portid)
        mad_decode_field(pi, IB_PORT_PHYS_STATE_F, &port->physstate);
 
        VERBOSE("portid %s portnum %d: lid %d state %d physstate %d",
-               portid2str(portid), portnum, port->lid, port->state, port->physstate);
+               portid2str(portid), portnum, port->lid, port->state,
+               port->physstate);
        return 1;
 }
 
-static void
-link_port(Port *port, Node *node)
+static void link_port(Port * port, Node * node)
 {
        port->next = node->ports;
        node->ports = port;
 }
 
-static int
-new_node(Node *node, Port *port, ib_portid_t *path, int dist)
+static int new_node(Node * node, Port * port, ib_portid_t * path, int dist)
 {
        if (port->portguid == target_portguid) {
-               node->dist = -1;                /* tag as target */
+               node->dist = -1;        /* tag as target */
                link_port(port, node);
                dump_endnode(ibverbose, "found target", node, port);
                return 1;       /* found; */
@@ -420,7 +421,8 @@ new_node(Node *node, Port *port, ib_portid_t *path, int dist)
        if (insert_node(node) < 0)
                return -1;      /* known switch */
 
-       VERBOSE("insert dist %d node %p port %d lid %d", dist, node, port->portnum, port->lid);
+       VERBOSE("insert dist %d node %p port %d lid %d", dist, node,
+               port->portnum, port->lid);
 
        link_port(port, node);
 
@@ -432,33 +434,34 @@ new_node(Node *node, Port *port, ib_portid_t *path, int dist)
        return 0;
 }
 
-static int
-switch_mclookup(Node *node, ib_portid_t *portid, int mlid, char *map)
+static int switch_mclookup(Node * node, ib_portid_t * portid, int mlid,
+                          char *map)
 {
        Switch sw;
        char mdb[64];
        void *si = sw.switchinfo;
-       uint16_t *msets = (uint16_t *)mdb;
+       uint16_t *msets = (uint16_t *) mdb;
        int maxsets, block, i, set;
 
        memset(map, 0, 256);
 
-       if (!smp_query_via(si, portid, IB_ATTR_SWITCH_INFO, 0, timeout, srcport))
+       if (!smp_query_via(si, portid, IB_ATTR_SWITCH_INFO, 0, timeout,
+                          srcport))
                return -1;
 
        mlid -= 0xc000;
 
        mad_decode_field(si, IB_SW_MCAST_FDB_CAP_F, &sw.mccap);
 
-       if (mlid > sw.mccap)
+       if (mlid >= sw.mccap)
                return -1;
 
        block = mlid / 32;
-       maxsets = (node->numports + 15) / 16;           /* round up */
+       maxsets = (node->numports + 15) / 16;   /* round up */
 
        for (set = 0; set < maxsets; set++) {
                if (!smp_query_via(mdb, portid, IB_ATTR_MULTICASTFORWTBL,
-                   block | (set << 28), timeout, srcport))
+                                  block | (set << 28), timeout, srcport))
                        return -1;
 
                for (i = 0; i < 16; i++, map++) {
@@ -467,7 +470,8 @@ switch_mclookup(Node *node, ib_portid_t *portid, int mlid, char *map)
                                *map = 1;
                        else
                                continue;
-                       VERBOSE("Switch guid 0x%" PRIx64 ": mlid 0x%x is forwarded to port %d",
+                       VERBOSE("Switch guid 0x%" PRIx64
+                               ": mlid 0x%x is forwarded to port %d",
                                node->nodeguid, mlid + 0xc000, i + set * 16);
                }
        }
@@ -478,8 +482,7 @@ switch_mclookup(Node *node, ib_portid_t *portid, int mlid, char *map)
 /*
  * Return 1 if found, 0 if not, -1 on errors.
  */
-static Node *
-find_mcpath(ib_portid_t *from, int mlid)
+static Node *find_mcpath(ib_portid_t * from, int mlid)
 {
        Node *node, *remotenode;
        Port *port, *remoteport;
@@ -501,15 +504,14 @@ find_mcpath(ib_portid_t *from, int mlid)
                return 0;
        }
 
-       node->upnode = 0;               /* root */
+       node->upnode = 0;       /* root */
        if ((r = new_node(node, port, from, 0)) > 0) {
                if (node->type != IB_NODE_SWITCH) {
                        IBWARN("ibtracert from CA to CA is unsupported");
                        return 0;       /* ibtracert from host to itself is unsupported */
                }
 
-               if (switch_mclookup(node, from, mlid, map) < 0 ||
-                   !map[0])
+               if (switch_mclookup(node, from, mlid, map) < 0 || !map[0])
                        return 0;
                return node;
        }
@@ -521,7 +523,8 @@ find_mcpath(ib_portid_t *from, int mlid)
                        path = &node->path;
 
                        VERBOSE("dist %d node %p", dist, node);
-                       dump_endnode(ibverbose, "processing", node, node->ports);
+                       dump_endnode(ibverbose, "processing", node,
+                                    node->ports);
 
                        memset(map, 0, sizeof(map));
 
@@ -531,8 +534,10 @@ find_mcpath(ib_portid_t *from, int mlid)
                                leafport = path->drpath.p[path->drpath.cnt];
                                map[port->portnum] = 1;
                                node->upport = 0;       /* starting here */
-                               DEBUG("Starting from CA 0x%" PRIx64 " lid %d port %d (leafport %d)",
-                                       node->nodeguid, port->lid, port->portnum, leafport);
+                               DEBUG("Starting from CA 0x%" PRIx64
+                                     " lid %d port %d (leafport %d)",
+                                     node->nodeguid, port->lid, port->portnum,
+                                     leafport);
                        } else {        /* switch */
 
                                /* if starting from a leaf port fix up port (up port) */
@@ -540,8 +545,8 @@ find_mcpath(ib_portid_t *from, int mlid)
                                        node->upport = leafport;
 
                                if (switch_mclookup(node, path, mlid, map) < 0) {
-                                       IBWARN("skipping bad Switch 0x%" PRIx64 "",
-                                               node->nodeguid);
+                                       IBWARN("skipping bad Switch 0x%" PRIx64
+                                              "", node->nodeguid);
                                        continue;
                                }
                        }
@@ -558,7 +563,9 @@ find_mcpath(ib_portid_t *from, int mlid)
                                                IBERROR("out of memory");
 
                                        if (get_port(port, i, path) < 0) {
-                                               IBWARN("can't reach node %s port %d", portid2str(path), i);
+                                               IBWARN
+                                                   ("can't reach node %s port %d",
+                                                    portid2str(path), i);
                                                return 0;
                                        }
 
@@ -566,7 +573,6 @@ find_mcpath(ib_portid_t *from, int mlid)
                                                free(port);
                                                continue;
                                        }
-
 #if 0
                                        link_port(port, node);
 #endif
@@ -582,8 +588,9 @@ find_mcpath(ib_portid_t *from, int mlid)
                                        IBERROR("out of memory");
 
                                if (get_node(remotenode, remoteport, path) < 0) {
-                                       IBWARN("NodeInfo on %s port %d failed, skipping port",
-                                               portid2str(path), i);
+                                       IBWARN
+                                           ("NodeInfo on %s port %d failed, skipping port",
+                                            portid2str(path), i);
                                        path->drpath.cnt--;     /* restore path */
                                        free(remotenode);
                                        free(remoteport);
@@ -594,15 +601,17 @@ find_mcpath(ib_portid_t *from, int mlid)
                                remotenode->upport = remoteport->portnum;
                                remoteport->remoteport = port;
 
-                               if ((r = new_node(remotenode, remoteport, path, dist+1)) > 0)
+                               if ((r = new_node(remotenode, remoteport, path,
+                                                 dist + 1)) > 0)
                                        return remotenode;
 
                                if (r == 0)
                                        dump_endnode(ibverbose, "new remote",
-                                               remotenode, remoteport);
+                                                    remotenode, remoteport);
                                else if (remotenode->type == IB_NODE_SWITCH)
-                                       dump_endnode(2, "ERR: circle discovered at",
-                                               remotenode, remoteport);
+                                       dump_endnode(2,
+                                                    "ERR: circle discovered at",
+                                                    remotenode, remoteport);
 
                                path->drpath.cnt--;     /* restore path */
                        }
@@ -612,8 +621,7 @@ find_mcpath(ib_portid_t *from, int mlid)
        return 0;               /* not found */
 }
 
-static uint64_t
-find_target_portguid(ib_portid_t *to)
+static uint64_t find_target_portguid(ib_portid_t * to)
 {
        Node tonode;
        Port toport;
@@ -626,52 +634,58 @@ find_target_portguid(ib_portid_t *to)
        return toport.portguid;
 }
 
-static void
-dump_mcpath(Node *node, int dumplevel)
+static void dump_mcpath(Node * node, int dumplevel)
 {
        char *nodename = NULL;
 
        if (node->upnode)
                dump_mcpath(node->upnode, dumplevel);
 
-       nodename = remap_node_name(node_name_map, node->nodeguid, node->nodedesc);
+       nodename =
+           remap_node_name(node_name_map, node->nodeguid, node->nodedesc);
 
        if (!node->dist) {
                printf("From %s 0x%" PRIx64 " port %d lid %u-%u \"%s\"\n",
-                       (node->type <= IB_NODE_MAX ? node_type_str[node->type] : "???"),
-                       node->nodeguid, node->ports->portnum, node->ports->lid,
-                       node->ports->lid + (1 << node->ports->lmc) - 1,
-                       nodename);
+                      (node->type <=
+                       IB_NODE_MAX ? node_type_str[node->type] : "???"),
+                      node->nodeguid, node->ports->portnum, node->ports->lid,
+                      node->ports->lid + (1 << node->ports->lmc) - 1,
+                      nodename);
                goto free_name;
        }
 
        if (node->dist) {
                if (dumplevel == 1)
                        printf("[%d] -> %s {0x%016" PRIx64 "}[%d]\n",
-                               node->ports->remoteport->portnum,
-                               (node->type <= IB_NODE_MAX ? node_type_str[node->type] : "???"),
-                               node->nodeguid, node->upport);
+                              node->ports->remoteport->portnum,
+                              (node->type <=
+                               IB_NODE_MAX ? node_type_str[node->
+                                                           type] : "???"),
+                              node->nodeguid, node->upport);
                else
                        printf("[%d] -> %s 0x%" PRIx64 "[%d] lid %u \"%s\"\n",
-                               node->ports->remoteport->portnum,
-                               (node->type <= IB_NODE_MAX ? node_type_str[node->type] : "???"),
-                               node->nodeguid, node->upport,
-                               node->ports->lid, nodename);
+                              node->ports->remoteport->portnum,
+                              (node->type <=
+                               IB_NODE_MAX ? node_type_str[node->
+                                                           type] : "???"),
+                              node->nodeguid, node->upport, node->ports->lid,
+                              nodename);
        }
 
        if (node->dist < 0)
-       /* target node */
+               /* target node */
                printf("To %s 0x%" PRIx64 " port %d lid %u-%u \"%s\"\n",
-                       (node->type <= IB_NODE_MAX ? node_type_str[node->type] : "???"),
-                       node->nodeguid, node->ports->portnum, node->ports->lid,
-                       node->ports->lid + (1 << node->ports->lmc) - 1,
-                       nodename);
+                      (node->type <=
+                       IB_NODE_MAX ? node_type_str[node->type] : "???"),
+                      node->nodeguid, node->ports->portnum, node->ports->lid,
+                      node->ports->lid + (1 << node->ports->lmc) - 1,
+                      nodename);
 
 free_name:
        free(nodename);
 }
 
-static int resolve_lid(ib_portid_t  *portid, const void *srcport)
+static int resolve_lid(ib_portid_t portid, const void *srcport)
 {
        uint8_t portinfo[64];
        uint16_t lid;
@@ -711,18 +725,19 @@ static int process_opt(void *context, int ch, char *optarg)
 
 int main(int argc, char **argv)
 {
-       int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
-       ib_portid_t my_portid = {0};
-       ib_portid_t src_portid = {0};
-       ib_portid_t dest_portid = {0};
+       int mgmt_classes[3] =
+           { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS };
+       ib_portid_t my_portid = { 0 };
+       ib_portid_t src_portid = { 0 };
+       ib_portid_t dest_portid = { 0 };
        Node *endnode;
 
        const struct ibdiag_opt opts[] = {
-               { "force", 'f', 0, NULL, "force" },
-               { "no_info", 'n', 0, NULL, "simple format" },
-               { "mlid", 'm', 1, "<mlid>", "multicast trace of the mlid" },
-               { "node-name-map", 1, 1, "<file>", "node name map file" },
-               { 0 }
+               {"force", 'f', 0, NULL, "force"},
+               {"no_info", 'n', 0, NULL, "simple format"},
+               {"mlid", 'm', 1, "<mlid>", "multicast trace of the mlid"},
+               {"node-name-map", 1, 1, "<file>", "node name map file"},
+               {0}
        };
        char usage_args[] = "<src-addr> <dest-addr>";
        const char *usage_examples[] = {
@@ -736,7 +751,6 @@ int main(int argc, char **argv)
                NULL,
        };
 
-
        ibdiag_process_opts(argc, argv, NULL, NULL, opts, process_opt,
                            usage_args, usage_examples);
 
@@ -757,11 +771,11 @@ int main(int argc, char **argv)
        node_name_map = open_node_name_map(node_name_map_file);
 
        if (ib_resolve_portid_str_via(&src_portid, argv[0], ibd_dest_type,
-                       ibd_sm_id, srcport) < 0)
+                                     ibd_sm_id, srcport) < 0)
                IBERROR("can't resolve source port %s", argv[0]);
 
        if (ib_resolve_portid_str_via(&dest_portid, argv[1], ibd_dest_type,
-                       ibd_sm_id, srcport) < 0)
+                                     ibd_sm_id, srcport) < 0)
                IBERROR("can't resolve destination port %s", argv[1]);
 
        if (ibd_dest_type == IB_DEST_DRPATH) {
index de5ea90..dae1670 100644 (file)
@@ -33,7 +33,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <string.h>
@@ -80,19 +80,19 @@ static ibmad_gid_t mgid_ipoib = {
 
 struct ibmad_port *srcport;
 
-uint64_t build_mcm_rec(uint8_t *data, ibmad_gid_t mgid, ibmad_gid_t port_gid)
+uint64_t build_mcm_rec(uint8_t * data, ibmad_gid_t mgid, ibmad_gid_t port_gid)
 {
        memset(data, 0, IB_SA_DATA_SIZE);
        mad_set_array(data, 0, IB_SA_MCM_MGID_F, mgid);
        mad_set_array(data, 0, IB_SA_MCM_PORTGID_F, port_gid);
        mad_set_field(data, 0, IB_SA_MCM_JOIN_STATE_F, 1);
 
-       return IB_MCR_COMPMASK_MGID|IB_MCR_COMPMASK_PORT_GID|
-               IB_MCR_COMPMASK_JOIN_STATE;
+       return IB_MCR_COMPMASK_MGID | IB_MCR_COMPMASK_PORT_GID |
+           IB_MCR_COMPMASK_JOIN_STATE;
 }
 
-static void build_mcm_rec_umad(void *umad, ib_portid_t *dport, int method,
-                              uint64_t comp_mask, uint8_t *data)
+static void build_mcm_rec_umad(void *umad, ib_portid_t * dport, int method,
+                              uint64_t comp_mask, uint8_t * data)
 {
        ib_rpc_t rpc;
 
@@ -100,7 +100,7 @@ static void build_mcm_rec_umad(void *umad, ib_portid_t *dport, int method,
        rpc.mgtclass = IB_SA_CLASS;
        rpc.method = method;
        rpc.attr.id = IB_SA_ATTR_MCRECORD;
-       rpc.attr.mod = 0; // ???
+       rpc.attr.mod = 0;       // ???
        rpc.mask = comp_mask;
        rpc.datasz = IB_SA_DATA_SIZE;
        rpc.dataoffs = IB_SA_DATA_OFFS;
@@ -108,8 +108,8 @@ static void build_mcm_rec_umad(void *umad, ib_portid_t *dport, int method,
        mad_build_pkt(umad, &rpc, dport, NULL, data);
 }
 
-static int rereg_send(int port, int agent, ib_portid_t *dport,
-                     uint8_t *umad, int len, int method, ibmad_gid_t port_gid)
+static int rereg_send(int port, int agent, ib_portid_t * dport,
+                     uint8_t * umad, int len, int method, ibmad_gid_t port_gid)
 {
        uint8_t data[IB_SA_DATA_SIZE];
        uint64_t comp_mask;
@@ -117,7 +117,7 @@ static int rereg_send(int port, int agent, ib_portid_t *dport,
        comp_mask = build_mcm_rec(data, mgid_ipoib, port_gid);
 
        build_mcm_rec_umad(umad, dport, method, comp_mask, data);
-       if(umad_send(port, agent, umad, len, TMO, 0) < 0) {
+       if (umad_send(port, agent, umad, len, TMO, 0) < 0) {
                err("umad_send leave failed: %s\n", strerror(errno));
                return -1;
        }
@@ -127,26 +127,24 @@ static int rereg_send(int port, int agent, ib_portid_t *dport,
        return 0;
 }
 
-static int rereg_port_gid(int port, int agent, ib_portid_t *dport,
-                         uint8_t *umad, int len, ibmad_gid_t port_gid)
+static int rereg_port_gid(int port, int agent, ib_portid_t * dport,
+                         uint8_t * umad, int len, ibmad_gid_t port_gid)
 {
        uint8_t data[IB_SA_DATA_SIZE];
        uint64_t comp_mask;
 
        comp_mask = build_mcm_rec(data, mgid_ipoib, port_gid);
 
-       build_mcm_rec_umad(umad, dport, IB_MAD_METHOD_DELETE,
-                          comp_mask, data);
-       if(umad_send(port, agent, umad, len, TMO, 0) < 0) {
+       build_mcm_rec_umad(umad, dport, IB_MAD_METHOD_DELETE, comp_mask, data);
+       if (umad_send(port, agent, umad, len, TMO, 0) < 0) {
                err("umad_send leave failed: %s\n", strerror(errno));
                return -1;
        }
        dbg("umad_send leave: tid = 0x%016" PRIx64 "\n",
            mad_get_field64(umad_get_mad(umad), 0, IB_MAD_TRID_F));
 
-       build_mcm_rec_umad(umad, dport, IB_MAD_METHOD_SET,
-                          comp_mask, data);
-       if(umad_send(port, agent, umad, len, TMO, 0) < 0) {
+       build_mcm_rec_umad(umad, dport, IB_MAD_METHOD_SET, comp_mask, data);
+       if (umad_send(port, agent, umad, len, TMO, 0) < 0) {
                err("umad_send join failed: %s\n", strerror(errno));
                return -1;
        }
@@ -162,7 +160,7 @@ struct guid_trid {
        uint64_t trid;
 };
 
-static int rereg_send_all(int port, int agent, ib_portid_t *dport,
+static int rereg_send_all(int port, int agent, ib_portid_t * dport,
                          struct guid_trid *list, unsigned cnt)
 {
        uint8_t *umad;
@@ -179,7 +177,8 @@ static int rereg_send_all(int port, int agent, ib_portid_t *dport,
        }
 
        for (i = 0; i < cnt; i++) {
-               ret = rereg_port_gid(port, agent, dport, umad, len, list[i].gid);
+               ret =
+                   rereg_port_gid(port, agent, dport, umad, len, list[i].gid);
                if (ret < 0) {
                        err("rereg_send_all: rereg_port_gid 0x%016" PRIx64
                            " failed\n", list[i].guid);
@@ -189,7 +188,7 @@ static int rereg_send_all(int port, int agent, ib_portid_t *dport,
                                               IB_MAD_TRID_F);
        }
 
-       info("rereg_send_all: sent %u requests\n", cnt*2);
+       info("rereg_send_all: sent %u requests\n", cnt * 2);
 
        free(umad);
 
@@ -197,7 +196,7 @@ static int rereg_send_all(int port, int agent, ib_portid_t *dport,
 }
 
 #if 0
-static int rereg_mcm_rec_send(int port, int agent, ib_portid_t *dport, int cnt)
+static int rereg_mcm_rec_send(int port, int agent, ib_portid_t * dport, int cnt)
 {
        ib_portid_t portid;
        ibmad_gid_t port_gid;
@@ -213,7 +212,7 @@ static int rereg_mcm_rec_send(int port, int agent, ib_portid_t *dport, int cnt)
                return -1;
        }
 
-       while(cnt--) {
+       while (cnt--) {
                if (!rereg_port_gid(port, agent, dport, umad, len, port_gid))
                        ret += 2;
        }
@@ -224,14 +223,14 @@ static int rereg_mcm_rec_send(int port, int agent, ib_portid_t *dport, int cnt)
 }
 #endif
 
-static int rereg_recv(int port, int agent, ib_portid_t *dport,
-                     uint8_t *umad, int length, int tmo)
+static int rereg_recv(int port, int agent, ib_portid_t * dport,
+                     uint8_t * umad, int length, int tmo)
 {
        int ret, retry = 0;
        int len = length;
 
-       while((ret = umad_recv(port, umad, &len, tmo)) < 0 &&
-             errno == ETIMEDOUT) {
+       while ((ret = umad_recv(port, umad, &len, tmo)) < 0 &&
+              errno == ETIMEDOUT) {
                if (retry++ > 3)
                        return 0;
        }
@@ -239,15 +238,15 @@ static int rereg_recv(int port, int agent, ib_portid_t *dport,
                err("umad_recv %d failed: %s\n", ret, strerror(errno));
                return -1;
        }
-       dbg("umad_recv (retries %d), tid = 0x%016" PRIx64 ": len = %d, status = %d\n",
-           retry,
-           mad_get_field64(umad_get_mad(umad), 0, IB_MAD_TRID_F),
-           len, umad_status(umad));
+       dbg("umad_recv (retries %d), tid = 0x%016" PRIx64
+           ": len = %d, status = %d\n", retry,
+           mad_get_field64(umad_get_mad(umad), 0, IB_MAD_TRID_F), len,
+           umad_status(umad));
 
        return 1;
 }
 
-static int rereg_recv_all(int port, int agent, ib_portid_t *dport,
+static int rereg_recv_all(int port, int agent, ib_portid_t * dport,
                          struct guid_trid *list, unsigned cnt)
 {
        uint8_t *umad, *mad;
@@ -277,7 +276,7 @@ static int rereg_recv_all(int port, int agent, ib_portid_t *dport,
                        dbg("MAD status %x, method %x\n", status, method);
 
                if (status &&
-                   (method&0x7f) == (IB_MAD_METHOD_GET_RESPONSE&0x7f)) {
+                   (method & 0x7f) == (IB_MAD_METHOD_GET_RESPONSE & 0x7f)) {
                        trid = mad_get_field64(mad, 0, IB_MAD_TRID_F);
                        for (i = 0; i < cnt; i++)
                                if (trid == list[i].trid)
@@ -287,12 +286,14 @@ static int rereg_recv_all(int port, int agent, ib_portid_t *dport,
                                    trid);
                                continue;
                        }
-                       info("guid 0x%016" PRIx64 ": method = %x status = %x. Resending\n",
+                       info("guid 0x%016" PRIx64
+                            ": method = %x status = %x. Resending\n",
                             ntohll(list[i].guid), method, status);
                        rereg_port_gid(port, agent, dport, umad, len,
                                       list[i].gid);
-                       list[i].trid = mad_get_field64(umad_get_mad(umad), 0,
-                                                      IB_MAD_TRID_F);
+                       list[i].trid =
+                           mad_get_field64(umad_get_mad(umad), 0,
+                                           IB_MAD_TRID_F);
                }
        }
 
@@ -302,7 +303,7 @@ static int rereg_recv_all(int port, int agent, ib_portid_t *dport,
        return 0;
 }
 
-static int rereg_query_all(int port, int agent, ib_portid_t *dport,
+static int rereg_query_all(int port, int agent, ib_portid_t * dport,
                           struct guid_trid *list, unsigned cnt)
 {
        uint8_t *umad, *mad;
@@ -319,7 +320,7 @@ static int rereg_query_all(int port, int agent, ib_portid_t *dport,
                return -1;
        }
 
-       for ( i = 0; i < cnt; i++ ) {
+       for (i = 0; i < cnt; i++) {
                ret = rereg_send(port, agent, dport, umad, len,
                                 IB_MAD_METHOD_GET, list[i].gid);
                if (ret < 0) {
@@ -362,7 +363,7 @@ static int rereg_mcm_rec_recv(int port, int agent, int cnt)
                return -1;
        }
 
-       for ( i = 0; i < cnt; i++ ) {
+       for (i = 0; i < cnt; i++) {
                int retry;
                retry = 0;
                while (umad_recv(port, umad, &len, TMO) < 0 &&
@@ -373,10 +374,10 @@ static int rereg_mcm_rec_recv(int port, int agent, int cnt)
                                free(umad);
                                return -1;
                        }
-               dbg("umad_recv %d (retries %d), tid = 0x%016" PRIx64 ": len = %d, status = %d\n",
-                   i, retry,
-                   mad_get_field64(umad_get_mad(umad), 0, IB_MAD_TRID_F),
-                   len, umad_status(umad));
+               dbg("umad_recv %d (retries %d), tid = 0x%016" PRIx64
+                   ": len = %d, status = %d\n", i, retry,
+                   mad_get_field64(umad_get_mad(umad), 0, IB_MAD_TRID_F), len,
+                   umad_status(umad));
                mad = umad_get_mad(umad);
        }
 
@@ -387,7 +388,8 @@ static int rereg_mcm_rec_recv(int port, int agent, int cnt)
 
 #define MAX_CLIENTS 50
 
-static int rereg_and_test_port(char *guid_file, int port, int agent, ib_portid_t *dport, int timeout)
+static int rereg_and_test_port(char *guid_file, int port, int agent,
+                              ib_portid_t * dport, int timeout)
 {
        char line[256];
        FILE *f;
@@ -399,7 +401,8 @@ static int rereg_and_test_port(char *guid_file, int port, int agent, ib_portid_t
 
        list = calloc(MAX_CLIENTS, sizeof(*list));
        if (!list) {
-               err("cannot alloc mem for guid/trid list: %s\n", strerror(errno));
+               err("cannot alloc mem for guid/trid list: %s\n",
+                   strerror(errno));
                return -1;
        }
 
@@ -435,7 +438,7 @@ static int rereg_and_test_port(char *guid_file, int port, int agent, ib_portid_t
 int main(int argc, char **argv)
 {
        char *guid_file = "port_guids.list";
-       int mgmt_classes[2] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS};
+       int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
        ib_portid_t dport_id;
        int port, agent;
        uint8_t *umad, *mad;
@@ -448,7 +451,6 @@ int main(int argc, char **argv)
        if (!srcport)
                err("Failed to open port");
 
-
 #if 1
        ib_resolve_smlid_via(&dport_id, TMO, srcport);
 #else
@@ -459,14 +461,12 @@ int main(int argc, char **argv)
        if (!dport_id.qkey)
                dport_id.qkey = IB_DEFAULT_QP1_QKEY;
 
-
        len = umad_size() + 256;
        umad = calloc(1, len);
        if (!umad) {
                err("cannot alloc mem for umad: %s\n", strerror(errno));
                return -1;
        }
-
 #if 1
        port = mad_rpc_portid(srcport);
 #else
index b0bda49..d70af9e 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2004-2008 Voltaire Inc.  All rights reserved.
  * Copyright (c) 2007 Xsigo Systems Inc.  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
@@ -34,7 +35,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -86,8 +87,9 @@ struct perf_count_ext {
 
 static uint8_t pc[1024];
 
-struct perf_count perf_count = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-struct perf_count_ext perf_count_ext = {0,0,0,0,0,0,0,0,0,0};
+struct perf_count perf_count =
+    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+struct perf_count_ext perf_count_ext = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
 #define ALL_PORTS 0xFF
 
@@ -98,16 +100,15 @@ struct perf_count_ext perf_count_ext = {0,0,0,0,0,0,0,0,0,0};
  * for fields < 32 bits in length.
  */
 
-static void aggregate_4bit(uint32_t *dest, uint32_t val)
+static void aggregate_4bit(uint32_t * dest, uint32_t val)
 {
-       if ((((*dest) + val) < (*dest))
-           || ((*dest) + val) > 0xf)
+       if ((((*dest) + val) < (*dest)) || ((*dest) + val) > 0xf)
                (*dest) = 0xf;
        else
                (*dest) = (*dest) + val;
 }
 
-static void aggregate_8bit(uint32_t *dest, uint32_t val)
+static void aggregate_8bit(uint32_t * dest, uint32_t val)
 {
        if ((((*dest) + val) < (*dest))
            || ((*dest) + val) > 0xff)
@@ -116,7 +117,7 @@ static void aggregate_8bit(uint32_t *dest, uint32_t val)
                (*dest) = (*dest) + val;
 }
 
-static void aggregate_16bit(uint32_t *dest, uint32_t val)
+static void aggregate_16bit(uint32_t * dest, uint32_t val)
 {
        if ((((*dest) + val) < (*dest))
            || ((*dest) + val) > 0xffff)
@@ -125,7 +126,7 @@ static void aggregate_16bit(uint32_t *dest, uint32_t val)
                (*dest) = (*dest) + val;
 }
 
-static void aggregate_32bit(uint32_t *dest, uint32_t val)
+static void aggregate_32bit(uint32_t * dest, uint32_t val)
 {
        if (((*dest) + val) < (*dest))
                (*dest) = 0xffffffff;
@@ -133,7 +134,7 @@ static void aggregate_32bit(uint32_t *dest, uint32_t val)
                (*dest) = (*dest) + val;
 }
 
-static void aggregate_64bit(uint64_t *dest, uint64_t val)
+static void aggregate_64bit(uint64_t * dest, uint64_t val)
 {
        if (((*dest) + val) < (*dest))
                (*dest) = 0xffffffffffffffffULL;
@@ -185,7 +186,7 @@ static void aggregate_perfcounters(void)
        aggregate_32bit(&perf_count.xmtwait, val);
 }
 
-static void output_aggregate_perfcounters(ib_portid_t *portid)
+static void output_aggregate_perfcounters(ib_portid_t * portid)
 {
        char buf[1024];
        uint32_t val = ALL_PORTS;
@@ -197,13 +198,19 @@ static void output_aggregate_perfcounters(ib_portid_t *portid)
        mad_encode_field(pc, IB_PC_LINK_RECOVERS_F, &perf_count.linkrecovers);
        mad_encode_field(pc, IB_PC_LINK_DOWNED_F, &perf_count.linkdowned);
        mad_encode_field(pc, IB_PC_ERR_RCV_F, &perf_count.rcverrors);
-       mad_encode_field(pc, IB_PC_ERR_PHYSRCV_F, &perf_count.rcvremotephyerrors);
-       mad_encode_field(pc, IB_PC_ERR_SWITCH_REL_F, &perf_count.rcvswrelayerrors);
+       mad_encode_field(pc, IB_PC_ERR_PHYSRCV_F,
+                        &perf_count.rcvremotephyerrors);
+       mad_encode_field(pc, IB_PC_ERR_SWITCH_REL_F,
+                        &perf_count.rcvswrelayerrors);
        mad_encode_field(pc, IB_PC_XMT_DISCARDS_F, &perf_count.xmtdiscards);
-       mad_encode_field(pc, IB_PC_ERR_XMTCONSTR_F, &perf_count.xmtconstrainterrors);
-       mad_encode_field(pc, IB_PC_ERR_RCVCONSTR_F, &perf_count.rcvconstrainterrors);
-       mad_encode_field(pc, IB_PC_ERR_LOCALINTEG_F, &perf_count.linkintegrityerrors);
-       mad_encode_field(pc, IB_PC_ERR_EXCESS_OVR_F, &perf_count.excbufoverrunerrors);
+       mad_encode_field(pc, IB_PC_ERR_XMTCONSTR_F,
+                        &perf_count.xmtconstrainterrors);
+       mad_encode_field(pc, IB_PC_ERR_RCVCONSTR_F,
+                        &perf_count.rcvconstrainterrors);
+       mad_encode_field(pc, IB_PC_ERR_LOCALINTEG_F,
+                        &perf_count.linkintegrityerrors);
+       mad_encode_field(pc, IB_PC_ERR_EXCESS_OVR_F,
+                        &perf_count.excbufoverrunerrors);
        mad_encode_field(pc, IB_PC_VL15_DROPPED_F, &perf_count.vl15dropped);
        mad_encode_field(pc, IB_PC_XMT_BYTES_F, &perf_count.xmtdata);
        mad_encode_field(pc, IB_PC_RCV_BYTES_F, &perf_count.rcvdata);
@@ -213,7 +220,8 @@ static void output_aggregate_perfcounters(ib_portid_t *portid)
 
        mad_dump_perfcounters(buf, sizeof buf, pc, sizeof pc);
 
-       printf("# Port counters: %s port %d\n%s", portid2str(portid), ALL_PORTS, buf);
+       printf("# Port counters: %s port %d\n%s", portid2str(portid), ALL_PORTS,
+              buf);
 }
 
 static void aggregate_perfcounters_ext(void)
@@ -243,30 +251,39 @@ static void aggregate_perfcounters_ext(void)
        aggregate_64bit(&perf_count_ext.portmulticastrcvpkts, val64);
 }
 
-static void output_aggregate_perfcounters_ext(ib_portid_t *portid)
+static void output_aggregate_perfcounters_ext(ib_portid_t * portid)
 {
        char buf[1024];
        uint32_t val = ALL_PORTS;
 
        /* set port_select to 255 to emulate AllPortSelect */
        mad_encode_field(pc, IB_PC_EXT_PORT_SELECT_F, &val);
-       mad_encode_field(pc, IB_PC_EXT_COUNTER_SELECT_F, &perf_count_ext.counterselect);
-       mad_encode_field(pc, IB_PC_EXT_XMT_BYTES_F, &perf_count_ext.portxmitdata);
-       mad_encode_field(pc, IB_PC_EXT_RCV_BYTES_F, &perf_count_ext.portrcvdata);
-       mad_encode_field(pc, IB_PC_EXT_XMT_PKTS_F, &perf_count_ext.portxmitpkts);
+       mad_encode_field(pc, IB_PC_EXT_COUNTER_SELECT_F,
+                        &perf_count_ext.counterselect);
+       mad_encode_field(pc, IB_PC_EXT_XMT_BYTES_F,
+                        &perf_count_ext.portxmitdata);
+       mad_encode_field(pc, IB_PC_EXT_RCV_BYTES_F,
+                        &perf_count_ext.portrcvdata);
+       mad_encode_field(pc, IB_PC_EXT_XMT_PKTS_F,
+                        &perf_count_ext.portxmitpkts);
        mad_encode_field(pc, IB_PC_EXT_RCV_PKTS_F, &perf_count_ext.portrcvpkts);
-       mad_encode_field(pc, IB_PC_EXT_XMT_UPKTS_F, &perf_count_ext.portunicastxmitpkts);
-       mad_encode_field(pc, IB_PC_EXT_RCV_UPKTS_F, &perf_count_ext.portunicastrcvpkts);
-       mad_encode_field(pc, IB_PC_EXT_XMT_MPKTS_F, &perf_count_ext.portmulticastxmitpkits);
-       mad_encode_field(pc, IB_PC_EXT_RCV_MPKTS_F, &perf_count_ext.portmulticastrcvpkts);
+       mad_encode_field(pc, IB_PC_EXT_XMT_UPKTS_F,
+                        &perf_count_ext.portunicastxmitpkts);
+       mad_encode_field(pc, IB_PC_EXT_RCV_UPKTS_F,
+                        &perf_count_ext.portunicastrcvpkts);
+       mad_encode_field(pc, IB_PC_EXT_XMT_MPKTS_F,
+                        &perf_count_ext.portmulticastxmitpkits);
+       mad_encode_field(pc, IB_PC_EXT_RCV_MPKTS_F,
+                        &perf_count_ext.portmulticastrcvpkts);
 
        mad_dump_perfcounters_ext(buf, sizeof buf, pc, sizeof pc);
 
-       printf("# Port counters: %s port %d\n%s", portid2str(portid), ALL_PORTS, buf);
+       printf("# Port extended counters: %s port %d\n%s", portid2str(portid),
+              ALL_PORTS, buf);
 }
 
 static void dump_perfcounters(int extended, int timeout, uint16_t cap_mask,
-                             ib_portid_t *portid, int port, int aggregate)
+                             ib_portid_t * portid, int port, int aggregate)
 {
        char buf[1024];
 
@@ -275,17 +292,22 @@ static void dump_perfcounters(int extended, int timeout, uint16_t cap_mask,
                                   IB_GSI_PORT_COUNTERS, srcport))
                        IBERROR("perfquery");
                if (!(cap_mask & 0x1000)) {
-                       /* if PortCounters:PortXmitWait not suppported clear this counter */
+                       /* if PortCounters:PortXmitWait not supported clear this counter */
+                       IBWARN
+                           ("PortXmitWait not indicated so ignore this counter");
                        perf_count.xmtwait = 0;
-                       mad_encode_field(pc, IB_PC_XMT_WAIT_F, &perf_count.xmtwait);
+                       mad_encode_field(pc, IB_PC_XMT_WAIT_F,
+                                        &perf_count.xmtwait);
                }
                if (aggregate)
                        aggregate_perfcounters();
                else
                        mad_dump_perfcounters(buf, sizeof buf, pc, sizeof pc);
        } else {
-               if (!(cap_mask & 0x200)) /* 1.2 errata: bit 9 is extended counter support */
-                       IBWARN("PerfMgt ClassPortInfo 0x%x extended counters not indicated\n", cap_mask);
+               if (!(cap_mask & 0x200))        /* 1.2 errata: bit 9 is extended counter support */
+                       IBWARN
+                           ("PerfMgt ClassPortInfo 0x%x extended counters not indicated\n",
+                            cap_mask);
 
                if (!pma_query_via(pc, portid, port, timeout,
                                   IB_GSI_PORT_COUNTERS_EXT, srcport))
@@ -293,14 +315,22 @@ static void dump_perfcounters(int extended, int timeout, uint16_t cap_mask,
                if (aggregate)
                        aggregate_perfcounters_ext();
                else
-                       mad_dump_perfcounters_ext(buf, sizeof buf, pc, sizeof pc);
+                       mad_dump_perfcounters_ext(buf, sizeof buf, pc,
+                                                 sizeof pc);
        }
 
-       if (!aggregate)
-               printf("# Port counters: %s port %d\n%s", portid2str(portid), port, buf);
+       if (!aggregate) {
+               if (extended)
+                       printf("# Port extended counters: %s port %d\n%s",
+                              portid2str(portid), port, buf);
+               else
+                       printf("# Port counters: %s port %d\n%s",
+                              portid2str(portid), port, buf);
+       }
 }
 
-static void reset_counters(int extended, int timeout, int mask, ib_portid_t *portid, int port)
+static void reset_counters(int extended, int timeout, int mask,
+                          ib_portid_t * portid, int port)
 {
        if (extended != 1) {
                if (!performance_reset_via(pc, portid, port, mask, timeout,
@@ -313,53 +343,56 @@ static void reset_counters(int extended, int timeout, int mask, ib_portid_t *por
        }
 }
 
-static int reset, reset_only, all_ports, loop_ports, port, extended, xmt_sl, rcv_sl;
+static int reset, reset_only, all_ports, loop_ports, port, extended, xmt_sl,
+    rcv_sl;
 
-void xmt_sl_query(ib_portid_t *portid, int port, int mask)
+void xmt_sl_query(ib_portid_t * portid, int port, int mask)
 {
        char buf[1024];
 
        if (reset_only) {
                if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
-                                               IB_GSI_PORT_XMIT_DATA_SL, srcport))
+                                          IB_GSI_PORT_XMIT_DATA_SL, srcport))
                        IBERROR("perfslreset");
                return;
        }
 
        if (!pma_query_via(pc, portid, port, ibd_timeout,
-                               IB_GSI_PORT_XMIT_DATA_SL, srcport))
+                          IB_GSI_PORT_XMIT_DATA_SL, srcport))
                IBERROR("perfslquery");
 
        mad_dump_perfcounters_xmt_sl(buf, sizeof buf, pc, sizeof pc);
-       printf("# PortXmitDataSL counters: %s port %d\n%s", portid2str(portid), port, buf);
+       printf("# PortXmitDataSL counters: %s port %d\n%s", portid2str(portid),
+              port, buf);
 
        if (reset)
                if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
-                                               IB_GSI_PORT_XMIT_DATA_SL, srcport))
+                                          IB_GSI_PORT_XMIT_DATA_SL, srcport))
                        IBERROR("perfslreset");
 }
 
-void rcv_sl_query(ib_portid_t *portid, int port, int mask)
+void rcv_sl_query(ib_portid_t * portid, int port, int mask)
 {
        char buf[1024];
 
        if (reset_only) {
                if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
-                                               IB_GSI_PORT_RCV_DATA_SL, srcport))
+                                          IB_GSI_PORT_RCV_DATA_SL, srcport))
                        IBERROR("perfslreset");
                return;
        }
 
        if (!pma_query_via(pc, portid, port, ibd_timeout,
-                               IB_GSI_PORT_RCV_DATA_SL, srcport))
+                          IB_GSI_PORT_RCV_DATA_SL, srcport))
                IBERROR("perfslquery");
 
        mad_dump_perfcounters_rcv_sl(buf, sizeof buf, pc, sizeof pc);
-       printf("# PortRcvDataSL counters: %s port %d\n%s", portid2str(portid), port, buf);
+       printf("# PortRcvDataSL counters: %s port %d\n%s", portid2str(portid),
+              port, buf);
 
        if (reset)
                if (!performance_reset_via(pc, portid, port, mask, ibd_timeout,
-                                               IB_GSI_PORT_RCV_DATA_SL, srcport))
+                                          IB_GSI_PORT_RCV_DATA_SL, srcport))
                        IBERROR("perfslreset");
 }
 
@@ -396,8 +429,10 @@ static int process_opt(void *context, int ch, char *optarg)
 
 int main(int argc, char **argv)
 {
-       int mgmt_classes[4] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS, IB_PERFORMANCE_CLASS};
-       ib_portid_t portid = {0};
+       int mgmt_classes[4] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS,
+               IB_PERFORMANCE_CLASS
+       };
+       ib_portid_t portid = { 0 };
        int mask = 0xffff;
        uint16_t cap_mask;
        int all_ports_loop = 0;
@@ -408,14 +443,14 @@ int main(int argc, char **argv)
        int i;
 
        const struct ibdiag_opt opts[] = {
-               { "extended", 'x', 0, NULL, "show extended port counters" },
-               { "xmtsl", 'X', 0, NULL, "show Xmt SL port counters" },
-               { "rcvsl", 'S', 0, NULL, "show Rcv SL port counters" },
-               { "all_ports", 'a', 0, NULL, "show aggregated counters" },
-               { "loop_ports", 'l', 0, NULL, "iterate through each port" },
-               { "reset_after_read", 'r', 0, NULL, "reset counters after read" },
-               { "Reset_only", 'R', 0, NULL, "only reset counters" },
-               { 0 }
+               {"extended", 'x', 0, NULL, "show extended port counters"},
+               {"xmtsl", 'X', 0, NULL, "show Xmt SL port counters"},
+               {"rcvsl", 'S', 0, NULL, "show Rcv SL port counters"},
+               {"all_ports", 'a', 0, NULL, "show aggregated counters"},
+               {"loop_ports", 'l', 0, NULL, "iterate through each port"},
+               {"reset_after_read", 'r', 0, NULL, "reset counters after read"},
+               {"Reset_only", 'R', 0, NULL, "only reset counters"},
+               {0}
        };
        char usage_args[] = " [<lid|guid> [[port] [reset_mask]]]";
        const char *usage_examples[] = {
@@ -450,7 +485,7 @@ int main(int argc, char **argv)
 
        if (argc) {
                if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                               ibd_sm_id, srcport) < 0)
+                                             ibd_sm_id, srcport) < 0)
                        IBERROR("can't resolve destination port %s", argv[0]);
        } else {
                if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0)
@@ -464,7 +499,7 @@ int main(int argc, char **argv)
        /* ClassPortInfo should be supported as part of libibmad */
        memcpy(&cap_mask, pc + 2, sizeof(cap_mask));    /* CapabilityMask */
        cap_mask = ntohs(cap_mask);
-       if (!(cap_mask & 0x100)) { /* bit 8 is AllPortSelect */
+       if (!(cap_mask & 0x100)) {      /* bit 8 is AllPortSelect */
                if (!all_ports && port == ALL_PORTS)
                        IBERROR("AllPortSelect not supported");
                if (all_ports)
@@ -483,7 +518,7 @@ int main(int argc, char **argv)
 
        if (all_ports_loop || (loop_ports && (all_ports || port == ALL_PORTS))) {
                if (smp_query_via(data, &portid, IB_ATTR_NODE_INFO, 0, 0,
-                               srcport) < 0)
+                                 srcport) < 0)
                        IBERROR("smp query nodeinfo failed");
                node_type = mad_get_field(data, 0, IB_NODE_TYPE_F);
                mad_decode_field(data, IB_NODE_NPORTS_F, &num_ports);
@@ -492,14 +527,16 @@ int main(int argc, char **argv)
 
                if (node_type == IB_NODE_SWITCH) {
                        if (smp_query_via(data, &portid, IB_ATTR_SWITCH_INFO,
-                                       0, 0, srcport) < 0)
+                                         0, 0, srcport) < 0)
                                IBERROR("smp query nodeinfo failed");
-                       enhancedport0 = mad_get_field(data, 0, IB_SW_ENHANCED_PORT0_F);
+                       enhancedport0 =
+                           mad_get_field(data, 0, IB_SW_ENHANCED_PORT0_F);
                        if (enhancedport0)
                                start_port = 0;
                }
                if (all_ports_loop && !loop_ports)
-                       IBWARN("Emulating AllPortSelect by iterating through all ports");
+                       IBWARN
+                           ("Emulating AllPortSelect by iterating through all ports");
        }
 
        if (reset_only)
@@ -507,31 +544,30 @@ int main(int argc, char **argv)
 
        if (all_ports_loop || (loop_ports && (all_ports || port == ALL_PORTS))) {
                for (i = start_port; i <= num_ports; i++)
-                       dump_perfcounters(extended, ibd_timeout, cap_mask, &portid, i,
-                                         (all_ports_loop && !loop_ports));
+                       dump_perfcounters(extended, ibd_timeout, cap_mask,
+                                         &portid, i, (all_ports_loop
+                                                      && !loop_ports));
                if (all_ports_loop && !loop_ports) {
                        if (extended != 1)
                                output_aggregate_perfcounters(&portid);
                        else
                                output_aggregate_perfcounters_ext(&portid);
                }
-       }
-       else
-               dump_perfcounters(extended, ibd_timeout, cap_mask, &portid, port, 0);
+       } else
+               dump_perfcounters(extended, ibd_timeout, cap_mask, &portid,
+                                 port, 0);
 
        if (!reset)
                goto done;
 
 do_reset:
-
        if (argc <= 2 && !extended && (cap_mask & 0x1000))
-               mask |= (1<<16); /* reset portxmitwait */
+               mask |= (1 << 16);      /* reset portxmitwait */
 
        if (all_ports_loop || (loop_ports && (all_ports || port == ALL_PORTS))) {
                for (i = start_port; i <= num_ports; i++)
                        reset_counters(extended, ibd_timeout, mask, &portid, i);
-       }
-       else
+       } else
                reset_counters(extended, ibd_timeout, mask, &portid, port);
 
 done:
index 5920eda..d880261 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * Produced at Lawrence Livermore National Laboratory.
  * Written by Ira Weiny <weiny2@llnl.gov>.
@@ -39,7 +40,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <unistd.h>
 #include <stdio.h>
@@ -70,7 +71,7 @@ struct query_res {
        void *p_result_madw;
 };
 
-typedef struct bind_handle * bind_handle_t;
+typedef struct bind_handle *bind_handle_t;
 
 struct query_params {
        ib_gid_t sgid, dgid, gid, mgid;
@@ -93,7 +94,7 @@ struct query_cmd {
        uint16_t query_type;
        const char *usage;
        int (*handler) (const struct query_cmd * q, bind_handle_t h,
-                       struct query_params *p, int argc, char *argv[]);
+                       struct query_params * p, int argc, char *argv[]);
 };
 
 static char *node_name_map_file = NULL;
@@ -197,7 +198,7 @@ static void *get_query_rec(void *mad, unsigned i)
        return (uint8_t *) mad + IB_SA_DATA_OFFS + i * (offset << 3);
 }
 
-static unsigned valid_gid(ib_gid_t *gid)
+static unsigned valid_gid(ib_gid_t * gid)
 {
        ib_gid_t zero_gid;
        memset(&zero_gid, 0, sizeof zero_gid);
@@ -385,12 +386,12 @@ static void dump_one_portinfo_record(void *data)
        mad_dump_portinfo(buf, sizeof(buf), pi, sizeof(*pi));
        format_buf(buf, buf2, sizeof(buf2));
        printf("PortInfoRecord dump:\n"
-               "\tRID:\n"
-               "\t\tEndPortLid..............%u\n"
-               "\t\tPortNum.................0x%x\n"
-               "\t\tReserved................0x%x\n"
-               "\tPortInfo dump:\n\t\t%s",
-               cl_ntoh16(pir->lid), pir->port_num, pir->resv, buf2);
+              "\tRID:\n"
+              "\t\tEndPortLid..............%u\n"
+              "\t\tPortNum.................0x%x\n"
+              "\t\tReserved................0x%x\n"
+              "\tPortInfo dump:\n\t\t%s",
+              cl_ntoh16(pir->lid), pir->port_num, pir->resv, buf2);
 }
 
 static void dump_one_mcmember_record(void *data)
@@ -456,8 +457,7 @@ static void dump_multicast_member_record(void *data)
         * This gives us a node name to print, if available.
         */
        for (i = 0; i < result.result_cnt; i++) {
-               ib_node_record_t *nr =
-                   get_query_rec(result.p_result_madw, i);
+               ib_node_record_t *nr = get_query_rec(result.p_result_madw, i);
                if (nr->node_info.port_guid ==
                    p_mcmr->port_gid.unicast.interface_id) {
                        node_name =
@@ -840,8 +840,7 @@ static int get_and_dump_all_records(bind_handle_t h, uint16_t attr_id,
 /**
  * return the lid from the node descriptor (name) supplied
  */
-static int
-get_lid_from_name(bind_handle_t h, const char *name, uint16_t* lid)
+static int get_lid_from_name(bind_handle_t h, const char *name, uint16_t * lid)
 {
        ib_node_record_t *node_record = NULL;
        ib_node_info_t *p_ni = NULL;
@@ -924,7 +923,7 @@ static int parse_lid_and_ports(bind_handle_t h,
 
 #define cl_hton8(x) (x)
 #define CHECK_AND_SET_VAL(val, size, comp_with, target, name, mask) \
-       if ((int##size##_t) val > (int##size##_t) comp_with) { \
+       if ((int##size##_t) val != (int##size##_t) comp_with) { \
                target = cl_hton##size((uint##size##_t) val); \
                comp_mask |= IB_##name##_COMPMASK_##mask; \
        }
@@ -1046,7 +1045,8 @@ static int query_path_records(const struct query_cmd *q, bind_handle_t h,
        ib_path_rec_set_qos_class(&pr, qos_class);
        CHECK_AND_SET_VAL_AND_SEL(p->mtu, pr.mtu, PR, MTU, SELEC);
        CHECK_AND_SET_VAL_AND_SEL(p->rate, pr.rate, PR, RATE, SELEC);
-       CHECK_AND_SET_VAL_AND_SEL(p->pkt_life, pr.pkt_life, PR, PKTLIFETIME, SELEC);
+       CHECK_AND_SET_VAL_AND_SEL(p->pkt_life, pr.pkt_life, PR, PKTLIFETIME,
+                                 SELEC);
 
        return get_and_dump_any_records(h, IB_SA_ATTR_PATHRECORD, 0, comp_mask,
                                        &pr, 0, dump_path_record);
@@ -1456,8 +1456,7 @@ static int process_opt(void *context, int ch, char *optarg)
                node_name_map_file = strdup(optarg);
                break;
        case 4:
-               if (!isxdigit(*optarg) &&
-                   !(optarg = getpass("SM_Key: "))) {
+               if (!isxdigit(*optarg) && !(optarg = getpass("SM_Key: "))) {
                        fprintf(stderr, "cannot get SM_Key\n");
                        ibdiag_show_usage();
                }
@@ -1545,6 +1544,10 @@ static int process_opt(void *context, int ch, char *optarg)
                p->numb_path = strtoul(optarg, NULL, 0);
                break;
        case 18:
+               if (!isxdigit(*optarg) && !(optarg = getpass("P_Key: "))) {
+                       fprintf(stderr, "cannot get P_Key\n");
+                       ibdiag_show_usage();
+               }
                p->pkey = (uint16_t) strtoul(optarg, NULL, 0);
                break;
        case 'Q':
@@ -1563,6 +1566,10 @@ static int process_opt(void *context, int ch, char *optarg)
                p->pkt_life = (uint8_t) strtoul(optarg, NULL, 0);
                break;
        case 'q':
+               if (!isxdigit(*optarg) && !(optarg = getpass("Q_Key: "))) {
+                       fprintf(stderr, "cannot get Q_Key\n");
+                       ibdiag_show_usage();
+               }
                p->qkey = strtoul(optarg, NULL, 0);
                break;
        case 'T':
@@ -1602,7 +1609,8 @@ int main(int argc, char **argv)
                {"p", 'p', 0, NULL, "get PathRecord info"},
                {"N", 'N', 0, NULL, "get NodeRecord info"},
                {"L", 'L', 0, NULL, "return the Lids of the name specified"},
-               {"l", 'l', 0, NULL, "return the unique Lid of the name specified"},
+               {"l", 'l', 0, NULL,
+                "return the unique Lid of the name specified"},
                {"G", 'G', 0, NULL, "return the Guids of the name specified"},
                {"O", 'O', 0, NULL, "return name for the Lid specified"},
                {"U", 'U', 0, NULL, "return name for the Guid specified"},
@@ -1621,33 +1629,48 @@ int main(int argc, char **argv)
                 " <src:dst> where src and dst are either node names or LIDs"},
                {"sgid-to-dgid", 2, 1, "<sgid-dgid>", "get a PathRecord for"
                 " <sgid-dgid> where sgid and dgid are addresses in IPv6 format"},
-               {"node-name-map", 3, 1, "<file>", "specify a node name map file"},
-               {"smkey", 4, 1, "<val>", "SA SM_Key value for the query."
+               {"node-name-map", 3, 1, "<file>",
+                "specify a node name map file"},
+               {"smkey", 4, 1, "<val>",
+                "SA SM_Key value for the query."
+                " If non-numeric value (like 'x') is specified then"
+                " saquery will prompt for a value"},
+               {"slid", 5, 1, "<lid>", "Source LID (PathRecord)"},
+               {"dlid", 6, 1, "<lid>", "Destination LID (PathRecord)"},
+               {"mlid", 7, 1, "<lid>", "Multicast LID (MCMemberRecord)"},
+               {"sgid", 14, 1, "<gid>",
+                "Source GID (IPv6 format) (PathRecord)"},
+               {"dgid", 15, 1, "<gid>",
+                "Destination GID (IPv6 format) (PathRecord)"},
+               {"gid", 16, 1, "<gid>", "Port GID (MCMemberRecord)"},
+               {"mgid", 17, 1, "<gid>", "Multicast GID (MCMemberRecord)"},
+               {"reversible", 'r', 1, NULL, "Reversible path (PathRecord)"},
+               {"numb_path", 'n', 1, NULL, "Number of paths (PathRecord)"},
+               {"pkey", 18, 1, NULL, "P_Key (PathRecord, MCMemberRecord)."
+                " If non-numeric value (like 'x') is specified then"
+                " saquery will prompt for a value"},
+               {"qos_class", 'Q', 1, NULL, "QoS Class (PathRecord)"},
+               {"sl", 19, 1, NULL,
+                "Service level (PathRecord, MCMemberRecord)"},
+               {"mtu", 'M', 1, NULL,
+                "MTU and selector (PathRecord, MCMemberRecord)"},
+               {"rate", 'R', 1, NULL,
+                "Rate and selector (PathRecord, MCMemberRecord)"},
+               {"pkt_lifetime", 20, 1, NULL,
+                "Packet lifetime and selector (PathRecord, MCMemberRecord)"},
+               {"qkey", 'q', 1, NULL, "Q_Key (MCMemberRecord)."
                 " If non-numeric value (like 'x') is specified then"
                 " saquery will prompt for a value"},
-               { "slid", 5, 1, "<lid>", "Source LID (PathRecord)" },
-               { "dlid", 6, 1, "<lid>", "Destination LID (PathRecord)" },
-               { "mlid", 7, 1, "<lid>", "Multicast LID (MCMemberRecord)" },
-               { "sgid", 14, 1, "<gid>", "Source GID (IPv6 format) (PathRecord)" },
-               { "dgid", 15, 1, "<gid>", "Destination GID (IPv6 format) (PathRecord)" },
-               { "gid", 16, 1, "<gid>", "Port GID (MCMemberRecord)" },
-               { "mgid", 17, 1, "<gid>", "Multicast GID (MCMemberRecord)" },
-               { "reversible", 'r', 1, NULL, "Reversible path (PathRecord)" },
-               { "numb_path", 'n', 1, NULL, "Number of paths (PathRecord)" },
-               { "pkey", 18, 1, NULL, "P_Key (PathRecord, MCMemberRecord)" },
-               { "qos_calss", 'Q', 1, NULL, "QoS Class (PathRecord)"},
-               { "sl", 19, 1, NULL, "Service level (PathRecord, MCMemberRecord)" },
-               { "mtu", 'M', 1, NULL, "MTU and selector (PathRecord, MCMemberRecord)" },
-               { "rate", 'R', 1, NULL, "Rate and selector (PathRecord, MCMemberRecord)" },
-               { "pkt_lifetime", 20, 1, NULL, "Packet lifetime and selector (PathRecord, MCMemberRecord)" },
-               { "qkey", 'q', 1, NULL, "Q_Key (MCMemberRecord)" },
-               { "tclass", 'T', 1, NULL, "Traffic Class (PathRecord, MCMemberRecord)" },
-               { "flow_label", 'F', 1, NULL, "Flow Label (PathRecord, MCMemberRecord)" },
-               { "hop_limit", 'H', 1, NULL, "Hop limit (PathRecord, MCMemberRecord)" },
-               { "scope", 21, 1, NULL, "Scope (MCMemberRecord)" },
-               { "join_state", 'J', 1, NULL, "Join state (MCMemberRecord)" },
-               { "proxy_join", 'X', 1, NULL, "Proxy join (MCMemberRecord)" },
-               { 0 }
+               {"tclass", 'T', 1, NULL,
+                "Traffic Class (PathRecord, MCMemberRecord)"},
+               {"flow_label", 'F', 1, NULL,
+                "Flow Label (PathRecord, MCMemberRecord)"},
+               {"hop_limit", 'H', 1, NULL,
+                "Hop limit (PathRecord, MCMemberRecord)"},
+               {"scope", 21, 1, NULL, "Scope (MCMemberRecord)"},
+               {"join_state", 'J', 1, NULL, "Join state (MCMemberRecord)"},
+               {"proxy_join", 'X', 1, NULL, "Proxy join (MCMemberRecord)"},
+               {0}
        };
 
        memset(&params, 0, sizeof params);
index ebf6a47..77495f9 100644 (file)
@@ -33,7 +33,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -50,7 +50,8 @@ static uint8_t sminfo[1024];
 
 struct ibmad_port *srcport;
 
-int strdata, xdata=1, bindata;
+int strdata, xdata = 1, bindata;
+
 enum {
        SMINFO_NOTACT,
        SMINFO_DISCOVER,
@@ -92,17 +93,18 @@ static int process_opt(void *context, int ch, char *optarg)
 
 int main(int argc, char **argv)
 {
-       int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
+       int mgmt_classes[3] =
+           { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS };
        int mod = 0;
-       ib_portid_t portid = {0};
+       ib_portid_t portid = { 0 };
        uint8_t *p;
        uint64_t guid = 0, key = 0;
 
        const struct ibdiag_opt opts[] = {
-               { "state", 's', 1, "<0-3>", "set SM state"},
-               { "priority", 'p', 1, "<0-15>", "set SM priority"},
-               { "activity", 'a', 1, NULL, "set activity count"},
-               { 0 }
+               {"state", 's', 1, "<0-3>", "set SM state"},
+               {"priority", 'p', 1, "<0-15>", "set SM priority"},
+               {"activity", 'a', 1, NULL, "set activity count"},
+               {0}
        };
        char usage_args[] = "<sm_lid|sm_dr_path> [modifier]";
 
@@ -121,7 +123,7 @@ int main(int argc, char **argv)
 
        if (argc) {
                if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                               0, srcport) < 0)
+                                             0, srcport) < 0)
                        IBERROR("can't resolve destination port %s", argv[0]);
        } else {
                if (ib_resolve_smlid_via(&portid, ibd_timeout, srcport) < 0)
@@ -136,12 +138,11 @@ int main(int argc, char **argv)
 
        if (mod) {
                if (!(p = smp_set_via(sminfo, &portid, IB_ATTR_SMINFO, mod,
-                               ibd_timeout, srcport)))
-                       IBERROR("query");
-       } else
-               if (!(p = smp_query_via(sminfo, &portid, IB_ATTR_SMINFO, 0,
-                               ibd_timeout, srcport)))
+                                     ibd_timeout, srcport)))
                        IBERROR("query");
+       } else if (!(p = smp_query_via(sminfo, &portid, IB_ATTR_SMINFO, 0,
+                                      ibd_timeout, srcport)))
+               IBERROR("query");
 
        mad_decode_field(sminfo, IB_SMINFO_GUID_F, &guid);
        mad_decode_field(sminfo, IB_SMINFO_ACT_F, &act);
@@ -149,8 +150,9 @@ int main(int argc, char **argv)
        mad_decode_field(sminfo, IB_SMINFO_PRIO_F, &prio);
        mad_decode_field(sminfo, IB_SMINFO_STATE_F, &state);
 
-       printf("sminfo: sm lid %d sm guid 0x%" PRIx64 ", activity count %u priority %d state %d %s\n",
-               portid.lid, guid, act, prio, state, STATESTR(state));
+       printf("sminfo: sm lid %d sm guid 0x%" PRIx64
+              ", activity count %u priority %d state %d %s\n", portid.lid,
+              guid, act, prio, state, STATESTR(state));
 
        mad_rpc_close_port(srcport);
        exit(0);
index 03277b3..a4f427d 100644 (file)
@@ -35,7 +35,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <inttypes.h>
 #include <string.h>
@@ -59,89 +59,86 @@ typedef struct {
 } DRPath;
 
 struct drsmp {
-       uint8_t         base_version;
-       uint8_t         mgmt_class;
-       uint8_t         class_version;
-       uint8_t         method;
-       uint16_t        status;
-       uint8_t         hop_ptr;
-       uint8_t         hop_cnt;
-       uint64_t        tid;
-       uint16_t        attr_id;
-       uint16_t        resv;
-       uint32_t        attr_mod;
-       uint64_t        mkey;
-       uint16_t        dr_slid;
-       uint16_t        dr_dlid;
-       uint8_t         reserved[28];
-       uint8_t         data[64];
-       uint8_t         initial_path[64];
-       uint8_t         return_path[64];
+       uint8_t base_version;
+       uint8_t mgmt_class;
+       uint8_t class_version;
+       uint8_t method;
+       uint16_t status;
+       uint8_t hop_ptr;
+       uint8_t hop_cnt;
+       uint64_t tid;
+       uint16_t attr_id;
+       uint16_t resv;
+       uint32_t attr_mod;
+       uint64_t mkey;
+       uint16_t dr_slid;
+       uint16_t dr_dlid;
+       uint8_t reserved[28];
+       uint8_t data[64];
+       uint8_t initial_path[64];
+       uint8_t return_path[64];
 };
 
-void
-drsmp_get_init(void *umad, DRPath *path, int attr, int mod)
+void drsmp_get_init(void *umad, DRPath * path, int attr, int mod)
 {
        struct drsmp *smp = (struct drsmp *)(umad_get_mad(umad));
 
-       memset(smp, 0, sizeof (*smp));
+       memset(smp, 0, sizeof(*smp));
 
-       smp->base_version  = 1;
-       smp->mgmt_class    = IB_SMI_DIRECT_CLASS;
+       smp->base_version = 1;
+       smp->mgmt_class = IB_SMI_DIRECT_CLASS;
        smp->class_version = 1;
 
-       smp->method        = 1;
-       smp->attr_id       = (uint16_t)htons((uint16_t)attr);
-       smp->attr_mod      = htonl(mod);
-       smp->tid           = htonll(drmad_tid++);
-       smp->dr_slid       = 0xffff;
-       smp->dr_dlid       = 0xffff;
+       smp->method = 1;
+       smp->attr_id = (uint16_t) htons((uint16_t) attr);
+       smp->attr_mod = htonl(mod);
+       smp->tid = htonll(drmad_tid++);
+       smp->dr_slid = 0xffff;
+       smp->dr_dlid = 0xffff;
 
        umad_set_addr(umad, 0xffff, 0, 0, 0);
 
        if (path)
-               memcpy(smp->initial_path, path->path, path->hop_cnt+1);
+               memcpy(smp->initial_path, path->path, path->hop_cnt + 1);
 
        smp->hop_cnt = (uint8_t) path->hop_cnt;
 }
 
-void
-smp_get_init(void *umad, int lid, int attr, int mod)
+void smp_get_init(void *umad, int lid, int attr, int mod)
 {
        struct drsmp *smp = (struct drsmp *)(umad_get_mad(umad));
 
-       memset(smp, 0, sizeof (*smp));
+       memset(smp, 0, sizeof(*smp));
 
-       smp->base_version  = 1;
-       smp->mgmt_class    = IB_SMI_CLASS;
+       smp->base_version = 1;
+       smp->mgmt_class = IB_SMI_CLASS;
        smp->class_version = 1;
 
-       smp->method        = 1;
-       smp->attr_id       = (uint16_t)htons((uint16_t)attr);
-       smp->attr_mod      = htonl(mod);
-       smp->tid           = htonll(drmad_tid++);
+       smp->method = 1;
+       smp->attr_id = (uint16_t) htons((uint16_t) attr);
+       smp->attr_mod = htonl(mod);
+       smp->tid = htonll(drmad_tid++);
 
        umad_set_addr(umad, lid, 0, 0, 0);
 }
 
-void
-drsmp_set_init(void *umad, DRPath *path, int attr, int mod, void *data)
+void drsmp_set_init(void *umad, DRPath * path, int attr, int mod, void *data)
 {
        struct drsmp *smp = (struct drsmp *)(umad_get_mad(umad));
 
-       memset(smp, 0, sizeof (*smp));
+       memset(smp, 0, sizeof(*smp));
 
-       smp->method        = 2;         /* SET */
-       smp->attr_id       = (uint16_t)htons((uint16_t)attr);
-       smp->attr_mod      = htonl(mod);
-       smp->tid           = htonll(drmad_tid++);
-       smp->dr_slid       = 0xffff;
-       smp->dr_dlid       = 0xffff;
+       smp->method = 2;        /* SET */
+       smp->attr_id = (uint16_t) htons((uint16_t) attr);
+       smp->attr_mod = htonl(mod);
+       smp->tid = htonll(drmad_tid++);
+       smp->dr_slid = 0xffff;
+       smp->dr_dlid = 0xffff;
 
        umad_set_addr(umad, 0xffff, 0, 0, 0);
 
        if (path)
-               memcpy(smp->initial_path, path->path, path->hop_cnt+1);
+               memcpy(smp->initial_path, path->path, path->hop_cnt + 1);
 
        if (data)
                memcpy(smp->data, data, sizeof smp->data);
@@ -149,8 +146,7 @@ drsmp_set_init(void *umad, DRPath *path, int attr, int mod, void *data)
        smp->hop_cnt = (uint8_t) path->hop_cnt;
 }
 
-char *
-drmad_status_str(struct drsmp *drsmp)
+char *drmad_status_str(struct drsmp *drsmp)
 {
        switch (drsmp->status) {
        case 0:
@@ -161,8 +157,7 @@ drmad_status_str(struct drsmp *drsmp)
        return "unknown error";
 }
 
-int
-str2DRPath(char *str, DRPath *path)
+int str2DRPath(char *str, DRPath * path)
 {
        char *s;
 
@@ -172,15 +167,15 @@ str2DRPath(char *str, DRPath *path)
        while (str && *str) {
                if ((s = strchr(str, ',')))
                        *s = 0;
-               path->path[++path->hop_cnt] = (char) atoi(str);
+               path->path[++path->hop_cnt] = (char)atoi(str);
                if (!s)
                        break;
-               str = s+1;
+               str = s + 1;
        }
 
 #if 0
        if (path->path[0] != 0 ||
-          (path->hop_cnt > 0 && dev_port && path->path[1] != dev_port)) {
+           (path->hop_cnt > 0 && dev_port && path->path[1] != dev_port)) {
                DEBUG("hop 0 != 0 or hop 1 != dev_port");
                return -1;
        }
@@ -220,8 +215,8 @@ int main(int argc, char *argv[])
        int length;
 
        const struct ibdiag_opt opts[] = {
-               { "sring", 's', 0, NULL, ""},
-               { 0 }
+               {"sring", 's', 0, NULL, ""},
+               {0}
        };
        char usage_args[] = "<dlid|dr_path> <attr> [mod]";
        const char *usage_examples[] = {
@@ -288,7 +283,8 @@ int main(int argc, char *argv[])
        if (!dump_char) {
                xdump(stdout, 0, smp->data, 64);
                if (smp->status)
-                       fprintf(stdout, "SMP status: 0x%x\n", ntohs(smp->status));
+                       fprintf(stdout, "SMP status: 0x%x\n",
+                               ntohs(smp->status));
                goto exit;
        }
 
index 2ed1e65..95b269e 100644 (file)
@@ -33,7 +33,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -53,7 +53,7 @@
 
 struct ibmad_port *srcport;
 
-typedef char *(op_fn_t)(ib_portid_t *dest, char **argv, int argc);
+typedef char *(op_fn_t) (ib_portid_t * dest, char **argv, int argc);
 
 typedef struct match_rec {
        const char *name, *alias;
@@ -61,18 +61,18 @@ typedef struct match_rec {
        unsigned opt_portnum;
 } match_rec_t;
 
-static op_fn_t node_desc, node_info, port_info, switch_info, pkey_table,
-       sl2vl_table, vlarb_table, guid_info;
+static op_fn_t node_desc, node_info, port_info, switch_info, pkey_table,
+    sl2vl_table, vlarb_table, guid_info;
 
 static const match_rec_t match_tbl[] = {
-       { "NodeInfo", "NI", node_info },
-       { "NodeDesc", "ND", node_desc },
-       { "PortInfo", "PI", port_info, 1 },
-       { "SwitchInfo", "SI", switch_info },
-       { "PKeyTable", "PKeys", pkey_table, 1 },
-       { "SL2VLTable", "SL2VL", sl2vl_table, 1 },
-       { "VLArbitration", "VLArb", vlarb_table, 1 },
-       { "GUIDInfo", "GI", guid_info },
+       {"NodeInfo", "NI", node_info},
+       {"NodeDesc", "ND", node_desc},
+       {"PortInfo", "PI", port_info, 1},
+       {"SwitchInfo", "SI", switch_info},
+       {"PKeyTable", "PKeys", pkey_table, 1},
+       {"SL2VLTable", "SL2VL", sl2vl_table, 1},
+       {"VLArbitration", "VLArb", vlarb_table, 1},
+       {"GUIDInfo", "GI", guid_info},
        {0}
 };
 
@@ -80,15 +80,14 @@ static char *node_name_map_file = NULL;
 static nn_map_t *node_name_map = NULL;
 
 /*******************************************/
-static char *
-node_desc(ib_portid_t *dest, char **argv, int argc)
+static char *node_desc(ib_portid_t * dest, char **argv, int argc)
 {
-       int       node_type, l;
-       uint64_t  node_guid;
-       char      nd[IB_SMP_DATA_SIZE];
-       uint8_t   data[IB_SMP_DATA_SIZE];
-       char      dots[128];
-       char     *nodename = NULL;
+       int node_type, l;
+       uint64_t node_guid;
+       char nd[IB_SMP_DATA_SIZE];
+       uint8_t data[IB_SMP_DATA_SIZE];
+       char dots[128];
+       char *nodename = NULL;
 
        if (!smp_query_via(data, dest, IB_ATTR_NODE_INFO, 0, 0, srcport))
                return "node info query failed";
@@ -115,8 +114,7 @@ node_desc(ib_portid_t *dest, char **argv, int argc)
        return 0;
 }
 
-static char *
-node_info(ib_portid_t *dest, char **argv, int argc)
+static char *node_info(ib_portid_t * dest, char **argv, int argc)
 {
        char buf[2048];
        char data[IB_SMP_DATA_SIZE];
@@ -130,8 +128,7 @@ node_info(ib_portid_t *dest, char **argv, int argc)
        return 0;
 }
 
-static char *
-port_info(ib_portid_t *dest, char **argv, int argc)
+static char *port_info(ib_portid_t * dest, char **argv, int argc)
 {
        char buf[2048];
        char data[IB_SMP_DATA_SIZE];
@@ -149,8 +146,7 @@ port_info(ib_portid_t *dest, char **argv, int argc)
        return 0;
 }
 
-static char *
-switch_info(ib_portid_t *dest, char **argv, int argc)
+static char *switch_info(ib_portid_t * dest, char **argv, int argc)
 {
        char buf[2048];
        char data[IB_SMP_DATA_SIZE];
@@ -164,8 +160,7 @@ switch_info(ib_portid_t *dest, char **argv, int argc)
        return 0;
 }
 
-static char *
-pkey_table(ib_portid_t *dest, char **argv, int argc)
+static char *pkey_table(ib_portid_t * dest, char **argv, int argc)
 {
        uint8_t data[IB_SMP_DATA_SIZE];
        int i, j, k;
@@ -188,16 +183,16 @@ pkey_table(ib_portid_t *dest, char **argv, int argc)
 
        if ((t == IB_NODE_SWITCH) && (portnum != 0)) {
                if (!smp_query_via(data, dest, IB_ATTR_SWITCH_INFO, 0, 0,
-                               srcport))
+                                  srcport))
                        return "switch info failed";
                mad_decode_field(data, IB_SW_PARTITION_ENFORCE_CAP_F, &n);
        } else
                mad_decode_field(data, IB_NODE_PARTITION_CAP_F, &n);
 
        for (i = 0; i < (n + 31) / 32; i++) {
-               mod =  i | (portnum << 16);
+               mod = i | (portnum << 16);
                if (!smp_query_via(data, dest, IB_ATTR_PKEY_TBL, mod, 0,
-                               srcport))
+                                  srcport))
                        return "pkey table query failed";
                if (i + 1 == (n + 31) / 32)
                        k = ((n + 7 - i * 32) / 8) * 8;
@@ -205,12 +200,11 @@ pkey_table(ib_portid_t *dest, char **argv, int argc)
                        k = 32;
                p = (uint16_t *) data;
                for (j = 0; j < k; j += 8, p += 8) {
-                       printf("%4u: 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n",
-                               (i * 32) + j,
-                               ntohs(p[0]), ntohs(p[1]),
-                               ntohs(p[2]), ntohs(p[3]),
-                               ntohs(p[4]), ntohs(p[5]),
-                               ntohs(p[6]), ntohs(p[7]));
+                       printf
+                           ("%4u: 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n",
+                            (i * 32) + j, ntohs(p[0]), ntohs(p[1]),
+                            ntohs(p[2]), ntohs(p[3]), ntohs(p[4]), ntohs(p[5]),
+                            ntohs(p[6]), ntohs(p[7]));
                }
        }
        printf("%d pkeys capacity for this port\n", n);
@@ -218,7 +212,7 @@ pkey_table(ib_portid_t *dest, char **argv, int argc)
        return 0;
 }
 
-static char *sl2vl_dump_table_entry(ib_portid_t *dest, int in, int out)
+static char *sl2vl_dump_table_entry(ib_portid_t * dest, int in, int out)
 {
        char buf[2048];
        char data[IB_SMP_DATA_SIZE];
@@ -233,8 +227,7 @@ static char *sl2vl_dump_table_entry(ib_portid_t *dest, int in, int out)
        return 0;
 }
 
-static char *
-sl2vl_table(ib_portid_t *dest, char **argv, int argc)
+static char *sl2vl_table(ib_portid_t * dest, char **argv, int argc)
 {
        uint8_t data[IB_SMP_DATA_SIZE];
        int type, num_ports, portnum = 0;
@@ -254,14 +247,14 @@ sl2vl_table(ib_portid_t *dest, char **argv, int argc)
 
        printf("# SL2VL table: %s\n", portid2str(dest));
        printf("#                 SL: |");
-       for (i = 0 ; i < 16 ; i++)
+       for (i = 0; i < 16; i++)
                printf("%2d|", i);
        printf("\n");
 
        if (type != IB_NODE_SWITCH)
                return sl2vl_dump_table_entry(dest, 0, 0);
 
-       for (i = 0 ; i <= num_ports ; i++) {
+       for (i = 0; i <= num_ports; i++) {
                ret = sl2vl_dump_table_entry(dest, i, portnum);
                if (ret)
                        return ret;
@@ -269,21 +262,22 @@ sl2vl_table(ib_portid_t *dest, char **argv, int argc)
        return 0;
 }
 
-static char *vlarb_dump_table_entry(ib_portid_t *dest, int portnum, int offset, unsigned cap)
+static char *vlarb_dump_table_entry(ib_portid_t * dest, int portnum, int offset,
+                                   unsigned cap)
 {
        char buf[2048];
        char data[IB_SMP_DATA_SIZE];
 
        if (!smp_query_via(data, dest, IB_ATTR_VL_ARBITRATION,
-                       (offset << 16) | portnum, 0, srcport))
+                          (offset << 16) | portnum, 0, srcport))
                return "vl arb query failed";
        mad_dump_vlarbitration(buf, sizeof(buf), data, cap * 2);
        printf("%s", buf);
        return 0;
 }
 
-static char *vlarb_dump_table(ib_portid_t *dest, int portnum,
-       char *name, int offset, int cap)
+static char *vlarb_dump_table(ib_portid_t * dest, int portnum,
+                             char *name, int offset, int cap)
 {
        char *ret;
 
@@ -296,8 +290,7 @@ static char *vlarb_dump_table(ib_portid_t *dest, int portnum,
        return ret;
 }
 
-static char *
-vlarb_table(ib_portid_t *dest, char **argv, int argc)
+static char *vlarb_table(ib_portid_t * dest, char **argv, int argc)
 {
        uint8_t data[IB_SMP_DATA_SIZE];
        int portnum = 0;
@@ -310,18 +303,19 @@ vlarb_table(ib_portid_t *dest, char **argv, int argc)
        /* port number of 0 could mean SP0 or port MAD arrives on */
        if (portnum == 0) {
                if (!smp_query_via(data, dest, IB_ATTR_NODE_INFO, 0, 0,
-                               srcport))
+                                  srcport))
                        return "node info query failed";
 
                mad_decode_field(data, IB_NODE_TYPE_F, &type);
                if (type == IB_NODE_SWITCH) {
                        if (!smp_query_via(data, dest, IB_ATTR_SWITCH_INFO, 0,
-                                       0, srcport))
+                                          0, srcport))
                                return "switch info query failed";
                        mad_decode_field(data, IB_SW_ENHANCED_PORT0_F, &enhsp0);
                        if (!enhsp0) {
-                               printf("# No VLArbitration tables (BSP0): %s port %d\n",
-                                       portid2str(dest), 0);
+                               printf
+                                   ("# No VLArbitration tables (BSP0): %s port %d\n",
+                                    portid2str(dest), 0);
                                return 0;
                        }
                }
@@ -331,10 +325,10 @@ vlarb_table(ib_portid_t *dest, char **argv, int argc)
                return "port info query failed";
 
        mad_decode_field(data, IB_PORT_VL_ARBITRATION_LOW_CAP_F, &lowcap);
-       mad_decode_field(data, IB_PORT_VL_ARBITRATION_HIGH_CAP_F,&highcap);
+       mad_decode_field(data, IB_PORT_VL_ARBITRATION_HIGH_CAP_F, &highcap);
 
        printf("# VLArbitration tables: %s port %d LowCap %d HighCap %d\n",
-                       portid2str(dest), portnum, lowcap, highcap);
+              portid2str(dest), portnum, lowcap, highcap);
 
        if (lowcap > 0)
                ret = vlarb_dump_table(dest, portnum, "Low", 1, lowcap);
@@ -345,8 +339,7 @@ vlarb_table(ib_portid_t *dest, char **argv, int argc)
        return ret;
 }
 
-static char *
-guid_info(ib_portid_t *dest, char **argv, int argc)
+static char *guid_info(ib_portid_t * dest, char **argv, int argc)
 {
        uint8_t data[IB_SMP_DATA_SIZE];
        int i, j, k;
@@ -360,9 +353,9 @@ guid_info(ib_portid_t *dest, char **argv, int argc)
        mad_decode_field(data, IB_PORT_GUID_CAP_F, &n);
 
        for (i = 0; i < (n + 7) / 8; i++) {
-               mod =  i;
+               mod = i;
                if (!smp_query_via(data, dest, IB_ATTR_GUID_INFO, mod, 0,
-                               srcport))
+                                  srcport))
                        return "guid info query failed";
                if (i + 1 == (n + 7) / 8)
                        k = ((n + 1 - i * 8) / 2) * 2;
@@ -370,9 +363,8 @@ guid_info(ib_portid_t *dest, char **argv, int argc)
                        k = 8;
                p = (uint64_t *) data;
                for (j = 0; j < k; j += 2, p += 2) {
-                       printf("%4u: 0x%016"PRIx64" 0x%016"PRIx64"\n",
-                               (i * 8) + j,
-                               ntohll(p[0]), ntohll(p[1]));
+                       printf("%4u: 0x%016" PRIx64 " 0x%016" PRIx64 "\n",
+                              (i * 8) + j, ntohll(p[0]), ntohll(p[1]));
                }
        }
        printf("%d guids capacity for this port\n", n);
@@ -409,17 +401,19 @@ static int process_opt(void *context, int ch, char *optarg)
 int main(int argc, char **argv)
 {
        char usage_args[1024];
-       int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
-       ib_portid_t portid = {0};
+       int mgmt_classes[3] =
+           { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS };
+       ib_portid_t portid = { 0 };
        char *err;
        op_fn_t *fn;
        const match_rec_t *r;
        int n;
 
        const struct ibdiag_opt opts[] = {
-               { "combined", 'c', 0, NULL, "use Combined route address argument"},
-               { "node-name-map", 1, 1, "<file>", "node name map file"},
-               { 0 }
+               {"combined", 'c', 0, NULL,
+                "use Combined route address argument"},
+               {"node-name-map", 1, 1, "<file>", "node name map file"},
+               {0}
        };
        const char *usage_examples[] = {
                "portinfo 3 1\t\t\t\t# portinfo by lid, with port modifier",
@@ -431,7 +425,7 @@ int main(int argc, char **argv)
 
        n = sprintf(usage_args, "<op> <dest dr_path|lid|guid> [op params]\n"
                    "\nSupported ops (and aliases, case insensitive):\n");
-       for (r = match_tbl ; r->name ; r++) {
+       for (r = match_tbl; r->name; r++) {
                n += snprintf(usage_args + n, sizeof(usage_args) - n,
                              "  %s (%s) <addr>%s\n", r->name,
                              r->alias ? r->alias : "",
@@ -460,9 +454,9 @@ int main(int argc, char **argv)
 
        if (ibd_dest_type != IB_DEST_DRSLID) {
                if (ib_resolve_portid_str_via(&portid, argv[1], ibd_dest_type,
-                               ibd_sm_id, srcport) < 0)
+                                             ibd_sm_id, srcport) < 0)
                        IBERROR("can't resolve destination port %s", argv[1]);
-               if ((err = fn(&portid, argv+2, argc-2)))
+               if ((err = fn(&portid, argv + 2, argc - 2)))
                        IBERROR("operation %s: %s", argv[0], err);
        } else {
                char concat[64];
@@ -470,9 +464,9 @@ int main(int argc, char **argv)
                memset(concat, 0, 64);
                snprintf(concat, sizeof(concat), "%s %s", argv[1], argv[2]);
                if (ib_resolve_portid_str_via(&portid, concat, ibd_dest_type,
-                               ibd_sm_id, srcport) < 0)
+                                             ibd_sm_id, srcport) < 0)
                        IBERROR("can't resolve destination port %s", concat);
-               if ((err = fn(&portid, argv+3, argc-3)))
+               if ((err = fn(&portid, argv + 3, argc - 3)))
                        IBERROR("operation %s: %s", argv[0], err);
        }
        close_node_name_map(node_name_map);
index 0bf9616..23375dd 100644 (file)
@@ -33,7 +33,7 @@
 
 #if HAVE_CONFIG_H
 #  include <config.h>
-#endif /* HAVE_CONFIG_H */
+#endif                         /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -62,7 +62,7 @@ struct ibmad_port *srcport;
 typedef struct {
        uint16_t hw_revision;
        uint16_t device_id;
-       uint8_t  reserved[24];
+       uint8_t reserved[24];
        uint32_t uptime;
 } is3_hw_info_t;
 
@@ -90,7 +90,7 @@ typedef struct {
 } is3_sw_info_t;
 
 typedef struct {
-       uint8_t       reserved[8];
+       uint8_t reserved[8];
        is3_hw_info_t hw_info;
        is3_fw_info_t fw_info;
        is3_sw_info_t sw_info;
@@ -103,7 +103,7 @@ typedef struct {
 } is3_record_t;
 
 typedef struct {
-       uint8_t      reserved[8];
+       uint8_t reserved[8];
        is3_record_t record[18];
 } is3_config_space_t;
 
@@ -111,10 +111,10 @@ typedef struct {
 
 typedef struct {
        uint8_t reserved1[8];
-       uint8_t reserved[3];
+       uint8_t reserved[3];
        uint8_t num_of_counter_groups;
        uint32_t group_masks[COUNTER_GROUPS_NUM];
-}  is4_counter_group_info_t;
+} is4_counter_group_info_t;
 
 typedef struct {
        uint8_t reserved[3];
@@ -123,11 +123,11 @@ typedef struct {
 
 typedef struct {
        uint8_t reserved1[8];
-       uint8_t reserved[4];
+       uint8_t reserved[4];
        is4_group_select_t group_selects[COUNTER_GROUPS_NUM];
 } is4_config_counter_groups_t;
 
-void counter_groups_info(ib_portid_t *portid, int port)
+void counter_groups_info(ib_portid_t * portid, int port)
 {
        char buf[1024];
        ib_vendor_call_t call;
@@ -136,17 +136,17 @@ void counter_groups_info(ib_portid_t *portid, int port)
 
        memset(&call, 0, sizeof(call));
        call.mgmt_class = IB_MLX_VENDOR_CLASS;
-       call.method  =  IB_MAD_METHOD_GET;
+       call.method = IB_MAD_METHOD_GET;
        call.timeout = ibd_timeout;
-       call.attrid  = IB_MLX_IS4_COUNTER_GROUP_INFO;
-       call.mod     = port;
+       call.attrid = IB_MLX_IS4_COUNTER_GROUP_INFO;
+       call.mod = port;
 
        /* Counter Group Info */
        memset(&buf, 0, sizeof(buf));
        if (!ib_vendor_call_via(&buf, portid, &call, srcport))
                IBERROR("counter group info query");
 
-       cg_info = (is4_counter_group_info_t *)&buf;
+       cg_info = (is4_counter_group_info_t *) & buf;
        num_cg = cg_info->num_of_counter_groups;
        printf("counter_group_info:\n");
        printf("%d counter groups\n", num_cg);
@@ -166,7 +166,7 @@ void counter_groups_info(ib_portid_t *portid, int port)
 
 static int cg0, cg1;
 
-void config_counter_groups(ib_portid_t *portid, int port)
+void config_counter_groups(ib_portid_t * portid, int port)
 {
        char buf[1024];
        ib_vendor_call_t call;
@@ -174,16 +174,17 @@ void config_counter_groups(ib_portid_t *portid, int port)
 
        memset(&call, 0, sizeof(call));
        call.mgmt_class = IB_MLX_VENDOR_CLASS;
-       call.attrid  = IB_MLX_IS4_CONFIG_COUNTER_GROUP;
+       call.attrid = IB_MLX_IS4_CONFIG_COUNTER_GROUP;
        call.timeout = ibd_timeout;
-       call.mod     = port;
+       call.mod = port;
        /* configure counter groups for groups 0 and 1 */
-       call.method  = IB_MAD_METHOD_SET;
+       call.method = IB_MAD_METHOD_SET;
 
        memset(&buf, 0, sizeof(buf));
-       cg_config = (is4_config_counter_groups_t *)&buf;
+       cg_config = (is4_config_counter_groups_t *) & buf;
 
-       printf("counter_groups_config: configuring group0 %d group1 %d\n", cg0, cg1);
+       printf("counter_groups_config: configuring group0 %d group1 %d\n", cg0,
+              cg1);
        cg_config->group_selects[0].group_select = (uint8_t) cg0;
        cg_config->group_selects[1].group_select = (uint8_t) cg1;
 
@@ -192,7 +193,7 @@ void config_counter_groups(ib_portid_t *portid, int port)
 
        /* get config counter groups */
        memset(&buf, 0, sizeof(buf));
-       call.method  =  IB_MAD_METHOD_GET;
+       call.method = IB_MAD_METHOD_GET;
 
        if (!ib_vendor_call_via(&buf, portid, &call, srcport))
                IBERROR("config counter group query");
@@ -227,8 +228,10 @@ static int process_opt(void *context, int ch, char *optarg)
 
 int main(int argc, char **argv)
 {
-       int mgmt_classes[4] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS, IB_MLX_VENDOR_CLASS};
-       ib_portid_t portid = {0};
+       int mgmt_classes[4] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS,
+               IB_MLX_VENDOR_CLASS
+       };
+       ib_portid_t portid = { 0 };
        int port = 0;
        char buf[1024];
        ib_vendor_call_t call;
@@ -237,11 +240,11 @@ int main(int argc, char **argv)
        int i;
 
        const struct ibdiag_opt opts[] = {
-               { "N", 'N', 0, NULL, "show IS3 general information"},
-               { "w", 'w', 0, NULL, "show IS3 port xmit wait counters"},
-               { "i", 'i', 0, NULL, "show IS4 counter group info"},
-               { "c", 'c', 1, "<num,num>", "configure IS4 counter groups"},
-               { 0 }
+               {"N", 'N', 0, NULL, "show IS3 general information"},
+               {"w", 'w', 0, NULL, "show IS3 port xmit wait counters"},
+               {"i", 'i', 0, NULL, "show IS4 counter group info"},
+               {"c", 'c', 1, "<num,num>", "configure IS4 counter groups"},
+               {0}
        };
 
        char usage_args[] = "<lid|guid> [port]";
@@ -269,7 +272,7 @@ int main(int argc, char **argv)
 
        if (argc) {
                if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type,
-                               ibd_sm_id, srcport) < 0)
+                                             ibd_sm_id, srcport) < 0)
                        IBERROR("can't resolve destination port %s", argv[0]);
        } else {
                if (ib_resolve_self_via(&portid, &port, 0, srcport) < 0)
@@ -311,7 +314,7 @@ int main(int argc, char **argv)
        call.attrid = IB_MLX_IS3_GENERAL_INFO;
        if (!ib_vendor_call_via(&buf, &portid, &call, srcport))
                IBERROR("vendstat");
-       gi = (is3_general_info_t *)&buf;
+       gi = (is3_general_info_t *) & buf;
 
        if (general_info) {
                /* dump IS3 general info here */
@@ -319,48 +322,54 @@ int main(int argc, char **argv)
                printf("hw_dev_id:   0x%04x\n", ntohs(gi->hw_info.device_id));
                printf("hw_uptime:   0x%08x\n", ntohl(gi->hw_info.uptime));
                printf("fw_version:  %02d.%02d.%02d\n",
-                      gi->fw_info.major, gi->fw_info.minor, gi->fw_info.sub_minor);
+                      gi->fw_info.major, gi->fw_info.minor,
+                      gi->fw_info.sub_minor);
                printf("fw_build_id: 0x%04x\n", ntohl(gi->fw_info.build_id));
                printf("fw_date:     %02d/%02d/%04x\n",
-                      gi->fw_info.month, gi->fw_info.day, ntohs(gi->fw_info.year));
+                      gi->fw_info.month, gi->fw_info.day,
+                      ntohs(gi->fw_info.year));
                printf("fw_psid:     '%s'\n", gi->fw_info.psid);
-               printf("fw_ini_ver:  %d\n", ntohl(gi->fw_info.ini_file_version));
-               printf("sw_version:  %02d.%02d.%02d\n",
-                      gi->sw_info.major, gi->sw_info.minor, gi->sw_info.sub_minor);
+               printf("fw_ini_ver:  %d\n",
+                      ntohl(gi->fw_info.ini_file_version));
+               printf("sw_version:  %02d.%02d.%02d\n", gi->sw_info.major,
+                      gi->sw_info.minor, gi->sw_info.sub_minor);
        }
 
        if (xmit_wait) {
                if (ntohs(gi->hw_info.device_id) != IS3_DEVICE_ID)
-                       IBERROR("Unsupported device ID 0x%x", ntohs(gi->hw_info.device_id));
+                       IBERROR("Unsupported device ID 0x%x",
+                               ntohs(gi->hw_info.device_id));
 
                memset(&buf, 0, sizeof(buf));
                call.attrid = IB_MLX_IS3_CONFIG_SPACE_ACCESS;
                /* Limit of 18 accesses per MAD ? */
-               call.mod = 2 << 22 | 16 << 16; /* 16 records */
+               call.mod = 2 << 22 | 16 << 16;  /* 16 records */
                /* Set record addresses for each port */
-               cs = (is3_config_space_t *)&buf;
+               cs = (is3_config_space_t *) & buf;
                for (i = 0; i < 16; i++)
-                       cs->record[i].address = htonl(IB_MLX_IS3_PORT_XMIT_WAIT + ((i + 1) << 12));
+                       cs->record[i].address =
+                           htonl(IB_MLX_IS3_PORT_XMIT_WAIT + ((i + 1) << 12));
                if (!ib_vendor_call_via(&buf, &portid, &call, srcport))
                        IBERROR("vendstat");
 
                for (i = 0; i < 16; i++)
                        if (cs->record[i].data) /* PortXmitWait is 32 bit counter */
-                               printf("Port %d: PortXmitWait 0x%x\n", i + 4, ntohl(cs->record[i].data)); /* port 4 is first port */
+                               printf("Port %d: PortXmitWait 0x%x\n", i + 4, ntohl(cs->record[i].data));       /* port 4 is first port */
 
                /* Last 8 ports is another query */
                memset(&buf, 0, sizeof(buf));
                call.attrid = IB_MLX_IS3_CONFIG_SPACE_ACCESS;
-                call.mod = 2 << 22 | 8 << 16; /* 8 records */
+               call.mod = 2 << 22 | 8 << 16;   /* 8 records */
                /* Set record addresses for each port */
-               cs = (is3_config_space_t *)&buf;
+               cs = (is3_config_space_t *) & buf;
                for (i = 0; i < 8; i++)
-                       cs->record[i].address = htonl(IB_MLX_IS3_PORT_XMIT_WAIT + ((i + 17) << 12));
+                       cs->record[i].address =
+                           htonl(IB_MLX_IS3_PORT_XMIT_WAIT + ((i + 17) << 12));
                if (!ib_vendor_call_via(&buf, &portid, &call, srcport))
                        IBERROR("vendstat");
 
                for (i = 0; i < 8; i++)
-                       if (cs->record[i].data) /* PortXmitWait is 32 bit counter */
+                       if (cs->record[i].data) /* PortXmitWait is 32 bit counter */
                                printf("Port %d: PortXmitWait 0x%x\n",
                                       i < 4 ? i + 21 : i - 3,
                                       ntohl(cs->record[i].data));
index aa27eb5..94b64cf 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2004-2007 Voltaire Inc.  All rights reserved.
  * Copyright (c) 2009 HNR Consulting.  All rights reserved.
+ * Copyright (c) 2009 Mellanox Technologies LTD.  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
@@ -45,7 +46,6 @@
 #endif                         /* __cplusplus */
 
 BEGIN_C_DECLS
-
 #define IB_SUBNET_PATH_HOPS_MAX        64
 #define IB_DEFAULT_SUBN_PREFIX 0xfe80000000000000ULL
 #define IB_DEFAULT_QP1_QKEY    0x80010000
@@ -62,7 +62,6 @@ BEGIN_C_DECLS
 #define IB_PC_DATA_SZ          (IB_MAD_SIZE - IB_PC_DATA_OFFS)
 #define IB_SA_MCM_RECSZ                53
 #define IB_SA_PR_RECSZ         64
-
 #define IB_BM_DATA_OFFS                64
 #define IB_BM_DATA_SZ          (IB_MAD_SIZE - IB_BM_DATA_OFFS)
 #define IB_BM_BKEY_OFFS                24
@@ -114,11 +113,13 @@ enum MAD_ATTR_ID {
 };
 
 enum MAD_STATUS {
-       IB_MAD_STS_OK                        = (0 << 2),
-       IB_MAD_STS_BAD_BASE_VER_OR_CLASS     = (1 << 2),
-       IB_MAD_STS_METHOD_NOT_SUPPORTED      = (2 << 2),
+       IB_MAD_STS_OK = (0 << 2),
+       IB_MAD_STS_BUSY = (1 << 0),
+       IB_MAD_STS_REDIRECT = (1 << 1),
+       IB_MAD_STS_BAD_BASE_VER_OR_CLASS = (1 << 2),
+       IB_MAD_STS_METHOD_NOT_SUPPORTED = (2 << 2),
        IB_MAD_STS_METHOD_ATTR_NOT_SUPPORTED = (3 << 2),
-       IB_MAD_STS_INV_ATTR_VALUE            = (7 << 2),
+       IB_MAD_STS_INV_ATTR_VALUE = (7 << 2),
 };
 
 enum SMI_ATTR_ID {
@@ -132,6 +133,8 @@ enum SMI_ATTR_ID {
        IB_ATTR_VL_ARBITRATION = 0x18,
        IB_ATTR_LINEARFORWTBL = 0x19,
        IB_ATTR_MULTICASTFORWTBL = 0x1b,
+       IB_ATTR_LINKSPEEDWIDTHPAIRSTBL = 0x1c,
+       IB_ATTR_VENDORMADSTBL = 0x1d,
        IB_ATTR_SMINFO = 0x20,
 
        IB_ATTR_LAST
@@ -167,30 +170,30 @@ enum GSI_ATTR_ID {
        IB_GSI_PORT_COUNTERS = 0x12,
        IB_GSI_PORT_COUNTERS_EXT = 0x1D,
        IB_GSI_PORT_XMIT_DATA_SL = 0x36,
-       IB_GSI_PORT_RCV_DATA_SL  = 0x37,
+       IB_GSI_PORT_RCV_DATA_SL = 0x37,
        IB_GSI_ATTR_LAST
 };
 
 enum BM_ATTR_ID {
-        IB_BM_ATTR_BKEYINFO = 0x10,
-        IB_BM_ATTR_WRITE_VPD = 0x20,
-        IB_BM_ATTR_READ_VPD = 0x21,
-        IB_BM_ATTR_RESET_IBML = 0x22,
-        IB_BM_ATTR_SET_MODULE_PM_CONTROL = 0x23,
-        IB_BM_ATTR_GET_MODULE_PM_CONTROL = 0x24,
-        IB_BM_ATTR_SET_UNIT_PM_CONTROL = 0x25,
-        IB_BM_ATTR_GET_UNIT_PM_CONTROL = 0x26,
-        IB_BM_ATTR_SET_IOC_PM_CONTROL = 0x27,
-        IB_BM_ATTR_GET_IOC_PM_CONTROL = 0x28,
-        IB_BM_ATTR_SET_MODULE_STATE = 0x29,
-        IB_BM_ATTR_SET_MODULE_ATTENTION = 0x2A,
-        IB_BM_ATTR_GET_MODULE_STATUS = 0x2B,
-        IB_BM_ATTR_IB2IBML = 0x2C,
-        IB_BM_ATTR_IB2CME = 0x2D,
-        IB_BM_ATTR_IB2MME = 0x2E,
-        IB_BM_ATTR_OEM = 0x2F,
-
-        IB_BM_ATTR_LAST
+       IB_BM_ATTR_BKEYINFO = 0x10,
+       IB_BM_ATTR_WRITE_VPD = 0x20,
+       IB_BM_ATTR_READ_VPD = 0x21,
+       IB_BM_ATTR_RESET_IBML = 0x22,
+       IB_BM_ATTR_SET_MODULE_PM_CONTROL = 0x23,
+       IB_BM_ATTR_GET_MODULE_PM_CONTROL = 0x24,
+       IB_BM_ATTR_SET_UNIT_PM_CONTROL = 0x25,
+       IB_BM_ATTR_GET_UNIT_PM_CONTROL = 0x26,
+       IB_BM_ATTR_SET_IOC_PM_CONTROL = 0x27,
+       IB_BM_ATTR_GET_IOC_PM_CONTROL = 0x28,
+       IB_BM_ATTR_SET_MODULE_STATE = 0x29,
+       IB_BM_ATTR_SET_MODULE_ATTENTION = 0x2A,
+       IB_BM_ATTR_GET_MODULE_STATUS = 0x2B,
+       IB_BM_ATTR_IB2IBML = 0x2C,
+       IB_BM_ATTR_IB2CME = 0x2D,
+       IB_BM_ATTR_IB2MME = 0x2E,
+       IB_BM_ATTR_OEM = 0x2F,
+
+       IB_BM_ATTR_LAST
 };
 
 #define IB_VENDOR_OPENIB_PING_CLASS    (IB_VENDOR_RANGE2_START_CLASS + 2)
@@ -400,6 +403,7 @@ enum MAD_FIELDS {
        IB_SW_FILTER_RAW_INB_F,
        IB_SW_FILTER_RAW_OUTB_F,
        IB_SW_ENHANCED_PORT0_F,
+       IB_SW_MCAST_FDB_TOP_F,
        IB_SW_LAST_F,
 
        /*
@@ -722,6 +726,7 @@ enum MAD_DEST {
        IB_DEST_DRPATH,
        IB_DEST_GUID,
        IB_DEST_DRSLID,
+       IB_DEST_GID
 };
 
 enum MAD_NODE_TYPE {
@@ -753,20 +758,29 @@ static inline int ib_portid_set(ib_portid_t * portid, int lid, int qp, int qkey)
 }
 
 /* fields.c */
-MAD_EXPORT uint32_t mad_get_field(void *buf, int base_offs, enum MAD_FIELDS field);
+MAD_EXPORT uint32_t mad_get_field(void *buf, int base_offs,
+                                 enum MAD_FIELDS field);
 MAD_EXPORT void mad_set_field(void *buf, int base_offs, enum MAD_FIELDS field,
                              uint32_t val);
 /* field must be byte aligned */
-MAD_EXPORT uint64_t mad_get_field64(void *buf, int base_offs, enum MAD_FIELDS field);
+MAD_EXPORT uint64_t mad_get_field64(void *buf, int base_offs,
+                                   enum MAD_FIELDS field);
 MAD_EXPORT void mad_set_field64(void *buf, int base_offs, enum MAD_FIELDS field,
                                uint64_t val);
-MAD_EXPORT void mad_set_array(void *buf, int base_offs, enum MAD_FIELDS field, void *val);
-MAD_EXPORT void mad_get_array(void *buf, int base_offs, enum MAD_FIELDS field, void *val);
-MAD_EXPORT void mad_decode_field(uint8_t * buf, enum MAD_FIELDS field, void *val);
-MAD_EXPORT void mad_encode_field(uint8_t * buf, enum MAD_FIELDS field, void *val);
-MAD_EXPORT int mad_print_field(enum MAD_FIELDS field, const char *name, void *val);
-MAD_EXPORT char *mad_dump_field(enum MAD_FIELDS field, char *buf, int bufsz, void *val);
-MAD_EXPORT char *mad_dump_val(enum MAD_FIELDS field, char *buf, int bufsz, void *val);
+MAD_EXPORT void mad_set_array(void *buf, int base_offs, enum MAD_FIELDS field,
+                             void *val);
+MAD_EXPORT void mad_get_array(void *buf, int base_offs, enum MAD_FIELDS field,
+                             void *val);
+MAD_EXPORT void mad_decode_field(uint8_t * buf, enum MAD_FIELDS field,
+                                void *val);
+MAD_EXPORT void mad_encode_field(uint8_t * buf, enum MAD_FIELDS field,
+                                void *val);
+MAD_EXPORT int mad_print_field(enum MAD_FIELDS field, const char *name,
+                              void *val);
+MAD_EXPORT char *mad_dump_field(enum MAD_FIELDS field, char *buf, int bufsz,
+                               void *val);
+MAD_EXPORT char *mad_dump_val(enum MAD_FIELDS field, char *buf, int bufsz,
+                             void *val);
 MAD_EXPORT const char *mad_field_name(enum MAD_FIELDS field);
 
 /* mad.c */
@@ -781,10 +795,18 @@ MAD_EXPORT void madrpc_show_errors(int set);
 MAD_EXPORT int madrpc_set_retries(int retries);
 MAD_EXPORT int madrpc_set_timeout(int timeout);
 MAD_EXPORT struct ibmad_port *mad_rpc_open_port(char *dev_name, int dev_port,
-                       int *mgmt_classes, int num_classes);
+                                               int *mgmt_classes,
+                                               int num_classes);
 MAD_EXPORT void mad_rpc_close_port(struct ibmad_port *srcport);
+
+/*
+ * On redirection, the dport argument is updated with the redirection target,
+ * so subsequent MADs will not go through the redirection process again but
+ * reach the target directly.
+ */
 MAD_EXPORT void *mad_rpc(const struct ibmad_port *srcport, ib_rpc_t * rpc,
-                       ib_portid_t * dport, void *payload, void *rcvdata);
+                        ib_portid_t * dport, void *payload, void *rcvdata);
+
 MAD_EXPORT void *mad_rpc_rmpp(const struct ibmad_port *srcport, ib_rpc_t * rpc,
                              ib_portid_t * dport, ib_rmpp_hdr_t * rmpp,
                              void *data);
@@ -793,11 +815,14 @@ MAD_EXPORT void mad_rpc_set_retries(struct ibmad_port *port, int retries);
 MAD_EXPORT void mad_rpc_set_timeout(struct ibmad_port *port, int timeout);
 MAD_EXPORT int mad_rpc_class_agent(struct ibmad_port *srcport, int cls);
 
+MAD_EXPORT int mad_get_timeout(const struct ibmad_port *srcport,
+                              int override_ms);
+MAD_EXPORT int mad_get_retries(const struct ibmad_port *srcport);
+
 /* register.c */
 MAD_EXPORT int mad_register_port_client(int port_id, int mgmt,
                                        uint8_t rmpp_version);
-MAD_EXPORT int mad_register_client(int mgmt, uint8_t rmpp_version)
-                       DEPRECATED;
+MAD_EXPORT int mad_register_client(int mgmt, uint8_t rmpp_version) DEPRECATED;
 MAD_EXPORT int mad_register_server(int mgmt, uint8_t rmpp_version,
                                   long method_mask[16 / sizeof(long)],
                                   uint32_t class_oui) DEPRECATED;
@@ -813,10 +838,9 @@ MAD_EXPORT int mad_class_agent(int mgmt) DEPRECATED;
 /* serv.c */
 MAD_EXPORT int mad_send(ib_rpc_t * rpc, ib_portid_t * dport,
                        ib_rmpp_hdr_t * rmpp, void *data) DEPRECATED;
-MAD_EXPORT void *mad_receive(void *umad, int timeout)
-               DEPRECATED;
+MAD_EXPORT void *mad_receive(void *umad, int timeout) DEPRECATED;
 MAD_EXPORT int mad_respond(void *umad, ib_portid_t * portid, uint32_t rstatus)
-               DEPRECATED;
+    DEPRECATED;
 
 /* serv.c new interface */
 MAD_EXPORT int mad_send_via(ib_rpc_t * rpc, ib_portid_t * dport,
@@ -824,8 +848,8 @@ MAD_EXPORT int mad_send_via(ib_rpc_t * rpc, ib_portid_t * dport,
                            struct ibmad_port *srcport);
 MAD_EXPORT void *mad_receive_via(void *umad, int timeout,
                                 struct ibmad_port *srcport);
-MAD_EXPORT int mad_respond_via(void *umad, ib_portid_t * portid, uint32_t rstatus,
-                              struct ibmad_port *srcport);
+MAD_EXPORT int mad_respond_via(void *umad, ib_portid_t * portid,
+                              uint32_t rstatus, struct ibmad_port *srcport);
 MAD_EXPORT void *mad_alloc(void);
 MAD_EXPORT void mad_free(void *umad);
 
@@ -851,9 +875,9 @@ static inline int mad_is_vendor_range2(int mgmt)
 /* rpc.c */
 MAD_EXPORT int madrpc_portid(void) DEPRECATED;
 void *madrpc(ib_rpc_t * rpc, ib_portid_t * dport, void *payload, void *rcvdata)
-               DEPRECATED;
-void *madrpc_rmpp(ib_rpc_t * rpc, ib_portid_t * dport, ib_rmpp_hdr_t * rmpp, void *data)
-               DEPRECATED;
+    DEPRECATED;
+void *madrpc_rmpp(ib_rpc_t * rpc, ib_portid_t * dport, ib_rmpp_hdr_t * rmpp,
+                 void *data) DEPRECATED;
 MAD_EXPORT void madrpc_init(char *dev_name, int dev_port, int *mgmt_classes,
                            int num_classes) DEPRECATED;
 void madrpc_save_mad(void *madbuf, int len) DEPRECATED;
@@ -888,14 +912,12 @@ MAD_EXPORT int ib_path_query_via(const struct ibmad_port *srcport,
        /* returns lid */
 
 /* resolve.c */
-MAD_EXPORT int ib_resolve_smlid(ib_portid_t * sm_id, int timeout)
-                               DEPRECATED;
+MAD_EXPORT int ib_resolve_smlid(ib_portid_t * sm_id, int timeout) DEPRECATED;
 MAD_EXPORT int ib_resolve_portid_str(ib_portid_t * portid, char *addr_str,
                                     enum MAD_DEST dest, ib_portid_t * sm_id)
-                               DEPRECATED;
+    DEPRECATED;
 MAD_EXPORT int ib_resolve_self(ib_portid_t * portid, int *portnum,
-                              ibmad_gid_t * gid)
-                               DEPRECATED;
+                              ibmad_gid_t * gid) DEPRECATED;
 
 /* resolve.c new interface */
 MAD_EXPORT int ib_resolve_smlid_via(ib_portid_t * sm_id, int timeout,
@@ -903,8 +925,12 @@ MAD_EXPORT int ib_resolve_smlid_via(ib_portid_t * sm_id, int timeout,
 MAD_EXPORT int ib_resolve_guid_via(ib_portid_t * portid, uint64_t * guid,
                                   ib_portid_t * sm_id, int timeout,
                                   const struct ibmad_port *srcport);
+MAD_EXPORT int ib_resolve_gid_via(ib_portid_t * portid, ibmad_gid_t gid,
+                                 ib_portid_t * sm_id, int timeout,
+                                 const struct ibmad_port *srcport);
 MAD_EXPORT int ib_resolve_portid_str_via(ib_portid_t * portid, char *addr_str,
-                                        enum MAD_DEST dest, ib_portid_t * sm_id,
+                                        enum MAD_DEST dest,
+                                        ib_portid_t * sm_id,
                                         const struct ibmad_port *srcport);
 MAD_EXPORT int ib_resolve_self_via(ib_portid_t * portid, int *portnum,
                                   ibmad_gid_t * gid,
@@ -920,7 +946,9 @@ MAD_EXPORT uint8_t *performance_reset_via(void *rcvbuf, ib_portid_t * dest,
                                          const struct ibmad_port *srcport);
 
 /* bm.c */
-MAD_EXPORT uint8_t * bm_call_via(void *data, ib_portid_t *portid, ib_bm_call_t *call, struct ibmad_port *srcport);
+MAD_EXPORT uint8_t *bm_call_via(void *data, ib_portid_t * portid,
+                               ib_bm_call_t * call,
+                               struct ibmad_port *srcport);
 
 /* dump.c */
 MAD_EXPORT ib_mad_dump_fn
index e335d92..2983855 100644 (file)
@@ -58,7 +58,7 @@ uint8_t *bm_call_via(void *data, ib_portid_t * portid, ib_bm_call_t * call,
        DEBUG("route %s data %p", portid2str(portid), data);
        if (portid->lid <= 0) {
                IBWARN("only lid routes are supported");
-               return 0;
+               return NULL;
        }
 
        resp_expected = response_expected(call->method);