From 00d36e836cc57a26d9315cfb693953fcaba9bedb Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Sat, 31 May 2008 10:46:23 -0700 Subject: [PATCH] add logging, cleanup AddAtEnd. --- src/common/packet-metadata.cc | 112 ++++++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 33 deletions(-) diff --git a/src/common/packet-metadata.cc b/src/common/packet-metadata.cc index 3bc23f6ba..0c5345415 100644 --- a/src/common/packet-metadata.cc +++ b/src/common/packet-metadata.cc @@ -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 ();