--- a/src/common/packet-history.cc Wed Jun 06 11:30:17 2007 +0200
+++ b/src/common/packet-history.cc Wed Jun 06 12:39:33 2007 +0200
@@ -727,9 +727,44 @@
void
PacketHistory::ReplaceTail (const PacketHistory::SmallItem *item,
- const PacketHistory::ExtraItem *extraItem)
+ const PacketHistory::ExtraItem *extraItem,
+ uint32_t available)
{
+ NS_ASSERT (m_data != 0);
+ if (available >= 10 &&
+ (m_data->m_count == 1 ||
+ m_used == m_data->m_dirtyEnd))
+ {
+ uint8_t *buffer = &m_data->m_data[m_tail];
+ uint8_t *end = buffer + available;
+ Append16 (item->next, &buffer);
+ Append16 (item->prev, &buffer);
+ if (TryToAppend (item->typeUid, &buffer, end) &&
+ TryToAppend (item->size, &buffer, end) &&
+ TryToAppend (item->chunkUid, &buffer, end) &&
+ TryToAppend (extraItem->fragmentStart, &buffer, end) &&
+ TryToAppend (extraItem->fragmentEnd, &buffer, end) &&
+ TryToAppend (extraItem->packetUid, &buffer, end))
+ {
+ return;
+ }
+ }
+
+ // create a copy of the packet.
+ PacketHistory h (m_packetUid, 0);
+ uint16_t current = m_head;
+ while (current != 0xffff && current != m_tail)
+ {
+ struct PacketHistory::SmallItem tmpItem;
+ PacketHistory::ExtraItem tmpExtraItem;
+ ReadItems (current, &tmpItem, &tmpExtraItem);
+ h.AddBig (false, &tmpItem, &tmpExtraItem);
+ }
+ // append new tail.
+ h.AddBig (false, item, extraItem);
+
+ *this = h;
}
@@ -748,7 +783,7 @@
item->chunkUid = ReadUleb128 (pBuffer);
}
-void
+uint32_t
PacketHistory::ReadItems (uint16_t current,
struct PacketHistory::SmallItem *item,
struct PacketHistory::ExtraItem *extraItem) const
@@ -767,6 +802,7 @@
extraItem->packetUid = m_packetUid;
}
NS_ASSERT (buffer <= &m_data->m_data[m_data->m_size]);
+ return buffer - &m_data->m_data[current];
}
@@ -968,7 +1004,12 @@
uint16_t lastTail = m_tail;
struct PacketHistory::SmallItem lastItem;
PacketHistory::ExtraItem lastExtraItem;
- ReadItems (m_tail, &lastItem, &lastExtraItem);
+ uint32_t lastTailSize = ReadItems (m_tail, &lastItem, &lastExtraItem);
+ if (m_tail + lastTailSize == m_used &&
+ m_used == m_data->m_dirtyEnd)
+ {
+ lastTailSize = m_data->m_size;
+ }
uint16_t current = o.m_head;
while (current != 0xffff)
@@ -982,13 +1023,14 @@
item.size == lastItem.size &&
extraItem.fragmentStart == lastExtraItem.fragmentEnd)
{
- // add at tail
+ // replace previous tail.
lastExtraItem.fragmentEnd = extraItem.fragmentEnd;
NS_ASSERT (m_tail == lastTail);
- ReplaceTail (&lastItem, &lastExtraItem);
+ ReplaceTail (&lastItem, &lastExtraItem, lastTailSize);
}
else
{
+ // append the extra items.
AddBig (false, &item, &extraItem);
}
current = item.next;
@@ -996,7 +1038,7 @@
{
break;
}
- }
+ }
}
void
PacketHistory::AddPaddingAtEnd (uint32_t end)
--- a/src/common/packet-history.h Wed Jun 06 11:30:17 2007 +0200
+++ b/src/common/packet-history.h Wed Jun 06 12:39:33 2007 +0200
@@ -104,7 +104,8 @@
const PacketHistory::SmallItem *item,
const PacketHistory::ExtraItem *extraItem);
void ReplaceTail (const PacketHistory::SmallItem *item,
- const PacketHistory::ExtraItem *extraItem);
+ const PacketHistory::ExtraItem *extraItem,
+ uint32_t available);
void Update (bool atStart, uint16_t written);
uint32_t GetUleb128Size (uint32_t value) const;
uint32_t ReadUleb128 (const uint8_t **pBuffer) const;
@@ -120,9 +121,9 @@
Buffer data, uint32_t offset, const PacketPrinter &printer,
std::ostream &os) const;
uint32_t GetTotalSize (void) const;
- void ReadItems (uint16_t current,
- struct PacketHistory::SmallItem *item,
- struct PacketHistory::ExtraItem *extraItem) const;
+ uint32_t ReadItems (uint16_t current,
+ struct PacketHistory::SmallItem *item,
+ struct PacketHistory::ExtraItem *extraItem) const;
static struct PacketHistory::Data *Create (uint32_t size);