samples/main-packet-tag.cc
author Florian Westphal <fw@strlen.de>
Wed, 03 Sep 2008 23:24:59 +0200
changeset 3595 693faf7f4e9b
parent 3208 1a754d09c4ba
child 4502 07d34c0d8d18
permissions -rw-r--r--
nsc: Fix build problem if gtk config store is disabled gtk config store pulled in libdl.so for us, so things fail to link of the config store isn't enabled. This makes nsc pull in libdl itself when its enabled.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2006,2007 INRIA
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
3041
a624276a897b mtag -> tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3040
diff changeset
    20
#include "ns3/tag.h"
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#include "ns3/packet.h"
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    22
#include "ns3/uinteger.h"
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
#include <iostream>
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
using namespace ns3;
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    27
// define this class in a public header
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    28
class MyTag : public Tag
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
{
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
public:
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    31
  static TypeId GetTypeId (void);
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    32
  virtual TypeId GetInstanceTypeId (void) const;
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    33
  virtual uint32_t GetSerializedSize (void) const;
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    34
  virtual void Serialize (TagBuffer i) const;
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    35
  virtual void Deserialize (TagBuffer i);
3208
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    36
  virtual void Print (std::ostream &os) const;
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    37
  
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    38
  // these are our accessors to our tag structure
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    39
  void SetSimpleValue (uint8_t value);
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    40
  uint8_t GetSimpleValue (void) const;
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
private:
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
  uint8_t m_simpleValue;
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
};
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    45
TypeId 
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    46
MyTag::GetTypeId (void)
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
{
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    48
  static TypeId tid = TypeId ("ns3::MyTag")
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    49
    .SetParent<Tag> ()
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    50
    .AddConstructor<MyTag> ()
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    51
    .AddAttribute ("SimpleValue",
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    52
                   "A simple value",
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    53
                   EmptyAttributeValue (),
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    54
                   MakeUintegerAccessor (&MyTag::GetSimpleValue),
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    55
                   MakeUintegerChecker<uint8_t> ())
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    56
    ;
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    57
  return tid;
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
}
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    59
TypeId 
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    60
MyTag::GetInstanceTypeId (void) const
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
{
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    62
  return GetTypeId ();
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
}
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
uint32_t 
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    65
MyTag::GetSerializedSize (void) const
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    66
{
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    67
  return 1;
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
}
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
void 
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    70
MyTag::Serialize (TagBuffer i) const
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
{
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    72
  i.WriteU8 (m_simpleValue);
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
}
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    74
void 
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
    75
MyTag::Deserialize (TagBuffer i)
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    76
{
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    77
  m_simpleValue = i.ReadU8 ();
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
    78
}
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
void 
3208
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    80
MyTag::Print (std::ostream &os) const
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    81
{
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    82
  os << "v=" << (uint32_t)m_simpleValue;
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    83
}
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
    84
void 
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
MyTag::SetSimpleValue (uint8_t value)
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
{
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
  m_simpleValue = value;
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
}
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
uint8_t 
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
MyTag::GetSimpleValue (void) const
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
{
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
  return m_simpleValue;
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    93
}
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    94
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    95
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    96
int main (int argc, char *argv[])
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    97
{
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    98
  // create a tag.
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
  MyTag tag;
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   100
  tag.SetSimpleValue (0x56);
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   101
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   102
  // store the tag in a packet.
3208
1a754d09c4ba bug 200: Packet::PrintTags is not implemented.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3041
diff changeset
   103
  Ptr<Packet> p = Create<Packet> (100);
3040
e11e106c7c19 Mtag -> Tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3038
diff changeset
   104
  p->AddTag (tag);
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
  // create a copy of the packet
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1243
diff changeset
   107
  Ptr<Packet> aCopy = p->Copy ();
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
  // read the tag from the packet copy
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
  MyTag tagCopy;
3038
5962e2962fa9 convert to new tag API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1866
diff changeset
   111
  p->FindFirstMatchingTag (tagCopy);
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
  // the copy and the original are the same !
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   114
  NS_ASSERT (tagCopy.GetSimpleValue () == tag.GetSimpleValue ());
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
1866
e7dbcc4df546 do not use Packet objects directly. Use Ptr<Packet> instead
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1243
diff changeset
   116
  aCopy->PrintTags (std::cout);
1243
c1d23e1b5891 improve print output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1237
diff changeset
   117
  std::cout << std::endl;
1237
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
  return 0;
636a61b111ae sample packet tag code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
}