--- a/src/network/model/packet.cc +++ a/src/network/model/packet.cc @@ -138,6 +138,7 @@ * global UID */ m_metadata (static_cast (Simulator::GetSystemId ()) << 32 | m_globalUid, 0), + m_dirtyMetadata (false), m_nixVector (0) { m_globalUid++; @@ -147,7 +148,8 @@ : m_buffer (o.m_buffer), m_byteTagList (o.m_byteTagList), m_packetTagList (o.m_packetTagList), - m_metadata (o.m_metadata) + m_metadata (o.m_metadata), + m_dirtyMetadata (o.m_dirtyMetadata) { o.m_nixVector ? m_nixVector = o.m_nixVector->Copy () : m_nixVector = 0; @@ -164,6 +166,7 @@ m_byteTagList = o.m_byteTagList; m_packetTagList = o.m_packetTagList; m_metadata = o.m_metadata; + m_dirtyMetadata = o.m_dirtyMetadata; o.m_nixVector ? m_nixVector = o.m_nixVector->Copy () : m_nixVector = 0; return *this; @@ -180,6 +183,7 @@ * global UID */ m_metadata (static_cast (Simulator::GetSystemId ()) << 32 | m_globalUid, size), + m_dirtyMetadata (false), m_nixVector (0) { m_globalUid++; @@ -189,6 +193,7 @@ m_byteTagList (), m_packetTagList (), m_metadata (0,0), + m_dirtyMetadata (false), m_nixVector (0) { NS_ASSERT (magic); @@ -206,6 +211,7 @@ * global UID */ m_metadata (static_cast (Simulator::GetSystemId ()) << 32 | m_globalUid, size), + m_dirtyMetadata (true), m_nixVector (0) { m_globalUid++; @@ -220,6 +226,7 @@ m_byteTagList (byteTagList), m_packetTagList (packetTagList), m_metadata (metadata), + m_dirtyMetadata (false), m_nixVector (0) { } @@ -270,7 +277,10 @@ uint32_t deserialized = header.Deserialize (m_buffer.Begin ()); NS_LOG_FUNCTION (this << header.GetInstanceTypeId ().GetName () << deserialized); m_buffer.RemoveAtStart (deserialized); - m_metadata.RemoveHeader (header, deserialized); + if (!m_dirtyMetadata) + { + m_metadata.RemoveHeader (header, deserialized); + } return deserialized; } uint32_t @@ -302,7 +312,10 @@ uint32_t deserialized = trailer.Deserialize (m_buffer.End ()); NS_LOG_FUNCTION (this << trailer.GetInstanceTypeId ().GetName () << deserialized); m_buffer.RemoveAtEnd (deserialized); - m_metadata.RemoveTrailer (trailer, deserialized); + if (!m_dirtyMetadata) + { + m_metadata.RemoveTrailer (trailer, deserialized); + } return deserialized; } uint32_t @@ -764,11 +777,11 @@ size -= metaSize; - uint32_t metadataDeserialized = + uint32_t metadataDeserialized = m_metadata.Deserialize (reinterpret_cast (p), metaSize); if (!metadataDeserialized) { - // meta-data not deserialized + // meta-data not deserialized // completely return 0; } --- a/src/network/model/packet.h +++ a/src/network/model/packet.h @@ -697,6 +697,7 @@ ByteTagList m_byteTagList; //!< the ByteTag list PacketTagList m_packetTagList; //!< the packet's Tag list PacketMetadata m_metadata; //!< the packet's metadata + bool m_dirtyMetadata; //!< the packet's metadata are not check-safe /* Please see comments above about nix-vector */ Ptr m_nixVector; //!< the packet's Nix vector