|
Packit |
db064d |
/*
|
|
Packit |
db064d |
* Copyright (c) 2004-2007 Voltaire Inc. All rights reserved.
|
|
Packit |
db064d |
* Copyright (c) 2007 Xsigo Systems Inc. All rights reserved.
|
|
Packit |
db064d |
* Copyright (c) 2008 Lawrence Livermore National Lab. All rights reserved.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* This software is available to you under a choice of one of two
|
|
Packit |
db064d |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
db064d |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
db064d |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
db064d |
* OpenIB.org BSD license below:
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
db064d |
* without modification, are permitted provided that the following
|
|
Packit |
db064d |
* conditions are met:
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* - Redistributions of source code must retain the above
|
|
Packit |
db064d |
* copyright notice, this list of conditions and the following
|
|
Packit |
db064d |
* disclaimer.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
db064d |
* copyright notice, this list of conditions and the following
|
|
Packit |
db064d |
* disclaimer in the documentation and/or other materials
|
|
Packit |
db064d |
* provided with the distribution.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
db064d |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
db064d |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
db064d |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
db064d |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
db064d |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
db064d |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
db064d |
* SOFTWARE.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#if HAVE_CONFIG_H
|
|
Packit |
db064d |
# include <config.h>
|
|
Packit |
db064d |
#endif /* HAVE_CONFIG_H */
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#define _GNU_SOURCE
|
|
Packit |
db064d |
#include <stdio.h>
|
|
Packit |
db064d |
#include <stdlib.h>
|
|
Packit |
db064d |
#include <unistd.h>
|
|
Packit |
db064d |
#include <stdarg.h>
|
|
Packit |
db064d |
#include <time.h>
|
|
Packit |
db064d |
#include <string.h>
|
|
Packit |
db064d |
#include <getopt.h>
|
|
Packit |
db064d |
#include <errno.h>
|
|
Packit |
db064d |
#include <inttypes.h>
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#include <infiniband/complib/cl_nodenamemap.h>
|
|
Packit |
db064d |
#include <infiniband/ibnetdisc.h>
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static const char *argv0 = "iblinkinfotest";
|
|
Packit |
db064d |
static FILE *f;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void usage(void)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
fprintf(stderr,
|
|
Packit |
db064d |
"Usage: %s [-hclp -D <direct route> -C <ca_name> -P <ca_port>]\n"
|
|
Packit |
db064d |
" Report link speed and connection for each port of each switch which is active\n"
|
|
Packit |
db064d |
" -h This help message\n"
|
|
Packit |
db064d |
" -i <iters> Number of iterations to run (default -1 == infinate)\n"
|
|
Packit |
db064d |
" -f <dr_path> specify node to start \"from\"\n"
|
|
Packit |
db064d |
" -n <hops> Number of hops to include away from specified node\n"
|
|
Packit |
db064d |
" -t <timeout_ms> timeout for any single fabric query\n"
|
|
Packit |
db064d |
" -s show errors\n"
|
|
Packit |
db064d |
" -C <ca_name> use selected Channel Adaptor name for queries\n"
|
|
Packit |
db064d |
" -P <ca_port> use selected channel adaptor port for queries\n"
|
|
Packit |
db064d |
" --debug print debug messages\n", argv0);
|
|
Packit |
db064d |
exit(-1);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
int main(int argc, char **argv)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
struct ibnd_config config = { 0 };
|
|
Packit |
db064d |
int rc = 0;
|
|
Packit |
db064d |
char *ca = NULL;
|
|
Packit |
db064d |
int ca_port = 0;
|
|
Packit |
db064d |
ibnd_fabric_t *fabric = NULL;
|
|
Packit |
db064d |
char *from = NULL;
|
|
Packit |
db064d |
ib_portid_t port_id;
|
|
Packit |
db064d |
int iters = -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static char const str_opts[] = "S:D:n:C:P:t:shuf:i:";
|
|
Packit |
db064d |
static const struct option long_opts[] = {
|
|
Packit |
db064d |
{"S", 1, NULL, 'S'},
|
|
Packit |
db064d |
{"D", 1, NULL, 'D'},
|
|
Packit |
db064d |
{"num-hops", 1, NULL, 'n'},
|
|
Packit |
db064d |
{"ca-name", 1, NULL, 'C'},
|
|
Packit |
db064d |
{"ca-port", 1, NULL, 'P'},
|
|
Packit |
db064d |
{"timeout", 1, NULL, 't'},
|
|
Packit |
db064d |
{"show", 0, NULL, 's'},
|
|
Packit |
db064d |
{"help", 0, NULL, 'h'},
|
|
Packit |
db064d |
{"usage", 0, NULL, 'u'},
|
|
Packit |
db064d |
{"debug", 0, NULL, 2},
|
|
Packit |
db064d |
{"from", 1, NULL, 'f'},
|
|
Packit |
db064d |
{"iters", 1, NULL, 'i'},
|
|
Packit |
db064d |
{}
|
|
Packit |
db064d |
};
|
|
Packit |
db064d |
|
|
Packit |
db064d |
f = stdout;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
argv0 = argv[0];
|
|
Packit |
db064d |
|
|
Packit |
db064d |
while (1) {
|
|
Packit |
db064d |
int ch = getopt_long(argc, argv, str_opts, long_opts, NULL);
|
|
Packit |
db064d |
if (ch == -1)
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
switch (ch) {
|
|
Packit |
db064d |
case 2:
|
|
Packit |
db064d |
config.debug++;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'f':
|
|
Packit |
db064d |
from = strdup(optarg);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'C':
|
|
Packit |
db064d |
ca = strdup(optarg);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'P':
|
|
Packit |
db064d |
ca_port = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'n':
|
|
Packit |
db064d |
config.max_hops = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'i':
|
|
Packit |
db064d |
iters = (int)strtol(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 't':
|
|
Packit |
db064d |
config.timeout_ms = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
default:
|
|
Packit |
db064d |
usage();
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
argc -= optind;
|
|
Packit |
db064d |
argv += optind;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
while (iters == -1 || iters-- > 0) {
|
|
Packit |
db064d |
if (from) {
|
|
Packit |
db064d |
/* only scan part of the fabric */
|
|
Packit |
db064d |
str2drpath(&(port_id.drpath), from, 0, 0);
|
|
Packit |
db064d |
if ((fabric = ibnd_discover_fabric(ca, ca_port,
|
|
Packit |
db064d |
&port_id, &config))
|
|
Packit |
db064d |
== NULL) {
|
|
Packit |
db064d |
fprintf(stderr, "discover failed\n");
|
|
Packit |
db064d |
rc = 1;
|
|
Packit |
db064d |
goto close_port;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
} else if ((fabric = ibnd_discover_fabric(ca, ca_port, NULL,
|
|
Packit |
db064d |
&config)) == NULL) {
|
|
Packit |
db064d |
fprintf(stderr, "discover failed\n");
|
|
Packit |
db064d |
rc = 1;
|
|
Packit |
db064d |
goto close_port;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ibnd_destroy_fabric(fabric);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
close_port:
|
|
Packit |
db064d |
exit(rc);
|
|
Packit |
db064d |
}
|