>From d109788f46b5839698f3f4a1f75bcbfe22a3b46d Mon Sep 17 00:00:00 2001 From: [email protected] <wei...@wopri.(none)> Date: Tue, 17 Feb 2009 20:08:53 -0800 Subject: [PATCH] convert ibping to "new" ibmad interface
To do this I needed the following additional functions mad_register_client_via mad_register_server_via mad_send_via mad_receive_via mad_respond_via ib_vendor_call_via Also further mark some functions as depricated and clean up interface a bit more. Signed-off-by: [email protected] <wei...@wopri.(none)> --- infiniband-diags/src/ibping.c | 21 +++++++++---- libibmad/include/infiniband/mad.h | 29 ++++++++++++++++++ libibmad/src/libibmad.map | 5 +++ libibmad/src/mad_internal.h | 44 ++++++++++++++++++++++++++++ libibmad/src/register.c | 58 ++++++++++++++++++++++++++++++------- libibmad/src/rpc.c | 8 +---- libibmad/src/serv.c | 39 +++++++++++++++++++++++-- libibmad/src/vendor.c | 15 ++++++++- 8 files changed, 190 insertions(+), 29 deletions(-) create mode 100644 libibmad/src/mad_internal.h diff --git a/infiniband-diags/src/ibping.c b/infiniband-diags/src/ibping.c index 29c98c2..7d458bf 100644 --- a/infiniband-diags/src/ibping.c +++ b/infiniband-diags/src/ibping.c @@ -48,6 +48,8 @@ #include "ibdiag_common.h" +struct ibmad_port *srcport; + static char host_and_domain[IB_VENDOR_RANGE2_DATA_SIZE]; static char last_host[IB_VENDOR_RANGE2_DATA_SIZE]; @@ -90,7 +92,7 @@ ibping_serv(void) DEBUG("starting to serve..."); - while ((umad = mad_receive(0, -1))) { + while ((umad = mad_receive_via(0, -1, srcport))) { mad = umad_get_mad(umad); data = (char *)mad + IB_VENDOR_RANGE2_DATA_OFFS; @@ -99,7 +101,7 @@ ibping_serv(void) DEBUG("Pong: %s", data); - if (mad_respond(umad, 0, 0) < 0) + if (mad_respond_via(umad, 0, 0, srcport) < 0) DEBUG("respond failed"); mad_free(umad); @@ -128,7 +130,7 @@ ibping(ib_portid_t *portid, int quiet) call.timeout = 0; memset(&call.rmpp, 0, sizeof call.rmpp); - if (!ib_vendor_call(data, portid, &call)) + if (!ib_vendor_call_via(data, portid, &call, srcport)) return ~0llu; rtt = getcurrenttime() - start; @@ -216,10 +218,12 @@ int main(int argc, char **argv) if (!argc && !server) ibdiag_show_usage(); - madrpc_init(ibd_ca, ibd_ca_port, mgmt_classes, 3); + srcport = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 3); + if (!srcport) + IBERROR("Failed to open '%s' port '%d'", ibd_ca, ibd_ca_port); if (server) { - if (mad_register_server(ping_class, 0, 0, oui) < 0) + if (mad_register_server_via(ping_class, 0, 0, oui, srcport) < 0) IBERROR("can't serve class %d on this port", ping_class); get_host_and_domain(host_and_domain, sizeof host_and_domain); @@ -229,10 +233,11 @@ int main(int argc, char **argv) exit(0); } - if (mad_register_client(ping_class, 0) < 0) + if (mad_register_client_via(ping_class, 0, srcport) < 0) IBERROR("can't register ping class %d on this port", ping_class); - if (ib_resolve_portid_str(&portid, argv[0], ibd_dest_type, ibd_sm_id) < 0) + if (ib_resolve_portid_str_via(&portid, argv[0], ibd_dest_type, + ibd_sm_id, srcport) < 0) IBERROR("can't resolve destination port %s", argv[0]); signal(SIGINT, report); @@ -260,5 +265,7 @@ int main(int argc, char **argv) report(0); + mad_rpc_close_port(srcport); + exit(-1); } diff --git a/libibmad/include/infiniband/mad.h b/libibmad/include/infiniband/mad.h index 5806e70..8e61395 100644 --- a/libibmad/include/infiniband/mad.h +++ b/libibmad/include/infiniband/mad.h @@ -650,6 +650,7 @@ enum MAD_NODE_TYPE { }; /******************************************************************************/ +struct ibmad_port; /* portid.c */ MAD_EXPORT char *portid2str(ib_portid_t * portid); @@ -692,26 +693,50 @@ MAD_EXPORT int mad_build_pkt(void *umad, ib_rpc_t * rpc, ib_portid_t * dport, ib_rmpp_hdr_t * rmpp, void *data); /* register.c */ +/* depricated */ MAD_EXPORT int mad_register_port_client(int port_id, int mgmt, uint8_t rmpp_version); MAD_EXPORT int mad_register_client(int mgmt, uint8_t rmpp_version); MAD_EXPORT int mad_register_server(int mgmt, uint8_t rmpp_version, long method_mask[16 / sizeof(long)], uint32_t class_oui); + +/* register.c new interface */ +MAD_EXPORT int mad_register_client_via(int mgmt, uint8_t rmpp_version, + struct ibmad_port *srcport); +MAD_EXPORT int mad_register_server_via(int mgmt, uint8_t rmpp_version, + long method_mask[16 / sizeof(long)], + uint32_t class_oui, + struct ibmad_port *srcport); MAD_EXPORT int mad_class_agent(int mgmt); MAD_EXPORT int mad_agent_class(int agent); /* serv.c */ +/* depricated */ MAD_EXPORT int mad_send(ib_rpc_t * rpc, ib_portid_t * dport, ib_rmpp_hdr_t * rmpp, void *data); MAD_EXPORT void *mad_receive(void *umad, int timeout); MAD_EXPORT int mad_respond(void *umad, ib_portid_t * portid, uint32_t rstatus); + +/* serv.c new interface */ +MAD_EXPORT int mad_send_via(ib_rpc_t * rpc, ib_portid_t * dport, + ib_rmpp_hdr_t * rmpp, void *data, + struct ibmad_port *srcport); +MAD_EXPORT void *mad_receive_via(void *umad, int timeout, + struct ibmad_port *srcport); +MAD_EXPORT int mad_respond_via(void *umad, ib_portid_t * portid, uint32_t rstatus, + struct ibmad_port *srcport); MAD_EXPORT void *mad_alloc(void); MAD_EXPORT void mad_free(void *umad); /* vendor.c */ +/* depricated */ MAD_EXPORT uint8_t *ib_vendor_call(void *data, ib_portid_t * portid, ib_vendor_call_t * call); +/* vendor.c new interface */ +MAD_EXPORT uint8_t *ib_vendor_call_via(void *data, ib_portid_t * portid, + ib_vendor_call_t * call, + struct ibmad_port *srcport); static inline int mad_is_vendor_range1(int mgmt) { @@ -746,6 +771,7 @@ void *mad_rpc_rmpp(const struct ibmad_port *srcport, ib_rpc_t * rpc, ib_portid_t MAD_EXPORT int mad_rpc_portid(struct ibmad_port *srcport); /* smp.c */ +/* depricated */ MAD_EXPORT uint8_t *smp_query(void *buf, ib_portid_t * id, unsigned attrid, unsigned mod, unsigned timeout); MAD_EXPORT uint8_t *smp_set(void *buf, ib_portid_t * id, unsigned attrid, @@ -758,6 +784,7 @@ uint8_t *smp_set_via(void *buf, ib_portid_t * id, unsigned attrid, unsigned mod, unsigned timeout, const struct ibmad_port *srcport); /* sa.c */ +/* depricated */ uint8_t *sa_call(void *rcvbuf, ib_portid_t * portid, ib_sa_call_t * sa, unsigned timeout); MAD_EXPORT int ib_path_query(ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t * sm_id, void *buf); /* returns lid */ @@ -769,6 +796,7 @@ int ib_path_query_via(const struct ibmad_port *srcport, ibmad_gid_t srcgid, ibmad_gid_t destgid, ib_portid_t * sm_id, void *buf); /* resolve.c */ +/* depricated */ MAD_EXPORT int ib_resolve_smlid(ib_portid_t * sm_id, int timeout); MAD_EXPORT int ib_resolve_guid(ib_portid_t * portid, uint64_t * guid, ib_portid_t * sm_id, int timeout); @@ -790,6 +818,7 @@ int ib_resolve_self_via(ib_portid_t * portid, int *portnum, ibmad_gid_t * gid, const struct ibmad_port *srcport); /* gs.c */ +/* depricated */ MAD_EXPORT uint8_t *perf_classportinfo_query(void *rcvbuf, ib_portid_t * dest, int port, unsigned timeout); MAD_EXPORT uint8_t *port_performance_query(void *rcvbuf, ib_portid_t * dest, diff --git a/libibmad/src/libibmad.map b/libibmad/src/libibmad.map index 6f0c0b5..ee1804a 100644 --- a/libibmad/src/libibmad.map +++ b/libibmad/src/libibmad.map @@ -60,6 +60,8 @@ IBMAD_1.3 { mad_class_agent; mad_register_client; mad_register_server; + mad_register_client_via; + mad_register_server_via; ib_resolve_guid; ib_resolve_portid_str; ib_resolve_self; @@ -85,10 +87,13 @@ IBMAD_1.3 { mad_free; mad_receive; mad_respond; + mad_receive_via; + mad_respond_via; mad_send; smp_query; smp_set; ib_vendor_call; + ib_vendor_call_via; smp_query_via; smp_set_via; ib_path_query_via; diff --git a/libibmad/src/mad_internal.h b/libibmad/src/mad_internal.h new file mode 100644 index 0000000..9afe7a9 --- /dev/null +++ b/libibmad/src/mad_internal.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2004-2006 Voltaire Inc. All rights reserved. + * + * This software is available to you under a choice of one of two + * licenses. You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the + * OpenIB.org BSD license below: + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +#ifndef _MAD_INTERNAL_H_ +#define _MAD_INTERNAL_H_ + +#define MAX_CLASS 256 + +struct ibmad_port { + int port_id; /* file descriptor returned by umad_open() */ + int class_agents[MAX_CLASS]; /* class2agent mapper */ +}; + +#endif /* _MAD_INTERNAL_H_ */ diff --git a/libibmad/src/register.c b/libibmad/src/register.c index 4d91ff8..4aabd7c 100644 --- a/libibmad/src/register.c +++ b/libibmad/src/register.c @@ -43,10 +43,11 @@ #include <infiniband/umad.h> #include <infiniband/mad.h> +#include "mad_internal.h" + #undef DEBUG #define DEBUG if (ibdebug) IBWARN -#define MAX_CLASS 256 #define MAX_AGENTS 256 static int class_agent[MAX_CLASS]; @@ -136,22 +137,57 @@ int mad_register_port_client(int port_id, int mgmt, uint8_t rmpp_version) int mad_register_client(int mgmt, uint8_t rmpp_version) { + int rc = 0; + struct ibmad_port port; + + port.port_id = madrpc_portid(); + rc = mad_register_client_via(mgmt, rmpp_version, &port); + if (rc < 0) + return rc; + return register_agent(port.class_agents[mgmt], mgmt); +} + +int mad_register_client_via(int mgmt, uint8_t rmpp_version, + struct ibmad_port *srcport) +{ int agent; - agent = mad_register_port_client(madrpc_portid(), mgmt, rmpp_version); + if (!srcport) + return -1; + + agent = mad_register_port_client(mad_rpc_portid(srcport), mgmt, rmpp_version); if (agent < 0) return agent; - return register_agent(agent, mgmt); + srcport->class_agents[mgmt] = agent; + return 0; } int mad_register_server(int mgmt, uint8_t rmpp_version, long method_mask[], uint32_t class_oui) { + int rc = 0; + struct ibmad_port port; + + port.port_id = madrpc_portid(); + port.class_agents[mgmt] = class_agent[mgmt]; + rc = mad_register_server_via(mgmt, rmpp_version, + method_mask, class_oui, + &port); + if (rc < 0) + return rc; + return register_agent(port.class_agents[mgmt], mgmt); +} + +int +mad_register_server_via(int mgmt, uint8_t rmpp_version, + long method_mask[], uint32_t class_oui, + struct ibmad_port *srcport) +{ long class_method_mask[16 / sizeof(long)]; uint8_t oui[3]; - int agent, vers, mad_portid; + int agent, vers; if (method_mask) memcpy(class_method_mask, method_mask, @@ -159,11 +195,12 @@ mad_register_server(int mgmt, uint8_t rmpp_version, else memset(class_method_mask, 0xff, sizeof(class_method_mask)); - if ((mad_portid = madrpc_portid()) < 0) + if (!srcport) return -1; - if (class_agent[mgmt] >= 0) { - DEBUG("Class 0x%x already registered", mgmt); + if (srcport->class_agents[mgmt] >= 0) { + DEBUG("Class 0x%x already registered %d", + mgmt, srcport->class_agents[mgmt]); return -1; } if ((vers = mgmt_class_vers(mgmt)) <= 0) { @@ -175,19 +212,18 @@ mad_register_server(int mgmt, uint8_t rmpp_version, oui[0] = (class_oui >> 16) & 0xff; oui[1] = (class_oui >> 8) & 0xff; oui[2] = class_oui & 0xff; - if ((agent = umad_register_oui(mad_portid, mgmt, rmpp_version, + if ((agent = umad_register_oui(srcport->port_id, mgmt, rmpp_version, oui, class_method_mask)) < 0) { DEBUG("Can't register agent for class %d", mgmt); return -1; } - } else if ((agent = umad_register(mad_portid, mgmt, vers, rmpp_version, + } else if ((agent = umad_register(srcport->port_id, mgmt, vers, rmpp_version, class_method_mask)) < 0) { DEBUG("Can't register agent for class %d", mgmt); return -1; } - if (register_agent(agent, mgmt) < 0) - return -1; + srcport->class_agents[mgmt] = agent; return agent; } diff --git a/libibmad/src/rpc.c b/libibmad/src/rpc.c index 20eeb89..bcb0a75 100644 --- a/libibmad/src/rpc.c +++ b/libibmad/src/rpc.c @@ -43,12 +43,7 @@ #include <infiniband/umad.h> #include <infiniband/mad.h> -#define MAX_CLASS 256 - -struct ibmad_port { - int port_id; /* file descriptor returned by umad_open() */ - int class_agents[MAX_CLASS]; /* class2agent mapper */ -}; +#include "mad_internal.h" int ibdebug; @@ -325,6 +320,7 @@ struct ibmad_port *mad_rpc_open_port(char *dev_name, int dev_port, return NULL; } + memset(p->class_agents, 0xff, sizeof p->class_agents); while (num_classes--) { uint8_t rmpp_version = 0; int mgmt = *mgmt_classes++; diff --git a/libibmad/src/serv.c b/libibmad/src/serv.c index c7631bb..0ce1660 100644 --- a/libibmad/src/serv.c +++ b/libibmad/src/serv.c @@ -42,12 +42,25 @@ #include <infiniband/umad.h> #include <infiniband/mad.h> +#include "mad_internal.h" + #undef DEBUG #define DEBUG if (ibdebug) IBWARN int mad_send(ib_rpc_t * rpc, ib_portid_t * dport, ib_rmpp_hdr_t * rmpp, void *data) { + struct ibmad_port port; + + port.port_id = madrpc_portid(); + port.class_agents[rpc->mgtclass] = mad_class_agent(rpc->mgtclass); + return mad_send_via(rpc, dport, rmpp, data, &port); +} + +int +mad_send_via(ib_rpc_t * rpc, ib_portid_t * dport, ib_rmpp_hdr_t * rmpp, void *data, + struct ibmad_port *srcport) +{ uint8_t pktbuf[1024]; void *umad = pktbuf; @@ -64,7 +77,7 @@ mad_send(ib_rpc_t * rpc, ib_portid_t * dport, ib_rmpp_hdr_t * rmpp, void *data) (char *)umad_get_mad(umad) + rpc->dataoffs, rpc->datasz); } - if (umad_send(madrpc_portid(), mad_class_agent(rpc->mgtclass), + if (umad_send(srcport->port_id, srcport->class_agents[rpc->mgtclass], umad, IB_MAD_SIZE, rpc->timeout, 0) < 0) { IBWARN("send failed; %m"); return -1; @@ -75,6 +88,18 @@ mad_send(ib_rpc_t * rpc, ib_portid_t * dport, ib_rmpp_hdr_t * rmpp, void *data) int mad_respond(void *umad, ib_portid_t * portid, uint32_t rstatus) { + int i = 0; + struct ibmad_port port; + + port.port_id = madrpc_portid(); + for (i = 1; i < MAX_CLASS; i++) + port.class_agents[i] = mad_class_agent(i); + return mad_respond_via(umad, portid, rstatus, &port); +} + +int mad_respond_via(void *umad, ib_portid_t * portid, uint32_t rstatus, + struct ibmad_port *srcport) +{ uint8_t *mad = umad_get_mad(umad); ib_mad_addr_t *mad_addr; ib_rpc_t rpc = { 0 }; @@ -138,7 +163,7 @@ int mad_respond(void *umad, ib_portid_t * portid, uint32_t rstatus) if (ibdebug > 1) xdump(stderr, "mad respond pkt\n", mad, IB_MAD_SIZE); - if (umad_send(madrpc_portid(), mad_class_agent(rpc.mgtclass), umad, + if (umad_send(srcport->port_id, srcport->class_agents[rpc.mgtclass], umad, IB_MAD_SIZE, rpc.timeout, 0) < 0) { DEBUG("send failed; %m"); return -1; @@ -149,11 +174,19 @@ int mad_respond(void *umad, ib_portid_t * portid, uint32_t rstatus) void *mad_receive(void *umad, int timeout) { + struct ibmad_port port; + + port.port_id = madrpc_portid(); + return mad_receive_via(umad, timeout, &port); +} + +void *mad_receive_via(void *umad, int timeout, struct ibmad_port *srcport) +{ void *mad = umad ? umad : umad_alloc(1, umad_size() + IB_MAD_SIZE); int agent; int length = IB_MAD_SIZE; - if ((agent = umad_recv(madrpc_portid(), mad, &length, timeout)) < 0) { + if ((agent = umad_recv(srcport->port_id, mad, &length, timeout)) < 0) { if (!umad) umad_free(mad); DEBUG("recv failed: %m"); diff --git a/libibmad/src/vendor.c b/libibmad/src/vendor.c index 50a878e..1a129e5 100644 --- a/libibmad/src/vendor.c +++ b/libibmad/src/vendor.c @@ -40,6 +40,7 @@ #include <string.h> #include <infiniband/mad.h> +#include "mad_internal.h" #undef DEBUG #define DEBUG if (ibdebug) IBWARN @@ -53,6 +54,16 @@ static inline int response_expected(int method) uint8_t *ib_vendor_call(void *data, ib_portid_t * portid, ib_vendor_call_t * call) { + struct ibmad_port port; + + port.port_id = madrpc_portid(); + return ib_vendor_call_via(data, portid, call, &port); +} + +uint8_t *ib_vendor_call_via(void *data, ib_portid_t * portid, + ib_vendor_call_t * call, + struct ibmad_port *srcport) +{ ib_rpc_t rpc = { 0 }; int range1 = 0, resp_expected; @@ -90,7 +101,7 @@ uint8_t *ib_vendor_call(void *data, ib_portid_t * portid, portid->qkey = IB_DEFAULT_QP1_QKEY; if (resp_expected) - return madrpc_rmpp(&rpc, portid, 0, data); /* FIXME: no RMPP for now */ + return mad_rpc_rmpp(srcport, &rpc, portid, 0, data); /* FIXME: no RMPP for now */ - return mad_send(&rpc, portid, 0, data) < 0 ? 0 : data; /* FIXME: no RMPP for now */ + return mad_send_via(&rpc, portid, 0, data, srcport) < 0 ? 0 : data; /* FIXME: no RMPP for now */ } -- 1.5.4.5 _______________________________________________ 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
