[ofa-general] Re: [PATCHv2] ibsim: Support short RMPP packets

Sasha Khapyorsky sashak at voltaire.com
Fri Jun 20 10:58:33 PDT 2008


On 07:35 Thu 19 Jun     , Hal Rosenstock wrote:
> ibsim: Support for short RMPP packets (up thru 256 bytes total)
> 
> Changes from v1:
> - Added length to simulation header (by reducing context size so as not
> to break ABI) and encoded length on sends and decoded and checked
> lengths on receive

RMPP supports transactions up to 2^^32 256 byte packets in size. So
length must be more that 32-bit (or later we will need to break ABI).
Also it should transferred in network byte order.

> - Restored short/partial packet read check in umad2sim_read
> - In umad2sim_write, fixed setting of umad->length
> - Eliminated sim_req256 typedef

Entire patch still be huge for what it tries to accomplish, I think it
is mostly due to "to malloc()" and data types conversions and it still
unclear for me why it was needed if packets are limited in size anyway.

For me it looks that something simpler like a patch below will do the
same. What do you think?

Sasha


diff --git a/ibsim/sim_mad.c b/ibsim/sim_mad.c
index 675d95b..6c5add9 100644
--- a/ibsim/sim_mad.c
+++ b/ibsim/sim_mad.c
@@ -1306,7 +1306,7 @@ int send_trap(Port * port, int trapnum)
 	req.sqp = 0;
 	req.dqp = 0;
 	req.status = 0;
-	req.context = 0;
+	req.length = htonll(sizeof(req.mad));
 
 	// find SM client
 	cl = find_client(destport, 0, 1, 0);
diff --git a/include/ibsim.h b/include/ibsim.h
index 84568e6..ba1e3dd 100644
--- a/include/ibsim.h
+++ b/include/ibsim.h
@@ -67,7 +67,7 @@ struct sim_request {
 	uint32_t dqp;
 	uint32_t sqp;
 	uint32_t status;
-	uint64_t context;
+	uint64_t length;
 	char mad[256];
 };
 
diff --git a/umad2sim/umad2sim.c b/umad2sim/umad2sim.c
index 4cbf8da..f8fa50a 100644
--- a/umad2sim/umad2sim.c
+++ b/umad2sim/umad2sim.c
@@ -411,7 +411,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() + ntohll(req.length);
 
 	umad->addr.qpn = req.sqp;
 	umad->addr.qkey = 0;	// agent->qkey;
@@ -470,13 +470,14 @@ static ssize_t umad2sim_write(struct umad2sim_dev *dev,
 	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);
 
+	req.length = htonll(cnt);
+
 	cnt = write(dev->sim_client.fd_pktout, (void *)&req, sizeof(req));
 	if (cnt < 0) {
 		ERROR("umad2sim_write: cannot write\n");



More information about the general mailing list