Add OLSR message tracing, as discussed on ns-developers list.

This commit is contained in:
Gustavo J. A. M. Carneiro
2007-10-29 14:11:20 +00:00
parent a7ec5d9b71
commit e560f2329d
3 changed files with 86 additions and 7 deletions

View File

@@ -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<TraceResolver>
AgentImpl::GetTraceResolver (void) const
{
Ptr<CompositeTraceResolver> resolver = Create<CompositeTraceResolver> ();
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> 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> 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<olsr::MessageHeader>::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 ();

View File

@@ -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<TraceResolver> 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<olsr::MessageHeader> 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<Socket> m_receiveSocket; // UDP socket for receving OSLR packets
Ptr<Socket> m_sendSocket; // UDP socket for sending OSLR packets
CallbackTraceSource <const PacketHeader &,
const MessageList &> m_rxPacketTrace;
CallbackTraceSource <const PacketHeader &,
const MessageList &> m_txPacketTrace;
};
}} // namespace ns3

View File

@@ -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<MessageHeader> MessageList;
static inline std::ostream& operator<< (std::ostream& os, const MessageList & messages)
{
os << "[";
for (std::vector<MessageHeader>::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 */