diff --git a/src/applications/model/onoff-application.cc b/src/applications/model/onoff-application.cc index 06911ea23..d00254664 100644 --- a/src/applications/model/onoff-application.cc +++ b/src/applications/model/onoff-application.cc @@ -91,6 +91,9 @@ OnOffApplication::GetTypeId (void) .AddTraceSource ("Tx", "A new packet is created and is sent", MakeTraceSourceAccessor (&OnOffApplication::m_txTrace), "ns3::Packet::TracedCallback") + .AddTraceSource ("TxWithAddresses", "A new packet is created and is sent", + MakeTraceSourceAccessor (&OnOffApplication::m_txTraceWithAddresses), + "ns3::Packet::TwoAddressTracedCallback") ; return tid; } @@ -283,6 +286,8 @@ void OnOffApplication::SendPacket () m_txTrace (packet); m_socket->Send (packet); m_totBytes += m_pktSize; + Address localAddress; + m_socket->GetSockName (localAddress); if (InetSocketAddress::IsMatchingType (m_peer)) { NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds () @@ -291,6 +296,7 @@ void OnOffApplication::SendPacket () << InetSocketAddress::ConvertFrom(m_peer).GetIpv4 () << " port " << InetSocketAddress::ConvertFrom (m_peer).GetPort () << " total Tx " << m_totBytes << " bytes"); + m_txTraceWithAddresses (packet, localAddress, InetSocketAddress::ConvertFrom (m_peer)); } else if (Inet6SocketAddress::IsMatchingType (m_peer)) { @@ -300,6 +306,7 @@ void OnOffApplication::SendPacket () << Inet6SocketAddress::ConvertFrom(m_peer).GetIpv6 () << " port " << Inet6SocketAddress::ConvertFrom (m_peer).GetPort () << " total Tx " << m_totBytes << " bytes"); + m_txTraceWithAddresses (packet, localAddress, Inet6SocketAddress::ConvertFrom(m_peer)); } m_lastStartTime = Simulator::Now (); m_residualBits = 0; diff --git a/src/applications/model/onoff-application.h b/src/applications/model/onoff-application.h index 2b08f00eb..6b075c916 100644 --- a/src/applications/model/onoff-application.h +++ b/src/applications/model/onoff-application.h @@ -167,6 +167,9 @@ private: /// Traced Callback: transmitted packets. TracedCallback > m_txTrace; + /// Callbacks for tracing the packet Tx events, includes source and destination addresses + TracedCallback, const Address &, const Address &> m_txTraceWithAddresses; + private: /** * \brief Schedule the next packet transmission diff --git a/src/applications/model/packet-sink.cc b/src/applications/model/packet-sink.cc index 2ba716f1a..832af588d 100644 --- a/src/applications/model/packet-sink.cc +++ b/src/applications/model/packet-sink.cc @@ -59,6 +59,9 @@ PacketSink::GetTypeId (void) "A packet has been received", MakeTraceSourceAccessor (&PacketSink::m_rxTrace), "ns3::Packet::AddressTracedCallback") + .AddTraceSource ("RxWithAddresses", "A packet has been received", + MakeTraceSourceAccessor (&PacketSink::m_rxTraceWithAddresses), + "ns3::Packet::TwoAddressTracedCallback") ; return tid; } @@ -165,6 +168,7 @@ void PacketSink::HandleRead (Ptr socket) NS_LOG_FUNCTION (this << socket); Ptr packet; Address from; + Address localAddress; while ((packet = socket->RecvFrom (from))) { if (packet->GetSize () == 0) @@ -190,7 +194,9 @@ void PacketSink::HandleRead (Ptr socket) << " port " << Inet6SocketAddress::ConvertFrom (from).GetPort () << " total Rx " << m_totalRx << " bytes"); } + socket->GetSockName (localAddress); m_rxTrace (packet, from); + m_rxTraceWithAddresses (packet, from, localAddress); } } diff --git a/src/applications/model/packet-sink.h b/src/applications/model/packet-sink.h index 72766091c..d54ef5d91 100644 --- a/src/applications/model/packet-sink.h +++ b/src/applications/model/packet-sink.h @@ -133,6 +133,9 @@ private: /// Traced Callback: received packets, source address. TracedCallback, const Address &> m_rxTrace; + /// Callback for tracing the packet Rx events, includes source and destination addresses + TracedCallback, const Address &, const Address &> m_rxTraceWithAddresses; + }; } // namespace ns3 diff --git a/src/applications/model/udp-echo-client.cc b/src/applications/model/udp-echo-client.cc index 9c51162fa..c1628f133 100644 --- a/src/applications/model/udp-echo-client.cc +++ b/src/applications/model/udp-echo-client.cc @@ -70,6 +70,15 @@ UdpEchoClient::GetTypeId (void) .AddTraceSource ("Tx", "A new packet is created and is sent", MakeTraceSourceAccessor (&UdpEchoClient::m_txTrace), "ns3::Packet::TracedCallback") + .AddTraceSource ("Rx", "A packet has been received", + MakeTraceSourceAccessor (&UdpEchoClient::m_rxTrace), + "ns3::Packet::TracedCallback") + .AddTraceSource ("TxWithAddresses", "A new packet is created and is sent", + MakeTraceSourceAccessor (&UdpEchoClient::m_txTraceWithAddresses), + "ns3::Packet::TwoAddressTracedCallback") + .AddTraceSource ("RxWithAddresses", "A packet has been received", + MakeTraceSourceAccessor (&UdpEchoClient::m_rxTraceWithAddresses), + "ns3::Packet::TwoAddressTracedCallback") ; return tid; } @@ -324,11 +333,20 @@ UdpEchoClient::Send (void) // p = Create (m_size); } + Address localAddress; + m_socket->GetSockName (localAddress); // call to the trace sinks before the packet is actually sent, // so that tags added to the packet can be sent as well m_txTrace (p); + if (Ipv4Address::IsMatchingType (m_peerAddress)) + { + m_txTraceWithAddresses (p, localAddress, InetSocketAddress (Ipv4Address::ConvertFrom (m_peerAddress), m_peerPort)); + } + else if (Ipv6Address::IsMatchingType (m_peerAddress)) + { + m_txTraceWithAddresses (p, localAddress, Inet6SocketAddress (Ipv6Address::ConvertFrom (m_peerAddress), m_peerPort)); + } m_socket->Send (p); - ++m_sent; if (Ipv4Address::IsMatchingType (m_peerAddress)) @@ -364,6 +382,7 @@ UdpEchoClient::HandleRead (Ptr socket) NS_LOG_FUNCTION (this << socket); Ptr packet; Address from; + Address localAddress; while ((packet = socket->RecvFrom (from))) { if (InetSocketAddress::IsMatchingType (from)) @@ -378,6 +397,9 @@ UdpEchoClient::HandleRead (Ptr socket) Inet6SocketAddress::ConvertFrom (from).GetIpv6 () << " port " << Inet6SocketAddress::ConvertFrom (from).GetPort ()); } + socket->GetSockName (localAddress); + m_rxTrace (packet); + m_rxTraceWithAddresses (packet, from, localAddress); } } diff --git a/src/applications/model/udp-echo-client.h b/src/applications/model/udp-echo-client.h index 6bcd448bd..1237eab73 100644 --- a/src/applications/model/udp-echo-client.h +++ b/src/applications/model/udp-echo-client.h @@ -172,6 +172,16 @@ private: /// Callbacks for tracing the packet Tx events TracedCallback > m_txTrace; + + /// Callbacks for tracing the packet Rx events + TracedCallback > m_rxTrace; + + /// Callbacks for tracing the packet Tx events, includes source and destination addresses + TracedCallback, const Address &, const Address &> m_txTraceWithAddresses; + + /// Callbacks for tracing the packet Rx events, includes source and destination addresses + TracedCallback, const Address &, const Address &> m_rxTraceWithAddresses; + }; } // namespace ns3 diff --git a/src/applications/model/udp-echo-server.cc b/src/applications/model/udp-echo-server.cc index 5694e9c64..883da5b34 100644 --- a/src/applications/model/udp-echo-server.cc +++ b/src/applications/model/udp-echo-server.cc @@ -49,6 +49,12 @@ UdpEchoServer::GetTypeId (void) UintegerValue (9), MakeUintegerAccessor (&UdpEchoServer::m_port), MakeUintegerChecker ()) + .AddTraceSource ("Rx", "A packet has been received", + MakeTraceSourceAccessor (&UdpEchoServer::m_rxTrace), + "ns3::Packet::TracedCallback") + .AddTraceSource ("RxWithAddresses", "A packet has been received", + MakeTraceSourceAccessor (&UdpEchoServer::m_rxTraceWithAddresses), + "ns3::Packet::TwoAddressTracedCallback") ; return tid; } @@ -153,8 +159,12 @@ UdpEchoServer::HandleRead (Ptr socket) Ptr packet; Address from; + Address localAddress; while ((packet = socket->RecvFrom (from))) { + socket->GetSockName (localAddress); + m_rxTrace (packet); + m_rxTraceWithAddresses (packet, from, localAddress); if (InetSocketAddress::IsMatchingType (from)) { NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds () << "s server received " << packet->GetSize () << " bytes from " << diff --git a/src/applications/model/udp-echo-server.h b/src/applications/model/udp-echo-server.h index efa0ba405..9304968ce 100644 --- a/src/applications/model/udp-echo-server.h +++ b/src/applications/model/udp-echo-server.h @@ -23,6 +23,7 @@ #include "ns3/event-id.h" #include "ns3/ptr.h" #include "ns3/address.h" +#include "ns3/traced-callback.h" namespace ns3 { @@ -72,6 +73,12 @@ private: Ptr m_socket; //!< IPv4 Socket Ptr m_socket6; //!< IPv6 Socket Address m_local; //!< local multicast address + + /// Callbacks for tracing the packet Rx events + TracedCallback > m_rxTrace; + + /// Callbacks for tracing the packet Rx events, includes source and destination addresses + TracedCallback, const Address &, const Address &> m_rxTraceWithAddresses; }; } // namespace ns3 diff --git a/src/applications/model/udp-server.cc b/src/applications/model/udp-server.cc index 0773eb44b..445be13f9 100644 --- a/src/applications/model/udp-server.cc +++ b/src/applications/model/udp-server.cc @@ -59,6 +59,12 @@ UdpServer::GetTypeId (void) MakeUintegerAccessor (&UdpServer::GetPacketWindowSize, &UdpServer::SetPacketWindowSize), MakeUintegerChecker (8,256)) + .AddTraceSource ("Rx", "A packet has been received", + MakeTraceSourceAccessor (&UdpServer::m_rxTrace), + "ns3::Packet::TracedCallback") + .AddTraceSource ("RxWithAddresses", "A packet has been received", + MakeTraceSourceAccessor (&UdpServer::m_rxTraceWithAddresses), + "ns3::Packet::TwoAddressTracedCallback") ; return tid; } @@ -162,8 +168,12 @@ UdpServer::HandleRead (Ptr socket) NS_LOG_FUNCTION (this << socket); Ptr packet; Address from; + Address localAddress; while ((packet = socket->RecvFrom (from))) { + socket->GetSockName (localAddress); + m_rxTrace (packet); + m_rxTraceWithAddresses (packet, from, localAddress); if (packet->GetSize () > 0) { SeqTsHeader seqTs; diff --git a/src/applications/model/udp-server.h b/src/applications/model/udp-server.h index 1ba2a3092..f6a42ae83 100644 --- a/src/applications/model/udp-server.h +++ b/src/applications/model/udp-server.h @@ -27,7 +27,9 @@ #include "ns3/event-id.h" #include "ns3/ptr.h" #include "ns3/address.h" +#include "ns3/traced-callback.h" #include "packet-loss-counter.h" + namespace ns3 { /** * \ingroup applications @@ -100,6 +102,13 @@ private: Ptr m_socket6; //!< IPv6 Socket uint64_t m_received; //!< Number of received packets PacketLossCounter m_lossCounter; //!< Lost packet counter + + /// Callbacks for tracing the packet Rx events + TracedCallback > m_rxTrace; + + /// Callbacks for tracing the packet Rx events, includes source and destination addresses + TracedCallback, const Address &, const Address &> m_rxTraceWithAddresses; + }; } // namespace ns3 diff --git a/src/network/model/packet.h b/src/network/model/packet.h index 2156a3efe..dc9083cd1 100644 --- a/src/network/model/packet.h +++ b/src/network/model/packet.h @@ -701,6 +701,16 @@ public: typedef void (* AddressTracedCallback) (Ptr packet, const Address &address); + /** + * TracedCallback signature for packet and source/destination addresses. + * + * \param [in] packet The packet. + * \param [in] srcAddress The source address. + * \param [in] destAddress The destination address. + */ + typedef void (* TwoAddressTracedCallback) + (const Ptr packet, const Address &srcAddress, const Address &destAddress); + /** * TracedCallback signature for packet and Mac48Address. *