A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
ns3::PacketMetadata Class Reference

handle packet metadata about packet headers and trailers More...

#include <packet-metadata.h>

+ Collaboration diagram for ns3::PacketMetadata:

Classes

struct  Data
 
class  DataFreeList
 
struct  ExtraItem
 
struct  Item
 
class  ItemIterator
 
struct  SmallItem
 

Public Member Functions

 PacketMetadata (uint64_t uid, uint32_t size)
 
 PacketMetadata (PacketMetadata const &o)
 
 ~PacketMetadata ()
 
void AddAtEnd (PacketMetadata const &o)
 
void AddHeader (Header const &header, uint32_t size)
 
void AddPaddingAtEnd (uint32_t end)
 
void AddTrailer (Trailer const &trailer, uint32_t size)
 
ItemIterator BeginItem (Buffer buffer) const
 
PacketMetadata CreateFragment (uint32_t start, uint32_t end) const
 
uint32_t Deserialize (const uint8_t *buffer, uint32_t size)
 
uint32_t GetSerializedSize (void) const
 
uint64_t GetUid (void) const
 
PacketMetadataoperator= (PacketMetadata const &o)
 
void RemoveAtEnd (uint32_t end)
 
void RemoveAtStart (uint32_t start)
 
void RemoveHeader (Header const &header, uint32_t size)
 
void RemoveTrailer (Trailer const &trailer, uint32_t size)
 
uint32_t Serialize (uint8_t *buffer, uint32_t maxSize) const
 

Static Public Member Functions

static void Enable (void)
 
static void EnableChecking (void)
 

Private Member Functions

 PacketMetadata ()
 
friend DataFreeList::~DataFreeList ()
 
uint16_t AddBig (uint32_t head, uint32_t tail, const PacketMetadata::SmallItem *item, const PacketMetadata::ExtraItem *extraItem)
 
uint16_t AddSmall (const PacketMetadata::SmallItem *item)
 
void Append16 (uint16_t value, uint8_t *buffer)
 
void Append32 (uint32_t value, uint8_t *buffer)
 
void AppendValue (uint32_t value, uint8_t *buffer)
 
void AppendValueExtra (uint32_t value, uint8_t *buffer)
 
void DoAddHeader (uint32_t uid, uint32_t size)
 
uint32_t GetTotalSize (void) const
 
uint32_t GetUleb128Size (uint32_t value) const
 
bool IsPointerOk (uint16_t pointer) const
 
bool IsSharedPointerOk (uint16_t pointer) const
 
bool IsStateOk (void) const
 
uint32_t ReadItems (uint16_t current, struct PacketMetadata::SmallItem *item, struct PacketMetadata::ExtraItem *extraItem) const
 
uint32_t ReadUleb128 (const uint8_t **pBuffer) const
 
void ReplaceTail (PacketMetadata::SmallItem *item, PacketMetadata::ExtraItem *extraItem, uint32_t available)
 
void Reserve (uint32_t n)
 
void ReserveCopy (uint32_t n)
 
void UpdateHead (uint16_t written)
 
void UpdateTail (uint16_t written)
 

Static Private Member Functions

static uint8_t * AddToRaw (const uint8_t *data, uint32_t dataSize, uint8_t *start, uint8_t *current, uint32_t maxSize)
 
static uint8_t * AddToRawU16 (const uint16_t &data, uint8_t *start, uint8_t *current, uint32_t maxSize)
 
static uint8_t * AddToRawU32 (const uint32_t &data, uint8_t *start, uint8_t *current, uint32_t maxSize)
 
static uint8_t * AddToRawU64 (const uint64_t &data, uint8_t *start, uint8_t *current, uint32_t maxSize)
 
static uint8_t * AddToRawU8 (const uint8_t &data, uint8_t *start, uint8_t *current, uint32_t maxSize)
 
static struct
PacketMetadata::Data
Allocate (uint32_t n)
 
static struct
PacketMetadata::Data
Create (uint32_t size)
 
static void Deallocate (struct PacketMetadata::Data *data)
 
static uint8_t * ReadFromRawU16 (uint16_t &data, const uint8_t *start, const uint8_t *current, uint32_t maxSize)
 
static uint8_t * ReadFromRawU32 (uint32_t &data, const uint8_t *start, const uint8_t *current, uint32_t maxSize)
 
static uint8_t * ReadFromRawU64 (uint64_t &data, const uint8_t *start, const uint8_t *current, uint32_t maxSize)
 
static uint8_t * ReadFromRawU8 (uint8_t &data, const uint8_t *start, const uint8_t *current, uint32_t maxSize)
 
static void Recycle (struct PacketMetadata::Data *data)
 

Private Attributes

struct Datam_data
 
uint16_t m_head
 head -(next)-> tail ^ | ---(prev)—| More...
 
uint64_t m_packetUid
 
uint16_t m_tail
 
uint16_t m_used
 

Static Private Attributes

static uint16_t m_chunkUid = 0
 
static bool m_enable = false
 
static bool m_enableChecking = false
 
static DataFreeList m_freeList
 
static uint32_t m_maxSize = 0
 
static bool m_metadataSkipped = false
 

Friends

class ItemIterator
 

Detailed Description

handle packet metadata about packet headers and trailers

Internal:

This class is used by the Packet class to record every operation performed on the packet's buffer. This class also provides an implementation of the Packet::Print methods which uses the metadata to analyse the content of the packet's buffer.

To achieve this, this class maintains a linked list of so-called "items", each of which represents a header or a trailer, or payload, or a fragment of any of these. Each item contains a "next" and a "prev" field which point to the next and previous entries in the linked list. The PacketMetadata class maintains a pair of pointers to the head and the tail of the linked list.

Each entry in the list also maintains:

  • its native size (the size it had when it was first added to the packet)
  • its type: identifies what kind of header, what kind of trailer, if it is payload or not
  • the uid of the packet to which it was first added
  • the start and end of the area represented by a fragment if it is one.

This linked list is flattened in a byte buffer stored in struct PacketMetadata::Data. Each entry of the linked list is identified by an offset which identifies the first byte of the entry from the start of the data buffer. The size of this data buffer is 2^16-1 bytes maximum which somewhat limits the number of entries which can be stored in this linked list but it is quite unlikely to hit this limit in practice.

Each item of the linked list is a variable-sized byte buffer made of a number of fields. Some of these fields are stored as fixed-size 32 bit integers, others as fixed-size 16 bit integers, and some others as variable-size 32-bit integers. The variable-size 32 bit integers are stored using the uleb128 encoding.

Definition at line 79 of file packet-metadata.h.

Constructor & Destructor Documentation

ns3::PacketMetadata::PacketMetadata ( uint64_t  uid,
uint32_t  size 
)
inline

Definition at line 366 of file packet-metadata.h.

References DoAddHeader(), ns3::PacketMetadata::Data::m_data, and m_data.

+ Here is the call graph for this function:

ns3::PacketMetadata::PacketMetadata ( PacketMetadata const &  o)
inline

Definition at line 379 of file packet-metadata.h.

References ns3::PacketMetadata::Data::m_count, m_data, and NS_ASSERT.

ns3::PacketMetadata::~PacketMetadata ( )
inline

Definition at line 412 of file packet-metadata.h.

References ns3::PacketMetadata::Data::m_count, m_data, NS_ASSERT, and Recycle().

+ Here is the call graph for this function:

ns3::PacketMetadata::PacketMetadata ( )
private

Member Function Documentation

void ns3::PacketMetadata::AddAtEnd ( PacketMetadata const &  o)
void ns3::PacketMetadata::AddHeader ( Header const &  header,
uint32_t  size 
)

Definition at line 666 of file packet-metadata.cc.

References DoAddHeader(), ns3::ObjectBase::GetInstanceTypeId(), ns3::TypeId::GetUid(), IsStateOk(), NS_ASSERT, and NS_LOG_FUNCTION.

Referenced by ns3::Packet::AddHeader().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void ns3::PacketMetadata::AddPaddingAtEnd ( uint32_t  end)

Definition at line 891 of file packet-metadata.cc.

References m_enable, m_metadataSkipped, and NS_LOG_FUNCTION.

Referenced by ns3::Packet::AddPaddingAtEnd().

+ Here is the caller graph for this function:

uint8_t * ns3::PacketMetadata::AddToRaw ( const uint8_t *  data,
uint32_t  dataSize,
uint8_t *  start,
uint8_t *  current,
uint32_t  maxSize 
)
staticprivate

Definition at line 1420 of file packet-metadata.cc.

References NS_LOG_FUNCTION.

Referenced by Serialize().

+ Here is the caller graph for this function:

uint8_t * ns3::PacketMetadata::AddToRawU16 ( const uint16_t &  data,
uint8_t *  start,
uint8_t *  current,
uint32_t  maxSize 
)
staticprivate

Definition at line 1372 of file packet-metadata.cc.

References NS_LOG_FUNCTION.

Referenced by Serialize().

+ Here is the caller graph for this function:

uint8_t * ns3::PacketMetadata::AddToRawU32 ( const uint32_t &  data,
uint8_t *  start,
uint8_t *  current,
uint32_t  maxSize 
)
staticprivate

Definition at line 1388 of file packet-metadata.cc.

References NS_LOG_FUNCTION.

Referenced by Serialize().

+ Here is the caller graph for this function:

uint8_t * ns3::PacketMetadata::AddToRawU64 ( const uint64_t &  data,
uint8_t *  start,
uint8_t *  current,
uint32_t  maxSize 
)
staticprivate

Definition at line 1404 of file packet-metadata.cc.

References NS_LOG_FUNCTION.

Referenced by Serialize().

+ Here is the caller graph for this function:

uint8_t * ns3::PacketMetadata::AddToRawU8 ( const uint8_t &  data,
uint8_t *  start,
uint8_t *  current,
uint32_t  maxSize 
)
staticprivate

Definition at line 1356 of file packet-metadata.cc.

References NS_LOG_FUNCTION.

Referenced by Serialize().

+ Here is the caller graph for this function:

struct PacketMetadata::Data * ns3::PacketMetadata::Allocate ( uint32_t  n)
staticprivate
void ns3::PacketMetadata::Append16 ( uint16_t  value,
uint8_t *  buffer 
)
inlineprivate

Definition at line 237 of file packet-metadata.cc.

References NS_LOG_FUNCTION.

Referenced by AddBig(), AddSmall(), ReplaceTail(), ReserveCopy(), UpdateHead(), and UpdateTail().

+ Here is the caller graph for this function:

void ns3::PacketMetadata::Append32 ( uint32_t  value,
uint8_t *  buffer 
)
inlineprivate

Definition at line 245 of file packet-metadata.cc.

References NS_LOG_FUNCTION.

Referenced by AddBig(), and ReplaceTail().

+ Here is the caller graph for this function:

void ns3::PacketMetadata::AppendValue ( uint32_t  value,
uint8_t *  buffer 
)
inlineprivate

Definition at line 302 of file packet-metadata.cc.

References AppendValueExtra(), and NS_LOG_FUNCTION.

Referenced by AddBig(), AddSmall(), and ReplaceTail().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void ns3::PacketMetadata::AppendValueExtra ( uint32_t  value,
uint8_t *  buffer 
)
private

Definition at line 255 of file packet-metadata.cc.

References NS_LOG_FUNCTION.

Referenced by AppendValue().

+ Here is the caller graph for this function:

PacketMetadata::ItemIterator ns3::PacketMetadata::BeginItem ( Buffer  buffer) const

Definition at line 1058 of file packet-metadata.cc.

References ItemIterator, and NS_LOG_FUNCTION.

Referenced by ns3::Packet::BeginItem(), and ns3::Packet::Print().

+ Here is the caller graph for this function:

struct PacketMetadata::Data * ns3::PacketMetadata::Create ( uint32_t  size)
staticprivate

Definition at line 582 of file packet-metadata.cc.

References Allocate(), data, Deallocate(), ns3::PacketMetadata::Data::m_count, m_freeList, m_maxSize, ns3::PacketMetadata::Data::m_size, NS_LOG_FUNCTION, and NS_LOG_LOGIC.

Referenced by ReserveCopy().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

PacketMetadata ns3::PacketMetadata::CreateFragment ( uint32_t  start,
uint32_t  end 
) const
Parameters
startthe amount of stuff to remove from the start
endthe amount of stuff to remove from the end

Calling this method is equivalent to calling RemoveAtStart (start) and then, RemoveAtEnd (end).

Definition at line 656 of file packet-metadata.cc.

References NS_LOG_FUNCTION, RemoveAtEnd(), and RemoveAtStart().

Referenced by ns3::Packet::CreateFragment().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void ns3::PacketMetadata::Deallocate ( struct PacketMetadata::Data data)
staticprivate

Definition at line 647 of file packet-metadata.cc.

References NS_LOG_FUNCTION.

Referenced by Create(), Recycle(), and ns3::PacketMetadata::DataFreeList::~DataFreeList().

+ Here is the caller graph for this function:

void ns3::PacketMetadata::DoAddHeader ( uint32_t  uid,
uint32_t  size 
)
private
void ns3::PacketMetadata::Enable ( void  )
static

Definition at line 52 of file packet-metadata.cc.

References m_enable, m_metadataSkipped, NS_ASSERT_MSG, and NS_LOG_FUNCTION_NOARGS.

Referenced by ns3::EpcTftClassifierTestCase::DoRun(), EnableChecking(), and ns3::Packet::EnablePrinting().

+ Here is the caller graph for this function:

void ns3::PacketMetadata::EnableChecking ( void  )
static

Definition at line 66 of file packet-metadata.cc.

References Enable(), m_enableChecking, and NS_LOG_FUNCTION_NOARGS.

Referenced by ns3::Packet::EnableChecking().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

uint32_t ns3::PacketMetadata::GetSerializedSize ( void  ) const

Definition at line 1149 of file packet-metadata.cc.

References current, ns3::TypeId::GetName(), m_enable, m_head, m_tail, ns3::PacketMetadata::SmallItem::next, NS_ASSERT, NS_LOG_FUNCTION, ReadItems(), ns3::TypeId::SetUid(), and ns3::PacketMetadata::SmallItem::typeUid.

Referenced by ns3::Packet::GetSerializedSize(), and ns3::Packet::Serialize().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

uint32_t ns3::PacketMetadata::GetTotalSize ( void  ) const
private

Definition at line 1029 of file packet-metadata.cc.

References current, m_head, m_tail, ns3::PacketMetadata::SmallItem::next, NS_ASSERT, NS_LOG_FUNCTION, and ReadItems().

+ Here is the call graph for this function:

uint64_t ns3::PacketMetadata::GetUid ( void  ) const

Definition at line 1052 of file packet-metadata.cc.

References m_packetUid, and NS_LOG_FUNCTION.

Referenced by ns3::Packet::GetUid().

+ Here is the caller graph for this function:

uint32_t ns3::PacketMetadata::GetUleb128Size ( uint32_t  value) const
inlineprivate

Definition at line 165 of file packet-metadata.cc.

References NS_LOG_FUNCTION.

Referenced by AddBig(), AddSmall(), and ReplaceTail().

+ Here is the caller graph for this function:

bool ns3::PacketMetadata::IsPointerOk ( uint16_t  pointer) const
private

Definition at line 125 of file packet-metadata.cc.

References m_used, and NS_LOG_FUNCTION.

Referenced by IsStateOk().

+ Here is the caller graph for this function:

bool ns3::PacketMetadata::IsSharedPointerOk ( uint16_t  pointer) const
private

Definition at line 118 of file packet-metadata.cc.

References m_data, ns3::PacketMetadata::Data::m_size, and NS_LOG_FUNCTION.

Referenced by IsStateOk().

+ Here is the caller graph for this function:

bool ns3::PacketMetadata::IsStateOk ( void  ) const
private
PacketMetadata & ns3::PacketMetadata::operator= ( PacketMetadata const &  o)
inline

Definition at line 391 of file packet-metadata.h.

References ns3::PacketMetadata::Data::m_count, m_data, m_head, m_packetUid, m_tail, m_used, NS_ASSERT, and Recycle().

+ Here is the call graph for this function:

uint8_t * ns3::PacketMetadata::ReadFromRawU16 ( uint16_t &  data,
const uint8_t *  start,
const uint8_t *  current,
uint32_t  maxSize 
)
staticprivate

Definition at line 1453 of file packet-metadata.cc.

References current, and NS_LOG_FUNCTION.

Referenced by Deserialize().

+ Here is the caller graph for this function:

uint8_t * ns3::PacketMetadata::ReadFromRawU32 ( uint32_t &  data,
const uint8_t *  start,
const uint8_t *  current,
uint32_t  maxSize 
)
staticprivate

Definition at line 1469 of file packet-metadata.cc.

References current, and NS_LOG_FUNCTION.

Referenced by Deserialize().

+ Here is the caller graph for this function:

uint8_t * ns3::PacketMetadata::ReadFromRawU64 ( uint64_t &  data,
const uint8_t *  start,
const uint8_t *  current,
uint32_t  maxSize 
)
staticprivate

Definition at line 1485 of file packet-metadata.cc.

References current, and NS_LOG_FUNCTION.

Referenced by Deserialize().

+ Here is the caller graph for this function:

uint8_t * ns3::PacketMetadata::ReadFromRawU8 ( uint8_t &  data,
const uint8_t *  start,
const uint8_t *  current,
uint32_t  maxSize 
)
staticprivate

Definition at line 1437 of file packet-metadata.cc.

References current, and NS_LOG_FUNCTION.

Referenced by Deserialize().

+ Here is the caller graph for this function:

uint32_t ns3::PacketMetadata::ReadItems ( uint16_t  current,
struct PacketMetadata::SmallItem item,
struct PacketMetadata::ExtraItem extraItem 
) const
private
Parameters
currentthe offset we should start reading the data from
itempointer to where we should store the data to return to the caller
extraItempointer to where we should store the data to return to the caller
Returns
the number of bytes read.

Definition at line 540 of file packet-metadata.cc.

References ns3::PacketMetadata::SmallItem::chunkUid, current, ns3::PacketMetadata::ExtraItem::fragmentEnd, ns3::PacketMetadata::ExtraItem::fragmentStart, ns3::PacketMetadata::Data::m_data, m_data, m_packetUid, ns3::PacketMetadata::Data::m_size, ns3::PacketMetadata::SmallItem::next, NS_ASSERT, NS_LOG_FUNCTION, ns3::PacketMetadata::ExtraItem::packetUid, ns3::PacketMetadata::SmallItem::prev, ReadUleb128(), ns3::PacketMetadata::SmallItem::size, and ns3::PacketMetadata::SmallItem::typeUid.

Referenced by AddAtEnd(), GetSerializedSize(), GetTotalSize(), IsStateOk(), RemoveAtEnd(), RemoveAtStart(), RemoveHeader(), RemoveTrailer(), ReplaceTail(), and Serialize().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

uint32_t ns3::PacketMetadata::ReadUleb128 ( const uint8_t **  pBuffer) const
private

Definition at line 187 of file packet-metadata.cc.

References NS_ASSERT, and NS_LOG_FUNCTION.

Referenced by ReadItems().

+ Here is the caller graph for this function:

void ns3::PacketMetadata::Recycle ( struct PacketMetadata::Data data)
staticprivate

Definition at line 608 of file packet-metadata.cc.

References Deallocate(), ns3::PacketMetadata::Data::m_count, m_enable, m_freeList, m_maxSize, ns3::PacketMetadata::Data::m_size, NS_ASSERT, NS_LOG_FUNCTION, and NS_LOG_LOGIC.

Referenced by operator=(), ReserveCopy(), and ~PacketMetadata().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void ns3::PacketMetadata::RemoveAtEnd ( uint32_t  end)

Definition at line 964 of file packet-metadata.cc.

References AddBig(), current, IsStateOk(), m_data, m_enable, m_head, m_metadataSkipped, m_packetUid, m_tail, NS_ASSERT, NS_LOG_FUNCTION, ns3::PacketMetadata::SmallItem::prev, ReadItems(), ns3::PacketMetadata::SmallItem::size, and UpdateHead().

Referenced by CreateFragment(), and ns3::Packet::RemoveAtEnd().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void ns3::PacketMetadata::RemoveAtStart ( uint32_t  start)
void ns3::PacketMetadata::ReplaceTail ( PacketMetadata::SmallItem item,
PacketMetadata::ExtraItem extraItem,
uint32_t  available 
)
private
void ns3::PacketMetadata::Reserve ( uint32_t  n)
inlineprivate
void ns3::PacketMetadata::ReserveCopy ( uint32_t  n)
private

Definition at line 74 of file packet-metadata.cc.

References Append16(), Create(), ns3::PacketMetadata::Data::m_count, ns3::PacketMetadata::Data::m_data, m_data, ns3::PacketMetadata::Data::m_dirtyEnd, m_head, m_tail, m_used, NS_ASSERT, NS_LOG_FUNCTION, Recycle(), and visualizer.core::start().

Referenced by AddBig(), AddSmall(), and Reserve().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void ns3::PacketMetadata::UpdateHead ( uint16_t  written)
inlineprivate

Definition at line 349 of file packet-metadata.cc.

References Append16(), ns3::PacketMetadata::Data::m_data, m_data, ns3::PacketMetadata::Data::m_dirtyEnd, m_head, m_tail, m_used, NS_ASSERT, and NS_LOG_FUNCTION.

Referenced by DoAddHeader(), and RemoveAtEnd().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void ns3::PacketMetadata::UpdateTail ( uint16_t  written)
inlineprivate

Definition at line 322 of file packet-metadata.cc.

References Append16(), ns3::PacketMetadata::Data::m_data, m_data, ns3::PacketMetadata::Data::m_dirtyEnd, m_head, m_tail, m_used, NS_ASSERT, and NS_LOG_FUNCTION.

Referenced by AddAtEnd(), AddTrailer(), Deserialize(), RemoveAtStart(), and ReplaceTail().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

Friends And Related Function Documentation

friend class ItemIterator
friend

Definition at line 302 of file packet-metadata.h.

Referenced by BeginItem().

Member Data Documentation

uint16_t ns3::PacketMetadata::m_chunkUid = 0
staticprivate

Definition at line 348 of file packet-metadata.h.

Referenced by AddTrailer(), and DoAddHeader().

bool ns3::PacketMetadata::m_enableChecking = false
staticprivate

Definition at line 340 of file packet-metadata.h.

Referenced by EnableChecking(), RemoveHeader(), and RemoveTrailer().

PacketMetadata::DataFreeList ns3::PacketMetadata::m_freeList
staticprivate

Definition at line 338 of file packet-metadata.h.

Referenced by Create(), and Recycle().

uint16_t ns3::PacketMetadata::m_head
private
uint32_t ns3::PacketMetadata::m_maxSize = 0
staticprivate

Definition at line 347 of file packet-metadata.h.

Referenced by Create(), and Recycle().

bool ns3::PacketMetadata::m_metadataSkipped = false
staticprivate
uint64_t ns3::PacketMetadata::m_packetUid
private
uint16_t ns3::PacketMetadata::m_used
private

The documentation for this class was generated from the following files: