attempt to document some of the internal details
This commit is contained in:
@@ -28,6 +28,41 @@ namespace ns3 {
|
||||
|
||||
struct TagListData;
|
||||
|
||||
/**
|
||||
* \brief keep track of the tags stored in a packet.
|
||||
*
|
||||
* This class is mostly private to the Packet implementation and users
|
||||
* should never have to access it directly.
|
||||
*
|
||||
* \internal
|
||||
* The implementation of this class is a bit tricky so, there are a couple
|
||||
* of things to keep in mind here:
|
||||
*
|
||||
* - it stores all tags in a single byte buffer: each tag is stored
|
||||
* as 4 32bit integers (TypeId, tag data size, start, end) followed
|
||||
* by the tag data as generated by Tag::Serialize.
|
||||
*
|
||||
* - the struct TagListData structure which contains the tag byte buffer
|
||||
* is shared and, thus, reference-counted. This data structure is unshared
|
||||
* as-needed to emulate COW semantics.
|
||||
*
|
||||
* - each tag tags a unique set of bytes identified by the pair of offsets
|
||||
* (start,end). These offsets are provided by Buffer::GetCurrentStartOffset
|
||||
* and Buffer::GetCurrentEndOffset which means that they are relative to
|
||||
* the start of the 'virtual byte buffer' as explained in the documentation
|
||||
* for the ns3::Buffer class. Whenever the origin of the offset of the Buffer
|
||||
* instance associated to this TagList instance changes, the Buffer class
|
||||
* reports this to its container Packet class as a bool return value
|
||||
* in Buffer::AddAtStart and Buffer::AddAtEnd. In both cases, when this happens
|
||||
* the Packet class calls TagList::AddAtEnd and TagList::AddAtStart to update
|
||||
* the byte offsets of each tag in the TagList.
|
||||
*
|
||||
* - whenever bytes are removed from the packet byte buffer, the TagList offsets
|
||||
* are never updated because we rely on the fact that they will be updated in
|
||||
* either the next call to Packet::AddHeader or Packet::AddTrailer or when
|
||||
* the user iterates the tag list with Packet::GetTagIterator and
|
||||
* TagIterator::Next.
|
||||
*/
|
||||
class TagList
|
||||
{
|
||||
public:
|
||||
@@ -68,16 +103,57 @@ public:
|
||||
TagList &operator = (const TagList &o);
|
||||
~TagList ();
|
||||
|
||||
/**
|
||||
* \param tid the typeid of the tag added
|
||||
* \param bufferSize the size of the tag when its serialization will
|
||||
* be completed. Typically, the return value of Tag::GetSerializedSize
|
||||
* \param start offset which uniquely identifies the first byte tagged by this tag.
|
||||
* \param start offset which uniquely identifies the last byte tagged by this tag.
|
||||
* \returns a buffer which can be used to write the tag data.
|
||||
*
|
||||
*
|
||||
*/
|
||||
TagBuffer Add (TypeId tid, uint32_t bufferSize, uint32_t start, uint32_t end);
|
||||
|
||||
/**
|
||||
* \param o the other list of tags to aggregate.
|
||||
*
|
||||
* Aggregate the two lists of tags.
|
||||
*/
|
||||
void Add (const TagList &o);
|
||||
|
||||
/**
|
||||
* \param i points to the item to remove from this list.
|
||||
*
|
||||
* Not implemented.
|
||||
*/
|
||||
void Remove (const Iterator &i);
|
||||
void RemoveAll (void);
|
||||
|
||||
/**
|
||||
* \param offsetStart the offset which uniquely identifies the first data byte
|
||||
* present in the byte buffer associated to this TagList.
|
||||
* \param offsetEnd the offset which uniquely identifies the last data byte
|
||||
* present in the byte buffer associated to this TagList.
|
||||
* \returns an iterator
|
||||
*
|
||||
* The returned iterator will allow you to loop through the set of tags present
|
||||
* in this list: the boundaries of each tag as reported by their start and
|
||||
* end offsets will be included within the input offsetStart and offsetEnd.
|
||||
*/
|
||||
TagList::Iterator Begin (uint32_t offsetStart, uint32_t offsetEnd) const;
|
||||
|
||||
/**
|
||||
* Adjust the offsets stored internally by the adjustment delta and
|
||||
* make sure that all offsets are smaller than appendOffset which represents
|
||||
* the location where new bytes have been added to the byte buffer.
|
||||
*/
|
||||
void AddAtEnd (int32_t adjustment, uint32_t appendOffset);
|
||||
/**
|
||||
* Adjust the offsets stored internally by the adjustment delta and
|
||||
* make sure that all offsets are bigger than prependOffset which represents
|
||||
* the location where new bytes have been added to the byte buffer.
|
||||
*/
|
||||
void AddAtStart (int32_t adjustment, uint32_t prependOffset);
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user