NS-3 (Network Simulator): How to find a specific header in packet in NS-3

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:

Leave a comment