# HG changeset patch # User Tommaso Pecorella # Date 1464223478 -7200 # Parent 39abf517d0106ca6aaedf2d2d083189f37f50f4f network: (fixes #2078) Packet metadata disabling on a per-packet basis diff --git a/RELEASE_NOTES b/RELEASE_NOTES --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -35,6 +35,7 @@ - Bug 1939 - Aggregating the same object to two nodes produce unexpected results - Bug 1977 - v4Ping verbose output when not explicitly stopped - Bug 2057 - ARP and Ndisc caches should be updated by receiving valid L3 packets +- Bug 2078 - Packet metadata disabling on a per-packet basis - Bug 2346 - SixLowPan ConpressionThreshold can be violated. - Bug 2329 - TCP Veno implementation - Bug 2333 - TCP Scalable implementation diff --git a/src/internet/model/icmpv6-header.cc b/src/internet/model/icmpv6-header.cc --- a/src/internet/model/icmpv6-header.cc +++ b/src/internet/model/icmpv6-header.cc @@ -1133,6 +1133,7 @@ i.ReadNtohU32 (); i.Read (data, length); m_packet = Create (data, length); + m_packet->DisableMetadata (); delete[] data; return GetSerializedSize (); diff --git a/src/network/model/packet-metadata.cc b/src/network/model/packet-metadata.cc --- a/src/network/model/packet-metadata.cc +++ b/src/network/model/packet-metadata.cc @@ -49,6 +49,18 @@ } void +PacketMetadata::Disable (void) +{ + NS_LOG_FUNCTION_NOARGS (); + m_enabledOnPacket = false; + m_data->m_count--; + if (m_data->m_count == 0) + { + PacketMetadata::Recycle (m_data); + } +} + +void PacketMetadata::Enable (void) { NS_LOG_FUNCTION_NOARGS (); @@ -669,6 +681,10 @@ m_metadataSkipped = true; return; } + if (!m_enabledOnPacket) + { + return; + } struct PacketMetadata::SmallItem item; item.next = m_head; @@ -691,6 +707,11 @@ m_metadataSkipped = true; return; } + if (!m_enabledOnPacket) + { + return; + } + struct PacketMetadata::SmallItem item; struct PacketMetadata::ExtraItem extraItem; uint32_t read = ReadItems (m_head, &item, &extraItem); @@ -739,6 +760,11 @@ m_metadataSkipped = true; return; } + if (!m_enabledOnPacket) + { + return; + } + struct PacketMetadata::SmallItem item; item.next = 0xffff; item.prev = m_tail; @@ -761,6 +787,11 @@ m_metadataSkipped = true; return; } + if (!m_enabledOnPacket) + { + return; + } + struct PacketMetadata::SmallItem item; struct PacketMetadata::ExtraItem extraItem; uint32_t read = ReadItems (m_tail, &item, &extraItem); @@ -808,6 +839,21 @@ m_metadataSkipped = true; return; } + if (!m_enabledOnPacket || !o.m_enabledOnPacket) + { + if (m_enabledOnPacket) + { + m_data->m_count--; + if (m_data->m_count == 0) + { + PacketMetadata::Recycle (m_data); + } + } + + m_enabledOnPacket = false; + return; + } + if (m_tail == 0xffff) { // We have no items so 'AddAtEnd' is diff --git a/src/network/model/packet-metadata.h b/src/network/model/packet-metadata.h --- a/src/network/model/packet-metadata.h +++ b/src/network/model/packet-metadata.h @@ -152,9 +152,26 @@ }; /** - * \brief Enable the packet metadata + * \brief Enable the packet metadata on all packets. + * + * Packet metadata must be enabled at the start of the + * simulation, before any Packet exchange. + * All the packets will have their metadata enabled, + * except the ones where metadata are explicitly + * disabled (\see Disable) + * */ static void Enable (void); + + /** + * \brief Disable, on a per-packet basis, the use of metadata. + * + * This must be used if metadata checking is globally enabled, + * and if the packet is built in a manner (e.g. from a raw + * byte buffer) such that the metadata is incomplete. + */ + void Disable (void); + /** * \brief Enable the packet metadata checking */ @@ -657,7 +674,8 @@ static void Deallocate (struct PacketMetadata::Data *data); static DataFreeList m_freeList; //!< the metadata data storage - static bool m_enable; //!< Enable the packet metadata + static bool m_enable; //!< Enable the packet metadata at global level + bool m_enabledOnPacket; //!< Enable the packet metadata at packet level static bool m_enableChecking; //!< Enable the packet metadata checking /** @@ -687,7 +705,8 @@ namespace ns3 { PacketMetadata::PacketMetadata (uint64_t uid, uint32_t size) - : m_data (PacketMetadata::Create (10)), + : m_enabledOnPacket (m_enable), + m_data (PacketMetadata::Create (10)), m_head (0xffff), m_tail (0xffff), m_used (0), @@ -700,7 +719,8 @@ } } PacketMetadata::PacketMetadata (PacketMetadata const &o) - : m_data (o.m_data), + : m_enabledOnPacket (o.m_enabledOnPacket), + m_data (o.m_data), m_head (o.m_head), m_tail (o.m_tail), m_used (o.m_used), @@ -713,6 +733,7 @@ PacketMetadata & PacketMetadata::operator = (PacketMetadata const& o) { + m_enabledOnPacket = o.m_enabledOnPacket; if (m_data != o.m_data) { // not self assignment diff --git a/src/network/model/packet.cc b/src/network/model/packet.cc --- a/src/network/model/packet.cc +++ b/src/network/model/packet.cc @@ -247,6 +247,12 @@ m_nixVector = nixVector; } +void +Packet::DisableMetadata (void) +{ + m_metadata.Disable (); +} + Ptr Packet::GetNixVector (void) const { @@ -752,11 +758,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; } diff --git a/src/network/model/packet.h b/src/network/model/packet.h --- a/src/network/model/packet.h +++ b/src/network/model/packet.h @@ -276,6 +276,10 @@ * The input data is copied: the input * buffer is untouched. * + * If the buffer also contains headers or trailers and these + * must be later removed, it is advisable to use + * Packet::SetDirtyMetadata as well. + * * \param buffer the data to store in the packet. * \param size the size of the input buffer. */ @@ -526,6 +530,18 @@ uint32_t Serialize (uint8_t* buffer, uint32_t maxSize) const; /** + * \brief Disable, on a per-packet basis, the use of metadata. + * + * This must be used if metadata checking is globally enabled, + * and if the packet is built in a way such that the metadata + * is incomplete (e.g. from a raw byte buffer). + * + * \warning If a packet with disabled metadata is added to another, + * the resulting packet will have its metadata disabled. + */ + void DisableMetadata (void); + + /** * \brief Tag each byte included in this packet with a new byte tag. * * \param tag the new tag to add to this packet @@ -542,6 +558,7 @@ * packet). */ void AddByteTag (const Tag &tag) const; + /** * \brief Retiurns an iterator over the set of byte tags included in this packet *