[openib-general] [PATCH] userspace/management changes to support send side RMPP
Hal Rosenstock
halr at voltaire.com
Mon May 23 09:30:11 PDT 2005
userspace/management changes to support send side RMPP
(needs change to linux-kernel/infiniband/core/user_mad.c)
ABI_VERSION is now 3
RMPP is enabled in build
SA GetTable is now supported properly (within current RMPP limitations)
Signed-off-by: Hal Rosenstock <halr at voltaire.com>
Modified: gen2/trunk/src/userspace/management/diags/ibping/src/ibping.c
===================================================================
--- gen2/trunk/src/userspace/management/diags/ibping/src/ibping.c 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/diags/ibping/src/ibping.c 2005-05-23 16:33:46 UTC (rev 2456)
@@ -295,7 +295,7 @@
madrpc_init(ca, ca_port, mgmt_classes, 3);
if (server) {
- if (mad_register_server(ping_class, 0, oui) < 0)
+ if (mad_register_server(ping_class, 0, 0, oui) < 0)
PANIC("can't serve class %d", ping_class);
get_host_and_domain(host_and_domain, sizeof host_and_domain);
@@ -305,7 +305,7 @@
exit(0);
}
- if (mad_register_client(ping_class) < 0)
+ if (mad_register_client(ping_class, 0) < 0)
PANIC("can't register to ping class %d", ping_class);
if (ib_resolve_portid_str(&portid, argv[0], dest_type, sm_id) < 0)
Modified: gen2/trunk/src/userspace/management/diags/ibsysstat/src/ibsysstat.c
===================================================================
--- gen2/trunk/src/userspace/management/diags/ibsysstat/src/ibsysstat.c 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/diags/ibsysstat/src/ibsysstat.c 2005-05-23 16:33:46 UTC (rev 2456)
@@ -269,7 +269,7 @@
main(int argc, char **argv)
{
int mgmt_classes[3] = {IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS};
- int ping_class = IB_VENDOR_OPENIB_SYSSTAT_CLASS;
+ int sysstat_class = IB_VENDOR_OPENIB_SYSSTAT_CLASS;
ib_portid_t portid = {0};
ib_portid_t *sm_id = 0, sm_portid = {0};
int timeout = 0, udebug = 0, server = 0;
@@ -336,8 +336,8 @@
madrpc_init(ca, ca_port, mgmt_classes, 3);
if (server) {
- if (mad_register_server(ping_class, 0, oui) < 0)
- PANIC("can't serve class %d", ping_class);
+ if (mad_register_server(sysstat_class, 0, 0, oui) < 0)
+ PANIC("can't serve class %d", sysstat_class);
host_ncpu = build_cpuinfo();
@@ -346,8 +346,8 @@
exit(0);
}
- if (mad_register_client(ping_class) < 0)
- PANIC("can't register to ping class %d", ping_class);
+ if (mad_register_client(sysstat_class, 0) < 0)
+ PANIC("can't register to ping class %d", sysstat_class);
if (ib_resolve_portid_str(&portid, argv[0], dest_type, sm_id) < 0)
PANIC("can't resolve destination port %s", argv[0]);
Modified: gen2/trunk/src/userspace/management/diags/smpdump/src/smpdump.c
===================================================================
--- gen2/trunk/src/userspace/management/diags/smpdump/src/smpdump.c 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/diags/smpdump/src/smpdump.c 2005-05-23 16:33:46 UTC (rev 2456)
@@ -282,7 +282,7 @@
if ((portid = umad_open_port(dev_name, dev_port)) < 0)
PANIC("can't open UMAD port (%s:%d)", dev_name, dev_port);
- if ((mad_agent = umad_register(portid, mgmt_class, 1, 0)) < 0)
+ if ((mad_agent = umad_register(portid, mgmt_class, 1, 0, 0)) < 0)
PANIC("Couldn't register agent for SMPs");
if (!(umad = umad_alloc(1)))
@@ -298,7 +298,7 @@
if (debug > 1)
xdump(stderr, "before send:\n", smp, 256);
- if (umad_send(portid, mad_agent, umad, timeout_ms) < 0)
+ if (umad_send(portid, mad_agent, umad, IB_MAD_SIZE, timeout_ms) < 0)
PANIC("send failed");
if (umad_recv(portid, umad, -1) != mad_agent)
Modified: gen2/trunk/src/userspace/management/libibmad/include/infiniband/mad.h
===================================================================
--- gen2/trunk/src/userspace/management/libibmad/include/infiniband/mad.h 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/libibmad/include/infiniband/mad.h 2005-05-23 16:33:46 UTC (rev 2456)
@@ -630,9 +630,9 @@
int mad_build_pkt(void *umad, ib_rpc_t *rpc, ib_portid_t *dport, ib_rmpp_hdr_t *rmpp, void *data);
/* register.c */
-int mad_register_client(int mgmt);
-int mad_register_server(int mgmt, uint32_t method_mask[4],
- uint32_t class_oui);
+int mad_register_client(int mgmt, uint8_t rmpp_version);
+int mad_register_server(int mgmt, uint8_t rmpp_version,
+ uint32_t method_mask[4], uint32_t class_oui);
int mad_class_agent(int mgmt);
int mad_agent_class(int agent);
Modified: gen2/trunk/src/userspace/management/libibmad/src/mad.c
===================================================================
--- gen2/trunk/src/userspace/management/libibmad/src/mad.c 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/libibmad/src/mad.c 2005-05-23 16:33:46 UTC (rev 2456)
@@ -147,7 +147,7 @@
mad_set_field(buf, 0, IB_DRSMP_DRDLID_F, drpath->drdlid ? drpath->drdlid : 0xffff);
mad_set_field(buf, 0, IB_DRSMP_DRSLID_F, drpath->drslid ? drpath->drslid : 0xffff);
- /* bytes 128 - 256 - by default should be zero due memset*/
+ /* bytes 128 - 256 - by default should be zero due to memset*/
if (is_resp)
mad_set_array(buf, 0, IB_DRSMP_RPATH_F, drpath->p);
else
Modified: gen2/trunk/src/userspace/management/libibmad/src/register.c
===================================================================
--- gen2/trunk/src/userspace/management/libibmad/src/register.c 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/libibmad/src/register.c 2005-05-23 16:33:46 UTC (rev 2456)
@@ -116,7 +116,7 @@
}
int
-mad_register_client(int mgmt)
+mad_register_client(int mgmt, uint8_t rmpp_version)
{
int vers, agent;
@@ -124,7 +124,7 @@
DEBUG("Unknown class %d mgmt_class", mgmt);
return -1;
}
- if ((agent = umad_register(madrpc_portid(), mgmt, vers, 0)) < 0) {
+ if ((agent = umad_register(madrpc_portid(), mgmt, vers, rmpp_version, 0)) < 0) {
DEBUG("Can't register agent for class %d", mgmt);
return -1;
}
@@ -141,9 +141,11 @@
}
int
-mad_register_server(int mgmt, uint32_t method_mask[4], uint32_t class_oui)
+mad_register_server(int mgmt, uint8_t rmpp_version,
+ uint32_t method_mask[4], uint32_t class_oui)
{
- uint32_t class_method_mask[4] = {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff};
+ uint32_t class_method_mask[4] = {0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff};
uint8_t oui[3];
int agent, vers, mad_portid;
@@ -165,11 +167,11 @@
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, oui, class_method_mask)) < 0) {
+ if ((agent = umad_register_oui(mad_portid, 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, class_method_mask)) < 0) {
+ } else if ((agent = umad_register(mad_portid, mgmt, vers, rmpp_version, class_method_mask)) < 0) {
DEBUG("Can't register agent for class %d", mgmt);
return -1;
}
Modified: gen2/trunk/src/userspace/management/libibmad/src/rpc.c
===================================================================
--- gen2/trunk/src/userspace/management/libibmad/src/rpc.c 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/libibmad/src/rpc.c 2005-05-23 16:33:46 UTC (rev 2456)
@@ -112,8 +112,8 @@
timeout = def_madrpc_timeout;
if (ibdebug > 1) {
- WARN(">>> sending: len %d pktsz %d", len, umad_size());
- xdump(stderr, "send buf\n", umad, umad_size());
+ WARN(">>> sending: len %d pktsz %d", len, umad_size() + IB_MAD_SIZE);
+ xdump(stderr, "send buf\n", umad, umad_size() + IB_MAD_SIZE);
}
if (save_mad) {
@@ -126,7 +126,7 @@
if (retries)
ERRS("retry %d (timeout %d ms)", retries+1, timeout);
- if (umad_send(mad_portid, agentid, umad, timeout) < 0) {
+ if (umad_send(mad_portid, agentid, umad, IB_MAD_SIZE, timeout) < 0) {
WARN("send failed; %m");
return -1;
}
@@ -157,7 +157,7 @@
uint8_t pktbuf[1024], *mad;
void *umad = pktbuf;
- memset(pktbuf, 0, umad_size());
+ memset(pktbuf, 0, umad_size() + IB_MAD_SIZE);
if ((len = mad_build_pkt(umad, rpc, dport, 0, payload)) < 0)
return 0;
@@ -192,7 +192,7 @@
uint8_t pktbuf[1024], *mad;
void *umad = pktbuf;
- memset(pktbuf, 0, umad_size());
+ memset(pktbuf, 0, umad_size() + IB_MAD_SIZE);
DEBUG("rmpp %p data %p", rmpp, data);
@@ -263,7 +263,7 @@
while (num_classes--) {
int mgmt = *mgmt_classes++;
- if (mad_register_client(mgmt) < 0)
+ if (mad_register_client(mgmt, 0) < 0)
PANIC("client_register for mgmt %d failed", mgmt);
}
}
Modified: gen2/trunk/src/userspace/management/libibmad/src/serv.c
===================================================================
--- gen2/trunk/src/userspace/management/libibmad/src/serv.c 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/libibmad/src/serv.c 2005-05-23 16:33:46 UTC (rev 2456)
@@ -71,7 +71,7 @@
}
if (umad_send(madrpc_portid(), mad_class_agent(rpc->mgtclass),
- umad, rpc->timeout) < 0) {
+ umad, IB_MAD_SIZE, rpc->timeout) < 0) {
WARN("send failed; %m");
return -1;
}
@@ -145,7 +145,7 @@
xdump(stderr, "mad respond pkt\n", mad, IB_MAD_SIZE);
if (umad_send(madrpc_portid(), mad_class_agent(rpc.mgtclass), umad,
- rpc.timeout) < 0) {
+ IB_MAD_SIZE, rpc.timeout) < 0) {
DEBUG("send failed; %m");
return -1;
}
@@ -156,7 +156,7 @@
void *
mad_receive(void *umad, int timeout)
{
- void *mad = umad ? umad : umad_alloc(1);
+ void *mad = umad ? umad : umad_alloc(1, umad_size() + IB_MAD_SIZE);
int agent;
if ((agent = umad_recv(madrpc_portid(), mad, timeout)) < 0) {
@@ -172,7 +172,7 @@
void *
mad_alloc(void)
{
- return umad_alloc(1);
+ return umad_alloc(1, umad_size() + IB_MAD_SIZE);
}
void
Modified: gen2/trunk/src/userspace/management/libibumad/include/infiniband/umad.h
===================================================================
--- gen2/trunk/src/userspace/management/libibumad/include/infiniband/umad.h 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/libibumad/include/infiniband/umad.h 2005-05-23 16:33:46 UTC (rev 2456)
@@ -63,7 +63,7 @@
uint32_t flow_label;
} ib_mad_addr_t;
-#define IB_UMAD_ABI_VERSION 2
+#define IB_UMAD_ABI_VERSION 3
#define IB_UMAD_ABI_DIR "/sys/class/infiniband_mad"
#define IB_UMAD_ABI_FILE "abi_version"
@@ -160,14 +160,15 @@
int umad_set_addr(void *umad, int dlid, int dqp, int sl, int qkey);
int umad_set_pkey(void *umad, int pkey);
-int umad_send(int portid, int agentid, void *umad, int timeout_ms);
+int umad_send(int portid, int agentid, void *umad, int length,
+ int timeout_ms);
int umad_recv(int portid, void *umad, int timeout_ms);
int umad_poll(int portid, int timeout_ms);
int umad_register(int portid, int mgmt_class, int mgmt_version,
- uint32_t method_mask[4]);
-int umad_register_oui(int portid, int mgmt_class, uint8_t oui[3],
- uint32_t method_mask[4]);
+ uint8_t rmpp_version, uint32_t method_mask[4]);
+int umad_register_oui(int portid, int mgmt_class, uint8_t rmpp_version,
+ uint8_t oui[3], uint32_t method_mask[4]);
int umad_unregister(int portid, int agentid);
int umad_debug(int level);
@@ -177,9 +178,9 @@
#include <stdlib.h>
static inline void *
-umad_alloc(int num) /* alloc array of umad buffers */
+umad_alloc(int num, int size) /* alloc array of umad buffers */
{
- return calloc(num, umad_size());
+ return calloc(num, size);
}
static inline void
Modified: gen2/trunk/src/userspace/management/libibumad/src/umad.c
===================================================================
--- gen2/trunk/src/userspace/management/libibumad/src/umad.c 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/libibumad/src/umad.c 2005-05-23 16:33:46 UTC (rev 2456)
@@ -50,12 +50,14 @@
#include "umad.h"
+#define IB_OPENIB_OUI (0x001405)
+
typedef struct ib_user_mad {
- uint8_t data[256];
uint32_t agent_id;
uint32_t status;
uint32_t timeout_ms;
ib_mad_addr_t addr;
+ uint8_t data[0];
} ib_user_mad_t;
typedef struct ib_user_mad_reg_req {
@@ -65,6 +67,7 @@
uint8_t mgmt_class;
uint8_t mgmt_class_version;
uint8_t oui[3];
+ uint8_t rmpp_version;
} ib_user_mad_reg_req_t;
#define TRACE if (umaddebug) WARN
@@ -233,7 +236,7 @@
return 1;
}
- if (*port > 0) { /* user wants user gets */
+ if (*port > 0) { /* user wants user gets */
if (*port > ca.numports)
return -1;
if (!ca.ports[*port])
@@ -300,7 +303,8 @@
if (port_type > 0) {
if (best_port)
*best_port = port;
- DEBUG("found ca %s with active port %d", names[caidx], port);
+ DEBUG("found ca %s with active port %d",
+ names[caidx], port);
return (char *)(names + caidx);
}
@@ -332,18 +336,22 @@
int r, i, ret;
int portnum;
- strncpy(ca->ca_name, ca_name, sizeof(ca->ca_name));
+ strncpy(ca->ca_name, ca_name, sizeof ca->ca_name);
- snprintf(dir_name, sizeof dir_name - 1, "%s/%s", SYS_INFINIBAND, ca->ca_name);
+ snprintf(dir_name, sizeof dir_name - 1, "%s/%s", SYS_INFINIBAND,
+ ca->ca_name);
dir_name[sizeof dir_name - 1] = 0;
if ((r = sys_read_uint(dir_name, SYS_NODE_TYPE, &ca->node_type)) < 0)
return r;
- if ((r = sys_read_string(dir_name, SYS_CA_FW_VERS, ca->fw_ver, sizeof ca->fw_ver)) < 0)
+ if ((r = sys_read_string(dir_name, SYS_CA_FW_VERS, ca->fw_ver,
+ sizeof ca->fw_ver)) < 0)
return r;
- if ((r = sys_read_string(dir_name, SYS_CA_HW_VERS, ca->hw_ver, sizeof ca->hw_ver)) < 0)
+ if ((r = sys_read_string(dir_name, SYS_CA_HW_VERS, ca->hw_ver,
+ sizeof ca->hw_ver)) < 0)
return r;
- if ((r = sys_read_string(dir_name, SYS_CA_TYPE, ca->ca_type, sizeof ca->ca_type)) < 0)
+ if ((r = sys_read_string(dir_name, SYS_CA_TYPE, ca->ca_type,
+ sizeof ca->ca_type)) < 0)
return r;
if ((r = sys_read_guid(dir_name, SYS_CA_NODE_GUID, &ca->node_guid)) < 0)
return r;
@@ -367,14 +375,16 @@
memset(ca->ports, 0, sizeof ca->ports);
for (i = 0; i < r; i++) {
portnum = 0;
- if (!strcmp(".", namelist[i]->d_name) || !strcmp("..", namelist[i]->d_name))
+ if (!strcmp(".", namelist[i]->d_name) ||
+ !strcmp("..", namelist[i]->d_name))
continue;
if (strcmp("0", namelist[i]->d_name) &&
- ((portnum = atoi(namelist[i]->d_name)) <= 0 || portnum >= UMAD_CA_MAX_PORTS)) {
+ ((portnum = atoi(namelist[i]->d_name)) <= 0 ||
+ portnum >= UMAD_CA_MAX_PORTS)) {
ret = -EIO;
goto clean;
}
- if (!(ca->ports[portnum] = calloc(1, sizeof (*ca->ports[portnum])))) {
+ if (!(ca->ports[portnum] = calloc(1, sizeof(*ca->ports[portnum])))) {
ret = -ENOMEM;
goto clean;
}
@@ -489,7 +499,8 @@
if (!strcmp(namelist[i]->d_name, ".") ||
!strcmp(namelist[i]->d_name, "..")) {
} else
- strncpy(cas[j++], namelist[i]->d_name, UMAD_CA_NAME_LEN);
+ strncpy(cas[j++], namelist[i]->d_name,
+ UMAD_CA_NAME_LEN);
free(namelist[i]);
}
DEBUG("return %d cas", j);
@@ -679,7 +690,8 @@
{
struct ib_user_mad *mad = umad;
- TRACE("umad %p dlid %d dqp %d sl %d, qkey %x", umad, dlid, dqp, sl, qkey);
+ TRACE("umad %p dlid %d dqp %d sl %d, qkey %x",
+ umad, dlid, dqp, sl, qkey);
mad->addr.qpn = htonl(dqp);
mad->addr.lid = htons(dlid);
mad->addr.qkey = htonl(qkey);
@@ -704,7 +716,7 @@
}
int
-umad_send(int portid, int agentid, void *umad, int timeout_ms)
+umad_send(int portid, int agentid, void *umad, int length, int timeout_ms)
{
struct ib_user_mad *mad = umad;
Port *port;
@@ -720,7 +732,7 @@
if (umaddebug > 1)
umad_dump(mad);
- if (write(port->dev_fd, mad, sizeof (*mad)) == sizeof (*mad))
+ if (write(port->dev_fd, mad, length + sizeof *mad) == length + sizeof *mad)
return 0;
DEBUG("send error: %m");
@@ -758,7 +770,7 @@
if (timeout_ms && (n = dev_poll(port->dev_fd, timeout_ms)) < 0)
return n;
- if ((n = read(port->dev_fd, umad, sizeof (*mad))) == sizeof (*mad)) {
+ if ((n = read(port->dev_fd, umad, sizeof *mad + 256)) == sizeof *mad + 256) {
DEBUG("mad received by agent %d", mad->agent_id);
return mad->agent_id;
}
@@ -766,7 +778,7 @@
if (n == -EWOULDBLOCK)
return n;
- DEBUG("read returned %d != sizeof umad %d (%m)", n, sizeof (*mad));
+ DEBUG("read returned %d != sizeof umad %d (%m)", n, sizeof *mad);
return -EIO;
}
@@ -783,14 +795,14 @@
}
int
-umad_register_oui(int portid, int mgmt_class, uint8_t oui[3],
- uint32_t method_mask[4])
+umad_register_oui(int portid, int mgmt_class, uint8_t rmpp_version,
+ uint8_t oui[3], uint32_t method_mask[4])
{
struct ib_user_mad_reg_req req;
Port *port;
- TRACE("portid %d mgmt_class %u oui 0x%x%x%x method_mask %p",
- portid, mgmt_class, (int)oui[0], (int)oui[1],
+ TRACE("portid %d mgmt_class %u rmpp_version %d oui 0x%x%x%x method_mask %p",
+ portid, mgmt_class, (int)rmpp_version, (int)oui[0], (int)oui[1],
(int)oui[2], method_mask);
if (!(port = port_get(portid)))
@@ -805,6 +817,7 @@
req.mgmt_class = mgmt_class;
req.mgmt_class_version = 1;
memcpy(req.oui, oui, sizeof req.oui);
+ req.rmpp_version = rmpp_version;
if ((void *)method_mask != 0)
memcpy(req.method_mask, method_mask, sizeof req.method_mask);
@@ -817,21 +830,22 @@
return req.id; /* return agentid */
}
- DEBUG("portid %d registering qp %d class %s version %d out 0x%x failed: %m",
+ DEBUG("portid %d registering qp %d class %s version %d oui 0x%x failed: %m",
portid, req.qpn, req.mgmt_class, req.mgmt_class_version, oui);
return -EPERM;
}
int
umad_register(int portid, int mgmt_class, int mgmt_version,
- uint32_t method_mask[4])
+ uint8_t rmpp_version, uint32_t method_mask[4])
{
struct ib_user_mad_reg_req req;
Port *port;
+ uint32_t oui = htonl(IB_OPENIB_OUI);
int qp;
- TRACE("portid %d mgmt_class %u mgmt_version %u method_mask %p",
- portid, mgmt_class, mgmt_version, method_mask);
+ TRACE("portid %d mgmt_class %u mgmt_version %u rmpp_version %d method_mask %p",
+ portid, mgmt_class, mgmt_version, rmpp_version, method_mask);
if (!(port = port_get(portid)))
return -EINVAL;
@@ -839,12 +853,15 @@
req.qpn = qp = (mgmt_class == 0x1 || mgmt_class == 0x81) ? 0 : 1;
req.mgmt_class = mgmt_class;
req.mgmt_class_version = mgmt_version;
+ req.rmpp_version = rmpp_version;
if ((void *)method_mask != 0)
memcpy(req.method_mask, method_mask, sizeof req.method_mask);
else
memset(req.method_mask, 0, sizeof req.method_mask);
+ memcpy(&req.oui, (char *)&oui + 1, sizeof req.oui);
+
if (!ioctl(port->dev_fd, IB_USER_MAD_REGISTER_AGENT, (void *)&req)) {
DEBUG("portid %d registered to use agent %d qp %d",
portid, req.id, qp);
Modified: gen2/trunk/src/userspace/management/osm/libvendor/Makefile.am
===================================================================
--- gen2/trunk/src/userspace/management/osm/libvendor/Makefile.am 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/osm/libvendor/Makefile.am 2005-05-23 16:33:46 UTC (rev 2456)
@@ -9,7 +9,7 @@
lib_LTLIBRARIES = libosmvendor.la
-libosmvendor_la_CFLAGS = -Wall -DOSM_VENDOR_INTF_OPENIB
+libosmvendor_la_CFLAGS = -Wall -DOSM_VENDOR_INTF_OPENIB -DVENDOR_RMPP_SUPPORT
if HAVE_LD_VERSION_SCRIPT
libosmvendor_version_script = -Wl,--version-script=$(srcdir)/libosmvendor.map
Modified: gen2/trunk/src/userspace/management/osm/libvendor/osm_vendor_ibumad.c
===================================================================
--- gen2/trunk/src/userspace/management/osm/libvendor/osm_vendor_ibumad.c 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/osm/libvendor/osm_vendor_ibumad.c 2005-05-23 16:33:46 UTC (rev 2456)
@@ -224,7 +224,8 @@
pthread_sigmask(SIG_BLOCK, &sigs, NULL);
for (;;) {
- if (!umad && !(umad = umad_alloc(1))) {
+ if (!umad &&
+ !(umad = umad_alloc(1, umad_size() + MAD_BLOCK_SIZE))) {
osm_log(p_ur->p_log, OSM_LOG_ERROR,
"umad_receiver: can't alloc umad\n");
break;
@@ -236,7 +237,8 @@
break;
}
- if (mad_agent >= UMAD_CA_MAX_AGENTS || !(p_bind = p_vend->agents[mad_agent])) {
+ if (mad_agent >= UMAD_CA_MAX_AGENTS ||
+ !(p_bind = p_vend->agents[mad_agent])) {
osm_log(p_ur->p_log, OSM_LOG_ERROR,
"umad_receiver: bad mad agent %d - dropping\n", mad_agent);
continue;
@@ -249,7 +251,8 @@
mad->mgmt_class == IB_MCLASS_SUBN_LID ||
mad->mgmt_class == IB_MCLASS_SUBN_DIR);
- if (!(madw_p = osm_mad_pool_get(p_bind->p_mad_pool, (osm_bind_handle_t)p_bind,
+ if (!(madw_p = osm_mad_pool_get(p_bind->p_mad_pool,
+ (osm_bind_handle_t)p_bind,
MAD_BLOCK_SIZE, &osm_addr))) {
osm_log( p_vend->p_log, OSM_LOG_ERROR, "umad_receiver: "
"request for a new madw failed -- dropping packet\n" );
@@ -271,7 +274,8 @@
if (mad->mgmt_class != IB_MCLASS_SUBN_DIR) {
/* LID routed */
osm_log( p_vend->p_log, OSM_LOG_ERROR,
- "umad_receiver: class 0x%x LID 0x%x\n", mad->mgmt_class, ib_addr->lid);
+ "umad_receiver: class 0x%x LID 0x%x\n",
+ mad->mgmt_class, ib_addr->lid);
} else {
/* Direct routed SMP */
ib_smp_t *smp = (ib_smp_t *)mad;
@@ -280,8 +284,10 @@
char line[BUF_SIZE];
osm_log( p_vend->p_log, OSM_LOG_ERROR,
- "umad_receiver: DR SMP hop ptr %d hop count %d DR SLID 0x%x DR DLID 0x%x\n", smp->hop_ptr, smp->hop_count, smp->dr_slid, smp->dr_dlid);
- if( osm_log_is_active( p_vend->p_log, OSM_LOG_ERROR) )
+ "umad_receiver: DR SMP hop ptr %d hop count %d DR SLID 0x%x DR DLID 0x%x\n",
+ smp->hop_ptr, smp->hop_count, smp->dr_slid, smp->dr_dlid);
+ if( osm_log_is_active( p_vend->p_log,
+ OSM_LOG_ERROR) )
{
sprintf( buf, "Initial path = ");
for ( i = 0; i < smp->hop_count; i++ ) {
@@ -622,6 +628,7 @@
osm_umad_bind_info_t *p_bind = 0;
uint32_t method_mask[4];
int umad_port_id;
+ uint8_t rmpp_version;
OSM_LOG_ENTER( p_vend->p_log, osm_vendor_bind );
@@ -657,10 +664,20 @@
memset(method_mask, 0xff, sizeof method_mask); /* accept all methods */
+#ifndef VENDOR_RMPP_SUPPORT
+ rmpp_version = 0;
+#else
+ /* If SA class, set rmpp_version */
+ if (p_user_bind->mad_class == IB_MCLASS_SUBN_ADM)
+ rmpp_version = 1;
+ else
+ rmpp_version = 0;
+#endif
+
if ((p_bind->agent_id = umad_register(p_vend->umad_port_id,
p_user_bind->mad_class,
p_user_bind->class_version,
- method_mask)) < 0) {
+ rmpp_version, method_mask)) < 0) {
osm_log( p_vend->p_log, OSM_LOG_ERROR, "osm_vendor_bind: "
"Unable to register class %u version %u.\n",
p_user_bind->mad_class, p_user_bind->class_version);
@@ -681,10 +698,12 @@
p_vend->agents[p_bind->agent_id] = p_bind;
- if (p_user_bind->mad_class == 0x81) {
- if ((p_bind->agent_id1 = umad_register(p_vend->umad_port_id, 1,
+ /* If Subn Directed Route class, register Subn LID routed class */
+ if (p_user_bind->mad_class == IB_MCLASS_SUBN_DIR) {
+ if ((p_bind->agent_id1 = umad_register(p_vend->umad_port_id,
+ IB_MCLASS_SUBN_LID,
p_user_bind->class_version,
- method_mask)) < 0) {
+ 0, method_mask)) < 0) {
osm_log( p_vend->p_log, OSM_LOG_ERROR, "osm_vendor_bind: "
"Unable to register class 1 version %u.\n",
p_user_bind->class_version);
@@ -724,13 +743,12 @@
OSM_LOG_ENTER( p_vend->p_log, osm_vendor_get );
+osm_log( p_vend->p_log, OSM_LOG_DEBUG, "osm_vendor_get: "
+ "Acquiring UMAD for p_madw = %p, size = %u.\n", p_vw, mad_size );
CL_ASSERT( p_vw );
- CL_ASSERT( mad_size <= MAD_BLOCK_SIZE );
+ p_vw->size = mad_size;
+ p_vw->umad = umad_alloc(1, mad_size + umad_size());
- /* IB_UMAD assumes it is 256 - we must follow */
- p_vw->size = MAD_BLOCK_SIZE;
- p_vw->umad = umad_alloc(1);
-
/* track locally */
p_vw->h_bind = h_bind;
@@ -786,7 +804,7 @@
osm_vend_wrap_t* const p_vw = osm_madw_get_vend_ptr( p_madw );
osm_mad_addr_t* const p_mad_addr = osm_madw_get_mad_addr_ptr( p_madw );
ib_mad_t* const p_mad = osm_madw_get_mad_ptr( p_madw );
- ib_sa_mad_t* const p_sa = (ib_sa_mad_t *)p_vw->umad;
+ ib_sa_mad_t* const p_sa = (ib_sa_mad_t *)p_mad;
int ret = -1;
#ifndef VENDOR_RMPP_SUPPORT
uint32_t paylen = 0;
@@ -821,6 +839,7 @@
p_sa->rmpp_status = 0;
#ifdef VENDOR_RMPP_SUPPORT
}
+ osm_log( p_vend->p_log, OSM_LOG_ERROR, "osm_vendor_send: RMPP %d length %d\n", ib_rmpp_is_flag_set((ib_rmpp_mad_t *)p_sa, IB_RMPP_FLAG_ACTIVE), p_madw->mad_size);
#else
} else {
p_sa->rmpp_version = 1;
@@ -838,7 +857,7 @@
if (resp_expected)
put_madw(p_vend, p_madw, &p_mad->trans_id);
- if ((ret = umad_send(p_bind->port_id, p_bind->agent_id, p_vw->umad, resp_expected ? p_vend->timeout : 0)) < 0) {
+ if ((ret = umad_send(p_bind->port_id, p_bind->agent_id, p_vw->umad, p_madw->mad_size, resp_expected ? p_vend->timeout : 0)) < 0) {
osm_log( p_vend->p_log, OSM_LOG_ERROR, "osm_vendor_send: Send failed %d (%m).\n", ret);
(*p_bind->send_err_callback)(p_bind->client_context, p_madw); /* cb frees madw */
if (resp_expected)
@@ -850,7 +869,7 @@
osm_mad_pool_put(p_bind->p_mad_pool, p_madw);
osm_log(p_vend->p_log, OSM_LOG_DEBUG, "__osm_mtl_send_callback: "
- "Completed Sending Request MADW:%p.\n", p_madw);
+ "Completed Sending Request MADW: %p.\n", p_madw);
Exit:
OSM_LOG_EXIT( p_vend->p_log );
return( ret );
Modified: gen2/trunk/src/userspace/management/osm/opensm/Makefile.am
===================================================================
--- gen2/trunk/src/userspace/management/osm/opensm/Makefile.am 2005-05-23 16:12:49 UTC (rev 2455)
+++ gen2/trunk/src/userspace/management/osm/opensm/Makefile.am 2005-05-23 16:33:46 UTC (rev 2456)
@@ -47,7 +47,7 @@
osm_ucast_mgr.c osm_ucast_updn.c \
osm_vl15intf.c osm_vl_arb_rcv.c\
osm_vl_arb_rcv_ctrl.c
-opensm_CFLAGS = -Wall -DOSM_VENDOR_INTF_OPENIB
+opensm_CFLAGS = -Wall -DOSM_VENDOR_INTF_OPENIB -DVENDOR_RMPP_SUPPORT
opensm_LDADD = $(libdir)/libibumad.la \
$(libdir)/libibcommon.la \
$(libdir)/libosmcomp.la \
More information about the general
mailing list