We can remove the header from a packet in NS-3 and get it out as following:
// To get a header from Ptr<Packet> p // first, copy the packet Ptr<Packet> q = p->Copy(); // use indicator to search the packet PacketMetadata::ItemIterator metadataIterator = copy->BeginItem(); PacketMetadata::Item item; while (metadataIterator.HasNext()) { item = metadataIterator.Next(); NS_LOG_FUNCTION("item name: " << item.tid.GetName()); // for example, if we want to have an ip header if(item.tid.GetName() == "ns3::Ipv4Header") { Callback constructor = item.tid.GetConstructor(); NS_ASSERT(!constructor.IsNull()); // Ptr<> and DynamicCast<> won't work here as all headers are from ObjectBase, not Object ObjectBase *instance = constructor(); NS_ASSERT(instance != 0); Ipv4Header *ipv4Header = dynamic_cast (instance); NS_ASSERT(ipv4Header != 0); ipv4Header->Deserialize(item.current); // you can use the ip header then ... // finished, clear the ip header delete ipv4Header; } }
Codes are origined from here: