21 #include "ns3/ipv4-flow-probe.h"
22 #include "ns3/ipv4-flow-classifier.h"
24 #include "ns3/packet.h"
25 #include "ns3/flow-monitor.h"
27 #include "ns3/pointer.h"
28 #include "ns3/config.h"
29 #include "ns3/flow-id-tag.h"
42 static TypeId GetTypeId (
void);
47 virtual void Print (std::ostream &os)
const;
50 void SetFlowId (uint32_t flowId);
51 void SetPacketId (uint32_t packetId);
52 void SetPacketSize (uint32_t packetSize);
53 uint32_t GetFlowId (
void)
const;
54 uint32_t GetPacketId (
void)
const;
55 uint32_t GetPacketSize (
void)
const;
59 uint32_t m_packetSize;
64 Ipv4FlowProbeTag::GetTypeId (
void)
68 .AddConstructor<Ipv4FlowProbeTag> ()
99 os <<
"FlowId=" << m_flowId;
100 os <<
"PacketId=" << m_packetId;
101 os <<
"PacketSize=" << m_packetSize;
103 Ipv4FlowProbeTag::Ipv4FlowProbeTag ()
108 Ipv4FlowProbeTag::Ipv4FlowProbeTag (uint32_t flowId, uint32_t packetId, uint32_t packetSize)
109 : Tag (), m_flowId (flowId), m_packetId (packetId), m_packetSize (packetSize)
114 Ipv4FlowProbeTag::SetFlowId (uint32_t
id)
119 Ipv4FlowProbeTag::SetPacketId (uint32_t
id)
124 Ipv4FlowProbeTag::SetPacketSize (uint32_t size)
129 Ipv4FlowProbeTag::GetFlowId (
void)
const
134 Ipv4FlowProbeTag::GetPacketId (
void)
const
139 Ipv4FlowProbeTag::GetPacketSize (
void)
const
148 Ipv4FlowProbe::Ipv4FlowProbe (Ptr<FlowMonitor> monitor,
149 Ptr<Ipv4FlowClassifier> classifier,
151 : FlowProbe (monitor),
152 m_classifier (classifier)
156 Ptr<Ipv4L3Protocol> ipv4 = node->GetObject<Ipv4L3Protocol> ();
158 if (!ipv4->TraceConnectWithoutContext (
"SendOutgoing",
159 MakeCallback (&Ipv4FlowProbe::SendOutgoingLogger, Ptr<Ipv4FlowProbe> (
this))))
163 if (!ipv4->TraceConnectWithoutContext (
"UnicastForward",
164 MakeCallback (&Ipv4FlowProbe::ForwardLogger, Ptr<Ipv4FlowProbe> (
this))))
168 if (!ipv4->TraceConnectWithoutContext (
"LocalDeliver",
169 MakeCallback (&Ipv4FlowProbe::ForwardUpLogger, Ptr<Ipv4FlowProbe> (
this))))
174 if (!ipv4->TraceConnectWithoutContext (
"Drop",
175 MakeCallback (&Ipv4FlowProbe::DropLogger, Ptr<Ipv4FlowProbe> (
this))))
181 std::ostringstream oss;
182 oss <<
"/NodeList/" << node->GetId () <<
"/DeviceList/*/TxQueue/Drop";
186 Ipv4FlowProbe::~Ipv4FlowProbe ()
200 FlowPacketId packetId;
202 if (m_classifier->Classify (ipHeader, ipPayload, &flowId, &packetId))
205 NS_LOG_DEBUG (
"ReportFirstTx ("<<
this<<
", "<<flowId<<
", "<<packetId<<
", "<<size<<
"); "
206 << ipHeader << *ipPayload);
207 m_flowMonitor->ReportFirstTx (
this, flowId, packetId, size);
217 Ipv4FlowProbe::ForwardLogger (
const Ipv4Header &ipHeader, Ptr<const Packet> ipPayload, uint32_t interface)
220 FlowPacketId packetId;
222 if (m_classifier->Classify (ipHeader, ipPayload, &flowId, &packetId))
224 uint32_t size = (ipPayload->GetSize () + ipHeader.GetSerializedSize ());
225 NS_LOG_DEBUG (
"ReportForwarding ("<<
this<<
", "<<flowId<<
", "<<packetId<<
", "<<size<<
");");
226 m_flowMonitor->ReportForwarding (
this, flowId, packetId, size);
232 Ipv4FlowProbe::ForwardUpLogger (
const Ipv4Header &ipHeader, Ptr<const Packet> ipPayload, uint32_t interface)
235 FlowPacketId packetId;
237 if (m_classifier->Classify (ipHeader, ipPayload, &flowId, &packetId))
240 Ipv4FlowProbeTag fTag;
243 ConstCast<Packet> (ipPayload)->RemovePacketTag (fTag);
245 uint32_t size = (ipPayload->GetSize () + ipHeader.GetSerializedSize ());
246 NS_LOG_DEBUG (
"ReportLastRx ("<<
this<<
", "<<flowId<<
", "<<packetId<<
", "<<size<<
");");
247 m_flowMonitor->ReportLastRx (
this, flowId, packetId, size);
252 Ipv4FlowProbe::DropLogger (
const Ipv4Header &ipHeader, Ptr<const Packet> ipPayload,
263 Ipv4Address addri = m_ipv4->GetAddress (ifIndex);
264 Ipv4Mask maski = m_ipv4->GetNetworkMask (ifIndex);
265 Ipv4Address bcast = addri.GetSubnetDirectedBroadcast (maski);
266 if (ipHeader.GetDestination () == bcast)
274 FlowPacketId packetId;
276 if (m_classifier->Classify (ipHeader, ipPayload, &flowId, &packetId))
279 Ipv4FlowProbeTag fTag;
282 ConstCast<Packet> (ipPayload)->RemovePacketTag (fTag);
284 uint32_t size = (ipPayload->GetSize () + ipHeader.GetSerializedSize ());
285 NS_LOG_DEBUG (
"Drop ("<<
this<<
", "<<flowId<<
", "<<packetId<<
", "<<size<<
", " << reason
286 <<
", destIp=" << ipHeader.GetDestination () <<
"); "
287 <<
"HDR: " << ipHeader <<
" PKT: " << *ipPayload);
320 myReason = DROP_INVALID_REASON;
324 m_flowMonitor->ReportDrop (
this, flowId, packetId, size, myReason);
329 Ipv4FlowProbe::QueueDropLogger (Ptr<const Packet> ipPayload)
332 Ipv4FlowProbeTag fTag;
336 tagFound = ConstCast<Packet> (ipPayload)->RemovePacketTag (fTag);
342 FlowId flowId = fTag.GetFlowId ();
343 FlowPacketId packetId = fTag.GetPacketId ();
344 uint32_t size = fTag.GetPacketSize ();
349 m_flowMonitor->ReportDrop (
this, flowId, packetId, size,
DROP_QUEUE);
#define NS_LOG_FUNCTION(parameters)
virtual void DoDispose(void)
void AddPacketTag(const Tag &tag) const
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetSize(void) const
TAG_BUFFER_INLINE uint32_t ReadU32(void)
#define NS_FATAL_ERROR(msg)
fatal error handling
virtual uint32_t GetSerializedSize(void) const
DropReason
Reason why a packet has been dropped.
virtual void Serialize(TagBuffer buf) const
TAG_BUFFER_INLINE void WriteU32(uint32_t v)
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Packet dropped due to invalid checksum in the IPv4 header.
tag a set of bytes in a packet
virtual void Print(std::ostream &os) const
virtual TypeId GetInstanceTypeId(void) const
virtual void Deserialize(TagBuffer buf)
Packet dropped due to TTL decremented to zero during IPv4 forwarding.
#define NS_LOG_DEBUG(msg)
Packet dropped due to missing route to the destination.
DropReason
enumeration of possible reasons why a packet may be dropped
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
virtual void DoDispose(void)