src/common/packet.cc
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Mon, 31 Mar 2008 14:56:41 -0700
changeset 2834 1aab57845b07
parent 2790 29e10e971644
child 2992 ba52f937610c
permissions -rw-r--r--
remove 'All rigts reserved' keyword per tom's suggestion
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2005,2006 INRIA
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
#include "packet.h"
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 239
diff changeset
    21
#include "ns3/assert.h"
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
16
99e833adbb46 change yans namespace to ns3
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 9
diff changeset
    23
namespace ns3 {
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
    25
uint32_t Packet::m_globalUid = 0;
91
8066ef8d9274 add packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
    26
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    27
void 
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    28
Packet::Ref (void) const
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    29
{
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    30
  m_refCount++;
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    31
}
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    32
void 
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    33
Packet::Unref (void) const
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    34
{
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    35
  m_refCount--;
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    36
  if (m_refCount == 0)
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    37
    {
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    38
      delete this;
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    39
    }
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    40
}
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    41
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    42
Ptr<Packet> 
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    43
Packet::Copy (void) const
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    44
{
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    45
  // we need to invoke the copy constructor directly
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    46
  // rather than calling Create because the copy constructor
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    47
  // is private.
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    48
  return Ptr<Packet> (new Packet (*this), false);
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    49
}
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    50
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    51
Packet::Packet ()
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    52
  : m_buffer (),
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    53
    m_tags (),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    54
    m_metadata (m_globalUid, 0),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    55
    m_refCount (1)
91
8066ef8d9274 add packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
    56
{
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
    57
  m_globalUid++;
91
8066ef8d9274 add packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
    58
}
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    60
Packet::Packet (const Packet &o)
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    61
  : m_buffer (o.m_buffer),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    62
    m_tags (o.m_tags),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    63
    m_metadata (o.m_metadata),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    64
    m_refCount (1)
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    65
{}
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    66
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    67
Packet &
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    68
Packet::operator = (const Packet &o)
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    69
{
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    70
  if (this == &o)
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    71
    {
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    72
      return *this;
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    73
    }
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    74
  m_buffer = o.m_buffer;
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    75
  m_tags = o.m_tags;
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    76
  m_metadata = o.m_metadata;
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    77
  return *this;
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    78
}
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    79
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
Packet::Packet (uint32_t size)
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    81
  : m_buffer (size),
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    82
    m_tags (),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    83
    m_metadata (m_globalUid, size),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    84
    m_refCount (1)
91
8066ef8d9274 add packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
    85
{
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
    86
  m_globalUid++;
91
8066ef8d9274 add packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
    87
}
239
e194d619534b add packet constructor which accepts payload buffer.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
    88
Packet::Packet (uint8_t const*buffer, uint32_t size)
e194d619534b add packet constructor which accepts payload buffer.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
    89
  : m_buffer (),
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    90
    m_tags (),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    91
    m_metadata (m_globalUid, size),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
    92
    m_refCount (1)
239
e194d619534b add packet constructor which accepts payload buffer.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
    93
{
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
    94
  m_globalUid++;
239
e194d619534b add packet constructor which accepts payload buffer.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
    95
  m_buffer.AddAtStart (size);
e194d619534b add packet constructor which accepts payload buffer.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
    96
  Buffer::Iterator i = m_buffer.Begin ();
e194d619534b add packet constructor which accepts payload buffer.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
    97
  i.Write (buffer, size);
e194d619534b add packet constructor which accepts payload buffer.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
    98
}
e194d619534b add packet constructor which accepts payload buffer.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
    99
888
f882ee7eaccf history -> metadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   100
Packet::Packet (Buffer buffer, Tags tags, PacketMetadata metadata)
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   101
  : m_buffer (buffer),
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   102
    m_tags (tags),
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   103
    m_metadata (metadata),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   104
    m_refCount (1)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
{}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   107
Ptr<Packet>
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   108
Packet::CreateFragment (uint32_t start, uint32_t length) const
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
{
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   110
  Buffer buffer = m_buffer.CreateFragment (start, length);
819
3bae75040589 calculate the correct size of header and trailer to remove from buffer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 806
diff changeset
   111
  NS_ASSERT (m_buffer.GetSize () >= start + length);
3bae75040589 calculate the correct size of header and trailer to remove from buffer
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 806
diff changeset
   112
  uint32_t end = m_buffer.GetSize () - (start + length);
888
f882ee7eaccf history -> metadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   113
  PacketMetadata metadata = m_metadata.CreateFragment (start, end);
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   114
  // again, call the constructor directly rather than
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   115
  // through Create because it is private.
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   116
  return Ptr<Packet> (new Packet (buffer, m_tags, metadata), false);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
uint32_t 
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   120
Packet::GetSize (void) const
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   121
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   122
  return m_buffer.GetSize ();
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
2663
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   125
void
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   126
Packet::AddHeader (const Header &header)
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   127
{
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   128
  uint32_t size = header.GetSerializedSize ();
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   129
  m_buffer.AddAtStart (size);
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   130
  header.Serialize (m_buffer.Begin ());
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   131
  m_metadata.AddHeader (header, size);
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   132
}
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   133
uint32_t
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   134
Packet::RemoveHeader (Header &header)
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   135
{
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   136
  uint32_t deserialized = header.Deserialize (m_buffer.Begin ());
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   137
  m_buffer.RemoveAtStart (deserialized);
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   138
  m_metadata.RemoveHeader (header, deserialized);
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   139
  return deserialized;
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   140
}
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   141
void
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   142
Packet::AddTrailer (const Trailer &trailer)
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   143
{
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   144
  uint32_t size = trailer.GetSerializedSize ();
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   145
  m_buffer.AddAtEnd (size);
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   146
  Buffer::Iterator end = m_buffer.End ();
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   147
  trailer.Serialize (end);
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   148
  m_metadata.AddTrailer (trailer, size);
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   149
}
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   150
uint32_t
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   151
Packet::RemoveTrailer (Trailer &trailer)
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   152
{
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   153
  uint32_t deserialized = trailer.Deserialize (m_buffer.End ());
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   154
  m_buffer.RemoveAtEnd (deserialized);
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   155
  m_metadata.RemoveTrailer (trailer, deserialized);
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   156
  return deserialized;
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   157
}
dc5314da50aa remove template methods.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2660
diff changeset
   158
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
void 
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   160
Packet::AddAtEnd (Ptr<const Packet> packet)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   161
{
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   162
  Buffer src = packet->m_buffer.CreateFullCopy ();
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   163
  Buffer dst = m_buffer.CreateFullCopy ();
824
3550753974a0 ensure that packets are real buffers before concatenating them
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 819
diff changeset
   164
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   165
  dst.AddAtEnd (src.GetSize ());
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   166
  Buffer::Iterator destStart = dst.End ();
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   167
  destStart.Prev (src.GetSize ());
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   168
  destStart.Write (src.Begin (), src.End ());
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   169
  m_buffer = dst;
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   170
  /**
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   171
   * XXX: we might need to merge the tag list of the
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   172
   * other packet into the current packet.
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   173
   */
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   174
  m_metadata.AddAtEnd (packet->m_metadata);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
}
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   176
void
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   177
Packet::AddPaddingAtEnd (uint32_t size)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
{
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   179
  m_buffer.AddAtEnd (size);
888
f882ee7eaccf history -> metadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   180
  m_metadata.AddPaddingAtEnd (size);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
void 
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   183
Packet::RemoveAtEnd (uint32_t size)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   184
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   185
  m_buffer.RemoveAtEnd (size);
888
f882ee7eaccf history -> metadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   186
  m_metadata.RemoveAtEnd (size);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
void 
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   189
Packet::RemoveAtStart (uint32_t size)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   191
  m_buffer.RemoveAtStart (size);
888
f882ee7eaccf history -> metadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   192
  m_metadata.RemoveAtStart (size);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   195
void 
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   196
Packet::RemoveAllTags (void)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   197
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   198
  m_tags.RemoveAll ();
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
90
d670ba9f726e replace pointers with references
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 54
diff changeset
   201
uint8_t const *
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   202
Packet::PeekData (void) const
90
d670ba9f726e replace pointers with references
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 54
diff changeset
   203
{
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
   204
  return m_buffer.PeekData ();
90
d670ba9f726e replace pointers with references
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 54
diff changeset
   205
}
d670ba9f726e replace pointers with references
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 54
diff changeset
   206
91
8066ef8d9274 add packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   207
uint32_t 
122
6b8f1eda5c57 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 111
diff changeset
   208
Packet::GetUid (void) const
91
8066ef8d9274 add packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   209
{
888
f882ee7eaccf history -> metadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   210
  return m_metadata.GetUid ();
91
8066ef8d9274 add packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   211
}
8066ef8d9274 add packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 90
diff changeset
   212
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   213
void 
1241
66f126692f5e add Packet::PrintTags and move tag documentation to tag.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1150
diff changeset
   214
Packet::PrintTags (std::ostream &os) const
66f126692f5e add Packet::PrintTags and move tag documentation to tag.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1150
diff changeset
   215
{
1261
f4bc87975995 avoid more spurious whitespaces during testing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1241
diff changeset
   216
  m_tags.Print (os, " ");
1241
66f126692f5e add Packet::PrintTags and move tag documentation to tag.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1150
diff changeset
   217
}
66f126692f5e add Packet::PrintTags and move tag documentation to tag.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1150
diff changeset
   218
66f126692f5e add Packet::PrintTags and move tag documentation to tag.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1150
diff changeset
   219
void 
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   220
Packet::Print (std::ostream &os) const
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 463
diff changeset
   221
{
2660
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   222
  PacketMetadata::ItemIterator i = m_metadata.BeginItem (m_buffer);
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   223
  while (i.HasNext ())
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   224
    {
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   225
      PacketMetadata::Item item = i.Next ();
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   226
      if (item.isFragment)
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   227
        {
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   228
          switch (item.type) {
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   229
          case PacketMetadata::Item::PAYLOAD:
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   230
            os << "Payload";
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   231
            break;
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   232
          case PacketMetadata::Item::HEADER:
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   233
          case PacketMetadata::Item::TRAILER:
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   234
            os << item.tid.GetName ();
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   235
            break;
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   236
          }
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   237
          os << " Fragment [" << item.currentTrimedFromStart<<":"
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   238
             << (item.currentTrimedFromStart + item.currentSize) << "]";
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   239
        }
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   240
      else
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   241
        {
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   242
          switch (item.type) {
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   243
          case PacketMetadata::Item::PAYLOAD:
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   244
            os << "Payload (size=" << item.currentSize << ")";
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   245
            break;
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   246
          case PacketMetadata::Item::HEADER:
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   247
          case PacketMetadata::Item::TRAILER:
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   248
            os << item.tid.GetName () << " (";
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   249
            {
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   250
              NS_ASSERT (item.tid.HasConstructor ());
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   251
              Callback<ObjectBase *> constructor = item.tid.GetConstructor ();
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   252
              NS_ASSERT (!constructor.IsNull ());
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   253
              ObjectBase *instance = constructor ();
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   254
              NS_ASSERT (instance != 0);
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   255
              Chunk *chunk = dynamic_cast<Chunk *> (instance);
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   256
              NS_ASSERT (chunk != 0);
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   257
              chunk->Deserialize (item.current);
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   258
              chunk->Print (os);
2790
29e10e971644 delete a packet chunk after deserializing it from a packet.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2693
diff changeset
   259
              delete chunk;
2660
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   260
            }
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   261
            os << ")";
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   262
            break;
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   263
          }          
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   264
        }
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   265
      if (i.HasNext ())
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   266
        {
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   267
          os << " ";
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   268
        }
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   269
    }
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   270
#if 0
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   271
  // The code below will work only if headers and trailers
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   272
  // define the right attributes which is not the case for
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   273
  // now. So, as a temporary measure, we use the 
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   274
  // headers' and trailers' Print method as shown above.
2647
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   275
  PacketMetadata::ItemIterator i = m_metadata.BeginItem (m_buffer);
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   276
  while (i.HasNext ())
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   277
    {
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   278
      PacketMetadata::Item item = i.Next ();
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   279
      if (item.isFragment)
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   280
        {
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   281
          switch (item.type) {
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   282
          case PacketMetadata::Item::PAYLOAD:
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   283
            os << "Payload";
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   284
            break;
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   285
          case PacketMetadata::Item::HEADER:
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   286
          case PacketMetadata::Item::TRAILER:
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   287
            os << item.tid.GetName ();
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   288
            break;
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   289
          }
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   290
          os << " Fragment [" << item.currentTrimedFromStart<<":"
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   291
             << (item.currentTrimedFromStart + item.currentSize) << "]";
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   292
        }
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   293
      else
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   294
        {
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   295
          switch (item.type) {
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   296
          case PacketMetadata::Item::PAYLOAD:
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   297
            os << "Payload (size=" << item.currentSize << ")";
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   298
            break;
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   299
          case PacketMetadata::Item::HEADER:
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   300
          case PacketMetadata::Item::TRAILER:
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   301
            os << item.tid.GetName () << "(";
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   302
            {
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   303
              NS_ASSERT (item.tid.HasConstructor ());
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   304
              Callback<ObjectBase *> constructor = item.tid.GetConstructor ();
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   305
              NS_ASSERT (constructor.IsNull ());
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   306
              ObjectBase *instance = constructor ();
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   307
              NS_ASSERT (instance != 0);
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   308
              Chunk *chunk = dynamic_cast<Chunk *> (instance);
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   309
              NS_ASSERT (chunk != 0);
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   310
              chunk->Deserialize (item.current);
2693
56e28e34e109 TypeId::GetAttributeListN -> TypeId::GetAttributeN
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2663
diff changeset
   311
              for (uint32_t j = 0; j < item.tid.GetAttributeN (); j++)
2647
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   312
                {
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   313
                  std::string attrName = item.tid.GetAttributeName (j);
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   314
                  std::string value;
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   315
                  bool ok = chunk->GetAttribute (attrName, value);
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   316
                  NS_ASSERT (ok);
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   317
                  os << attrName << "=" << value;
2693
56e28e34e109 TypeId::GetAttributeListN -> TypeId::GetAttributeN
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2663
diff changeset
   318
                  if ((j + 1) < item.tid.GetAttributeN ())
2647
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   319
                    {
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   320
                      os << ",";
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   321
                    }
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   322
                }
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   323
            }
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   324
            os << ")";
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   325
            break;
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   326
          }          
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   327
        }
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   328
      if (i.HasNext ())
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   329
        {
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   330
          os << " ";
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   331
        }
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2640
diff changeset
   332
    }
2660
1d54065d728a convert Packet::Print to use Chunk::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   333
#endif   
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 463
diff changeset
   334
}
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   335
2639
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1865
diff changeset
   336
PacketMetadata::ItemIterator 
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1865
diff changeset
   337
Packet::BeginItem (void) const
806
0190f1b49dc8 re-implement PacketHistory to use the PacketPrinter and work on ItemList::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 790
diff changeset
   338
{
2639
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1865
diff changeset
   339
  return m_metadata.BeginItem (m_buffer);
806
0190f1b49dc8 re-implement PacketHistory to use the PacketPrinter and work on ItemList::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 790
diff changeset
   340
}
0190f1b49dc8 re-implement PacketHistory to use the PacketPrinter and work on ItemList::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 790
diff changeset
   341
875
4ebee6ceebb5 rename History::Enable to Packet::EnableMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 824
diff changeset
   342
void
4ebee6ceebb5 rename History::Enable to Packet::EnableMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 824
diff changeset
   343
Packet::EnableMetadata (void)
4ebee6ceebb5 rename History::Enable to Packet::EnableMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 824
diff changeset
   344
{
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 875
diff changeset
   345
  PacketMetadata::Enable ();
875
4ebee6ceebb5 rename History::Enable to Packet::EnableMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 824
diff changeset
   346
}
463
c2082308e01a merge Packet API changes needed for Packet pretty printing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 286
diff changeset
   347
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   348
Buffer 
1142
ff8f4a2efc6b add doxygen documentation, constify
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1141
diff changeset
   349
Packet::Serialize (void) const
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   350
{
1144
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   351
  Buffer buffer;
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   352
  uint32_t reserve;
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   353
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   354
  // write metadata
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   355
  reserve = m_metadata.GetSerializedSize ();
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   356
  buffer.AddAtStart (reserve);
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   357
  m_metadata.Serialize (buffer.Begin (), reserve);
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   358
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   359
  // write tags
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   360
  reserve = m_tags.GetSerializedSize ();
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   361
  buffer.AddAtStart (reserve);
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   362
  m_tags.Serialize (buffer.Begin (), reserve);
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   363
  
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   364
  // aggregate byte buffer, metadata, and tags
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   365
  Buffer tmp = m_buffer.CreateFullCopy ();
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   366
  buffer.AddAtStart (tmp.GetSize ());
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   367
  buffer.Begin ().Write (tmp.Begin (), tmp.End ());
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   368
  
1150
fcdda7ef3cee fix packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1144
diff changeset
   369
  // write byte buffer size.
fcdda7ef3cee fix packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1144
diff changeset
   370
  buffer.AddAtStart (4);
fcdda7ef3cee fix packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1144
diff changeset
   371
  buffer.Begin ().WriteU32 (m_buffer.GetSize ());
1144
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   372
1150
fcdda7ef3cee fix packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1144
diff changeset
   373
  return buffer;
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   374
}
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   375
void 
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   376
Packet::Deserialize (Buffer buffer)
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   377
{
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   378
  Buffer buf = buffer;
1144
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   379
  // read size
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   380
  uint32_t packetSize = buf.Begin ().ReadU32 ();
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   381
  buf.RemoveAtStart (4);
1144
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   382
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   383
  // read buffer.
1150
fcdda7ef3cee fix packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1144
diff changeset
   384
  buf.RemoveAtEnd (buf.GetSize () - packetSize);
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   385
  m_buffer = buf;
1144
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   386
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   387
  // read tags
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   388
  buffer.RemoveAtStart (4 + packetSize);
1144
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   389
  uint32_t tagsDeserialized = m_tags.Deserialize (buffer.Begin ());
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   390
  buffer.RemoveAtStart (tagsDeserialized);
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   391
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   392
  // read metadata
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   393
  uint32_t metadataDeserialized = 
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   394
    m_metadata.Deserialize (buffer.Begin ());
6442e000420b finish packet serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1142
diff changeset
   395
  buffer.RemoveAtStart (metadataDeserialized);
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   396
}
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   397
1360
7686e996bd1d add operator << for Packet and TraceContext
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1241
diff changeset
   398
std::ostream& operator<< (std::ostream& os, const Packet &packet)
7686e996bd1d add operator << for Packet and TraceContext
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1241
diff changeset
   399
{
7686e996bd1d add operator << for Packet and TraceContext
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1241
diff changeset
   400
  packet.Print (os);
7686e996bd1d add operator << for Packet and TraceContext
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1241
diff changeset
   401
  return os;
7686e996bd1d add operator << for Packet and TraceContext
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1241
diff changeset
   402
}
7686e996bd1d add operator << for Packet and TraceContext
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1241
diff changeset
   403
1138
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   404
27245d50e5e0 use CreateFullCopy and implement Serialize/Deserialize
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 896
diff changeset
   405
} // namespace ns3
772
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   406
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   407
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   408
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   409
#ifdef RUN_SELF_TESTS
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   410
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   411
#include "ns3/test.h"
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   412
#include <string>
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   413
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   414
namespace ns3 {
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   415
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   416
class PacketTest: public Test {
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   417
public:
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   418
  virtual bool RunTests (void);
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   419
  PacketTest ();
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   420
};
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   421
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   422
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   423
PacketTest::PacketTest ()
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   424
  : Test ("Packet") {}
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   425
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   426
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   427
bool
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   428
PacketTest::RunTests (void)
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   429
{
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   430
  bool ok = true;
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   431
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   432
  Ptr<Packet> pkt1 = Create<Packet> (reinterpret_cast<const uint8_t*> ("hello"), 5);
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   433
  Ptr<Packet> pkt2 = Create<Packet> (reinterpret_cast<const uint8_t*> (" world"), 6);
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   434
  Ptr<Packet> packet = Create<Packet> ();
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   435
  packet->AddAtEnd (pkt1);
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   436
  packet->AddAtEnd (pkt2);
772
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   437
  
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   438
  if (packet->GetSize () != 11)
772
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   439
    {
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   440
      Failure () << "expected size 11, got " << packet->GetSize () << std::endl;
772
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   441
      ok = false;
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   442
    }
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   443
1865
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   444
  std::string msg = std::string (reinterpret_cast<const char *>(packet->PeekData ()),
829dc1815014 add Packet::Ref/Unref methods
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1493
diff changeset
   445
                                 packet->GetSize ());
772
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   446
  if (msg != "hello world")
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   447
    {
1475
725c9adf19d2 improve debugging output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1261
diff changeset
   448
      Failure () << "expected 'hello world', got '" << msg << "'" << std::endl;
772
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   449
      ok = false;
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   450
    }
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   451
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   452
  return ok;
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   453
}
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   454
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   455
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   456
static PacketTest gPacketTest;
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   457
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   458
}; // namespace ns3
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   459
1e4fde8c1249 Add a Packet::AddAtEnd unit test.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 463
diff changeset
   460
#endif /* RUN_SELF_TESTS */