[ofa-general] [PATCH 4/5] infiniband-diags/libibnetdisc: Introduce a context object.

Ira Weiny weiny2 at llnl.gov
Thu Aug 13 20:43:06 PDT 2009


From: Ira Weiny <weiny2 at llnl.gov>
Date: Thu, 13 Aug 2009 20:16:01 -0700
Subject: [PATCH] infiniband-diags/libibnetdisc: Introduce a context object.

	This object must be created before query functions can be used and is
	used to control the functionality of the queries.

Signed-off-by: Ira Weiny <weiny2 at llnl.gov>
---
 infiniband-diags/libibnetdisc/Makefile.am          |    4 +-
 .../libibnetdisc/include/infiniband/ibnetdisc.h    |   23 ++++--
 .../libibnetdisc/man/ibnd_create_ctx.3             |    2 +
 .../libibnetdisc/man/ibnd_destroy_ctx.3            |    2 +
 .../libibnetdisc/man/ibnd_discover_fabric.3        |   41 ++++++++---
 infiniband-diags/libibnetdisc/src/ibnetdisc.c      |   74 ++++++++++++++------
 infiniband-diags/libibnetdisc/src/internal.h       |    5 ++
 infiniband-diags/libibnetdisc/src/libibnetdisc.map |    2 +
 infiniband-diags/libibnetdisc/test/testleaks.c     |    7 ++-
 infiniband-diags/src/iblinkinfo.c                  |    8 ++-
 infiniband-diags/src/ibnetdiscover.c               |   13 +++-
 infiniband-diags/src/ibqueryerrors.c               |    8 ++-
 12 files changed, 141 insertions(+), 48 deletions(-)
 create mode 100644 infiniband-diags/libibnetdisc/man/ibnd_create_ctx.3
 create mode 100644 infiniband-diags/libibnetdisc/man/ibnd_destroy_ctx.3

diff --git a/infiniband-diags/libibnetdisc/Makefile.am b/infiniband-diags/libibnetdisc/Makefile.am
index 7085f14..5619aad 100644
--- a/infiniband-diags/libibnetdisc/Makefile.am
+++ b/infiniband-diags/libibnetdisc/Makefile.am
@@ -45,7 +45,9 @@ man_MANS = man/ibnd_debug.3 \
 	man/ibnd_iter_nodes.3 \
 	man/ibnd_iter_nodes_type.3 \
 	man/ibnd_show_progress.3 \
-	man/ibnd_update_node.3
+	man/ibnd_update_node.3 \
+	man/ibnd_create_ctx.3 \
+	man/ibnd_destroy_ctx.3
 
 EXTRA_DIST = $(srcdir)/src/libibnetdisc.map libibnetdisc.ver $(man_MANS)
 
diff --git a/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h b/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
index 414e068..65ba74f 100644
--- a/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
+++ b/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
@@ -38,8 +38,11 @@
 #include <infiniband/mad.h>
 #include <iba/ib_types.h>
 
-struct ibnd_chassis;		/* forward declare */
-struct ibnd_port;		/* forward declare */
+typedef struct ibnd_ctx ibnd_ctx_t;
+
+/* forward declares */
+struct ibnd_chassis;
+struct ibnd_port;
 
 /** =========================================================================
  * Node
@@ -159,15 +162,21 @@ typedef struct ibnd_fabric {
 } ibnd_fabric_t;
 
 /** =========================================================================
- * Initialization (fabric operations)
+ * Initialization
  */
 MAD_EXPORT void ibnd_debug(int i);
-MAD_EXPORT void ibnd_show_progress(int i);
 
-MAD_EXPORT ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port *ibmad_port,
+MAD_EXPORT ibnd_ctx_t *ibnd_create_ctx(struct ibmad_port *ibmad_port);
+MAD_EXPORT void ibnd_destroy_ctx(ibnd_ctx_t * ctx);
+MAD_EXPORT int ibnd_show_progress(ibnd_ctx_t * ctx, int i);
+
+/** =========================================================================
+ * Fabric Operations
+ */
+MAD_EXPORT ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t * ctx,
 					       ib_portid_t * from, int hops);
 	/**
-	 * open: (required) ibmad_port object from libibmad
+	 * ctx : (required) context created by ibnd_create_ctx.
 	 * from: (optional) specify the node to start scanning from.
 	 *       If NULL start from the node we are running on.
 	 * hops: (optional) Specify how much of the fabric to traverse.
@@ -181,7 +190,7 @@ MAD_EXPORT void ibnd_destroy_fabric(ibnd_fabric_t * fabric);
 MAD_EXPORT ibnd_node_t *ibnd_find_node_guid(ibnd_fabric_t * fabric,
 					    uint64_t guid);
 MAD_EXPORT ibnd_node_t *ibnd_find_node_dr(ibnd_fabric_t * fabric, char *dr_str);
-MAD_EXPORT ibnd_node_t *ibnd_update_node(struct ibmad_port *ibmad_port,
+MAD_EXPORT ibnd_node_t *ibnd_update_node(ibnd_ctx_t * ctx,
 					 ibnd_fabric_t * fabric,
 					 ibnd_node_t * node);
 
diff --git a/infiniband-diags/libibnetdisc/man/ibnd_create_ctx.3 b/infiniband-diags/libibnetdisc/man/ibnd_create_ctx.3
new file mode 100644
index 0000000..8b321b0
--- /dev/null
+++ b/infiniband-diags/libibnetdisc/man/ibnd_create_ctx.3
@@ -0,0 +1,2 @@
+.\".TH IBND_CREATE_CTX 3  "Aug 12, 2009" "OpenIB" "OpenIB Programmer's Manual"
+.so man3/ibnd_discover_fabric.3
diff --git a/infiniband-diags/libibnetdisc/man/ibnd_destroy_ctx.3 b/infiniband-diags/libibnetdisc/man/ibnd_destroy_ctx.3
new file mode 100644
index 0000000..bb9d96a
--- /dev/null
+++ b/infiniband-diags/libibnetdisc/man/ibnd_destroy_ctx.3
@@ -0,0 +1,2 @@
+.\".TH IBND_DESTROY_CTX 3  "Aug 12, 2009" "OpenIB" "OpenIB Programmer's Manual"
+.so man3/ibnd_discover_fabric.3
diff --git a/infiniband-diags/libibnetdisc/man/ibnd_discover_fabric.3 b/infiniband-diags/libibnetdisc/man/ibnd_discover_fabric.3
index dfeaf47..f014977 100644
--- a/infiniband-diags/libibnetdisc/man/ibnd_discover_fabric.3
+++ b/infiniband-diags/libibnetdisc/man/ibnd_discover_fabric.3
@@ -1,46 +1,65 @@
 .TH IBND_DISCOVER_FABRIC 3  "July 25, 2008" "OpenIB" "OpenIB Programmer's Manual"
 .SH "NAME"
-ibnd_discover_fabric, ibnd_destroy_fabric, ibnd_debug ibnd_show_progress \- initialize ibnetdiscover library.
+ibnd_create_ctx, ibnd_destroy_ctx,
+ibnd_discover_fabric, ibnd_destroy_fabric, ibnd_debug, ibnd_show_progress \-
+initialize ibnetdiscover library and query the fabric.
 .SH "SYNOPSIS"
 .nf
 .B #include <infiniband/ibnetdisc.h>
 .sp
-.bi "ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port *ibmad_port, int timeout_ms, ib_portid_t *from, int hops)"
+.bi "ibnd_ctx_t *ibnd_create_ctx(struct ibmad_port *ibmad_port)"
+.BI "void ibnd_destroy_ctx(ibnd_ctx_t *ctx)"
+.bi "ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t *ctx, ib_portid_t *from, int hops)"
 .BI "void ibnd_destroy_fabric(ibnd_fabric_t *fabric)"
 .BI "void ibnd_debug(int i)"
-.BI "void ibnd_show_progress(int i)"
+.BI "int ibnd_show_progress(ibnd_ctx_t *ctx, int i)"
 .SH "DESCRIPTION"
-.B ibnd_discover_fabric()
-Discover the fabric connected to the port specified by ibmad_port, using a timeout specified.  The "from" and "hops" parameters are optional and allow one to scan part of a fabric by specifying a node "from" and a number of hops away from that node to scan, "hops".  This gives the user a "sub-fabric" which is "centered" anywhere they chose.
+.B ibnd_create_ctx()
+Create a context for the ibnetdiscover library to be used in query operations.
 
 ibmad_port must be opened with at least IB_SMI_CLASS and IB_SMI_DIRECT_CLASS
-classes for ibnd_discover_fabric to work.
+classes for queries to work.
+
+.B ibnd_discover_fabric()
+Discover the fabric using the context specified.  The "from" and "hops" parameters are optional and allow one to scan part of a fabric by specifying a node "from" and a number of hops away from that node to scan, "hops".  This gives the user a "sub-fabric" which is "centered" anywhere they chose.
 
 .B ibnd_destroy_fabric()
 free all memory and resources associated with the fabric.
 
+.B ibnd_destroy_ctx()
+free all memory and resources associated with the context.
+
 .B ibnd_debug()
 Set the debug level to be printed as library operations take place.
 
-.B ibnd_debug()
-Indicate that the library should print debug output which shows it's progress
+.B ibnd_show_progress()
+Indicate that the library should print output which shows it's progress
 through the fabric.
 
 .SH "RETURN VALUE"
+.B ibnd_create_ctx()
+return NULL on failure, otherwise a valid ibnd_ctx_t object.
+
 .B ibnd_discover_fabric()
 return NULL on failure, otherwise a valid ibnd_fabric_t object.
 
-.B ibnd_destory_fabric(), ibnd_debug()
+.B ibnd_show_progress()
+Returnes the previous setting for this value.
+
+.B ibnd_destory_fabric(), ibnd_debug(), ibnd_destroy_ctx()
 NONE
+
 .SH "EXAMPLES"
 
 .B Discover the entire fabric connected to device "mthca0", port 1.
 
 	int mgmt_classes[2] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS};
 	struct ibmad_port *ibmad_port = mad_rpc_open_port(ca, ca_port, mgmt_classes, 2);
-	ibnd_fabric_t *fabric = ibnd_discover_fabric(ibmad_port, 100, NULL, 0);
+	ibnd_ctx_t *ctx = ibnd_create_ctx(ibmad_port);
+	ibnd_fabric_t *fabric = ibnd_discover_fabric(ctx, NULL, 0);
 	...
 	ibnd_destroy_fabric(fabric);
+	ibnd_destroy_ctx(ctx);
 	mad_rpc_close_port(ibmad_port);
 
 .B Discover only a single node and those nodes connected to it.
@@ -48,7 +67,7 @@ NONE
 	...
 	str2drpath(&(port_id.drpath), from, 0, 0);
 	...
-	ibnd_discover_fabric(ibmad_port, 100, &port_id, 1);
+	ibnd_discover_fabric(ctx, &port_id, 1);
 	...
 .SH "SEE ALSO"
 	libibmad, mad_rpc_open_port
diff --git a/infiniband-diags/libibnetdisc/src/ibnetdisc.c b/infiniband-diags/libibnetdisc/src/ibnetdisc.c
index 2cd2c9b..4b320cd 100644
--- a/infiniband-diags/libibnetdisc/src/ibnetdisc.c
+++ b/infiniband-diags/libibnetdisc/src/ibnetdisc.c
@@ -57,9 +57,23 @@
 #include "internal.h"
 #include "chassis.h"
 
-static int show_progress = 0;
 int ibdebug;
 
+ibnd_ctx_t *ibnd_create_ctx(struct ibmad_port *ibmad_port)
+{
+	ibnd_ctx_t *rc = calloc(1, sizeof *rc);
+	if (!rc)
+		return (NULL);
+
+	rc->ibmad_port = ibmad_port;
+	return (rc);
+}
+
+void ibnd_destroy_ctx(ibnd_ctx_t * ctx)
+{
+	free(ctx);
+}
+
 void decode_port_info(ibnd_port_t * port)
 {
 	port->base_lid = (uint16_t) mad_get_field(port->info, 0, IB_PORT_LID_F);
@@ -204,8 +218,6 @@ static void dump_endnode(ib_portid_t * path, char *prompt,
 			 ibnd_node_t * node, ibnd_port_t * port)
 {
 	char type[64];
-	if (!show_progress)
-		return;
 
 	mad_dump_node_type(type, 64, &(node->type), sizeof(int)),
 	    printf("%s -> %s %s {%016" PRIx64
@@ -261,16 +273,29 @@ static int _check_ibmad_port(struct ibmad_port *ibmad_port)
 	return (0);
 }
 
-ibnd_node_t *ibnd_update_node(struct ibmad_port * ibmad_port,
-			      ibnd_fabric_t * fabric, ibnd_node_t * node)
+static int check_ctx(ibnd_ctx_t * ctx)
+{
+	if (!ctx) {
+		IBND_DEBUG("ctx must be specified\n");
+		return (-1);
+	}
+
+	return (_check_ibmad_port(ctx->ibmad_port));
+}
+
+ibnd_node_t *ibnd_update_node(ibnd_ctx_t * ctx, ibnd_fabric_t * fabric,
+			      ibnd_node_t * node)
 {
 	char portinfo_port0[IB_SMP_DATA_SIZE];
 	void *nd = node->nodedesc;
 	int p = 0;
+	struct ibmad_port *ibmad_port;
 
-	if (_check_ibmad_port(ibmad_port) < 0)
+	if (check_ctx(ctx) < 0)
 		return (NULL);
 
+	ibmad_port = ctx->ibmad_port;
+
 	if (!fabric) {
 		IBND_DEBUG("fabric parameter NULL\n");
 		return (NULL);
@@ -476,12 +501,12 @@ static void link_ports(ibnd_node_t * node, ibnd_port_t * port,
 	remoteport->remoteport = (ibnd_port_t *) port;
 }
 
-static int get_remote_node(struct ibmad_port *ibmad_port,
-			   ibnd_fabric_t * fabric, ibnd_node_t * node,
-			   ibnd_port_t * port, ib_portid_t * path,
-			   int portnum, int dist)
+static int get_remote_node(ibnd_ctx_t * ctx, ibnd_fabric_t * fabric,
+			   ibnd_node_t * node, ibnd_port_t * port,
+			   ib_portid_t * path, int portnum, int dist)
 {
 	int rc = 0;
+	struct ibmad_port *ibmad_port = ctx->ibmad_port;
 	ibnd_node_t node_buf;
 	ibnd_port_t port_buf;
 	ibnd_node_t *remotenode, *oldnode;
@@ -525,8 +550,9 @@ static int get_remote_node(struct ibmad_port *ibmad_port,
 		goto error;
 	}
 
-	dump_endnode(path, oldnode ? "known remote" : "new remote",
-		     remotenode, remoteport);
+	if (ctx->show_progress)
+		dump_endnode(path, oldnode ? "known remote" : "new remote",
+			     remotenode, remoteport);
 
 	link_ports(node, port, remotenode, remoteport);
 
@@ -535,7 +561,7 @@ error:
 	return (rc);
 }
 
-ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
+ibnd_fabric_t *ibnd_discover_fabric(ibnd_ctx_t * ctx,
 				    ib_portid_t * from, int hops)
 {
 	int rc = 0;
@@ -550,7 +576,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
 	ib_portid_t *path;
 	int max_hops = MAXHOPS - 1;	/* default find everything */
 
-	if (_check_ibmad_port(ibmad_port) < 0)
+	if (check_ctx(ctx) < 0)
 		return (NULL);
 
 	/* if not everything how much? */
@@ -576,7 +602,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
 	memset(&node_buf, 0, sizeof(node_buf));
 	memset(&port_buf, 0, sizeof(port_buf));
 
-	if (query_node(ibmad_port, fabric, &node_buf, &port_buf, from)) {
+	if (query_node(ctx->ibmad_port, fabric, &node_buf, &port_buf, from)) {
 		IBND_DEBUG("can't reach node %s\n", portid2str(from));
 		goto error;
 	}
@@ -591,7 +617,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
 	if (!port)
 		goto error;
 
-	rc = get_remote_node(ibmad_port, fabric, node, port, from,
+	rc = get_remote_node(ctx, fabric, node, port, from,
 			     mad_get_field(node->info, 0,
 					   IB_NODE_LOCAL_PORT_F), 0);
 	if (rc < 0)
@@ -606,14 +632,15 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
 			path = &node->path_portid;
 
 			IBND_DEBUG("dist %d node %p\n", dist, node);
-			dump_endnode(path, "processing", node, port);
+			if (ctx->show_progress)
+				dump_endnode(path, "processing", node, port);
 
 			for (i = 1; i <= node->numports; i++) {
 				if (i == mad_get_field(node->info, 0,
 						       IB_NODE_LOCAL_PORT_F))
 					continue;
 
-				if (get_port_info(ibmad_port, fabric,
+				if (get_port_info(ctx->ibmad_port, fabric,
 						  &port_buf, i, path)) {
 					IBND_ERROR
 					    ("can't reach node %s port %d",
@@ -637,7 +664,7 @@ ibnd_fabric_t *ibnd_discover_fabric(struct ibmad_port * ibmad_port,
 							    IB_NODE_PORT_GUID_F);
 				}
 
-				if (get_remote_node(ibmad_port, fabric, node,
+				if (get_remote_node(ctx, fabric, node,
 						    port, path, i, dist) < 0)
 					goto error;
 			}
@@ -704,9 +731,14 @@ void ibnd_debug(int i)
 	}
 }
 
-void ibnd_show_progress(int i)
+int ibnd_show_progress(ibnd_ctx_t * ctx, int i)
 {
-	show_progress = i;
+	int rc = 0;
+	if (check_ctx(ctx))
+		return (-1);
+	rc = ctx->show_progress;
+	ctx->show_progress = i;
+	return (rc);
 }
 
 void ibnd_iter_nodes(ibnd_fabric_t * fabric, ibnd_iter_node_func_t func,
diff --git a/infiniband-diags/libibnetdisc/src/internal.h b/infiniband-diags/libibnetdisc/src/internal.h
index ba32291..8753eae 100644
--- a/infiniband-diags/libibnetdisc/src/internal.h
+++ b/infiniband-diags/libibnetdisc/src/internal.h
@@ -47,4 +47,9 @@
 #define	IBND_ERROR(fmt, ...) \
 		fprintf(stderr, "%s:%u; " fmt, __FILE__, __LINE__, ## __VA_ARGS__)
 
+struct ibnd_ctx {
+	struct ibmad_port *ibmad_port;
+	int show_progress;
+};
+
 #endif				/* _INTERNAL_H_ */
diff --git a/infiniband-diags/libibnetdisc/src/libibnetdisc.map b/infiniband-diags/libibnetdisc/src/libibnetdisc.map
index bd108ab..56560ec 100644
--- a/infiniband-diags/libibnetdisc/src/libibnetdisc.map
+++ b/infiniband-diags/libibnetdisc/src/libibnetdisc.map
@@ -2,6 +2,8 @@ IBNETDISC_1.0 {
 	global:
 		ibnd_debug;
 		ibnd_show_progress;
+		ibnd_create_ctx;
+		ibnd_destroy_ctx;
 		ibnd_discover_fabric;
 		ibnd_destroy_fabric;
 		ibnd_find_node_guid;
diff --git a/infiniband-diags/libibnetdisc/test/testleaks.c b/infiniband-diags/libibnetdisc/test/testleaks.c
index cb5651e..b121bdd 100644
--- a/infiniband-diags/libibnetdisc/test/testleaks.c
+++ b/infiniband-diags/libibnetdisc/test/testleaks.c
@@ -87,6 +87,7 @@ int main(int argc, char **argv)
 	int hops = 0;
 	ib_portid_t port_id;
 	int iters = -1;
+	ibnd_ctx_t *ctx = NULL;
 
 	struct ibmad_port *ibmad_port;
 	int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
@@ -156,11 +157,12 @@ int main(int argc, char **argv)
 
 	mad_rpc_set_timeout(ibmad_port, timeout_ms);
 
+	ctx = ibnd_create_ctx(ibmad_port);
 	while (iters == -1 || iters-- > 0) {
 		if (from) {
 			/* only scan part of the fabric */
 			str2drpath(&(port_id.drpath), from, 0, 0);
-			if ((fabric = ibnd_discover_fabric(ibmad_port,
+			if ((fabric = ibnd_discover_fabric(ctx,
 							   &port_id,
 							   hops)) == NULL) {
 				fprintf(stderr, "discover failed\n");
@@ -170,7 +172,7 @@ int main(int argc, char **argv)
 			guid = 0;
 		} else {
 			if ((fabric =
-			     ibnd_discover_fabric(ibmad_port, NULL,
+			     ibnd_discover_fabric(ctx, NULL,
 						  -1)) == NULL) {
 				fprintf(stderr, "discover failed\n");
 				rc = 1;
@@ -182,6 +184,7 @@ int main(int argc, char **argv)
 	}
 
 close_port:
+	ibnd_destroy_ctx(ctx);
 	mad_rpc_close_port(ibmad_port);
 	exit(rc);
 }
diff --git a/infiniband-diags/src/iblinkinfo.c b/infiniband-diags/src/iblinkinfo.c
index 5dfadee..af5be09 100644
--- a/infiniband-diags/src/iblinkinfo.c
+++ b/infiniband-diags/src/iblinkinfo.c
@@ -274,6 +274,7 @@ main(int argc, char **argv)
 	int rc = 0;
 	int resolved = -1;
 	ibnd_fabric_t *fabric = NULL;
+	ibnd_ctx_t *ctx = NULL;
 	struct ibmad_port *ibmad_port;
 	ib_portid_t port_id = {0};
 	int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
@@ -313,6 +314,8 @@ main(int argc, char **argv)
 
 	node_name_map = open_node_name_map(node_name_map_file);
 
+	ctx = ibnd_create_ctx(ibmad_port);
+
 	if (dr_path) {
 		/* only scan part of the fabric */
 		if ((resolved = ib_resolve_portid_str_via(&port_id, dr_path, IB_DEST_DRPATH,
@@ -327,12 +330,12 @@ main(int argc, char **argv)
 	}
 
 	if (resolved >= 0)
-		if ((fabric = ibnd_discover_fabric(ibmad_port, &port_id,
+		if ((fabric = ibnd_discover_fabric(ctx, &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) {
+		if ((fabric = ibnd_discover_fabric(ctx, NULL, -1)) == NULL) {
 			fprintf(stderr, "discover failed\n");
 			rc = 1;
 			goto close_port;
@@ -364,6 +367,7 @@ main(int argc, char **argv)
 	ibnd_destroy_fabric(fabric);
 
 close_port:
+	ibnd_destroy_ctx(ctx);
 	close_node_name_map(node_name_map);
 	mad_rpc_close_port(ibmad_port);
 	exit(rc);
diff --git a/infiniband-diags/src/ibnetdiscover.c b/infiniband-diags/src/ibnetdiscover.c
index b04f2c6..ecb591e 100644
--- a/infiniband-diags/src/ibnetdiscover.c
+++ b/infiniband-diags/src/ibnetdiscover.c
@@ -65,6 +65,7 @@ static char *node_name_map_file = NULL;
 static nn_map_t *node_name_map = NULL;
 
 static int report_max_hops = 0;
+static int show_progress = 0;
 
 /**
  * Define our own conversion functions to maintain compatibility with the old
@@ -610,7 +611,7 @@ static int process_opt(void *context, int ch, char *optarg)
 		node_name_map_file = strdup(optarg);
 		break;
 	case 's':
-		ibnd_show_progress(1);
+		show_progress = 1;
 		break;
 	case 'l':
 		list = LIST_CA_NODE | LIST_SWITCH_NODE | LIST_ROUTER_NODE;
@@ -643,6 +644,7 @@ static int process_opt(void *context, int ch, char *optarg)
 int main(int argc, char **argv)
 {
 	ibnd_fabric_t *fabric = NULL;
+	ibnd_ctx_t *ctx = NULL;
 
 	struct ibmad_port *ibmad_port;
 	int mgmt_classes[2] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS};
@@ -683,8 +685,14 @@ int main(int argc, char **argv)
 		IBERROR("can't open file %s for writing", argv[0]);
 
 	node_name_map = open_node_name_map(node_name_map_file);
+	ctx = ibnd_create_ctx(ibmad_port);
 
-	if ((fabric = ibnd_discover_fabric(ibmad_port, NULL, -1)) == NULL)
+	if (!ctx)
+		IBERROR("failed to create libibnetdisc context\n");
+
+	ibnd_show_progress(ctx, show_progress);
+
+	if ((fabric = ibnd_discover_fabric(ctx, NULL, -1)) == NULL)
 		IBERROR("discover failed\n");
 
 	if (ports_report)
@@ -697,6 +705,7 @@ int main(int argc, char **argv)
 		dump_topology(group, fabric);
 
 	ibnd_destroy_fabric(fabric);
+	ibnd_destroy_ctx(ctx);
 	close_node_name_map(node_name_map);
 	mad_rpc_close_port(ibmad_port);
 	exit(0);
diff --git a/infiniband-diags/src/ibqueryerrors.c b/infiniband-diags/src/ibqueryerrors.c
index 2c85423..0955415 100644
--- a/infiniband-diags/src/ibqueryerrors.c
+++ b/infiniband-diags/src/ibqueryerrors.c
@@ -392,6 +392,7 @@ main(int argc, char **argv)
 	ib_portid_t portid = {0};
 	int rc = 0;
 	ibnd_fabric_t *fabric = NULL;
+	ibnd_ctx_t *ctx = NULL;
 
 	int mgmt_classes[4] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS, IB_PERFORMANCE_CLASS};
 
@@ -427,6 +428,8 @@ main(int argc, char **argv)
 
 	node_name_map = open_node_name_map(node_name_map_file);
 
+	ctx = ibnd_create_ctx(ibmad_port);
+
 	/* limit the scan the fabric around the target */
 	if (dr_path) {
 		if ((resolved = ib_resolve_portid_str_via(&portid, dr_path, IB_DEST_DRPATH,
@@ -440,12 +443,12 @@ main(int argc, char **argv)
 	}
 
 	if (resolved >= 0)
-		if ((fabric = ibnd_discover_fabric(ibmad_port, &portid,
+		if ((fabric = ibnd_discover_fabric(ctx, &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) {
+		if ((fabric = ibnd_discover_fabric(ctx, NULL, -1)) == NULL) {
 			fprintf(stderr, "discover failed\n");
 			rc = 1;
 			goto close_port;
@@ -479,6 +482,7 @@ main(int argc, char **argv)
 	ibnd_destroy_fabric(fabric);
 
 close_port:
+	ibnd_destroy_ctx(ctx);
 	mad_rpc_close_port(ibmad_port);
 	close_node_name_map(node_name_map);
 	exit(rc);
-- 
1.5.4.5




More information about the general mailing list