--- 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;