Miscellaneous
Putting payload in a Packet
If you don’t care about the actual content of the payload, the following will keep track of 1024 bytes of payload filled with zeros
uint32_t size = 1024; Ptr<Packet> p = Create<Packet> (size);
Putting real bytes in the payload
If you do care about the actual content of the packet payload, you can also request the packet to copy the data in an internal buffer:
uint8_t *buffer = ...; uint32_t size = ...; Ptr<Packet> p = Create<Packet> (buffer, size);
Adding data to an existing packet
If you have an existing packet and you need to add data at its start or its end, you need to create a new Header (Trailer). First, subclass the Header(Trailer) class:
class MyHeader : public Header { public: // new methods void SetData (uint16_t data); uint16_t GetData (void); // new method needed static TypeId GetTypeId (void); // overridden from Header virtual uint32_t GetSerializedSize (void) const; virtual void Serialize (Buffer::Iterator start) const; virtual uint32_t Deserialize (Buffer::Iterator start); virtual void Print (std::ostream &os) const; private: uint16_t m_data; };
Typical implementations of the SetData/GetData methods will look like this:
void MyHeader::SetData (uint16_t data) { m_data = data; } uint16_t MyHeader::GetData (void) { return m_data; }
While the overridden methods would look like this:
uint32_t MyHeader::GetSerializedSize (void) const { // two bytes of data to store return 2; } void MyHeader::Serialize (Buffer::Iterator start) const { start.WriteHtonU16 (m_data); } uint32_t MyHeader::Deserialize (Buffer::Iterator start) { m_data = start.ReadNtohU16 (); return 2; } void MyHeader::Print (std::ostream &os) const { os << m_data; }
And, finally, you need to implement GetTypeId:
TypeId MyHeader::GetTypeId (void) { static TypeId tid = TypeId ("ns3::MyHeader") .SetParent<Header> () ; return tid; }
And, now, you can use this new header to store data in the packet as follows:
Ptr<Packet> p = ...; MyHeader header = ...; header.SetData (10); p->AddHeader (header);
or remove data from the packet:
Ptr<Packet> p = ...; MyHeader header; p->RemoveHeader (header); header.GetData ();