126 lines
2.6 KiB
C++
126 lines
2.6 KiB
C++
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
|
#include "ns3/ptr.h"
|
|
#include "ns3/packet.h"
|
|
#include "ns3/header.h"
|
|
#include <iostream>
|
|
|
|
using namespace ns3;
|
|
|
|
/* A sample Header implementation
|
|
*/
|
|
class MyHeader : public Header
|
|
{
|
|
public:
|
|
|
|
MyHeader ();
|
|
virtual ~MyHeader ();
|
|
|
|
void SetData (uint16_t data);
|
|
uint16_t GetData (void) const;
|
|
|
|
static TypeId GetTypeId (void);
|
|
virtual TypeId GetInstanceTypeId (void) const;
|
|
virtual void Print (std::ostream &os) const;
|
|
virtual void Serialize (Buffer::Iterator start) const;
|
|
virtual uint32_t Deserialize (Buffer::Iterator start);
|
|
virtual uint32_t GetSerializedSize (void) const;
|
|
private:
|
|
uint16_t m_data;
|
|
};
|
|
|
|
MyHeader::MyHeader ()
|
|
{
|
|
// we must provide a public default constructor,
|
|
// implicit or explicit, but never private.
|
|
}
|
|
MyHeader::~MyHeader ()
|
|
{}
|
|
|
|
TypeId
|
|
MyHeader::GetTypeId (void)
|
|
{
|
|
static TypeId tid = TypeId ("ns3::MyHeader")
|
|
.SetParent<Header> ()
|
|
.AddConstructor<MyHeader> ()
|
|
;
|
|
return tid;
|
|
}
|
|
TypeId
|
|
MyHeader::GetInstanceTypeId (void) const
|
|
{
|
|
return GetTypeId ();
|
|
}
|
|
|
|
void
|
|
MyHeader::Print (std::ostream &os) const
|
|
{
|
|
// This method is invoked by the packet printing
|
|
// routines to print the content of my header.
|
|
//os << "data=" << m_data << std::endl;
|
|
os << "data=" << m_data;
|
|
}
|
|
uint32_t
|
|
MyHeader::GetSerializedSize (void) const
|
|
{
|
|
// we reserve 2 bytes for our header.
|
|
return 2;
|
|
}
|
|
void
|
|
MyHeader::Serialize (Buffer::Iterator start) const
|
|
{
|
|
// we can serialize two bytes at the start of the buffer.
|
|
// we write them in network byte order.
|
|
start.WriteHtonU16 (m_data);
|
|
}
|
|
uint32_t
|
|
MyHeader::Deserialize (Buffer::Iterator start)
|
|
{
|
|
// we can deserialize two bytes from the start of the buffer.
|
|
// we read them in network byte order and store them
|
|
// in host byte order.
|
|
m_data = start.ReadNtohU16 ();
|
|
|
|
// we return the number of bytes effectively read.
|
|
return 2;
|
|
}
|
|
|
|
void
|
|
MyHeader::SetData (uint16_t data)
|
|
{
|
|
m_data = data;
|
|
}
|
|
uint16_t
|
|
MyHeader::GetData (void) const
|
|
{
|
|
return m_data;
|
|
}
|
|
|
|
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
// instantiate a header.
|
|
MyHeader sourceHeader;
|
|
sourceHeader.SetData (2);
|
|
|
|
// instantiate a packet
|
|
Ptr<Packet> p = Create<Packet> ();
|
|
|
|
// and store my header into the packet.
|
|
p->AddHeader (sourceHeader);
|
|
|
|
// print the content of my packet on the standard output.
|
|
p->Print (std::cout);
|
|
std::cout << std::endl;
|
|
|
|
// you can now remove the header from the packet:
|
|
MyHeader destinationHeader;
|
|
p->RemoveHeader (destinationHeader);
|
|
|
|
// and check that the destination and source
|
|
// headers contain the same values.
|
|
NS_ASSERT (sourceHeader.GetData () == destinationHeader.GetData ());
|
|
|
|
return 0;
|
|
}
|