I'm writing a data collection agent for PCP (http://oss.sgi.com/projects/pcp)
which needs to pull performance counters and port information from the
mulitple HCAs and/or switches on a subnet. What's more, a single host
could be connected to multiple disjoined fabrics so the choice of HCA
port to send MAD rpcs on becomes important.

I could write my own library for sending MADs but there is one already
which does 90% of what I need, I just need to be add a few extra entry
points. The attached patch against ~sashak/management.git does that
for me.

max

Add extra entry points to allow explicit selection of
HCA ports used to send MAD rpcs.

Signed-off-by: Max Matveev <[EMAIL PROTECTED]>

diff --git a/libibmad/ChangeLog b/libibmad/ChangeLog
index cf39c7b..bd88ca0 100644
--- a/libibmad/ChangeLog
+++ b/libibmad/ChangeLog
@@ -1,3 +1,8 @@
+2008-06-15 Max Matveev <[EMAIL PROTECTED]>
+	* Add extra entry points for most functions to allow explicit
+	  selection of HCA for MAD rpc.
+	* constify MAD port pointer for mad_rcp, mad_rpc_rmpp and sa_rpc_call
+
 2007-07-10  Hal Rosenstock <[EMAIL PROTECTED]>
 
 	* Release version 1.1.1.
diff --git a/libibmad/include/infiniband/mad.h b/libibmad/include/infiniband/mad.h
index 4f19a31..5fc9664 100644
--- a/libibmad/include/infiniband/mad.h
+++ b/libibmad/include/infiniband/mad.h
@@ -738,9 +738,9 @@ void	madrpc_show_errors(int set);
 void *	mad_rpc_open_port(char *dev_name, int dev_port, int *mgmt_classes,
 			  int num_classes);
 void	mad_rpc_close_port(void *ibmad_port);
-void *	mad_rpc(void *ibmad_port, ib_rpc_t *rpc, ib_portid_t *dport,
+void *	mad_rpc(const void *ibmad_port, ib_rpc_t *rpc, ib_portid_t *dport,
 		void *payload, void *rcvdata);
-void *  mad_rpc_rmpp(void *ibmad_port, ib_rpc_t *rpc, ib_portid_t *dport,
+void *  mad_rpc_rmpp(const void *ibmad_port, ib_rpc_t *rpc, ib_portid_t *dport,
 		     ib_rmpp_hdr_t *rmpp, void *data);
 
 /* smp.c */
@@ -748,6 +748,10 @@ uint8_t * smp_query(void *buf, ib_portid_t *id, unsigned attrid, unsigned mod,
 		    unsigned timeout);
 uint8_t * smp_set(void *buf, ib_portid_t *id, unsigned attrid, unsigned mod,
 		  unsigned timeout);
+uint8_t * smp_query_via(void *buf, ib_portid_t *id, unsigned attrid, 
+			unsigned mod, unsigned timeout, const void *srcport);
+uint8_t * smp_set_via(void *buf, ib_portid_t *id, unsigned attrid, unsigned mod,
+		      unsigned timeout, const void *srcport);
 
 inline static uint8_t *
 safe_smp_query(void *rcvbuf, ib_portid_t *portid, unsigned attrid, unsigned mod,
@@ -778,11 +782,13 @@ safe_smp_set(void *rcvbuf, ib_portid_t *portid, unsigned attrid, unsigned mod,
 /* sa.c */
 uint8_t * sa_call(void *rcvbuf, ib_portid_t *portid, ib_sa_call_t *sa,
 		  unsigned timeout);
-uint8_t * sa_rpc_call(void *ibmad_port, void *rcvbuf, ib_portid_t *portid,
-		      ib_sa_call_t *sa, unsigned timeout);
+uint8_t * sa_rpc_call(const void *ibmad_port, void *rcvbuf, ib_portid_t *portid,
+                      ib_sa_call_t *sa, unsigned timeout);
 int	ib_path_query(ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t *sm_id,
 		      void *buf);	/* returns lid */
-
+int	ib_path_query_via(const void *srcport, ibmad_gid_t srcgid, 
+			  ibmad_gid_t destgid, ib_portid_t *sm_id, void *buf);
+                      
 inline static uint8_t *
 safe_sa_call(void *rcvbuf, ib_portid_t *portid, ib_sa_call_t *sa,
 	     unsigned timeout)
@@ -804,6 +810,17 @@ int	ib_resolve_portid_str(ib_portid_t *portid, char *addr_str,
 			      int dest_type, ib_portid_t *sm_id);
 int	ib_resolve_self(ib_portid_t *portid, int *portnum, ibmad_gid_t *gid);
 
+int	ib_resolve_smlid_via(ib_portid_t *sm_id, int timeout,
+			     const void *srcport);
+int	ib_resolve_guid_via(ib_portid_t *portid, uint64_t *guid,
+			    ib_portid_t *sm_id, int timeout,
+			    const void *srcport);
+int	ib_resolve_portid_str_via(ib_portid_t *portid, char *addr_str,
+			          int dest_type, ib_portid_t *sm_id,
+				  const void *srcport);
+int	ib_resolve_self_via(ib_portid_t *portid, int *portnum, ibmad_gid_t *gid,
+			    const void *srcport);
+
 /* gs.c */
 uint8_t *perf_classportinfo_query(void *rcvbuf, ib_portid_t *dest, int port,
 				  unsigned timeout);
@@ -820,6 +837,20 @@ uint8_t *port_samples_control_query(void *rcvbuf, ib_portid_t *dest, int port,
 uint8_t *port_samples_result_query(void *rcvbuf, ib_portid_t *dest, int port,
 				   unsigned timeout);
 
+uint8_t *perf_classportinfo_query_via(void *rcvbuf, ib_portid_t *dest, int port,
+				  unsigned timeout, const void *srcport);
+uint8_t *port_performance_query_via(void *rcvbuf, ib_portid_t *dest, int port,
+				unsigned timeout, const void *srcport);
+uint8_t *port_performance_reset_via(void *rcvbuf, ib_portid_t *dest, int port,
+				unsigned mask, unsigned timeout, const void *srcport);
+uint8_t *port_performance_ext_query_via(void *rcvbuf, ib_portid_t *dest, int port,
+				    unsigned timeout, const void *srcport);
+uint8_t *port_performance_ext_reset_via(void *rcvbuf, ib_portid_t *dest, int port,
+				    unsigned mask, unsigned timeout, const void *srcport);
+uint8_t *port_samples_control_query_via(void *rcvbuf, ib_portid_t *dest, int port,
+				    unsigned timeout, const void *srcport);
+uint8_t *port_samples_result_query_via(void *rcvbuf, ib_portid_t *dest, int port,
+				   unsigned timeout, const void *srcport);
 /* dump.c */
 ib_mad_dump_fn
 	mad_dump_int, mad_dump_uint, mad_dump_hex, mad_dump_rhex,
diff --git a/libibmad/src/gs.c b/libibmad/src/gs.c
index 7e9f4f4..40fd5e1 100644
--- a/libibmad/src/gs.c
+++ b/libibmad/src/gs.c
@@ -48,8 +48,9 @@
 #undef DEBUG
 #define DEBUG 	if (ibdebug)	IBWARN
 
-uint8_t *
-pma_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout, unsigned id)
+static uint8_t *
+pma_query_via(void *rcvbuf, ib_portid_t *dest, int port, 
+	      unsigned timeout, unsigned id, const void *srcport)
 {
 	ib_rpc_t rpc = {0};
 	int lid = dest->lid;
@@ -76,7 +77,25 @@ pma_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout, unsigned
 	if (!dest->qkey)
 		dest->qkey = IB_DEFAULT_QP1_QKEY;
 
-	return madrpc(&rpc, dest, rcvbuf, rcvbuf);
+	if (srcport) {
+		return mad_rpc(srcport, &rpc, dest, rcvbuf, rcvbuf);
+	} else {
+		return madrpc(&rpc, dest, rcvbuf, rcvbuf);
+	}
+}
+
+uint8_t *
+pma_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout, unsigned id)
+{
+	return pma_query_via(rcvbuf, dest, port, timeout, id, NULL);
+}
+
+uint8_t *
+perf_classportinfo_query_via(void *rcvbuf, ib_portid_t *dest, int port, 
+			     unsigned timeout, const void *srcport)
+{
+	return pma_query_via(rcvbuf, dest, port, timeout, CLASS_PORT_INFO,
+			     srcport);
 }
 
 uint8_t *
@@ -86,14 +105,22 @@ perf_classportinfo_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned tim
 }
 
 uint8_t *
+port_performance_query_via(void *rcvbuf, ib_portid_t *dest, int port, 
+			   unsigned timeout, const void *srcport)
+{
+	return pma_query_via(rcvbuf, dest, port, timeout, 
+			     IB_GSI_PORT_COUNTERS, srcport);
+}
+
+uint8_t *
 port_performance_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout)
 {
 	return pma_query(rcvbuf, dest, port, timeout, IB_GSI_PORT_COUNTERS);
 }
 
 static uint8_t *
-performance_reset(void *rcvbuf, ib_portid_t *dest, int port, unsigned mask,
-		  unsigned timeout, unsigned id)
+performance_reset_via(void *rcvbuf, ib_portid_t *dest, int port, unsigned mask,
+		      unsigned timeout, unsigned id, const void *srcport)
 {
 	ib_rpc_t rpc = {0};
 	int lid = dest->lid;
@@ -125,7 +152,27 @@ performance_reset(void *rcvbuf, ib_portid_t *dest, int port, unsigned mask,
 	if (!dest->qkey)
 		dest->qkey = IB_DEFAULT_QP1_QKEY;
 
-	return madrpc(&rpc, dest, rcvbuf, rcvbuf);
+	if (srcport) {
+		return mad_rpc(srcport, &rpc, dest, rcvbuf, rcvbuf);
+	} else {
+		return madrpc(&rpc, dest, rcvbuf, rcvbuf);
+	}
+}
+
+static uint8_t *
+performance_reset(void *rcvbuf, ib_portid_t *dest, int port, unsigned mask,
+		  unsigned timeout, unsigned id)
+{
+	return performance_reset_via(rcvbuf, dest, port, mask, timeout,
+				     id, NULL);
+}
+
+uint8_t *
+port_performance_reset_via(void *rcvbuf, ib_portid_t *dest, int port, 
+			   unsigned mask, unsigned timeout, const void *srcport)
+{
+	return performance_reset_via(rcvbuf, dest, port, mask, timeout,
+				     IB_GSI_PORT_COUNTERS, srcport);
 }
 
 uint8_t *
@@ -136,12 +183,29 @@ port_performance_reset(void *rcvbuf, ib_portid_t *dest, int port, unsigned mask,
 }
 
 uint8_t *
+port_performance_ext_query_via(void *rcvbuf, ib_portid_t *dest, int port,
+			       unsigned timeout, const void *srcport)
+{
+	return pma_query_via(rcvbuf, dest, port, timeout, 
+			     IB_GSI_PORT_COUNTERS_EXT, srcport);
+}
+
+uint8_t *
 port_performance_ext_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout)
 {
 	return pma_query(rcvbuf, dest, port, timeout, IB_GSI_PORT_COUNTERS_EXT);
 }
 
 uint8_t *
+port_performance_ext_reset_via(void *rcvbuf, ib_portid_t *dest, int port,
+			       unsigned mask, unsigned timeout,
+			       const void *srcport)
+{
+	return performance_reset_via(rcvbuf, dest, port, mask, timeout, 
+				     IB_GSI_PORT_COUNTERS_EXT, srcport);
+}
+
+uint8_t *
 port_performance_ext_reset(void *rcvbuf, ib_portid_t *dest, int port, unsigned mask,
 			   unsigned timeout)
 {
@@ -149,12 +213,28 @@ port_performance_ext_reset(void *rcvbuf, ib_portid_t *dest, int port, unsigned m
 }
 
 uint8_t *
+port_samples_control_query_via(void *rcvbuf, ib_portid_t *dest, int port,
+			       unsigned timeout, const void *srcport)
+{
+	return pma_query_via(rcvbuf, dest, port, timeout,
+			     IB_GSI_PORT_SAMPLES_CONTROL, srcport);
+}
+
+uint8_t *
 port_samples_control_query(void *rcvbuf, ib_portid_t *dest, int port, unsigned timeout)
 {
 	return pma_query(rcvbuf, dest, port, timeout, IB_GSI_PORT_SAMPLES_CONTROL);
 }
 
 uint8_t *
+port_samples_result_query_via(void *rcvbuf, ib_portid_t *dest, int port, 
+			      unsigned timeout, const void *srcport)
+{
+	return pma_query_via(rcvbuf, dest, port, timeout, 
+			     IB_GSI_PORT_SAMPLES_RESULT, srcport);
+}
+
+uint8_t *
 port_samples_result_query(void *rcvbuf, ib_portid_t *dest, int port,  unsigned timeout)
 {
 	return pma_query(rcvbuf, dest, port, timeout, IB_GSI_PORT_SAMPLES_RESULT);
diff --git a/libibmad/src/libibmad.map b/libibmad/src/libibmad.map
index c1eb613..874e8fc 100644
--- a/libibmad/src/libibmad.map
+++ b/libibmad/src/libibmad.map
@@ -91,5 +91,19 @@ IBMAD_1.3 {
 		smp_query;
 		smp_set;
 		ib_vendor_call;
+		smp_query_via;
+		smp_set_via;
+		ib_path_query_via;
+		ib_resolve_smlid_via;
+		ib_resolve_guid_via;
+		ib_resolve_portid_str_via;
+		ib_resolve_self_via;
+		perf_classportinfo_query_via;
+		port_performance_query_via;
+		port_performance_reset_via;
+		port_performance_ext_query_via;
+		port_performance_ext_reset_via;
+		port_samples_control_query_via;
+		port_samples_result_query_via;
 	local: *;
 };
diff --git a/libibmad/src/resolve.c b/libibmad/src/resolve.c
index b063867..4f3d791 100644
--- a/libibmad/src/resolve.c
+++ b/libibmad/src/resolve.c
@@ -50,7 +50,7 @@
 #define DEBUG 	if (ibdebug)	IBWARN
 
 int
-ib_resolve_smlid(ib_portid_t *sm_id, int timeout)
+ib_resolve_smlid_via(ib_portid_t *sm_id, int timeout, const void *srcport)
 {
 	ib_portid_t self = {0};
 	uint8_t portinfo[64];
@@ -58,7 +58,8 @@ ib_resolve_smlid(ib_portid_t *sm_id, int timeout)
 
 	memset(sm_id, 0, sizeof(*sm_id));
 
-	if (!smp_query(portinfo, &self, IB_ATTR_PORT_INFO, 0, 0))
+	if (!smp_query_via(portinfo, &self, IB_ATTR_PORT_INFO, 
+			   0, 0, srcport))
 		return -1;
 
 	mad_decode_field(portinfo, IB_PORT_SMLID_F, &lid);
@@ -67,14 +68,20 @@ ib_resolve_smlid(ib_portid_t *sm_id, int timeout)
 }
 
 int
-ib_resolve_guid(ib_portid_t *portid, uint64_t *guid, ib_portid_t *sm_id, int timeout)
+ib_resolve_smlid(ib_portid_t *sm_id, int timeout)
+{
+	return ib_resolve_smlid_via(sm_id, timeout, NULL);
+}
+
+int
+ib_resolve_guid_via(ib_portid_t *portid, uint64_t *guid, ib_portid_t *sm_id, int timeout, const void *srcport)
 {
 	ib_portid_t sm_portid;
 	char buf[IB_SA_DATA_SIZE] = {0};
 
 	if (!sm_id) {
 		sm_id = &sm_portid;
-		if (ib_resolve_smlid(sm_id, timeout) < 0)
+		if (ib_resolve_smlid_via(sm_id, timeout, srcport) < 0)
 			return -1;
 	}
 	if (*(uint64_t*)&portid->gid == 0)
@@ -82,14 +89,14 @@ ib_resolve_guid(ib_portid_t *portid, uint64_t *guid, ib_portid_t *sm_id, int tim
 	if (guid)
 		mad_set_field64(portid->gid, 0, IB_GID_GUID_F, *guid);
 
-	if ((portid->lid = ib_path_query(portid->gid, portid->gid, sm_id, buf)) < 0)
+	if ((portid->lid = ib_path_query_via(srcport, portid->gid, portid->gid, sm_id, buf)) < 0)
 		return -1;
 
 	return 0;
 }
 
 int
-ib_resolve_portid_str(ib_portid_t *portid, char *addr_str, int dest_type, ib_portid_t *sm_id)
+ib_resolve_portid_str_via(ib_portid_t *portid, char *addr_str, int dest_type, ib_portid_t *sm_id, const void *srcport)
 {
 	uint64_t guid;
 	int lid;
@@ -114,7 +121,7 @@ ib_resolve_portid_str(ib_portid_t *portid, char *addr_str, int dest_type, ib_por
 			return -1;
 
 		/* keep guid in portid? */
-		return ib_resolve_guid(portid, &guid, sm_id, 0);
+		return ib_resolve_guid_via(portid, &guid, sm_id, 0, srcport);
 
 	case IB_DEST_DRSLID:
 		lid = strtol(addr_str, &routepath, 0);
@@ -124,7 +131,7 @@ ib_resolve_portid_str(ib_portid_t *portid, char *addr_str, int dest_type, ib_por
 		ib_portid_set(portid, lid, 0, 0);
 
 		/* handle DR parsing and set DrSLID to local lid */
-		if (ib_resolve_self(&selfportid, &selfport, 0) < 0)
+		if (ib_resolve_self_via(&selfportid, &selfport, 0, srcport) < 0)
 			return -1;
 		if (str2drpath(&portid->drpath, routepath, selfportid.lid, 0) < 0)
 			return -1;
@@ -138,17 +145,25 @@ ib_resolve_portid_str(ib_portid_t *portid, char *addr_str, int dest_type, ib_por
 }
 
 int
-ib_resolve_self(ib_portid_t *portid, int *portnum, ibmad_gid_t *gid)
+ib_resolve_portid_str(ib_portid_t *portid, char *addr_str, int dest_type, ib_portid_t *sm_id)
+{
+	return ib_resolve_portid_str_via(portid, addr_str, dest_type,
+					 sm_id, NULL);
+}
+
+int
+ib_resolve_self_via(ib_portid_t *portid, int *portnum, ibmad_gid_t *gid,
+		    const void *srcport)
 {
 	ib_portid_t self = {0};
 	uint8_t portinfo[64];
 	uint8_t nodeinfo[64];
 	uint64_t guid, prefix;
 
-	if (!smp_query(nodeinfo, &self, IB_ATTR_NODE_INFO, 0, 0))
+	if (!smp_query_via(nodeinfo, &self, IB_ATTR_NODE_INFO, 0, 0, srcport))
 		return -1;
 
-	if (!smp_query(portinfo, &self, IB_ATTR_PORT_INFO, 0, 0))
+	if (!smp_query_via(portinfo, &self, IB_ATTR_PORT_INFO, 0, 0, srcport))
 		return -1;
 
 	mad_decode_field(portinfo, IB_PORT_LID_F, &portid->lid);
@@ -163,3 +178,9 @@ ib_resolve_self(ib_portid_t *portid, int *portnum, ibmad_gid_t *gid)
 	}
 	return 0;
 }
+
+int
+ib_resolve_self(ib_portid_t *portid, int *portnum, ibmad_gid_t *gid)
+{
+	return ib_resolve_self_via (portid, portnum, gid, NULL);
+}
diff --git a/libibmad/src/rpc.c b/libibmad/src/rpc.c
index 17f43b8..1646f29 100644
--- a/libibmad/src/rpc.c
+++ b/libibmad/src/rpc.c
@@ -170,10 +170,10 @@ _do_madrpc(int port_id, void *sndbuf, void *rcvbuf, int agentid, int len,
 }
 
 void *
-mad_rpc(void *port_id, ib_rpc_t *rpc, ib_portid_t *dport, void *payload,
+mad_rpc(const void *port_id, ib_rpc_t *rpc, ib_portid_t *dport, void *payload,
 	void *rcvdata)
 {
-	struct ibmad_port *p = port_id;
+	const struct ibmad_port *p = port_id;
 	int status, len;
 	uint8_t sndbuf[1024], rcvbuf[1024], *mad;
 
@@ -207,7 +207,7 @@ mad_rpc(void *port_id, ib_rpc_t *rpc, ib_portid_t *dport, void *payload,
 }
 
 void *
-mad_rpc_rmpp(void *port_id, ib_rpc_t *rpc, ib_portid_t *dport,
+mad_rpc_rmpp(const void *port_id, ib_rpc_t *rpc, ib_portid_t *dport,
 	     ib_rmpp_hdr_t *rmpp, void *data)
 {
 	struct ibmad_port *p = port_id;
diff --git a/libibmad/src/sa.c b/libibmad/src/sa.c
index 59ef7de..2e092ec 100644
--- a/libibmad/src/sa.c
+++ b/libibmad/src/sa.c
@@ -49,7 +49,7 @@
 #define DEBUG 	if (ibdebug)	IBWARN
 
 uint8_t *
-sa_rpc_call(void *ibmad_port, void *rcvbuf, ib_portid_t *portid,
+sa_rpc_call(const void *ibmad_port, void *rcvbuf, ib_portid_t *portid,
 	    ib_sa_call_t *sa, unsigned timeout)
 {
 	ib_rpc_t rpc = {0};
@@ -112,7 +112,7 @@ sa_rpc_call(void *ibmad_port, void *rcvbuf, ib_portid_t *portid,
 			IB_PR_COMPMASK_NUMBPATH)
 
 int
-ib_path_query(ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t *sm_id, void *buf)
+ib_path_query_via(const void *srcport, ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t *sm_id, void *buf)
 {
 	int npath;
 	ib_sa_call_t sa = {0};
@@ -132,7 +132,12 @@ ib_path_query(ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t *sm_id, void
 	mad_encode_field(buf, IB_SA_PR_DGID_F, destgid);
 	mad_encode_field(buf, IB_SA_PR_SGID_F, srcgid);
 
-	if (!(p = safe_sa_call(buf, sm_id, &sa, 0))) {
+	if (srcport) {
+		p = sa_rpc_call (srcport, buf, sm_id, &sa, 0);
+	} else {
+		p = safe_sa_call(buf, sm_id, &sa, 0);
+	}
+	if (!p) {
 		IBWARN("sa call path_query failed");
 		return -1;
 	}
@@ -140,3 +145,8 @@ ib_path_query(ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t *sm_id, void
 	mad_decode_field(p, IB_SA_PR_DLID_F, &dlid);
 	return dlid;
 }
+int
+ib_path_query(ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t *sm_id, void *buf)
+{
+	return ib_path_query_via (NULL, srcgid, destgid, sm_id, buf);
+}
diff --git a/libibmad/src/smp.c b/libibmad/src/smp.c
index cc4c776..e3795e4 100644
--- a/libibmad/src/smp.c
+++ b/libibmad/src/smp.c
@@ -49,7 +49,7 @@
 #define DEBUG 	if (ibdebug)	IBWARN
 
 uint8_t *
-smp_set(void *data, ib_portid_t *portid, unsigned attrid, unsigned mod, unsigned timeout)
+smp_set_via(void *data, ib_portid_t *portid, unsigned attrid, unsigned mod, unsigned timeout, const void *srcport)
 {
 	ib_rpc_t rpc = {0};
 
@@ -71,12 +71,22 @@ smp_set(void *data, ib_portid_t *portid, unsigned attrid, unsigned mod, unsigned
 	portid->sl = 0;
 	portid->qp = 0;
 
-	return madrpc(&rpc, portid, data, data);
+	if (srcport) {
+		return mad_rpc(srcport, &rpc, portid, data, data);
+	} else {
+		return madrpc(&rpc, portid, data, data);
+	}
+}
+
+uint8_t *
+smp_set(void *data, ib_portid_t *portid, unsigned attrid, unsigned mod, unsigned timeout)
+{
+	return smp_set_via(data, portid, attrid, mod, timeout, NULL);
 }
 
 uint8_t *
-smp_query(void *rcvbuf, ib_portid_t *portid, unsigned attrid, unsigned mod,
-	  unsigned timeout)
+smp_query_via(void *rcvbuf, ib_portid_t *portid, unsigned attrid, unsigned mod,
+	      unsigned timeout, const void *srcport)
 {
 	ib_rpc_t rpc = {0};
 
@@ -98,5 +108,9 @@ smp_query(void *rcvbuf, ib_portid_t *portid, unsigned attrid, unsigned mod,
 	portid->sl = 0;
 	portid->qp = 0;
 
-	return madrpc(&rpc, portid, 0, rcvbuf);
+	if (srcport) {
+		return mad_rpc(srcport, &rpc, portid, 0, rcvbuf);
+	} else {
+		return madrpc(&rpc, portid, 0, rcvbuf);
+	}
 }
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to