diff --git a/samples/main-packet-tag.cc b/samples/main-packet-tag.cc new file mode 100644 index 000000000..3bd1ad2a7 --- /dev/null +++ b/samples/main-packet-tag.cc @@ -0,0 +1,135 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2006,2007 INRIA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Mathieu Lacage + */ +#include "ns3/tag.h" +#include "ns3/packet.h" +#include + +using namespace ns3; + +// define this class in a public header +class MyTag : public Tag +{ +public: + // we have to define a public constructor + MyTag (); + // we have to define a public copy constructor + MyTag (const MyTag &other); + // we have to define a public destructor + ~MyTag (); + // we have to define a public static GetUid method + static uint32_t GetUid (void); + // we have to define a public Print method + void Print (std::ostream &os) const; + // we have to define a public GetSerializedSize method + uint32_t GetSerializedSize (void) const; + // we have to define a public Serialize method + void Serialize (Buffer::Iterator i) const; + // we have to define a public Deserialize method + uint32_t Deserialize (Buffer::Iterator i); + + // these are our accessors to our tag structure + void SetSimpleValue (uint8_t value); + uint8_t GetSimpleValue (void) const; +private: + uint8_t m_simpleValue; +}; + +MyTag::MyTag () +{} +MyTag::MyTag (const MyTag &other) + : m_simpleValue (other.m_simpleValue) +{} +MyTag::~MyTag () +{} +uint32_t +MyTag::GetUid (void) +{ + // we input a unique string to AllocateUid + // to avoid name collisions. + static uint32_t uid = AllocateUid ("MyTag.tests.nsnam.org"); + return uid; +} +void +MyTag::Print (std::ostream &os) const +{ + // print the content of this tag for Packet::PrintTags + os << (uint32_t)m_simpleValue; +} +uint32_t +MyTag::GetSerializedSize (void) const +{ + // we do not want to deal with parallel simulations + // so we return 0. + return 0; +} +void +MyTag::Serialize (Buffer::Iterator i) const +{ + // we will never be invoked because we are not doing + // parallel simulations so, we assert. + NS_ASSERT (false); +} +uint32_t +MyTag::Deserialize (Buffer::Iterator i) +{ + // we will never be invoked because we are not doing + // parallel simulations so, we assert. + NS_ASSERT (false); + // theoretically, return the number of bytes read + return 0; +} + + +void +MyTag::SetSimpleValue (uint8_t value) +{ + m_simpleValue = value; +} +uint8_t +MyTag::GetSimpleValue (void) const +{ + return m_simpleValue; +} + + +int main (int argc, char *argv[]) +{ + // create a tag. + MyTag tag; + tag.SetSimpleValue (0x56); + + // store the tag in a packet. + Packet p; + p.AddTag (tag); + + // create a copy of the packet + Packet aCopy = p; + + // read the tag from the packet copy + MyTag tagCopy; + p.PeekTag (tagCopy); + + // the copy and the original are the same ! + NS_ASSERT (tagCopy.GetSimpleValue () == tag.GetSimpleValue ()); + + aCopy.PrintTags (std::cout); + + return 0; +}