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