new Packet testcases, bug fix.
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 29 May 2008 12:13:42 -0700
changeset 3180 b69d00a3d410
parent 3179 1763f7ac8e80
child 3181 26e7f865c548
child 3184 2722ec585e94
new Packet testcases, bug fix.
src/common/buffer.cc
src/common/packet-metadata-test.cc
--- a/src/common/buffer.cc	Thu May 29 09:37:07 2008 -0700
+++ b/src/common/buffer.cc	Thu May 29 12:13:42 2008 -0700
@@ -360,6 +360,8 @@
       NS_ASSERT (m_data->m_count == 1 || m_start == m_data->m_dirtyStart);
       m_start -= start;
       dirty = m_start > m_data->m_dirtyStart;
+      // update dirty area
+      m_data->m_dirtyStart = m_start;
       HEURISTICS (g_nAddNoRealloc++);
     } 
   else
@@ -381,14 +383,15 @@
       m_end += delta;
       m_start -= start;
 
+      // update dirty area
+      m_data->m_dirtyStart = m_start;
+      m_data->m_dirtyEnd = m_end;
+
       dirty = true;
 
       HEURISTICS (g_nAddRealloc++);
     }
   HEURISTICS (m_maxZeroAreaStart = std::max (m_maxZeroAreaStart, m_zeroAreaStart));
-  // update dirty area
-  m_data->m_dirtyStart = m_start;
-  m_data->m_dirtyEnd = m_end;
   LOG_INTERNAL_STATE ("add start=" << start << ", ");
   NS_ASSERT (CheckInternalState ());
   return dirty;
@@ -409,6 +412,8 @@
        */
       NS_ASSERT (m_data->m_count == 1 || m_end == m_data->m_dirtyEnd);
       m_end += end;
+      // update dirty area.
+      m_data->m_dirtyEnd = m_end;
 
       dirty = m_end < m_data->m_dirtyEnd;
 
@@ -433,14 +438,15 @@
       m_start += delta;
       m_end += end;
 
+      // update dirty area
+      m_data->m_dirtyStart = m_start;
+      m_data->m_dirtyEnd = m_end;
+
       dirty = true;
 
       HEURISTICS (g_nAddRealloc++);
     } 
   HEURISTICS (m_maxZeroAreaStart = std::max (m_maxZeroAreaStart, m_zeroAreaStart));
-  // update dirty area
-  m_data->m_dirtyStart = m_start;
-  m_data->m_dirtyEnd = m_end;
   LOG_INTERNAL_STATE ("add end=" << end << ", ");
   NS_ASSERT (CheckInternalState ());
 
--- a/src/common/packet-metadata-test.cc	Thu May 29 09:37:07 2008 -0700
+++ b/src/common/packet-metadata-test.cc	Thu May 29 12:13:42 2008 -0700
@@ -32,42 +32,70 @@
 
 namespace {
 
+class HistoryHeaderBase : public Header
+{
+public:
+  static TypeId GetTypeId (void);
+  HistoryHeaderBase ();
+  bool IsOk (void) const;
+protected:
+  void ReportError (void);
+private:
+  bool m_ok;
+};
+
+TypeId 
+HistoryHeaderBase::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::HistoryHeaderBase")
+    .SetParent<Header> ()
+    ;
+  return tid;
+}
+
+HistoryHeaderBase::HistoryHeaderBase ()
+  : m_ok (true)
+{}
+
+bool 
+HistoryHeaderBase::IsOk (void) const
+{
+  return m_ok;
+}
+void 
+HistoryHeaderBase::ReportError (void)
+{
+  m_ok = false;
+}
+
+
 template <int N>
-class HistoryHeader : public Header
+class HistoryHeader : public HistoryHeaderBase
 {
 public:
   HistoryHeader ();
-  bool IsOk (void) const;
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetSerializedSize (void) const;
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
-private:
-  bool m_ok;
 };
 
 template <int N>
 HistoryHeader<N>::HistoryHeader ()
-  : m_ok (false)
+  : HistoryHeaderBase ()
 {}
 
 template <int N>
-bool 
-HistoryHeader<N>::IsOk (void) const
-{
-  return m_ok;
-}
-
-template <int N>
 TypeId
 HistoryHeader<N>::GetTypeId (void)
 {
   std::ostringstream oss;
   oss << "ns3::HistoryHeader<"<<N<<">";
   static TypeId tid = TypeId (oss.str ().c_str ())
-    .SetParent<Header> ()
+    .SetParent<HistoryHeaderBase> ()
+    .AddConstructor<HistoryHeader<N> > ()
     ;
   return tid;
 }
@@ -100,19 +128,53 @@
 uint32_t
 HistoryHeader<N>::Deserialize (Buffer::Iterator start)
 {
-  m_ok = true;
   for (int i = 0; i < N; i++)
     {
       if (start.ReadU8 () != N)
         {
-          m_ok = false;
+          ReportError ();
         }
     }
   return N;
 }
 
+class HistoryTrailerBase : public Trailer
+{
+public:
+  static TypeId GetTypeId (void);
+  HistoryTrailerBase ();
+  bool IsOk (void) const;
+protected:
+  void ReportError (void);
+private:
+  bool m_ok;
+};
+
+TypeId 
+HistoryTrailerBase::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::HistoryTrailerBase")
+    .SetParent<Trailer> ()
+    ;
+  return tid;
+}
+HistoryTrailerBase::HistoryTrailerBase ()
+  : m_ok (true)
+{}
+bool 
+HistoryTrailerBase::IsOk (void) const
+{
+  return m_ok;
+}
+void 
+HistoryTrailerBase::ReportError (void)
+{
+  m_ok = false;
+}
+
+
 template <int N>
-class HistoryTrailer : public Trailer
+class HistoryTrailer : public HistoryTrailerBase
 {
 public:
   HistoryTrailer ();
@@ -130,24 +192,17 @@
 
 template <int N>
 HistoryTrailer<N>::HistoryTrailer ()
-  : m_ok (false)
 {}
 
 template <int N>
-bool
-HistoryTrailer<N>::IsOk (void) const
-{
-  return m_ok;
-}
-
-template <int N>
 TypeId
 HistoryTrailer<N>::GetTypeId (void)
 {
   std::ostringstream oss;
   oss << "ns3::HistoryTrailer<"<<N<<">";
   static TypeId tid = TypeId (oss.str ().c_str ())
-    .SetParent<Trailer> ()
+    .SetParent<HistoryTrailerBase> ()
+    .AddConstructor<HistoryTrailer<N> > ()
     ;
   return tid;
 }
@@ -181,13 +236,12 @@
 uint32_t
 HistoryTrailer<N>::Deserialize (Buffer::Iterator start)
 {
-  m_ok = true;
   start.Prev (N);
   for (int i = 0; i < N; i++)
     {
       if (start.ReadU8 () != N)
         {
-          m_ok = false;
+          ReportError ();
         }
     }
   return N;
@@ -234,6 +288,43 @@
   while (k.HasNext ())
     {
       struct PacketMetadata::Item item = k.Next ();
+      if (item.isFragment || item.type == PacketMetadata::Item::PAYLOAD)
+        {
+          got.push_back (item.currentSize);
+          continue;
+        }
+      if (item.type == PacketMetadata::Item::HEADER)
+        {
+          Callback<ObjectBase *> constructor = item.tid.GetConstructor ();
+          HistoryHeaderBase *header = dynamic_cast<HistoryHeaderBase *> (constructor ());
+          if (header == 0)
+            {
+              goto error;
+            }
+          header->Deserialize (item.current);
+          if (!header->IsOk ())
+            {
+              delete header;
+              goto error;
+            }
+          delete header;
+        }
+      else if (item.type == PacketMetadata::Item::TRAILER)
+        {
+          Callback<ObjectBase *> constructor = item.tid.GetConstructor ();
+          HistoryTrailerBase *trailer = dynamic_cast<HistoryTrailerBase *> (constructor ());
+          if (trailer == 0)
+            {
+              goto error;
+            }
+          trailer->Deserialize (item.current);
+          if (!trailer->IsOk ())
+            {
+              delete trailer;
+              goto error;
+            }
+          delete trailer;
+        }
       got.push_back (item.currentSize);
     }
 
@@ -291,7 +382,7 @@
     if (!CheckHistory (p, __FILE__,             \
                       __LINE__, __VA_ARGS__))   \
       {                                         \
-        ok = false;                             \
+        result = false;                         \
       }                                         \
     Buffer buffer;                              \
     buffer = p->Serialize ();                   \
@@ -300,7 +391,7 @@
     if (!CheckHistory (otherPacket, __FILE__,   \
                       __LINE__, __VA_ARGS__))   \
       {                                         \
-        ok = false;                             \
+        result = false;                         \
       }                                         \
   }
 
@@ -315,7 +406,7 @@
 bool
 PacketMetadataTest::RunTests (void)
 {
-  bool ok = true;
+  bool result = true;
 
   PacketMetadata::Enable ();
 
@@ -624,7 +715,40 @@
   REM_HEADER (p3, 8);
   p2->AddAtEnd (p3);
 
-  return ok;
+
+  p = Create<Packet> (1000);
+  ADD_HEADER (p, 10);
+  ADD_TRAILER (p, 5);
+  p1 = p->Copy ();
+  ADD_HEADER (p1, 20);
+  REM_HEADER (p1, 20);
+  REM_TRAILER (p1, 5);
+  NS_TEST_ASSERT_EQUAL (p->GetSize (), 1015);
+
+  
+  p = Create<Packet> (1510);
+  ADD_HEADER (p, 8);
+  ADD_HEADER (p, 25);
+  REM_HEADER (p, 25);
+  ADD_HEADER (p, 1);
+  p1 = p->CreateFragment (0, 1500);
+  p2 = p1->Copy ();
+  ADD_HEADER (p2, 24);
+  NS_TEST_ASSERT_EQUAL (p->GetSize (), 1519);
+
+  p = Create<Packet> (1000);
+  ADD_HEADER (p, 2);
+  ADD_TRAILER (p, 3);
+  p1 = p->Copy ();
+  CHECK_HISTORY (p1, 3, 2, 1000, 3);
+  REM_HEADER (p, 2);
+  ADD_HEADER (p, 1);
+  CHECK_HISTORY (p, 3, 1, 1000, 3);
+  CHECK_HISTORY (p1, 3, 2, 1000, 3);
+
+
+
+  return result;
 }
 
 static PacketMetadataTest g_packetHistoryTest;