rewrite PacketHistory::RemoveAtstart
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 06 Jun 2007 09:13:21 +0200
changeset 847 319d107f2435
parent 846 cf1ae24de38a
child 848 10e989a2ed6e
rewrite PacketHistory::RemoveAtstart
src/common/packet-history.cc
src/common/packet-history.h
--- a/src/common/packet-history.cc	Wed Jun 06 08:54:11 2007 +0200
+++ b/src/common/packet-history.cc	Wed Jun 06 09:13:21 2007 +0200
@@ -759,6 +759,27 @@
 }
 
 void
+PacketHistory::ReadItems (uint16_t current, 
+                          struct PacketHistory::SmallItem *item,
+                          struct PacketHistory::ExtraItem *extraItem) const
+{
+  const uint8_t *buffer = &m_data->m_data[current];
+  ReadSmall (item, &buffer);
+  bool isExtra = (item->typeUid & 0x1) == 0x1;
+  if (isExtra)
+    {
+      ReadExtra (extraItem, &buffer);
+    }
+  else
+    {
+      extraItem->fragmentStart = 0;
+      extraItem->fragmentEnd = item->size;
+      extraItem->packetUid = m_packetUid;
+    }
+}
+
+
+void
 PacketHistory::ReadExtra (struct PacketHistory::ExtraItem *item, const uint8_t **pBuffer) const
 {
   item->fragmentStart = ReadUleb128 (pBuffer);
@@ -970,23 +991,11 @@
   uint32_t leftToRemove = start;
   uint16_t current = m_head;
   uint16_t tail = m_tail;
-  while (current != 0xffff)
+  while (current != 0xffff && leftToRemove > 0)
     {
-      const uint8_t *buffer = &m_data->m_data[current];
       struct PacketHistory::SmallItem item;
-      ReadSmall (&item, &buffer);
-      bool isExtra = (item.typeUid & 0x1) == 0x1;
       PacketHistory::ExtraItem extraItem;
-      if (isExtra)
-        {
-          ReadExtra (&extraItem, &buffer);
-        }
-      else
-        {
-          extraItem.fragmentStart = 0;
-          extraItem.fragmentEnd = item.size;
-          extraItem.packetUid = m_packetUid;
-        }
+      ReadItems (current, &item, &extraItem);
       uint32_t itemRealSize = extraItem.fragmentEnd - extraItem.fragmentStart;
       if (itemRealSize <= leftToRemove)
         {
@@ -1001,9 +1010,21 @@
           extraItem.fragmentStart += leftToRemove;
           leftToRemove = 0;
           fragment.AddBig (false, &item, &extraItem);
-          NS_ASSERT (item.size >= extraItem.fragmentEnd - extraItem.fragmentStart &&
-                     extraItem.fragmentStart <= extraItem.fragmentEnd);
+          current = item.next;
+          while (current != 0xffff)
+            {
+              ReadItems (current, &item, &extraItem);
+              fragment.AddBig (false, &item, &extraItem);
+              if (current == tail)
+                {
+                  break;
+                }
+              current = item.next;
+            }
+          *this = fragment;
         }
+      NS_ASSERT (item.size >= extraItem.fragmentEnd - extraItem.fragmentStart &&
+                 extraItem.fragmentStart <= extraItem.fragmentEnd);
       if (current == tail)
         {
           break;
--- a/src/common/packet-history.h	Wed Jun 06 08:54:11 2007 +0200
+++ b/src/common/packet-history.h	Wed Jun 06 09:13:21 2007 +0200
@@ -117,6 +117,10 @@
                     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;
+
 
   static struct PacketHistory::Data *Create (uint32_t size);
   static void Recycle (struct PacketHistory::Data *data);