changeset e832056deaed in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=e832056deaed
description:
        dev: Fix buffer length when unserializing an eth pkt

        Changeset 11701 only serialized the useful portion of of an ethernet 
packets'
        payload. However, the device models expect each ethernet packet to 
contain
        a 16KB buffer, even if there is no data in it. This patch adds a 
'bufLength'
        field to EthPacketData so the original size of the packet buffer can 
always
        be unserialized.

        Reported-by: Gabor Dozsa <[email protected]>

diffstat:

 src/dev/net/etherpkt.cc  |  21 +++++++++++++++++----
 src/dev/net/etherpkt.hh  |   9 +++++++--
 src/dev/net/i8254xGBe.cc |   2 +-
 src/dev/net/ns_gige.cc   |   2 +-
 src/dev/net/sinic.cc     |   2 +-
 5 files changed, 27 insertions(+), 9 deletions(-)

diffs (104 lines):

diff -r 09f8fda798bc -r e832056deaed src/dev/net/etherpkt.cc
--- a/src/dev/net/etherpkt.cc   Mon Nov 28 12:44:54 2016 -0500
+++ b/src/dev/net/etherpkt.cc   Tue Nov 29 13:04:45 2016 -0500
@@ -42,6 +42,7 @@
 EthPacketData::serialize(const string &base, CheckpointOut &cp) const
 {
     paramOut(cp, base + ".simLength", simLength);
+    paramOut(cp, base + ".bufLength", bufLength);
     paramOut(cp, base + ".length", length);
     arrayParamOut(cp, base + ".data", data, length);
 }
@@ -50,11 +51,23 @@
 EthPacketData::unserialize(const string &base, CheckpointIn &cp)
 {
     paramIn(cp, base + ".length", length);
-    if (length) {
-        assert(data == nullptr);
-        data = new uint8_t[length];
-        arrayParamIn(cp, base + ".data", data, length);
+    unsigned chkpt_buf_length;
+    if (optParamIn(cp, base + ".bufLength", chkpt_buf_length)) {
+        // If bufLength is in the checkpoint, make sure that the current buffer
+        // is unallocated or that the checkpoint requested size is smaller than
+        // the current buffer.
+        assert(!data || chkpt_buf_length <= bufLength);
+        bufLength = chkpt_buf_length;
+    } else {
+        // If bufLength is not in the checkpoint, try to use the existing
+        // buffer or use length to size the buffer
+        if (!data)
+            bufLength = length;
     }
+    assert(length <= bufLength);
+    if (!data)
+        data = new uint8_t[bufLength];
+    arrayParamIn(cp, base + ".data", data, length);
     if (!optParamIn(cp, base + ".simLength", simLength))
         simLength = length;
 }
diff -r 09f8fda798bc -r e832056deaed src/dev/net/etherpkt.hh
--- a/src/dev/net/etherpkt.hh   Mon Nov 28 12:44:54 2016 -0500
+++ b/src/dev/net/etherpkt.hh   Tue Nov 29 13:04:45 2016 -0500
@@ -55,6 +55,11 @@
     uint8_t *data;
 
     /**
+     * Total size of the allocated data buffer.
+     */
+    unsigned bufLength;
+
+    /**
      * Amount of space occupied by the payload in the data buffer
      */
     unsigned length;
@@ -69,11 +74,11 @@
     unsigned simLength;
 
     EthPacketData()
-        : data(nullptr), length(0), simLength(0)
+        : data(nullptr), bufLength(0), length(0), simLength(0)
     { }
 
     explicit EthPacketData(unsigned size)
-        : data(new uint8_t[size]), length(0), simLength(0)
+        : data(new uint8_t[size]), bufLength(size), length(0), simLength(0)
     { }
 
     ~EthPacketData() { if (data) delete [] data; }
diff -r 09f8fda798bc -r e832056deaed src/dev/net/i8254xGBe.cc
--- a/src/dev/net/i8254xGBe.cc  Mon Nov 28 12:44:54 2016 -0500
+++ b/src/dev/net/i8254xGBe.cc  Tue Nov 29 13:04:45 2016 -0500
@@ -2522,7 +2522,7 @@
     bool txPktExists;
     UNSERIALIZE_SCALAR(txPktExists);
     if (txPktExists) {
-        txPacket = std::make_shared<EthPacketData>();
+        txPacket = std::make_shared<EthPacketData>(16384);
         txPacket->unserialize("txpacket", cp);
     }
 
diff -r 09f8fda798bc -r e832056deaed src/dev/net/ns_gige.cc
--- a/src/dev/net/ns_gige.cc    Mon Nov 28 12:44:54 2016 -0500
+++ b/src/dev/net/ns_gige.cc    Tue Nov 29 13:04:45 2016 -0500
@@ -2352,7 +2352,7 @@
     bool txPacketExists;
     UNSERIALIZE_SCALAR(txPacketExists);
     if (txPacketExists) {
-        txPacket = make_shared<EthPacketData>();
+        txPacket = make_shared<EthPacketData>(16384);
         txPacket->unserialize("txPacket", cp);
         uint32_t txPktBufPtr;
         UNSERIALIZE_SCALAR(txPktBufPtr);
diff -r 09f8fda798bc -r e832056deaed src/dev/net/sinic.cc
--- a/src/dev/net/sinic.cc      Mon Nov 28 12:44:54 2016 -0500
+++ b/src/dev/net/sinic.cc      Tue Nov 29 13:04:45 2016 -0500
@@ -1496,7 +1496,7 @@
     UNSERIALIZE_SCALAR(txPacketExists);
     txPacket = 0;
     if (txPacketExists) {
-        txPacket = make_shared<EthPacketData>();
+        txPacket = make_shared<EthPacketData>(16384);
         txPacket->unserialize("txPacket", cp);
         UNSERIALIZE_SCALAR(txPacketOffset);
         UNSERIALIZE_SCALAR(txPacketBytes);
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to