21 #include "ns3/assert.h"
23 #include "ns3/simulator.h"
31 uint32_t Packet::m_globalUid = 0;
60 ByteTagIterator::Item::Item (
TypeId tid, uint32_t start, uint32_t end,
TagBuffer buffer)
71 return m_current.HasNext ();
79 i.start-m_current.GetOffsetStart (),
80 i.end-m_current.GetOffsetStart (),
90 PacketTagIterator::PacketTagIterator (
const struct PacketTagList::TagData *head)
99 return m_current != 0;
107 m_current = m_current->next;
150 m_metadata (static_cast<uint64_t> (
Simulator::GetSystemId ()) << 32 | m_globalUid, 0),
158 : m_buffer (o.m_buffer),
159 m_byteTagList (o.m_byteTagList),
160 m_packetTagList (o.m_packetTagList),
161 m_metadata (o.m_metadata)
163 o.m_nixVector ? m_nixVector = o.m_nixVector->
Copy ()
168 Packet::operator = (
const Packet &o)
174 m_buffer = o.m_buffer;
175 m_byteTagList = o.m_byteTagList;
176 m_packetTagList = o.m_packetTagList;
177 m_metadata = o.m_metadata;
178 o.m_nixVector ? m_nixVector = o.m_nixVector->
Copy ()
193 m_metadata (static_cast<uint64_t> (
Simulator::GetSystemId ()) << 32 | m_globalUid, size),
200 : m_buffer (0, false),
208 Deserialize (buffer, size);
221 m_metadata (static_cast<uint64_t> (
Simulator::GetSystemId ()) << 32 | m_globalUid, size),
228 i.
Write (buffer, size);
234 m_byteTagList (byteTagList),
235 m_packetTagList (packetTagList),
236 m_metadata (metadata),
239 NS_LOG_FUNCTION (
this << &buffer << &byteTagList << &packetTagList << &metadata);
248 uint32_t end = m_buffer.
GetSize () - (start + length);
252 return Ptr<Packet> (
new Packet (buffer, m_byteTagList, m_packetTagList, metadata),
false);
259 m_nixVector = nixVector;
263 Packet::GetNixVector (
void)
const
274 uint32_t orgStart = m_buffer.GetCurrentStartOffset ();
278 m_byteTagList.
AddAtStart (m_buffer.GetCurrentStartOffset () + size - orgStart,
279 m_buffer.GetCurrentStartOffset () + size);
282 m_metadata.AddHeader (header, size);
290 m_metadata.RemoveHeader (header, deserialized);
305 uint32_t orgStart = m_buffer.GetCurrentStartOffset ();
306 bool resized = m_buffer.
AddAtEnd (size);
309 m_byteTagList.
AddAtEnd (m_buffer.GetCurrentStartOffset () - orgStart,
310 m_buffer.GetCurrentEndOffset () - size);
314 m_metadata.AddTrailer (trailer, size);
322 m_metadata.RemoveTrailer (trailer, deserialized);
337 uint32_t aStart = m_buffer.GetCurrentStartOffset ();
338 uint32_t bEnd = packet->m_buffer.GetCurrentEndOffset ();
339 m_buffer.
AddAtEnd (packet->m_buffer);
340 uint32_t appendPrependOffset = m_buffer.GetCurrentEndOffset () - packet->m_buffer.
GetSize ();
341 m_byteTagList.
AddAtEnd (m_buffer.GetCurrentStartOffset () - aStart,
342 appendPrependOffset);
344 copy.
AddAtStart (m_buffer.GetCurrentEndOffset () - bEnd,
345 appendPrependOffset);
346 m_byteTagList.
Add (copy);
347 m_metadata.AddAtEnd (packet->m_metadata);
353 uint32_t orgEnd = m_buffer.GetCurrentEndOffset ();
354 bool resized = m_buffer.
AddAtEnd (size);
357 m_byteTagList.
AddAtEnd (m_buffer.GetCurrentEndOffset () - orgEnd,
358 m_buffer.GetCurrentEndOffset () - size);
360 m_metadata.AddPaddingAtEnd (size);
367 m_metadata.RemoveAtEnd (size);
374 m_metadata.RemoveAtStart (size);
381 m_byteTagList.RemoveAll ();
388 uint32_t oldStart = m_buffer.GetCurrentStartOffset ();
389 uint8_t
const * data = m_buffer.
PeekData ();
390 uint32_t newStart = m_buffer.GetCurrentStartOffset ();
393 const_cast<ByteTagList &
>(m_byteTagList).AddAtStart (newStart - oldStart, newStart);
401 return m_buffer.
CopyData (buffer, size);
408 return m_buffer.
CopyData (os, size);
415 return m_metadata.GetUid ();
428 if (constructor.IsNull ())
436 Tag *tag =
dynamic_cast<Tag *
> (constructor ());
460 case PacketMetadata::Item::PAYLOAD:
463 case PacketMetadata::Item::HEADER:
464 case PacketMetadata::Item::TRAILER:
468 os <<
" Fragment [" << item.currentTrimedFromStart<<
":"
469 << (item.currentTrimedFromStart + item.currentSize) <<
"]";
474 case PacketMetadata::Item::PAYLOAD:
475 os <<
"Payload (size=" << item.currentSize <<
")";
477 case PacketMetadata::Item::HEADER:
478 case PacketMetadata::Item::TRAILER:
479 os << item.tid.
GetName () <<
" (";
486 Chunk *chunk =
dynamic_cast<Chunk *
> (instance);
488 chunk->Deserialize (item.current);
513 case PacketMetadata::Item::PAYLOAD:
516 case PacketMetadata::Item::HEADER:
517 case PacketMetadata::Item::TRAILER:
521 os <<
" Fragment [" << item.currentTrimedFromStart<<
":"
522 << (item.currentTrimedFromStart + item.currentSize) <<
"]";
527 case PacketMetadata::Item::PAYLOAD:
528 os <<
"Payload (size=" << item.currentSize <<
")";
530 case PacketMetadata::Item::HEADER:
531 case PacketMetadata::Item::TRAILER:
532 os << item.tid.
GetName () <<
"(";
539 Chunk *chunk =
dynamic_cast<Chunk *
> (instance);
541 chunk->Deserialize (item.current);
544 std::string attrName = item.tid.GetAttributeName (j);
548 os << attrName <<
"=" << value;
571 return m_metadata.BeginItem (m_buffer);
578 PacketMetadata::Enable ();
585 PacketMetadata::EnableChecking ();
616 size += ((m_metadata.GetSerializedSize () + 3) & (~3));
632 Packet::Serialize (uint8_t* buffer, uint32_t maxSize)
const
635 uint32_t* p =
reinterpret_cast<uint32_t *
> (buffer);
642 if (size + nixSize <= maxSize)
651 uint32_t serialized =
657 p += ((nixSize+3) & (~3)) / 4;
674 if (size + 4 <= maxSize)
689 uint32_t metaSize = m_metadata.GetSerializedSize ();
690 if (size + metaSize <= maxSize)
699 uint32_t serialized =
700 m_metadata.Serialize (reinterpret_cast<uint8_t *> (p), metaSize);
705 p += ((metaSize+3) & (~3)) / 4;
719 if (size + bufSize <= maxSize)
728 uint32_t serialized =
729 m_buffer.
Serialize (reinterpret_cast<uint8_t *> (p), bufSize);
734 p += ((bufSize+3) & (~3)) / 4;
751 Packet::Deserialize (
const uint8_t* buffer, uint32_t size)
755 const uint32_t* p =
reinterpret_cast<const uint32_t *
> (buffer);
759 uint32_t nixSize = *p++;
769 Ptr<NixVector> nix = Create<NixVector> ();
770 uint32_t nixDeserialized = nix->Deserialize (p, nixSize);
771 if (!nixDeserialized)
780 p += ((((nixSize - 4) + 3) & (~3)) / 4);
789 uint32_t metaSize = *p++;
797 uint32_t metadataDeserialized =
798 m_metadata.Deserialize (reinterpret_cast<const uint8_t *> (p), metaSize);
799 if (!metadataDeserialized)
807 p += ((((metaSize - 4) + 3) & (~3)) / 4);
810 uint32_t bufSize = *p++;
818 uint32_t bufferDeserialized =
819 m_buffer.
Deserialize (reinterpret_cast<const uint8_t *> (p), bufSize);
820 if (!bufferDeserialized)
838 m_buffer.GetCurrentStartOffset (),
839 m_buffer.GetCurrentEndOffset ());
846 return ByteTagIterator (m_byteTagList.
Begin (m_buffer.GetCurrentStartOffset (), m_buffer.GetCurrentEndOffset ()));
871 m_packetTagList.Add (tag);
877 bool found = m_packetTagList.
Remove (tag);
884 bool found = m_packetTagList.Peek (tag);
891 m_packetTagList.RemoveAll ();
906 Tag *tag =
dynamic_cast<Tag *
> (instance);
uint32_t RemoveHeader(Header &header)
uint32_t GetAttributeN(void) const
bool FindFirstMatchingByteTag(Tag &tag) const
#define NS_LOG_FUNCTION(parameters)
void PrintPacketTags(std::ostream &os) const
Control the scheduling of simulation events.
void RemoveAtEnd(uint32_t end)
void RemoveAtStart(uint32_t start)
virtual uint32_t GetSerializedSize(void) const =0
automatically resized byte buffer
Ptr< NixVector > Copy(void) const
void AddPacketTag(const Tag &tag) const
uint64_t GetUid(void) const
keep track of the tags stored in a packet.
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
TagBuffer Add(TypeId tid, uint32_t bufferSize, int32_t start, int32_t end)
uint32_t GetSerializedSize(void) const
#define NS_LOG_FUNCTION_NOARGS()
implement the ns-3 type and attribute system
void Print(std::ostream &os) const
#define NS_FATAL_ERROR(msg)
fatal error handling
PacketTagIterator GetPacketTagIterator(void) const
iterator in a Buffer instance
Callback< ObjectBase * > GetConstructor(void) const
bool HasConstructor(void) const
void GetTag(Tag &tag) const
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
uint32_t PeekTrailer(Trailer &trailer)
void AddAtEnd(Ptr< const Packet > packet)
uint32_t Deserialize(const uint8_t *buffer, uint32_t size)
uint8_t const * PeekData(void) const NS_DEPRECATED
bool PeekPacketTag(Tag &tag) const
void RemoveAllPacketTags(void)
void RemoveAtStart(uint32_t size)
static void EnablePrinting(void)
uint32_t Serialize(uint32_t *buffer, uint32_t maxSize) const
uint32_t GetSerializedSize(void) const
Buffer::Iterator End(void) const
static void EnableChecking(void)
uint8_t const * PeekData(void) const
void AddPaddingAtEnd(uint32_t size)
ByteTagIterator GetByteTagIterator(void) const
void CopyData(std::ostream *os, uint32_t size) const
virtual uint32_t Deserialize(Buffer::Iterator end)=0
uint32_t GetEnd(void) const
Iterator over the set of 'packet' tags in a packet.
void PrintByteTags(std::ostream &os) const
void AddAtEnd(int32_t adjustment, int32_t appendOffset)
Buffer::Iterator Begin(void) const
std::ostream & operator<<(std::ostream &os, const Angles &a)
Ptr< Packet > Copy(void) const
uint32_t PeekHeader(Header &header) const
Protocol trailer serialization and deserialization.
virtual void Serialize(TagBuffer i) const =0
tag a set of bytes in a packet
PacketMetadata::ItemIterator BeginItem(void) const
void AddTrailer(const Trailer &trailer)
void RemoveAtEnd(uint32_t size)
Iterator over the set of tags in a packet.
virtual void Deserialize(TagBuffer i)=0
uint32_t RemoveTrailer(Trailer &trailer)
std::string GetName(void) const
TypeId GetTypeId(void) const
void GetAttribute(std::string name, AttributeValue &value) const
uint32_t GetSize(void) const
TypeId GetTypeId(void) const
Buffer CreateFragment(uint32_t start, uint32_t length) const
bool AddAtEnd(uint32_t end)
void GetTag(Tag &tag) const
uint32_t Serialize(uint8_t *buffer, uint32_t maxSize) const
ByteTagList::Iterator Begin(int32_t offsetStart, int32_t offsetEnd) const
#define PACKET_TAG_MAX_SIZE
Tag maximum size The maximum size (in bytes) of a Tag is stored in this constant. ...
uint32_t GetStart(void) const
uint32_t GetSerializedSize(void) const
virtual TypeId GetInstanceTypeId(void) const =0
bool RemovePacketTag(Tag &tag)
void RemoveAllByteTags(void)
virtual uint32_t GetSerializedSize(void) const =0
void Write(uint8_t const *buffer, uint32_t size)
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
virtual void Serialize(Buffer::Iterator start) const =0
bool AddAtStart(uint32_t start)
a unique identifier for an interface.
abstract base class for ns3::Header and ns3::Trailer
void AddHeader(const Header &header)
virtual void Print(std::ostream &os) const =0
void AddAtStart(int32_t adjustment, int32_t prependOffset)
void AddByteTag(const Tag &tag) const