Merge last two changesets
authorRaj Bhattacharjea <raj.b@gatech.edu>
Fri, 06 Jun 2008 14:19:05 -0400
changeset 3254 c3f792428d62
parent 3253 469aaa3f67a5 (current diff)
parent 3237 57d9fc10f15d (diff)
child 3255 ba3b5024f6a6
Merge last two changesets
--- a/src/common/packet.cc	Fri Jun 06 13:58:28 2008 -0400
+++ b/src/common/packet.cc	Fri Jun 06 14:19:05 2008 -0400
@@ -184,7 +184,7 @@
   bool resized = m_buffer.AddAtStart (size);
   if (resized)
     {
-      m_tagList.AddAtStart (m_buffer.GetCurrentStartOffset () - orgStart,
+      m_tagList.AddAtStart (m_buffer.GetCurrentStartOffset () + size - orgStart,
                             m_buffer.GetCurrentStartOffset () + size);
     }
   header.Serialize (m_buffer.Begin ());
@@ -204,11 +204,11 @@
 {
   NS_LOG_FUNCTION (this << &trailer);
   uint32_t size = trailer.GetSerializedSize ();
-  uint32_t orgEnd = m_buffer.GetCurrentEndOffset ();
+  uint32_t orgStart = m_buffer.GetCurrentStartOffset ();
   bool resized = m_buffer.AddAtEnd (size);
   if (resized)
     {
-      m_tagList.AddAtEnd (m_buffer.GetCurrentEndOffset () - orgEnd,
+      m_tagList.AddAtEnd (m_buffer.GetCurrentStartOffset () - orgStart,
                           m_buffer.GetCurrentEndOffset () - size);
     }
   Buffer::Iterator end = m_buffer.End ();
@@ -657,6 +657,60 @@
 
 };
 
+class ATestTrailerBase : public Trailer
+{
+public:
+  ATestTrailerBase () : Trailer (), m_error (false) {}
+  bool m_error;
+};
+
+template <int N>
+class ATestTrailer : public ATestTrailerBase
+{
+public:
+  static TypeId GetTypeId (void) {
+    std::ostringstream oss;
+    oss << "anon::ATestTrailer<" << N << ">";
+    static TypeId tid = TypeId (oss.str ().c_str ())
+      .SetParent<Header> ()
+      .AddConstructor<ATestTrailer<N> > ()
+      .HideFromDocumentation ()
+      ;
+    return tid;
+  }
+  virtual TypeId GetInstanceTypeId (void) const {
+    return GetTypeId ();
+  }
+  virtual uint32_t GetSerializedSize (void) const {
+    return N;
+  }
+  virtual void Serialize (Buffer::Iterator iter) const {
+    iter.Prev (N);
+    for (uint32_t i = 0; i < N; ++i)
+      {
+        iter.WriteU8 (N);
+      }
+  }
+  virtual uint32_t Deserialize (Buffer::Iterator iter) {
+    iter.Prev (N);
+    for (uint32_t i = 0; i < N; ++i)
+      {
+        uint8_t v = iter.ReadU8 ();
+        if (v != N)
+          {
+            m_error = true;
+          }
+      }
+    return N;
+  }
+  virtual void Print (std::ostream &os) const {
+  }
+  ATestTrailer ()
+    : ATestTrailerBase () {}
+
+};
+
+
 struct Expected
 {
   Expected (uint32_t n_, uint32_t start_, uint32_t end_)
@@ -669,6 +723,7 @@
 
 }
 
+// tag name, start, end
 #define E(a,b,c) a,b,c
 
 #define CHECK(p, n, ...)                                \
@@ -808,6 +863,30 @@
   frag0->AddHeader (ATestHeader<10> ());
   CHECK (frag0, 1, E (20, 10, 100));
 
+  {
+    Ptr<Packet> tmp = Create<Packet> (100);
+    tmp->AddTag (ATestTag<20> ());
+    CHECK (tmp, 1, E (20, 0, 100));
+    tmp->AddHeader (ATestHeader<10> ());
+    CHECK (tmp, 1, E (20, 10, 110));
+    ATestHeader<10> h;
+    tmp->RemoveHeader (h);
+    CHECK (tmp, 1, E (20, 0, 100));
+    tmp->AddHeader (ATestHeader<10> ());
+    CHECK (tmp, 1, E (20, 10, 110));
+
+    tmp = Create<Packet> (100);
+    tmp->AddTag (ATestTag<20> ());
+    CHECK (tmp, 1, E (20, 0, 100));
+    tmp->AddTrailer (ATestTrailer<10> ());
+    CHECK (tmp, 1, E (20, 0, 100));
+    ATestTrailer<10> t;
+    tmp->RemoveTrailer (t);
+    CHECK (tmp, 1, E (20, 0, 100));
+    tmp->AddTrailer (ATestTrailer<10> ());
+    CHECK (tmp, 1, E (20, 0, 100));
+    
+  }
   
 
   return result;
--- a/src/common/tag-list.cc	Fri Jun 06 13:58:28 2008 -0400
+++ b/src/common/tag-list.cc	Fri Jun 06 14:19:05 2008 -0400
@@ -18,8 +18,11 @@
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
 #include "tag-list.h"
+#include "ns3/log.h"
 #include <vector>
 
+NS_LOG_COMPONENT_DEFINE ("TagList");
+
 #define USE_FREE_LIST 1
 #define FREE_LIST_SIZE 1000
 
@@ -115,11 +118,14 @@
 TagList::TagList ()
   : m_used (0),
     m_data (0)
-{}
+{
+  NS_LOG_FUNCTION (this);
+}
 TagList::TagList (const TagList &o)
   : m_used (o.m_used),
     m_data (o.m_data)
 {
+  NS_LOG_FUNCTION (this << &o);
   if (m_data != 0)
     {
       m_data->count++;
@@ -128,6 +134,7 @@
 TagList &
 TagList::operator = (const TagList &o)
 {
+  NS_LOG_FUNCTION (this << &o);
   if (this == &o)
     {
       return *this;
@@ -144,6 +151,7 @@
 }
 TagList::~TagList ()
 {
+  NS_LOG_FUNCTION (this);
   Deallocate (m_data);
   m_data = 0;
   m_used = 0;
@@ -152,6 +160,7 @@
 TagBuffer
 TagList::Add (TypeId tid, uint32_t bufferSize, uint32_t start, uint32_t end)
 {
+  NS_LOG_FUNCTION (this << tid << bufferSize << start << end);
   uint32_t spaceNeeded = m_used + bufferSize + 4 + 4 + 4 + 4;
   NS_ASSERT (m_used <= spaceNeeded);
   if (m_data == 0)
@@ -181,6 +190,7 @@
 void 
 TagList::Add (const TagList &o)
 {
+  NS_LOG_FUNCTION (this << &o);
   TagList::Iterator i = o.Begin (0, 0xffffffff);
   while (i.HasNext ())
     {
@@ -193,6 +203,7 @@
 void 
 TagList::RemoveAll (void)
 {
+  NS_LOG_FUNCTION (this);
   Deallocate (m_data);
   m_data = 0;
   m_used = 0;
@@ -201,6 +212,7 @@
 TagList::Iterator 
 TagList::Begin (uint32_t offsetStart, uint32_t offsetEnd) const
 {
+  NS_LOG_FUNCTION (this << offsetStart << offsetEnd);
   if (m_data == 0)
     {
       return Iterator (0, 0, offsetStart, offsetEnd);
@@ -214,6 +226,7 @@
 bool 
 TagList::IsDirtyAtEnd (uint32_t appendOffset)
 {
+  NS_LOG_FUNCTION (this << appendOffset);
   TagList::Iterator i = Begin (0, 0xffffffff);
   while (i.HasNext ())
     {
@@ -229,6 +242,7 @@
 bool 
 TagList::IsDirtyAtStart (uint32_t prependOffset)
 {
+  NS_LOG_FUNCTION (this << prependOffset);
   TagList::Iterator i = Begin (0, 0xffffffff);
   while (i.HasNext ())
     {
@@ -244,6 +258,7 @@
 void 
 TagList::AddAtEnd (int32_t adjustment, uint32_t appendOffset)
 {
+  NS_LOG_FUNCTION (this << adjustment << appendOffset);
   if (adjustment == 0 && !IsDirtyAtEnd (appendOffset))
     {
       return;
@@ -277,6 +292,7 @@
 void 
 TagList::AddAtStart (int32_t adjustment, uint32_t prependOffset)
 {
+  NS_LOG_FUNCTION (this << adjustment << prependOffset);
   if (adjustment == 0 && !IsDirtyAtStart (prependOffset))
     {
       return;
@@ -304,7 +320,7 @@
       TagBuffer buf = list.Add (item.tid, item.size, item.start, item.end);
       buf.CopyFrom (item.buf);
     }
-  *this = list;    
+  *this = list;
 }
 
 #ifdef USE_FREE_LIST
@@ -312,6 +328,7 @@
 struct TagListData *
 TagList::Allocate (uint32_t size)
 {
+  NS_LOG_FUNCTION (this << size);
   while (!g_freeList.empty ())
     {
       struct TagListData *data = g_freeList.back ();
@@ -337,6 +354,7 @@
 void 
 TagList::Deallocate (struct TagListData *data)
 {
+  NS_LOG_FUNCTION (this << data);
   if (data == 0)
     {
       return;
@@ -363,6 +381,7 @@
 struct TagListData *
 TagList::Allocate (uint32_t size)
 {
+  NS_LOG_FUNCTION (this << size);
   uint8_t *buffer = new uint8_t [size + sizeof (struct TagListData) - 4];
   struct TagListData *data = (struct TagListData *)buffer;
   data->count = 1;
@@ -374,6 +393,7 @@
 void 
 TagList::Deallocate (struct TagListData *data)
 {
+  NS_LOG_FUNCTION (this << data);
   if (data == 0)
     {
       return;