[ofa-general] [PATCH] ibsim: Support short RMPP packets
Hal Rosenstock
hrosenstock at xsigo.com
Wed Jun 11 06:53:30 PDT 2008
ibsim: Support for short RMPP packets (up to 256 bytes total)
If this is acceptable, I'll follow this up with long packet support.
Signed-off-by: Hal Rosenstock <hal at xsigo.com>
diff --git a/ibsim/ibsim.c b/ibsim/ibsim.c
index e4ab6bc..bdfe252 100644
--- a/ibsim/ibsim.c
+++ b/ibsim/ibsim.c
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved.
*
* This file is part of ibsim.
*
@@ -494,7 +495,7 @@ static int sim_read_pkt(int fd, int client)
VERB("%s %d bytes (%zu) to client %d fd %d",
dcl == cl ? "replying" : "forwarding",
- size, sizeof(struct sim_request), dcl->id, dcl->fd);
+ size, sizeof(struct sim_req256), dcl->id, dcl->fd);
// reply
ret = write(dcl->fd, buf, size);
@@ -508,7 +509,7 @@ static int sim_read_pkt(int fd, int client)
}
IBWARN("write failed: %m - pkt dropped");
if (dcl != cl) { /* reply timeout */
- struct sim_request *r = (struct sim_request *)buf;
+ struct sim_req256 *r = (struct sim_req256 *)buf;
r->status = htonl(110);
write(cl->fd, buf, size);
}
diff --git a/ibsim/sim_mad.c b/ibsim/sim_mad.c
index 675d95b..eef0bab
--- a/ibsim/sim_mad.c
+++ b/ibsim/sim_mad.c
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved.
*
* This file is part of ibsim.
*
@@ -1128,14 +1129,14 @@ Smpfn *get_handle_fn(ib_rpc_t rpc, int response)
return fn;
}
- return 0; // No MGTCLASS matched .
+ return 0; // No MGTCLASS matched.
}
int process_packet(Client * cl, void *p, int size, Client ** dcl)
{
struct sim_request *r = p;
Port *port;
- uint8_t data[256];
+ uint8_t data[MAD_BLOCK_SIZE];
int status, tlid, tqp;
int response;
Smpfn *fn;
@@ -1144,9 +1145,10 @@ int process_packet(Client * cl, void *p, int size, Client ** dcl)
*dcl = cl;
- DEBUG("client %d, size %d", cl->id, size);
- if (size != sizeof(*r)) {
- IBWARN("bad packet size %d (!= %zu)", size, sizeof(*r));
+ DEBUG("client %d size %d", cl->id, size);
+ if (size > sizeof(*r) + MAD_BLOCK_SIZE) {
+ IBWARN("unsupported packet size %d (> %zu)", size,
+ sizeof(*r) + MAD_BLOCK_SIZE);
return -1;
}
@@ -1183,7 +1185,7 @@ int process_packet(Client * cl, void *p, int size, Client ** dcl)
VERB("forward pkt to client %d pid %d attr %d",
(*dcl)->id, (*dcl)->pid, rpc.attr.id);
forward_MAD(r->mad, &rpc, &path);
- return sizeof(*r); // forward only
+ return size; // forward only
}
if (port->errrate && (random() % 100) < port->errrate) {
@@ -1214,12 +1216,12 @@ int process_packet(Client * cl, void *p, int size, Client ** dcl)
VERB("PKT roll back did not succeed");
goto _dropped;
}
- return sizeof(*r);
+ return sizeof(*r) + MAD_BLOCK_SIZE;
_dropped:
r->status = htonl(110);
*dcl = cl;
- return sizeof(*r);
+ return sizeof(*r) + MAD_BLOCK_SIZE;
}
static int encode_trap128(Port * port, char *data)
@@ -1279,7 +1281,7 @@ static int encode_trap_header(char *buf)
int send_trap(Port * port, int trapnum)
{
- struct sim_request req;
+ struct sim_req256 req;
Client *cl;
int ret, lid = port->lid;
char *data = req.mad + 64; /* data offset */
diff --git a/include/ibsim.h b/include/ibsim.h
index 84568e6..14a3f90 100644
--- a/include/ibsim.h
+++ b/include/ibsim.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2006,2007 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved.
*
* This file is part of ibsim.
*
@@ -61,6 +62,8 @@ struct sim_port {
#define SIM_MAGIC 0xdeadbeef
#define SIM_CTL_MAX_DATA 64
+#define MAD_BLOCK_SIZE 256
+
struct sim_request {
uint32_t dlid;
uint32_t slid;
@@ -68,7 +71,17 @@ struct sim_request {
uint32_t sqp;
uint32_t status;
uint64_t context;
- char mad[256];
+ char mad[0];
+};
+
+struct sim_req256 {
+ uint32_t dlid;
+ uint32_t slid;
+ uint32_t dqp;
+ uint32_t sqp;
+ uint32_t status;
+ uint64_t context;
+ char mad[MAD_BLOCK_SIZE];
};
enum SIM_CTL_TYPES {
diff --git a/umad2sim/umad2sim.c b/umad2sim/umad2sim.c
index 4cbf8da..9c69fb5 100644
--- a/umad2sim/umad2sim.c
+++ b/umad2sim/umad2sim.c
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2006,2007 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2008 Xsigo Systems Inc. All rights reserved.
*
* This file is part of ibsim.
*
@@ -376,7 +377,7 @@ static int dev_sysfs_create(struct umad2sim_dev *dev)
static ssize_t umad2sim_read(struct umad2sim_dev *dev, void *buf, size_t count)
{
- struct sim_request req;
+ struct sim_req256 req;
ib_user_mad_t *umad = (ib_user_mad_t *) buf;
unsigned mgmt_class;
int cnt;
@@ -385,11 +386,6 @@ static ssize_t umad2sim_read(struct umad2sim_dev *dev, void *buf, size_t count)
cnt = real_read(dev->sim_client.fd_pktin, &req, sizeof(req));
DEBUG("umad2sim_read: got %d...\n", cnt);
- if (cnt < sizeof(req)) {
- ERROR("umad2sim_read: partial request - skip.\n");
- umad->status = EAGAIN;
- return umad_size();
- }
mgmt_class = mad_get_field(req.mad, 0, IB_MAD_MGMTCLASS_F);
@@ -411,7 +407,7 @@ static ssize_t umad2sim_read(struct umad2sim_dev *dev, void *buf, size_t count)
umad->status = ntohl(req.status);
umad->timeout_ms = 0;
umad->retries = 0;
- umad->length = umad_size() + sizeof(req.mad);
+ umad->length = umad_size() + cnt;
umad->addr.qpn = req.sqp;
umad->addr.qkey = 0; // agent->qkey;
@@ -431,9 +427,9 @@ static ssize_t umad2sim_read(struct umad2sim_dev *dev, void *buf, size_t count)
static ssize_t umad2sim_write(struct umad2sim_dev *dev,
const void *buf, size_t count)
{
- struct sim_request req;
+ struct sim_request *req;
ib_user_mad_t *umad = (ib_user_mad_t *) buf;
- int cnt;
+ int cnt, ocnt;
#ifdef SIMULATE_SEND_ERRORS
{ static int err_count;
@@ -464,25 +460,32 @@ static ssize_t umad2sim_write(struct umad2sim_dev *dev,
mad_get_field(umad_get_mad(umad), 0, IB_MAD_ATTRMOD_F)
);
- req.dlid = umad->addr.lid;
- req.slid = req.dlid == 0xffff ? 0xffff : 0; /* 0 - means auto
+ cnt = count - umad_size();
+ if (cnt > MAD_BLOCK_SIZE)
+ cnt = MAD_BLOCK_SIZE;
+ req = malloc(sizeof(*req) + cnt);
+ if (!req) {
+ ERROR("umad2sim_write: no mem for sim req: %m");
+ return -1;
+ }
+
+ req->dlid = umad->addr.lid;
+ req->slid = req->dlid == 0xffff ? 0xffff : 0; /* 0 - means auto
(supported by ibsim) */ ;
- req.dqp = umad->addr.qpn;
- req.sqp = htonl(dev->agents[umad->agent_id].qpn);
- req.status = 0;
- req.context = 0;
+ req->dqp = umad->addr.qpn;
+ req->sqp = htonl(dev->agents[umad->agent_id].qpn);
+ req->status = 0;
+ req->context = 0;
- cnt = count - umad_size();
- if (cnt > sizeof(req.mad))
- cnt = sizeof(req.mad);
- memcpy(req.mad, umad_get_mad(umad), cnt);
+ memcpy(req->mad, umad_get_mad(umad), cnt);
- cnt = write(dev->sim_client.fd_pktout, (void *)&req, sizeof(req));
- if (cnt < 0) {
+ ocnt = write(dev->sim_client.fd_pktout, req, sizeof(*req) + cnt);
+ free(req);
+ if (ocnt < 0) {
ERROR("umad2sim_write: cannot write\n");
return -1;
}
- if (cnt < sizeof(req)) {
+ if (ocnt < sizeof(*req) + cnt) {
ERROR("umad2sim_write: partial write\n");
}
More information about the general
mailing list