Blame libibnetdisc/test/testleaks.c

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
}