Diags/ibtracert: Add switch-map option to ibtracert Signed-off-by: Ira K. Weiny <[EMAIL PROTECTED]> Signed-off-by: Hal Rosenstock <[EMAIL PROTECTED]>
diff --git a/diags/man/ibtracert.8 b/diags/man/ibtracert.8 index c1632ac..28f18b6 100644 --- a/diags/man/ibtracert.8 +++ b/diags/man/ibtracert.8 @@ -1,11 +1,11 @@ -.TH IBTRACERT 8 "July 25, 2006" "OpenIB" "OpenIB Diagnostics" +.TH IBTRACERT 8 "January 31, 2007" "OpenIB" "OpenIB Diagnostics" .SH NAME ibtracert\- trace InfiniBand path .SH SYNOPSIS .B ibtracert -[\-d(ebug)] [-v(erbose)] [\-D(irect)] [\-G(uids)] [-n(o_info)] [-m mlid] [-s smlid] [\-C ca_name] [\-P ca_port] [\-t(imeout) timeout_ms] [\-V(ersion)] [\-h(elp)] [<dest dr_path|lid|guid> [<startlid> [<endlid>]]] +[\-d(ebug)] [-v(erbose)] [\-D(irect)] [\-G(uids)] [-n(o_info)] [-m mlid] [-s smlid] [\-C ca_name] [\-P ca_port] [\-t(imeout) timeout_ms] [\-V(ersion)] [\-\-switch\-map <switch-map>] [\-h(elp)] [<dest dr_path|lid|guid> [<startlid> [<endlid>]]] .SH DESCRIPTION .PP @@ -23,6 +23,10 @@ simple format; don't show additional inf .TP \fB\-m\fR show the multicast trace of the specified mlid +.TP +\fB\-\-switch\-map\fR <switch-map> +Specify a switch map. The switch map file maps GUIDs to more user friendly +names. See ibnetdiscover for switch map file format. .SH COMMON OPTIONS @@ -101,3 +105,6 @@ ibtracert -m 0xc000 4 16 # show multi .TP Hal Rosenstock .RI < [EMAIL PROTECTED] > +.TP +Ira Weiny +.RI < [EMAIL PROTECTED] > diff --git a/diags/src/ibtracert.c b/diags/src/ibtracert.c index c69ff4e..34da658 100644 --- a/diags/src/ibtracert.c +++ b/diags/src/ibtracert.c @@ -35,6 +35,7 @@ # include <config.h> #endif /* HAVE_CONFIG_H */ +#define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -43,6 +44,7 @@ #include <getopt.h> #include <netinet/in.h> #include <inttypes.h> +#include <errno.h> #define __BUILD_VERSION_TAG__ 1.2 #include <common.h> @@ -65,6 +67,8 @@ static int force; static FILE *f; static char *argv0 = "ibtracert"; +static char *switch_map = NULL; +static FILE *switch_map_fp = NULL; #undef DEBUG #define DEBUG if (ibdebug || verbose) IBWARN @@ -146,6 +150,68 @@ clean_nodedesc(char *nodedesc) return (nodedesc); } +/** ========================================================================= + */ +static void +open_switch_map(void) +{ + if (switch_map) { + switch_map_fp = fopen(switch_map, "r"); + if (switch_map_fp == NULL) { + fprintf(stderr, + "WARNING failed to open switch map \"%s\" (%s)\n" + " Switch names will default to node descriptions\n", + switch_map, strerror(errno)); + } + } +} + +static void +close_switch_map(void) +{ + if (switch_map_fp) + fclose(switch_map_fp); +} + +static char * +lookup_switch_name(Node *node) +{ +#define NAME_LEN (256) + char *line = NULL; + size_t len = 0; + uint64_t guid = 0; + char *rc = NULL; + int line_count = 0; + uint64_t target_guid = node->nodeguid; + + if (switch_map_fp == NULL) + goto done; + + rewind(switch_map_fp); + for (line_count = 1; + getline(&line, &len, switch_map_fp) != -1; + line_count++) { + line[len-1] = '\0'; + if (line[0] == '#') { goto next_one; } + char *guid_str = strtok(line, "\"#"); + char *name = strtok(NULL, "\"#"); + if (!guid_str || !name) { goto next_one; } + guid = strtoull(guid_str, NULL, 0); + if (target_guid == guid) { + rc = strdup(name); + free(line); + goto done; + } +next_one: + free (line); + line = NULL; + } +done: + if (rc == NULL) + rc = strdup(clean_nodedesc(node->nodedesc)); + return (rc); +} + static int get_node(Node *node, Port *port, ib_portid_t *portid) { @@ -234,13 +300,20 @@ dump_endnode(int dump, char *prompt, Nod return; } - nodename = clean_nodedesc(node->nodedesc); + if (node->type == IB_NODE_SWITCH) + nodename = lookup_switch_name(node); + else + nodename = clean_nodedesc(node->nodedesc); + fprintf(f, "%s %s {0x%016" PRIx64 "} portnum %d lid 0x%x-0x%x \"%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); + + if (nodename && (node->type == IB_NODE_SWITCH)) + free(nodename); } static void @@ -251,7 +324,11 @@ dump_route(int dump, Node *node, int out if (!dump && !verbose) return; - nodename = clean_nodedesc(node->nodedesc); + if (node->type == IB_NODE_SWITCH) + nodename = lookup_switch_name(node); + else + nodename = clean_nodedesc(node->nodedesc); + if (dump == 1) fprintf(f, "[%d] -> {0x%016" PRIx64 "}[%d]\n", outport, port->portguid, port->portnum); @@ -262,6 +339,9 @@ dump_route(int dump, Node *node, int out port->portguid, port->portnum, port->lid, port->lid + (1 << port->lmc) - 1, nodename); + + if (nodename && (node->type == IB_NODE_SWITCH)) + free(nodename); } static int @@ -660,14 +740,18 @@ dump_mcpath(Node *node, int dumplevel) if (node->upnode) dump_mcpath(node->upnode, dumplevel); - nodename = clean_nodedesc(node->nodedesc); + if (node->type == IB_NODE_SWITCH) + nodename = lookup_switch_name(node); + else + nodename = clean_nodedesc(node->nodedesc); + if (!node->dist) { printf("From %s 0x%" PRIx64 " port %d lid 0x%x-0x%x \"%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); - return; + goto free_name; } if (node->dist) { @@ -691,6 +775,10 @@ dump_mcpath(Node *node, int dumplevel) node->nodeguid, node->ports->portnum, node->ports->lid, node->ports->lid + (1 << node->ports->lmc) - 1, nodename); + +free_name: + if (nodename && (node->type == IB_NODE_SWITCH)) + free(nodename); } static void @@ -704,7 +792,7 @@ usage(void) basename++; fprintf(stderr, "Usage: %s [-d(ebug) -v(erbose) -D(irect) -G(uids) -n(o_info) -C ca_name -P ca_port " - "-s smlid -t(imeout) timeout_ms -m mlid] <src-addr> <dest-addr>\n", + "-s smlid -t(imeout) timeout_ms -m mlid --switch-map switch-map ] <src-addr> <dest-addr>\n", basename); fprintf(stderr, "\n\tUnicast examples:\n"); fprintf(stderr, "\t\t%s 4 16\t\t\t# show path between lids 4 and 16\n", basename); @@ -747,6 +835,7 @@ main(int argc, char **argv) { "Version", 0, 0, 'V'}, { "help", 0, 0, 'h'}, { "usage", 0, 0, 'u'}, + { "switch-map", 1, 0, 1}, { } }; @@ -759,6 +848,9 @@ main(int argc, char **argv) if ( ch == -1 ) break; switch(ch) { + case 1: + switch_map = strdup(optarg); + break; case 'C': ca = optarg; break; @@ -815,6 +907,7 @@ main(int argc, char **argv) usage(); madrpc_init(ca, ca_port, mgmt_classes, 3); + open_switch_map(); if (ib_resolve_portid_str(&src_portid, argv[0], dest_type, sm_id) < 0) IBERROR("can't resolve source port %s", argv[0]); @@ -852,5 +945,7 @@ main(int argc, char **argv) /* dump multicast path */ dump_mcpath(endnode, dumplevel); + + close_switch_map(); exit(0); } _______________________________________________ openib-general mailing list openib-general@openib.org http://openib.org/mailman/listinfo/openib-general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general