[ofa-general] [infiniband-diags] [PATCH] [4/6] fix libibnetdisc API consistency and bugs

Al Chu chu11 at llnl.gov
Mon Jul 27 10:12:51 PDT 2009


Make api more consistent and make struct ibnd_fabric a struct that
represents just fabric data by removing the ibmad_port and making it a
function paramete in appropriate functions.

Al

-- 
Albert Chu
chu11 at llnl.gov
Computer Scientist
High Performance Systems Division
Lawrence Livermore National Laboratory
-------------- next part --------------
From: Albert Chu <chu11 at llnl.gov>
Date: Thu, 23 Jul 2009 14:14:57 -0700
Subject: [PATCH] Make api more consistent and make struct ibnd_fabric a struct that represents just fabric data by removing the ibmad_port and making it a function paramete in appropriate functions.


Signed-off-by: Albert Chu <chu11 at llnl.gov>
---
 .../libibnetdisc/include/infiniband/ibnetdisc.h    |    4 +-
 infiniband-diags/libibnetdisc/src/ibnetdisc.c      |   93 +++++++++++---------
 2 files changed, 55 insertions(+), 42 deletions(-)

diff --git a/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h b/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
index 5f07805..f65690c 100644
--- a/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
+++ b/infiniband-diags/libibnetdisc/include/infiniband/ibnetdisc.h
@@ -121,7 +121,6 @@ typedef struct chassis {
  * Main fabric object which is returned and represents the data discovered
  */
 typedef struct ib_fabric {
-	struct ibmad_port *ibmad_port;
 	/* the node the discover was initiated from
 	 * "from" parameter in ibnd_discover_fabric
 	 * or by default the node you ar running on
@@ -160,7 +159,8 @@ 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(ibnd_fabric_t *fabric, ibnd_node_t *node);
+MAD_EXPORT ibnd_node_t *ibnd_update_node(struct ibmad_port *ibmad_port,
+					 ibnd_fabric_t *fabric, ibnd_node_t *node);
 
 typedef void (*ibnd_iter_node_func_t)(ibnd_node_t *node, void *user_data);
 MAD_EXPORT void         ibnd_iter_nodes(ibnd_fabric_t *fabric,
diff --git a/infiniband-diags/libibnetdisc/src/ibnetdisc.c b/infiniband-diags/libibnetdisc/src/ibnetdisc.c
index a942ef4..5c5814d 100644
--- a/infiniband-diags/libibnetdisc/src/ibnetdisc.c
+++ b/infiniband-diags/libibnetdisc/src/ibnetdisc.c
@@ -69,8 +69,8 @@ decode_port_info(ibnd_port_t *port)
 }
 
 static int
-get_port_info(struct ibnd_fabric *fabric, struct ibnd_port *port,
-		int portnum, ib_portid_t *portid)
+get_port_info(struct ibmad_port *ibmad_port, struct ibnd_fabric *fabric,
+	      struct ibnd_port *port, int portnum, ib_portid_t *portid)
 {
 	char width[64], speed[64];
 	int iwidth;
@@ -81,7 +81,7 @@ get_port_info(struct ibnd_fabric *fabric, struct ibnd_port *port,
 	ispeed = mad_get_field(port->port.info, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
 
 	if (!smp_query_via(port->port.info, portid, IB_ATTR_PORT_INFO, portnum, timeout_ms,
-			fabric->fabric.ibmad_port))
+			ibmad_port))
 		return -1;
 
 	decode_port_info(&(port->port));
@@ -99,10 +99,11 @@ get_port_info(struct ibnd_fabric *fabric, struct ibnd_port *port,
  * Returns -1 if error.
  */
 static int
-query_node_info(struct ibnd_fabric *fabric, struct ibnd_node *node, ib_portid_t *portid)
+query_node_info(struct ibmad_port *ibmad_port, struct ibnd_fabric *fabric,
+	        struct ibnd_node *node, ib_portid_t *portid)
 {
 	if (!smp_query_via(&(node->node.info), portid, IB_ATTR_NODE_INFO, 0, timeout_ms,
-			fabric->fabric.ibmad_port))
+			ibmad_port))
 		return -1;
 
 	/* decode just a couple of fields for quicker reference. */
@@ -118,25 +119,25 @@ query_node_info(struct ibnd_fabric *fabric, struct ibnd_node *node, ib_portid_t
  * Returns 0 if non switch node is found, 1 if switch is found, -1 if error.
  */
 static int
-query_node(struct ibnd_fabric *fabric, struct ibnd_node *inode,
-		struct ibnd_port *iport, ib_portid_t *portid)
+query_node(struct ibmad_port *ibmad_port, struct ibnd_fabric *fabric,
+	   struct ibnd_node *inode, struct ibnd_port *iport, ib_portid_t *portid)
 {
 	ibnd_node_t *node = &(inode->node);
 	ibnd_port_t *port = &(iport->port);
 	void *nd = inode->node.nodedesc;
 
-	if (query_node_info(fabric, inode, portid))
+	if (query_node_info(ibmad_port, fabric, inode, portid))
 		return -1;
 
 	port->portnum = mad_get_field(node->info, 0, IB_NODE_LOCAL_PORT_F);
 	port->guid = mad_get_field64(node->info, 0, IB_NODE_PORT_GUID_F);
 
 	if (!smp_query_via(nd, portid, IB_ATTR_NODE_DESC, 0, timeout_ms,
-			fabric->fabric.ibmad_port))
+			ibmad_port))
 		return -1;
 
 	if (!smp_query_via(port->info, portid, IB_ATTR_PORT_INFO, 0, timeout_ms,
-			fabric->fabric.ibmad_port))
+			ibmad_port))
 		return -1;
 	decode_port_info(port);
 
@@ -148,7 +149,7 @@ query_node(struct ibnd_fabric *fabric, struct ibnd_node *inode,
 
 	/* after we have the sma information find out the real PortInfo for this port */
 	if (!smp_query_via(port->info, portid, IB_ATTR_PORT_INFO, port->portnum, timeout_ms,
-			fabric->fabric.ibmad_port))
+			ibmad_port))
 		return -1;
 	decode_port_info(port);
 
@@ -156,7 +157,7 @@ query_node(struct ibnd_fabric *fabric, struct ibnd_node *inode,
 	port->lmc = (uint8_t) node->smalmc;
 
         if (!smp_query_via(node->switchinfo, portid, IB_ATTR_SWITCH_INFO, 0, timeout_ms,
-			fabric->fabric.ibmad_port))
+			ibmad_port))
 		node->smaenhsp0 = 0;	/* assume base SP0 */
 	else
 		mad_decode_field(node->switchinfo, IB_SW_ENHANCED_PORT0_F, &node->smaenhsp0);
@@ -177,7 +178,8 @@ add_port_to_dpath(ib_dr_path_t *path, int nextport)
 }
 
 static int
-extend_dpath(struct ibnd_fabric *f, ib_portid_t *portid, int nextport)
+extend_dpath(struct ibmad_port *ibmad_port, struct ibnd_fabric *f,
+	     ib_portid_t *portid, int nextport)
 {
 	int rc = 0;
 
@@ -185,7 +187,7 @@ extend_dpath(struct ibnd_fabric *f, ib_portid_t *portid, int nextport)
 		/* If we were LID routed we need to set up the drslid */
 		if (!f->selfportid.lid)
 			if (ib_resolve_self_via(&f->selfportid, NULL, NULL,
-					f->fabric.ibmad_port) < 0)
+					ibmad_port) < 0)
 				return -1;
 
 		portid->drpath.drslid = (uint16_t) f->selfportid.lid;
@@ -244,8 +246,25 @@ ibnd_find_node_guid(ibnd_fabric_t *fabric, uint64_t guid)
 	return NULL;
 }
 
+static int
+_check_ibmad_port(struct ibmad_port *ibmad_port)
+{
+        if (!ibmad_port) {
+                IBND_DEBUG("ibmad_port must be specified\n");
+                return (-1);
+        }
+        if (mad_rpc_class_agent(ibmad_port, IB_SMI_CLASS) == -1
+                        ||
+                mad_rpc_class_agent(ibmad_port, IB_SMI_DIRECT_CLASS) == -1) {
+                IBND_DEBUG("ibmad_port must be opened with "
+                           "IB_SMI_CLASS && IB_SMI_DIRECT_CLASS\n");
+                return (-1);
+        }
+	return (0);
+}
+
 ibnd_node_t *
-ibnd_update_node(ibnd_fabric_t *fabric, ibnd_node_t *node)
+ibnd_update_node(struct ibmad_port *ibmad_port, ibnd_fabric_t *fabric, ibnd_node_t *node)
 {
 	char portinfo_port0[IB_SMP_DATA_SIZE];
 	void *nd = node->nodedesc;
@@ -253,30 +272,34 @@ ibnd_update_node(ibnd_fabric_t *fabric, ibnd_node_t *node)
 	struct ibnd_fabric *f = CONV_FABRIC_INTERNAL(fabric);
 	struct ibnd_node *n = CONV_NODE_INTERNAL(node);
 
-	if (query_node_info(f, n, &(n->node.path_portid)))
+	if (_check_ibmad_port(ibmad_port) < 0)
+		return (NULL);
+
+	if (query_node_info(ibmad_port, f, n, &(n->node.path_portid)))
 		return (NULL);
 
 	if (!smp_query_via(nd, &(n->node.path_portid), IB_ATTR_NODE_DESC, 0, timeout_ms,
-			f->fabric.ibmad_port))
+			ibmad_port))
 		return (NULL);
 
 	/* update all the port info's */
 	for (p = 1; p >= n->node.numports; p++) {
-		get_port_info(f, CONV_PORT_INTERNAL(n->node.ports[p]), p, &(n->node.path_portid));
+		get_port_info(ibmad_port, f, CONV_PORT_INTERNAL(n->node.ports[p]),
+			      p, &(n->node.path_portid));
 	}
 
 	if (n->node.type != IB_NODE_SWITCH)
 		goto done;
 
 	if (!smp_query_via(portinfo_port0, &(n->node.path_portid), IB_ATTR_PORT_INFO, 0, timeout_ms,
-			f->fabric.ibmad_port))
+			ibmad_port))
 		return (NULL);
 
 	n->node.smalid = mad_get_field(portinfo_port0, 0, IB_PORT_LID_F);
 	n->node.smalmc = mad_get_field(portinfo_port0, 0, IB_PORT_LMC_F);
 
         if (!smp_query_via(node->switchinfo, &(n->node.path_portid), IB_ATTR_SWITCH_INFO, 0, timeout_ms,
-			f->fabric.ibmad_port))
+			ibmad_port))
                 node->smaenhsp0 = 0;	/* assume base SP0 */
 	else
 		mad_decode_field(node->switchinfo, IB_SW_ENHANCED_PORT0_F, &n->node.smaenhsp0);
@@ -441,7 +464,8 @@ link_ports(struct ibnd_node *node, struct ibnd_port *port,
 }
 
 static int
-get_remote_node(struct ibnd_fabric *fabric, struct ibnd_node *node, struct ibnd_port *port, ib_portid_t *path,
+get_remote_node(struct ibmad_port *ibmad_port, struct ibnd_fabric *fabric,
+		struct ibnd_node *node, struct ibnd_port *port, ib_portid_t *path,
 		int portnum, int dist)
 {
 	struct ibnd_node node_buf;
@@ -458,10 +482,10 @@ get_remote_node(struct ibnd_fabric *fabric, struct ibnd_node *node, struct ibnd_
 			!= IB_PORT_PHYS_STATE_LINKUP)
 		return -1;
 
-	if (extend_dpath(fabric, path, portnum) < 0)
+	if (extend_dpath(ibmad_port, fabric, path, portnum) < 0)
 		return -1;
 
-	if (query_node(fabric, &node_buf, &port_buf, path)) {
+	if (query_node(ibmad_port, fabric, &node_buf, &port_buf, path)) {
 		IBND_DEBUG("NodeInfo on %s failed, skipping port",
 			   portid2str(path));
 		path->drpath.cnt--;	/* restore path */
@@ -504,18 +528,8 @@ ibnd_discover_fabric(struct ibmad_port *ibmad_port, int timeout_ms,
 	ib_portid_t *path;
 	int max_hops = MAXHOPS-1; /* default find everything */
 
-	if (!ibmad_port) {
-		IBND_DEBUG("ibmad_port must be specified to "
-			   "ibnd_discover_fabric\n");
-		return (NULL);
-	}
-	if (mad_rpc_class_agent(ibmad_port, IB_SMI_CLASS) == -1
-			||
-		mad_rpc_class_agent(ibmad_port, IB_SMI_DIRECT_CLASS) == -1) {
-		IBND_DEBUG("ibmad_port must be opened with "
-			   "IB_SMI_CLASS && IB_SMI_DIRECT_CLASS\n");
+	if (_check_ibmad_port(ibmad_port) < 0)
 		return (NULL);
-	}
 
 	/* if not everything how much? */
 	if (hops >= 0) {
@@ -533,14 +547,12 @@ ibnd_discover_fabric(struct ibmad_port *ibmad_port, int timeout_ms,
 
 	memset(fabric, 0, sizeof(*fabric));
 
-	fabric->fabric.ibmad_port = ibmad_port;
-
 	IBND_DEBUG("from %s\n", portid2str(from));
 
 	memset(&node_buf, 0, sizeof(node_buf));
 	memset(&port_buf, 0, sizeof(port_buf));
 
-	if (query_node(fabric, &node_buf, &port_buf, from)) {
+	if (query_node(ibmad_port, fabric, &node_buf, &port_buf, from)) {
 		IBND_DEBUG("can't reach node %s\n", portid2str(from));
 		goto error;
 	}
@@ -555,7 +567,7 @@ ibnd_discover_fabric(struct ibmad_port *ibmad_port, int timeout_ms,
 	if (!port)
 		IBPANIC("out of memory");
 
-	if(get_remote_node(fabric, node, port, from,
+	if(get_remote_node(ibmad_port, fabric, node, port, from,
 				mad_get_field(node->node.info, 0, IB_NODE_LOCAL_PORT_F),
 				0) < 0)
 		return ((ibnd_fabric_t *)fabric);
@@ -574,7 +586,7 @@ ibnd_discover_fabric(struct ibmad_port *ibmad_port, int timeout_ms,
 							IB_NODE_LOCAL_PORT_F))
 					continue;
 
-				if (get_port_info(fabric, &port_buf, i, path)) {
+				if (get_port_info(ibmad_port, fabric, &port_buf, i, path)) {
 					IBND_DEBUG("can't reach node %s port %d", portid2str(path), i);
 					continue;
 				}
@@ -593,7 +605,8 @@ ibnd_discover_fabric(struct ibmad_port *ibmad_port, int timeout_ms,
 								0, IB_NODE_PORT_GUID_F);
 				}
 
-				get_remote_node(fabric, node, port, path, i, dist);
+				get_remote_node(ibmad_port, fabric, node, port,
+						path, i, dist);
 			}
 		}
 	}
-- 
1.5.4.5



More information about the general mailing list