diff --git a/src/routing/olsr/olsr-agent-impl.cc b/src/routing/olsr/olsr-agent-impl.cc index 752df02ed..94bbfa75f 100644 --- a/src/routing/olsr/olsr-agent-impl.cc +++ b/src/routing/olsr/olsr-agent-impl.cc @@ -37,7 +37,7 @@ #include "ns3/debug.h" #include "ns3/random-variable.h" #include "ns3/inet-socket-address.h" - +#include "ns3/composite-trace-resolver.h" /********** Useful macros **********/ @@ -256,6 +256,27 @@ void AgentImpl::SetMainInterface (uint32_t interface) } +Ptr +AgentImpl::GetTraceResolver (void) const +{ + Ptr resolver = Create (); + resolver->AddSource ("rx", + TraceDoc ("receive OLSR packet", + "const olsr::PacketHeader &", "header of OLSR packet received", + "const olsr::MessageList &", "list of OLSR messages contained in the packet" + ), + m_rxPacketTrace); + resolver->AddSource ("tx", + TraceDoc ("send OLSR packet", + "const olsr::PacketHeader &", "header of OLSR packet sent", + "const olsr::MessageList &", "list of OLSR messages contained in the packet" + ), + m_txPacketTrace); + resolver->SetParentResolver (Object::GetTraceResolver ()); + return resolver; +} + + // // \brief Processes an incoming %OLSR packet following RFC 3626 specification. void @@ -276,10 +297,12 @@ AgentImpl::RecvOlsr (Ptr socket, packet.RemoveHeader (olsrPacketHeader); NS_ASSERT (olsrPacketHeader.GetPacketLength () >= olsrPacketHeader.GetSerializedSize ()); uint32_t sizeLeft = olsrPacketHeader.GetPacketLength () - olsrPacketHeader.GetSerializedSize (); + + MessageList messages; while (sizeLeft) { - olsr::MessageHeader messageHeader; + MessageHeader messageHeader; if (packet.RemoveHeader (messageHeader) == 0) NS_ASSERT (false); @@ -289,7 +312,15 @@ AgentImpl::RecvOlsr (Ptr socket, << std::dec << int (messageHeader.GetMessageType ()) << " TTL=" << int (messageHeader.GetTimeToLive ()) << " origAddr=" << messageHeader.GetOriginatorAddress ()); + messages.push_back (messageHeader); + } + m_rxPacketTrace (olsrPacketHeader, messages); + + for (MessageList::const_iterator messageIter = messages.begin (); + messageIter != messages.end (); messageIter++) + { + const MessageHeader &messageHeader = *messageIter; // If ttl is less than or equal to zero, or // the receiver is the same as the originator, // the message must be silently dropped @@ -1059,14 +1090,19 @@ AgentImpl::QueueMessage (const olsr::MessageHeader &message, Time delay) } void -AgentImpl::SendPacket (Packet packet) +AgentImpl::SendPacket (Packet packet, const MessageList &containedMessages) { NS_DEBUG ("OLSR node " << m_mainAddress << " sending a OLSR packet"); + // Add a header olsr::PacketHeader header; header.SetPacketLength (header.GetSerializedSize () + packet.GetSize ()); header.SetPacketSequenceNumber (GetPacketSequenceNumber ()); packet.AddHeader (header); + + // Trace it + m_txPacketTrace (header, containedMessages); + // Send it m_sendSocket->Send (packet); } @@ -1086,6 +1122,8 @@ AgentImpl::SendQueuedMessages () NS_DEBUG ("Olsr node " << m_mainAddress << ": SendQueuedMessages"); + MessageList msglist; + for (std::vector::const_iterator message = m_queuedMessages.begin (); message != m_queuedMessages.end (); message++) @@ -1093,9 +1131,11 @@ AgentImpl::SendQueuedMessages () Packet p; p.AddHeader (*message); packet.AddAtEnd (p); + msglist.push_back (*message); if (++numMessages == OLSR_MAX_MSGS) { - SendPacket (packet); + SendPacket (packet, msglist); + msglist.clear (); // Reset variables for next packet numMessages = 0; packet = Packet (); @@ -1104,7 +1144,7 @@ AgentImpl::SendQueuedMessages () if (packet.GetSize ()) { - SendPacket (packet); + SendPacket (packet, msglist); } m_queuedMessages.clear (); diff --git a/src/routing/olsr/olsr-agent-impl.h b/src/routing/olsr/olsr-agent-impl.h index 82f2314e5..1b561c821 100644 --- a/src/routing/olsr/olsr-agent-impl.h +++ b/src/routing/olsr/olsr-agent-impl.h @@ -39,6 +39,7 @@ #include "ns3/socket.h" #include "event-garbage-collector.h" #include "ns3/timer.h" +#include "ns3/callback-trace-source.h" namespace ns3 { @@ -88,7 +89,9 @@ private: protected: void DoDispose (); - void SendPacket (Packet packet); + Ptr GetTraceResolver (void) const; + + void SendPacket (Packet packet, const MessageList &containedMessages); /// Increments packet sequence number and returns the new value. inline uint16_t GetPacketSequenceNumber (); @@ -122,7 +125,7 @@ protected: void IfaceAssocTupleTimerExpire (IfaceAssocTuple tuple); /// A list of pending messages which are buffered awaiting for being sent. - std::vector m_queuedMessages; + olsr::MessageList m_queuedMessages; Timer m_queuedMessagesTimer; // timer for throttling outgoing messages void ForwardDefault (olsr::MessageHeader olsrMessage, @@ -176,6 +179,12 @@ protected: Ipv4Address m_mainAddress; Ptr m_receiveSocket; // UDP socket for receving OSLR packets Ptr m_sendSocket; // UDP socket for sending OSLR packets + + CallbackTraceSource m_rxPacketTrace; + CallbackTraceSource m_txPacketTrace; + }; }} // namespace ns3 diff --git a/src/routing/olsr/olsr-header.h b/src/routing/olsr/olsr-header.h index b06dd85bd..36cb8e742 100644 --- a/src/routing/olsr/olsr-header.h +++ b/src/routing/olsr/olsr-header.h @@ -434,6 +434,36 @@ public: }; + +static inline std::ostream& operator<< (std::ostream& os, const PacketHeader & packet) +{ + packet.Print (os); + return os; +} + +static inline std::ostream& operator<< (std::ostream& os, const MessageHeader & message) +{ + message.Print (os); + return os; +} + +typedef std::vector MessageList; + +static inline std::ostream& operator<< (std::ostream& os, const MessageList & messages) +{ + os << "["; + for (std::vector::const_iterator messageIter = messages.begin (); + messageIter != messages.end (); messageIter++) + { + messageIter->Print (os); + if (messageIter+1 != messages.end ()) + os << ", "; + } + os << "]"; + return os; +} + + }} // namespace olsr, ns3 #endif /* OLSR_HEADER_H */