And in this trace method I am calling them.
Ipv4Address GetSourceAddress(Ptr<const Packet> p)
{
Ipv4Address src;
// To get a header from Ptr<Packet> packet first, copy the packet
Ptr<Packet> q = p->Copy();
// Use indicator to search the packet
PacketMetadata::ItemIterator metadataIterator = q->BeginItem();
PacketMetadata::Item item;
while (metadataIterator.HasNext())
{
item = metadataIterator.Next();
NS_LOG_FUNCTION("item name: " << item.tid.GetName());
// If we want to have a dsdv header
if(item.tid.GetName() == "ns3::ArpHeader")
{
Callback<ObjectBase *> constr = item.tid.GetConstructor();
NS_ASSERT(!constr.IsNull());
// Ptr<> and DynamicCast<> won't work here as all headers are from ObjectBase, not Object
ObjectBase *instance = constr();
NS_ASSERT(instance != 0);
ArpHeader* arpHeader = dynamic_cast<ArpHeader*>(instance);
NS_ASSERT(arpHeader != 0);
arpHeader->Deserialize(item.current);
src = arpHeader->GetSourceIpv4Address();
}
}
return src;
}
Ipv4Address GetDestAddress(Ptr<const Packet> p)
{
Ipv4Address dest;
// To get a header from Ptr<Packet> packet first, copy the packet
Ptr<Packet> q = p->Copy();
// Use indicator to search the packet
PacketMetadata::ItemIterator metadataIterator = q->BeginItem();
PacketMetadata::Item item;
while (metadataIterator.HasNext())
{
item = metadataIterator.Next();
NS_LOG_FUNCTION("item name: " << item.tid.GetName());
// If we want to have a dsdv header
if(item.tid.GetName() == "ns3::ArpHeader")
{
Callback<ObjectBase *> constr = item.tid.GetConstructor();
NS_ASSERT(!constr.IsNull());
// Ptr<> and DynamicCast<> won't work here as all headers are from ObjectBase, not Object
ObjectBase *instance = constr();
NS_ASSERT(instance != 0);
ArpHeader* arpHeader = dynamic_cast<ArpHeader*>(instance);
NS_ASSERT(arpHeader != 0);
arpHeader->Deserialize(item.current);
dest = arpHeader->GetDestinationIpv4Address();
}
}
return dest;
}
void
Rx (std::string context, Ptr <const Packet> packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise){
//context will include info about the source of this event. Use string manipulation if you want to extract info.
//std::cout << BOLD_CODE << context << END_CODE << std::endl;
//Print the info.
Packet::EnablePrinting();
Packet::EnableChecking();
packet->Print(std::cout << "\nTime: " << Simulator::Now().GetSeconds() << "s, Packet Details are: ");
Ipv4Address src_ip = GetSourceAddress(packet);
Ipv4Address des_ip = GetDestAddress(packet); if(packet->GetSize() >= 500){
counterAppRX++;
} else {
counterRX++;
}
//Packet Received from: " << src_ip << ", Destination address in Packet: " << des_ip<< ", NS_LOG_DEBUG(" Packet Received from: " << src_ip << ", Destination address in Packet: " << des_ip<< ", Size = " << packet->GetSize()
<< " Freq = "<<channelFreqMhz
<< " Mode = " << txVector.GetMode()
<< " ReceptionDataRate = " << txVector.GetMode().GetDataRate(txVector)
<< " RX Counter: " << counterRX << "\t RX APP Counter: " << counterAppRX);
m_rxDataRate = txVector.GetMode().GetDataRate(txVector)/1000000; //We can also examine the WifiMacHeader
WifiMacHeader hdr;
if (packet->PeekHeader(hdr))
{
NS_LOG_DEBUG("\tDestination MAC : " << hdr.GetAddr1() << "\tSource MAC : " << hdr.GetAddr2());
}
}
assert failed. cond="uid <= m_information.size () && uid != 0", file=../src/core/model/type-id.cc, line=458
Ipv4Header ip_head;
if(p->PeekHeader(ip_head)) //succeeds if packet have Ipv4Header
{
Ipv4Address source = ip_head.GetSource();
Ipv4Address dest = ip_head.GetDestination ();
}
LlcSnapHeader llc;
if (p->PeekHeader (llc)) // succeeds if packet has the header
{
if (llc.GetType() == 0x0806)
{
//this is an ARP packet, you can try to peek ArpHeader, or do what you need to do
}
else if (llc.GetType() == 0x0800)
{
//This is an IPv4 packet
}
}
Ptr<Packet> p = packet->Copy(); //Because MonitorSnifferRx gets a const Packet
//Examine if it is a WifiMacHeader
WifiMacHeader wifi_mac;
if (p->PeekHeader (wifi_mac))
{
//Remove that header and go to the next header
p->RemoveHeader (wifi_mac);
if (wifi_mac.IsMgt ()) // Is this a management Wi-Fi frame? Then ignore it.
{
//do nothing
}
else
{
LlcSnapHeader snap;
if (p->PeekHeader (snap)
{
p->RemoveHeader (snap);
uint16_t type = snap.GetType();
if (type == 0x0800) // if ether type is IPv4
{
Ipv4Header ipv4_hdr;
if (p->PeekHeader (ipv4_hdr))
{
p->RemoveHeader (ipv4_hdr);
//You can examine the source & destination IP addresses.
UdpHeader udp;
if (p->PeekHeader (udp))
{
uint16_t source_port = udp.GetSourcePort();
//....
}
}
}
}
}
}