diff --git a/src/dev/net/etherpkt.hh b/src/dev/net/etherpkt.hh --- a/src/dev/net/etherpkt.hh +++ b/src/dev/net/etherpkt.hh @@ -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; } # Node ID b8cb39c6221a46517100017e7f0a2e301f20bfeb # Parent c38fcdaa5fe508dbb18cc084e758ad0ce8e2e2f4 diff --git a/src/dev/net/etherpkt.cc b/src/dev/net/etherpkt.cc --- a/src/dev/net/etherpkt.cc +++ b/src/dev/net/etherpkt.cc @@ -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 --git a/src/dev/net/i8254xGBe.cc b/src/dev/net/i8254xGBe.cc --- a/src/dev/net/i8254xGBe.cc +++ b/src/dev/net/i8254xGBe.cc @@ -2522,7 +2522,7 @@ bool txPktExists; UNSERIALIZE_SCALAR(txPktExists); if (txPktExists) { - txPacket = std::make_shared(); + txPacket = std::make_shared(16384); txPacket->unserialize("txpacket", cp); } diff --git a/src/dev/net/ns_gige.cc b/src/dev/net/ns_gige.cc --- a/src/dev/net/ns_gige.cc +++ b/src/dev/net/ns_gige.cc @@ -2352,7 +2352,7 @@ bool txPacketExists; UNSERIALIZE_SCALAR(txPacketExists); if (txPacketExists) { - txPacket = make_shared(); + txPacket = make_shared(16384); txPacket->unserialize("txPacket", cp); uint32_t txPktBufPtr; UNSERIALIZE_SCALAR(txPktBufPtr); diff --git a/src/dev/net/sinic.cc b/src/dev/net/sinic.cc --- a/src/dev/net/sinic.cc +++ b/src/dev/net/sinic.cc @@ -1496,7 +1496,7 @@ UNSERIALIZE_SCALAR(txPacketExists); txPacket = 0; if (txPacketExists) { - txPacket = make_shared(); + txPacket = make_shared(16384); txPacket->unserialize("txPacket", cp); UNSERIALIZE_SCALAR(txPacketOffset); UNSERIALIZE_SCALAR(txPacketBytes);