Diags/ibnetdiscover: Add switch-map option to ibnetdiscover Signed-off-by: Ira K. Weiny <[EMAIL PROTECTED]> Signed-off-by: Hal Rosenstock <[EMAIL PROTECTED]>
diff --git a/diags/man/ibnetdiscover.8 b/diags/man/ibnetdiscover.8 index 4960a8f..000edb5 100644 --- a/diags/man/ibnetdiscover.8 +++ b/diags/man/ibnetdiscover.8 @@ -1,11 +1,11 @@ -.TH IBNETDISCOVER 8 "October 16, 2006" "OpenIB" "OpenIB Diagnostics" +.TH IBNETDISCOVER 8 "January 31, 2007" "OpenIB" "OpenIB Diagnostics" .SH NAME ibnetdiscover \- discover InfiniBand topology .SH SYNOPSIS .B ibnetdiscover -[\-d(ebug)] [\-e(rr_show)] [\-v(erbose)] [\-s(how)] [\-l(ist)] [\-g(rouping)] [\-H(ca_list)] [\-S(witch_list)] [\-C ca_name] [\-P ca_port] [\-t(imeout) timeout_ms] [\-V(ersion)] [\-h(elp)] [<topology-file>] +[\-d(ebug)] [\-e(rr_show)] [\-v(erbose)] [\-s(how)] [\-l(ist)] [\-g(rouping)] [\-H(ca_list)] [\-S(witch_list)] [\-C ca_name] [\-P ca_port] [\-t(imeout) timeout_ms] [\-V(ersion)] [\--switch-map <switch-map>] [\-h(elp)] [<topology-file>] .SH DESCRIPTION .PP @@ -34,6 +34,10 @@ List of connected switches .TP \fB\-s\fR, \fB\-\-show\fR Show more information +.TP +\fB\-\-switch\-map\fR <switch-map> +Specify a switch map. The switch map file maps GUIDs to more user friendly +names. See file format below. .SH COMMON OPTIONS @@ -89,7 +93,63 @@ by the following criteria: If a port and/or CA name is specified, the user request is attempted to be fulfilled, and will fail if it is not possible. +.SH SWITCH MAP FILE FORMAT +The switch map is used to specify a user friendly name for switches in the +output. GUIDs are used to perform the lookup. + +.TP +\fBGenerically:\fR + +# comment +.br +<guid> "<name>" + +.TP +\fBExample:\fR + +# IB1 +.br +# Line cards +.br +0x0008f104003f125c "IB1 (Rack 11 slot 1 ) ISR9288/ISR9096 Voltaire sLB-24D" +.br +0x0008f104003f125d "IB1 (Rack 11 slot 1 ) ISR9288/ISR9096 Voltaire sLB-24D" +.br +0x0008f104003f10d2 "IB1 (Rack 11 slot 2 ) ISR9288/ISR9096 Voltaire sLB-24D" +.br +0x0008f104003f10d3 "IB1 (Rack 11 slot 2 ) ISR9288/ISR9096 Voltaire sLB-24D" +.br +0x0008f104003f10bf "IB1 (Rack 11 slot 12 ) ISR9288/ISR9096 Voltaire sLB-24D" +.br +.br +# Spines +.br +0x0008f10400400e2d "IB1 (Rack 11 spine 1 ) ISR9288 Voltaire sFB-12D" +.br +0x0008f10400400e2e "IB1 (Rack 11 spine 1 ) ISR9288 Voltaire sFB-12D" +.br +0x0008f10400400e2f "IB1 (Rack 11 spine 1 ) ISR9288 Voltaire sFB-12D" +.br +0x0008f10400400e31 "IB1 (Rack 11 spine 2 ) ISR9288 Voltaire sFB-12D" +.br +0x0008f10400400e32 "IB1 (Rack 11 spine 2 ) ISR9288 Voltaire sFB-12D" +.br +.br +# GUID Switch Name +.br +0x0008f10400411a08 "SW1 (Rack 3) ISR9024 Voltaire 9024D" +.br +0x0008f10400411a28 "SW2 (Rack 3) ISR9024 Voltaire 9024D" +.br +0x0008f10400411a34 "SW3 (Rack 3) ISR9024 Voltaire 9024D" +.br +0x0008f104004119d0 "SW4 (Rack 3) ISR9024 Voltaire 9024D" +.br + .SH AUTHOR .TP Hal Rosenstock .RI < [EMAIL PROTECTED] > +.TP +Ira Weiny +.RI < [EMAIL PROTECTED] > diff --git a/diags/src/ibnetdiscover.c b/diags/src/ibnetdiscover.c index ec47961..c0ed563 100644 --- a/diags/src/ibnetdiscover.c +++ b/diags/src/ibnetdiscover.c @@ -74,6 +74,9 @@ static FILE *f; static char *argv0 = "ibnetdiscover"; +static char *switch_map = NULL; +static FILE *switch_map_fp = NULL; + Node *nodesdist[MAXHOPS+1]; /* last is Ca list */ Node *mynode; int maxhops_discovered = 0; @@ -201,6 +204,68 @@ clean_nodedesc(char *nodedesc) return (nodedesc); } +/** ========================================================================= + */ +static void +open_switch_map(void) +{ + if (switch_map != NULL) { + switch_map_fp = fopen(switch_map, "r"); + if (switch_map_fp == NULL) { + fprintf(stderr, + "WARNING failed to open switch map \"%s\" (%s)\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 void dump_endnode(ib_portid_t *path, char *prompt, Node *node, Port *port) { @@ -454,7 +519,12 @@ void list_node(Node *node) { char *node_type; + char *nodename = NULL; + if (node->type == SWITCH_NODE) + nodename = lookup_switch_name(node); + else + nodename = clean_nodedesc(node->nodedesc); switch(node->type) { case SWITCH_NODE: node_type = "Switch"; @@ -472,7 +542,10 @@ list_node(Node *node) fprintf(f, "%s\t : 0x%016" PRIx64 " ports %d devid 0x%x vendid 0x%x \"%s\"\n", node_type, node->nodeguid, node->numports, node->devid, node->vendid, - clean_nodedesc(node->nodedesc)); + nodename); + + if (nodename && (node->type == SWITCH_NODE)) + free(nodename); } void @@ -499,6 +572,7 @@ void out_switch(Node *node, int group) { char *str; + char *nodename = NULL; out_ids(node); fprintf(f, "switchguid=0x%" PRIx64, node->nodeguid); @@ -520,11 +594,17 @@ out_switch(Node *node, int group) } } + if (node->type == SWITCH_NODE) + nodename = lookup_switch_name(node); + else + nodename = clean_nodedesc(node->nodedesc); fprintf(f, "\nSwitch\t%d %s\t\t# %s %s port 0 lid %d lmc %d\n", node->numports, node_name(node), - clean_nodedesc(node->nodedesc), + nodename, node->smaenhsp0 ? "enhanced" : "base", node->smalid, node->smalmc); + if (nodename && (node->type == SWITCH_NODE)) + free(nodename); } void @@ -573,25 +653,37 @@ void out_switch_port(Port *port, int group) { char *ext_port_str = NULL; + char *rem_nodename = NULL; DEBUG("port %p:%d remoteport %p", port, port->portnum, port->remoteport); fprintf(f, "[%d]", port->portnum); + ext_port_str = out_ext_port(port, group); if (ext_port_str) fprintf(f, "%s", ext_port_str); + + if (port->remoteport->node->type == SWITCH_NODE) + rem_nodename = lookup_switch_name(port->remoteport->node); + else + rem_nodename = clean_nodedesc(port->remoteport->node->nodedesc); + ext_port_str = out_ext_port(port->remoteport, group); fprintf(f, "\t%s[%d]%s\t\t# \"%s\" lid %d\n", node_name(port->remoteport->node), port->remoteport->portnum, ext_port_str ? ext_port_str : "", - clean_nodedesc(port->remoteport->node->nodedesc), + rem_nodename, port->remoteport->node->type == SWITCH_NODE ? port->remoteport->node->smalid : port->remoteport->lid); + + if (rem_nodename && (port->remoteport->node->type == SWITCH_NODE)) + free(rem_nodename); } void out_ca_port(Port *port, int group) { char *str = NULL; + char *rem_nodename = NULL; fprintf(f, "[%d]\t%s[%d]", port->portnum, node_name(port->remoteport->node), @@ -599,10 +691,16 @@ out_ca_port(Port *port, int group) str = out_ext_port(port->remoteport, group); if (str) fprintf(f, "%s", str); + + if (port->remoteport->node->type == SWITCH_NODE) + rem_nodename = lookup_switch_name(port->remoteport->node); + else + rem_nodename = clean_nodedesc(port->remoteport->node->nodedesc); fprintf(f, "\t\t# lid %d lmc %d \"%s\" lid %d\n", - port->lid, port->lmc, - clean_nodedesc(port->remoteport->node->nodedesc), + port->lid, port->lmc, rem_nodename, port->remoteport->node->type == SWITCH_NODE ? port->remoteport->node->smalid : port->remoteport->lid); + if (rem_nodename && (port->remoteport->node->type == SWITCH_NODE)) + free(rem_nodename); } int @@ -739,8 +837,9 @@ void usage(void) { fprintf(stderr, "Usage: %s [-d(ebug)] -e(rr_show) -v(erbose) -s(how) -l(ist) -g(rouping) -H(ca_list) -S(witch_list) -V(ersion) -C ca_name -P ca_port " - "-t(imeout) timeout_ms] [<topology-file>]\n", + "-t(imeout) timeout_ms --switch-map switch-map] [<topology-file>]\n", argv0); + fprintf(stderr, " --switch-map <switch-map> specify a switch-map file\n"); exit(-1); } @@ -768,6 +867,7 @@ main(int argc, char **argv) { "Hca_list", 0, 0, 'H'}, { "Switch_list", 0, 0, 'S'}, { "timeout", 1, 0, 't'}, + { "switch-map", 1, 0, 1}, { "Version", 0, 0, 'V'}, { "help", 0, 0, 'h'}, { "usage", 0, 0, 'u'}, @@ -783,6 +883,9 @@ main(int argc, char **argv) if ( ch == -1 ) break; switch(ch) { + case 1: + switch_map = strdup(optarg); + break; case 'C': ca = optarg; break; @@ -836,6 +939,7 @@ main(int argc, char **argv) IBERROR("can't open file %s for writing", argv[0]); madrpc_init(ca, ca_port, mgmt_classes, 2); + open_switch_map(); if (discover(&my_portid) < 0) IBERROR("discover"); @@ -845,5 +949,6 @@ main(int argc, char **argv) dump_topology(list, group); + 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