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
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

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 645 of file packet-metadata.cc.

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

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 869 of file packet-metadata.cc.

References m_enable, and m_metadataSkipped.

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 1387 of file packet-metadata.cc.

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 1342 of file packet-metadata.cc.

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 1357 of file packet-metadata.cc.

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 1372 of file packet-metadata.cc.

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 1327 of file packet-metadata.cc.

Referenced by Serialize().

+ Here is the caller graph for this function:

struct PacketMetadata::Data * ns3::PacketMetadata::Allocate ( uint32_t  n)
staticreadprivate

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

References data, ns3::PacketMetadata::Data::m_count, ns3::PacketMetadata::Data::m_dirtyEnd, ns3::PacketMetadata::Data::m_size, and PACKET_METADATA_DATA_M_DATA_SIZE.

Referenced by Create().

+ Here is the caller graph for this function:

void ns3::PacketMetadata::Append16 ( uint16_t  value,
uint8_t *  buffer 
)
inlineprivate

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

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 234 of file packet-metadata.cc.

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 289 of file packet-metadata.cc.

References AppendValueExtra().

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 243 of file packet-metadata.cc.

Referenced by AppendValue().

+ Here is the caller graph for this function:

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

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

References ItemIterator.

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)
staticreadprivate

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

References Allocate(), data, Deallocate(), ns3::PacketMetadata::Data::m_count, m_freeList, m_maxSize, ns3::PacketMetadata::Data::m_size, 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 636 of file packet-metadata.cc.

References 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 628 of file packet-metadata.cc.

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 51 of file packet-metadata.cc.

References m_enable, m_metadataSkipped, and NS_ASSERT_MSG.

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

+ Here is the caller graph for this function:

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

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

References Enable(), and m_enableChecking.

+ Here is the call graph for this function:

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

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

References 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 1006 of file packet-metadata.cc.

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

+ Here is the call graph for this function:

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

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

References m_packetUid.

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 157 of file packet-metadata.cc.

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 119 of file packet-metadata.cc.

References m_used.

Referenced by IsStateOk().

+ Here is the caller graph for this function:

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

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

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

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 1418 of file packet-metadata.cc.

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 1433 of file packet-metadata.cc.

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 1448 of file packet-metadata.cc.

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 1403 of file packet-metadata.cc.

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 526 of file packet-metadata.cc.

References ns3::PacketMetadata::SmallItem::chunkUid, 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 178 of file packet-metadata.cc.

References NS_ASSERT.

Referenced by ReadItems().

+ Here is the caller graph for this function:

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

Definition at line 591 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, 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 941 of file packet-metadata.cc.

References AddBig(), 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 71 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, 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 335 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 308 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: