add logging, cleanup AddAtEnd.

This commit is contained in:
Mathieu Lacage
2008-05-31 10:46:23 -07:00
parent 26d46a960d
commit 00d36e836c

View File

@@ -350,6 +350,7 @@ PacketMetadata::AppendValue (uint32_t value, uint8_t *buffer)
void
PacketMetadata::UpdateTail (uint16_t written)
{
NS_LOG_FUNCTION (this << written);
if (m_head == 0xffff)
{
NS_ASSERT (m_tail == 0xffff);
@@ -376,6 +377,7 @@ PacketMetadata::UpdateTail (uint16_t written)
void
PacketMetadata::UpdateHead (uint16_t written)
{
NS_LOG_FUNCTION (this << written);
if (m_head == 0xffff)
{
NS_ASSERT (m_tail == 0xffff);
@@ -401,6 +403,7 @@ PacketMetadata::UpdateHead (uint16_t written)
uint16_t
PacketMetadata::AddSmall (const struct PacketMetadata::SmallItem *item)
{
NS_LOG_FUNCTION (this << item->next << item->prev << item->typeUid << item->size << item->chunkUid);
NS_ASSERT (m_data != 0);
NS_ASSERT (m_used != item->prev && m_used != item->next);
uint32_t typeUidSize = GetUleb128Size (item->typeUid);
@@ -431,6 +434,9 @@ PacketMetadata::AddBig (uint32_t next, uint32_t prev,
const PacketMetadata::SmallItem *item,
const PacketMetadata::ExtraItem *extraItem)
{
NS_LOG_FUNCTION (this << next << prev <<
item->next << item->prev << item->typeUid << item->size << item->chunkUid <<
extraItem->fragmentStart << extraItem->fragmentEnd << extraItem->packetUid);
NS_ASSERT (m_data != 0);
uint32_t typeUid = ((item->typeUid & 0x1) == 0x1)?item->typeUid:item->typeUid+1;
NS_ASSERT (m_used != prev && m_used != next);
@@ -470,12 +476,32 @@ PacketMetadata::AddBig (uint32_t next, uint32_t prev,
return n;
}
/**
* \param item the item data to write
* \param extraItem the extra item data to write
* \param available the number of bytes which can
* be written without having to rewrite the buffer entirely.
*
* XXX: should rewrite the code below to avoid using
* TryToAppend calls.
*/
void
PacketMetadata::ReplaceTail (PacketMetadata::SmallItem *item,
PacketMetadata::ExtraItem *extraItem,
uint32_t available)
{
NS_LOG_FUNCTION (this <<
item->next << item->prev << item->typeUid << item->size << item->chunkUid <<
extraItem->fragmentStart << extraItem->fragmentEnd << extraItem->packetUid <<
available);
NS_ASSERT (m_data != 0);
if (m_tail + available == m_used &&
m_used == m_data->m_dirtyEnd)
{
available = m_data->m_size - m_tail;
}
if (available >= 14 &&
m_data->m_count == 1)
{
@@ -518,11 +544,18 @@ PacketMetadata::ReplaceTail (PacketMetadata::SmallItem *item,
*this = h;
}
/**
* \param current the offset we should start reading the data from
* \param item pointer to where we should store the data to return to the caller
* \param extraItem pointer to where we should store the data to return to the caller
* \returns the number of bytes read.
*/
uint32_t
PacketMetadata::ReadItems (uint16_t current,
struct PacketMetadata::SmallItem *item,
struct PacketMetadata::ExtraItem *extraItem) const
{
NS_LOG_FUNCTION (this << current);
const uint8_t *buffer = &m_data->m_data[current];
item->next = buffer[0];
item->next |= (buffer[1]) << 8;
@@ -644,12 +677,12 @@ PacketMetadata::AddHeader (const Header &header, uint32_t size)
void
PacketMetadata::DoAddHeader (uint32_t uid, uint32_t size)
{
NS_LOG_FUNCTION (this << uid << size);
if (!m_enable)
{
m_metadataSkipped = true;
return;
}
NS_LOG_FUNCTION ("uid=" << uid << "size=" << size << "");
struct PacketMetadata::SmallItem item;
item.next = m_head;
@@ -665,12 +698,12 @@ void
PacketMetadata::RemoveHeader (const Header &header, uint32_t size)
{
uint32_t uid = header.GetInstanceTypeId ().GetUid () << 1;
NS_LOG_FUNCTION (this << uid << size);
if (!m_enable)
{
m_metadataSkipped = true;
return;
}
NS_LOG_FUNCTION ("(uid=" << uid << ", size=" << size << ")");
struct PacketMetadata::SmallItem item;
struct PacketMetadata::ExtraItem extraItem;
uint32_t read = ReadItems (m_head, &item, &extraItem);
@@ -703,12 +736,12 @@ void
PacketMetadata::AddTrailer (const Trailer &trailer, uint32_t size)
{
uint32_t uid = trailer.GetInstanceTypeId ().GetUid () << 1;
NS_LOG_FUNCTION (this << uid << size);
if (!m_enable)
{
m_metadataSkipped = true;
return;
}
NS_LOG_FUNCTION ("(uid=" << uid << ", size=" << size << ")");
struct PacketMetadata::SmallItem item;
item.next = 0xffff;
item.prev = m_tail;
@@ -723,12 +756,12 @@ void
PacketMetadata::RemoveTrailer (const Trailer &trailer, uint32_t size)
{
uint32_t uid = trailer.GetInstanceTypeId ().GetUid () << 1;
NS_LOG_FUNCTION (this << uid << size);
if (!m_enable)
{
m_metadataSkipped = true;
return;
}
NS_LOG_FUNCTION ("(uid=" << uid << ", size=" << size << ")");
struct PacketMetadata::SmallItem item;
struct PacketMetadata::ExtraItem extraItem;
uint32_t read = ReadItems (m_tail, &item, &extraItem);
@@ -760,6 +793,7 @@ PacketMetadata::RemoveTrailer (const Trailer &trailer, uint32_t size)
void
PacketMetadata::AddAtEnd (PacketMetadata const&o)
{
NS_LOG_FUNCTION (this << &o);
if (!m_enable)
{
m_metadataSkipped = true;
@@ -767,46 +801,53 @@ PacketMetadata::AddAtEnd (PacketMetadata const&o)
}
if (m_tail == 0xffff)
{
// We have no items so 'AddAtEnd' is
// equivalent to self-assignment.
*this = o;
return;
}
NS_ASSERT (m_head != 0xffff && m_tail != 0xffff);
uint16_t lastTail;
lastTail = m_tail;
struct PacketMetadata::SmallItem lastItem;
PacketMetadata::ExtraItem lastExtraItem;
uint32_t lastTailSize = ReadItems (m_tail, &lastItem, &lastExtraItem);
if (m_tail + lastTailSize == m_used &&
m_used == m_data->m_dirtyEnd)
// We read the current tail because we are going to append
// after this item.
struct PacketMetadata::SmallItem tailItem;
PacketMetadata::ExtraItem tailExtraItem;
uint32_t tailSize = ReadItems (m_tail, &tailItem, &tailExtraItem);
uint16_t current;
struct PacketMetadata::SmallItem item;
PacketMetadata::ExtraItem extraItem;
o.ReadItems (o.m_head, &item, &extraItem);
if (extraItem.packetUid == tailExtraItem.packetUid &&
item.typeUid == tailItem.typeUid &&
item.chunkUid == tailItem.chunkUid &&
item.size == tailItem.size &&
extraItem.fragmentStart == tailExtraItem.fragmentEnd)
{
lastTailSize = m_data->m_size - m_tail;
/* If the previous tail came from the same header as
* the next item we want to append to our array, then,
* we merge them and attempt to reuse the previous tail's
* location.
*/
tailExtraItem.fragmentEnd = extraItem.fragmentEnd;
// XXX This call might be wrong.
ReplaceTail (&tailItem, &tailExtraItem, tailSize);
current = item.next;
}
else
{
current = o.m_head;
}
uint16_t current = o.m_head;
/* Now that we have merged our current tail with the head of the
* next packet, we just append all items from the next packet
* to the current packet.
*/
while (current != 0xffff)
{
struct PacketMetadata::SmallItem item;
PacketMetadata::ExtraItem extraItem;
o.ReadItems (current, &item, &extraItem);
if (extraItem.packetUid == lastExtraItem.packetUid &&
item.typeUid == lastItem.typeUid &&
item.chunkUid == lastItem.chunkUid &&
item.size == lastItem.size &&
extraItem.fragmentStart == lastExtraItem.fragmentEnd)
{
// replace previous tail.
lastExtraItem.fragmentEnd = extraItem.fragmentEnd;
NS_ASSERT (m_tail == lastTail);
// XXX This call might be wrong.
ReplaceTail (&lastItem, &lastExtraItem, lastTailSize);
}
else
{
// append the extra items.
uint16_t written = AddBig (0xffff, m_tail, &item, &extraItem);
UpdateTail (written);
}
uint16_t written = AddBig (0xffff, m_tail, &item, &extraItem);
UpdateTail (written);
if (current == o.m_tail)
{
break;
@@ -826,6 +867,7 @@ PacketMetadata::AddPaddingAtEnd (uint32_t end)
void
PacketMetadata::RemoveAtStart (uint32_t start)
{
NS_LOG_FUNCTION (this << start);
if (!m_enable)
{
m_metadataSkipped = true;
@@ -891,6 +933,7 @@ PacketMetadata::RemoveAtStart (uint32_t start)
void
PacketMetadata::RemoveAtEnd (uint32_t end)
{
NS_LOG_FUNCTION (this << end);
if (!m_enable)
{
m_metadataSkipped = true;
@@ -1069,6 +1112,7 @@ PacketMetadata::ItemIterator::Next (void)
uint32_t
PacketMetadata::GetSerializedSize (void) const
{
NS_LOG_FUNCTION (this);
uint32_t totalSize = 0;
totalSize += 4;
if (!m_enable)
@@ -1105,6 +1149,7 @@ PacketMetadata::GetSerializedSize (void) const
void
PacketMetadata::Serialize (Buffer::Iterator i, uint32_t size) const
{
NS_LOG_FUNCTION (this);
uint32_t bytesWritten = 0;
i.WriteU32 (size);
bytesWritten += 4;
@@ -1160,6 +1205,7 @@ PacketMetadata::Serialize (Buffer::Iterator i, uint32_t size) const
uint32_t
PacketMetadata::Deserialize (Buffer::Iterator i)
{
NS_LOG_FUNCTION (this);
struct PacketMetadata::SmallItem item;
struct PacketMetadata::ExtraItem extraItem;
uint32_t totalSize = i.ReadU32 ();