aodv: Fix various coding style issues
This commit is contained in:
@@ -22,10 +22,8 @@
|
||||
|
||||
#include "aodv-dpd.h"
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
namespace aodv
|
||||
{
|
||||
namespace ns3 {
|
||||
namespace aodv {
|
||||
|
||||
bool
|
||||
DuplicatePacketDetection::IsDuplicate (Ptr<const Packet> p, const Ipv4Header & header)
|
||||
|
||||
@@ -28,20 +28,24 @@
|
||||
#include "aodv-id-cache.h"
|
||||
#include <algorithm>
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
namespace aodv
|
||||
{
|
||||
namespace ns3 {
|
||||
namespace aodv {
|
||||
bool
|
||||
IdCache::IsDuplicate (Ipv4Address addr, uint32_t id)
|
||||
{
|
||||
Purge ();
|
||||
for (std::vector<UniqueId>::const_iterator i = m_idCache.begin ();
|
||||
i != m_idCache.end (); ++i)
|
||||
if (i->m_context == addr && i->m_id == id)
|
||||
return true;
|
||||
{
|
||||
if (i->m_context == addr && i->m_id == id)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
struct UniqueId uniqueId =
|
||||
{ addr, id, m_lifetime + Simulator::Now () };
|
||||
{
|
||||
addr, id, m_lifetime + Simulator::Now ()
|
||||
};
|
||||
m_idCache.push_back (uniqueId);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -31,15 +31,13 @@
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("AodvNeighbors");
|
||||
|
||||
namespace aodv
|
||||
{
|
||||
Neighbors::Neighbors (Time delay) :
|
||||
m_ntimer (Timer::CANCEL_ON_DESTROY)
|
||||
namespace aodv {
|
||||
Neighbors::Neighbors (Time delay)
|
||||
: m_ntimer (Timer::CANCEL_ON_DESTROY)
|
||||
{
|
||||
m_ntimer.SetDelay (delay);
|
||||
m_ntimer.SetFunction (&Neighbors::Purge, this);
|
||||
@@ -54,7 +52,9 @@ Neighbors::IsNeighbor (Ipv4Address addr)
|
||||
i != m_nb.end (); ++i)
|
||||
{
|
||||
if (i->m_neighborAddress == addr)
|
||||
return true;
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -67,7 +67,9 @@ Neighbors::GetExpireTime (Ipv4Address addr)
|
||||
!= m_nb.end (); ++i)
|
||||
{
|
||||
if (i->m_neighborAddress == addr)
|
||||
return (i->m_expireTime - Simulator::Now ());
|
||||
{
|
||||
return (i->m_expireTime - Simulator::Now ());
|
||||
}
|
||||
}
|
||||
return Seconds (0);
|
||||
}
|
||||
@@ -76,14 +78,18 @@ void
|
||||
Neighbors::Update (Ipv4Address addr, Time expire)
|
||||
{
|
||||
for (std::vector<Neighbor>::iterator i = m_nb.begin (); i != m_nb.end (); ++i)
|
||||
if (i->m_neighborAddress == addr)
|
||||
{
|
||||
i->m_expireTime
|
||||
= std::max (expire + Simulator::Now (), i->m_expireTime);
|
||||
if (i->m_hardwareAddress == Mac48Address ())
|
||||
i->m_hardwareAddress = LookupMacAddress (i->m_neighborAddress);
|
||||
return;
|
||||
}
|
||||
{
|
||||
if (i->m_neighborAddress == addr)
|
||||
{
|
||||
i->m_expireTime
|
||||
= std::max (expire + Simulator::Now (), i->m_expireTime);
|
||||
if (i->m_hardwareAddress == Mac48Address ())
|
||||
{
|
||||
i->m_hardwareAddress = LookupMacAddress (i->m_neighborAddress);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
NS_LOG_LOGIC ("Open link to " << addr);
|
||||
Neighbor neighbor (addr, LookupMacAddress (addr), expire + Simulator::Now ());
|
||||
@@ -91,8 +97,17 @@ Neighbors::Update (Ipv4Address addr, Time expire)
|
||||
Purge ();
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief CloseNeighbor structure
|
||||
*/
|
||||
struct CloseNeighbor
|
||||
{
|
||||
/**
|
||||
* Check if the entry is expired
|
||||
*
|
||||
* \param nb Neighbors::Neighbor entry
|
||||
* \return true if expired, false otherwise
|
||||
*/
|
||||
bool operator() (const Neighbors::Neighbor & nb) const
|
||||
{
|
||||
return ((nb.m_expireTime < Simulator::Now ()) || nb.close);
|
||||
@@ -103,7 +118,9 @@ void
|
||||
Neighbors::Purge ()
|
||||
{
|
||||
if (m_nb.empty ())
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
CloseNeighbor pred;
|
||||
if (!m_handleLinkFailure.IsNull ())
|
||||
@@ -166,10 +183,13 @@ Neighbors::ProcessTxError (WifiMacHeader const & hdr)
|
||||
for (std::vector<Neighbor>::iterator i = m_nb.begin (); i != m_nb.end (); ++i)
|
||||
{
|
||||
if (i->m_hardwareAddress == addr)
|
||||
i->close = true;
|
||||
{
|
||||
i->close = true;
|
||||
}
|
||||
}
|
||||
Purge ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace aodv
|
||||
} // namespace ns3
|
||||
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Based on
|
||||
* Based on
|
||||
* NS-2 AODV model developed by the CMU/MONARCH group and optimized and
|
||||
* tuned by Samir Das and Mahesh Marina, University of Cincinnati;
|
||||
*
|
||||
*
|
||||
* AODV-UU implementation by Erik Nordström of Uppsala University
|
||||
* http://core.it.uu.se/core/index.php/AODV-UU
|
||||
*
|
||||
@@ -29,15 +29,14 @@
|
||||
#include "ns3/address-utils.h"
|
||||
#include "ns3/packet.h"
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
namespace aodv
|
||||
{
|
||||
namespace ns3 {
|
||||
namespace aodv {
|
||||
|
||||
NS_OBJECT_ENSURE_REGISTERED (TypeHeader);
|
||||
|
||||
TypeHeader::TypeHeader (MessageType t) :
|
||||
m_type (t), m_valid (true)
|
||||
TypeHeader::TypeHeader (MessageType t)
|
||||
: m_type (t),
|
||||
m_valid (true)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -46,7 +45,7 @@ TypeHeader::GetTypeId ()
|
||||
{
|
||||
static TypeId tid = TypeId ("ns3::aodv::TypeHeader")
|
||||
.SetParent<Header> ()
|
||||
.SetGroupName("Aodv")
|
||||
.SetGroupName ("Aodv")
|
||||
.AddConstructor<TypeHeader> ()
|
||||
;
|
||||
return tid;
|
||||
@@ -141,9 +140,15 @@ operator<< (std::ostream & os, TypeHeader const & h)
|
||||
// RREQ
|
||||
//-----------------------------------------------------------------------------
|
||||
RreqHeader::RreqHeader (uint8_t flags, uint8_t reserved, uint8_t hopCount, uint32_t requestID, Ipv4Address dst,
|
||||
uint32_t dstSeqNo, Ipv4Address origin, uint32_t originSeqNo) :
|
||||
m_flags (flags), m_reserved (reserved), m_hopCount (hopCount), m_requestID (requestID), m_dst (dst),
|
||||
m_dstSeqNo (dstSeqNo), m_origin (origin), m_originSeqNo (originSeqNo)
|
||||
uint32_t dstSeqNo, Ipv4Address origin, uint32_t originSeqNo)
|
||||
: m_flags (flags),
|
||||
m_reserved (reserved),
|
||||
m_hopCount (hopCount),
|
||||
m_requestID (requestID),
|
||||
m_dst (dst),
|
||||
m_dstSeqNo (dstSeqNo),
|
||||
m_origin (origin),
|
||||
m_originSeqNo (originSeqNo)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -154,7 +159,7 @@ RreqHeader::GetTypeId ()
|
||||
{
|
||||
static TypeId tid = TypeId ("ns3::aodv::RreqHeader")
|
||||
.SetParent<Header> ()
|
||||
.SetGroupName("Aodv")
|
||||
.SetGroupName ("Aodv")
|
||||
.AddConstructor<RreqHeader> ()
|
||||
;
|
||||
return tid;
|
||||
@@ -225,9 +230,13 @@ void
|
||||
RreqHeader::SetGratiousRrep (bool f)
|
||||
{
|
||||
if (f)
|
||||
m_flags |= (1 << 5);
|
||||
{
|
||||
m_flags |= (1 << 5);
|
||||
}
|
||||
else
|
||||
m_flags &= ~(1 << 5);
|
||||
{
|
||||
m_flags &= ~(1 << 5);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -240,9 +249,13 @@ void
|
||||
RreqHeader::SetDestinationOnly (bool f)
|
||||
{
|
||||
if (f)
|
||||
m_flags |= (1 << 4);
|
||||
{
|
||||
m_flags |= (1 << 4);
|
||||
}
|
||||
else
|
||||
m_flags &= ~(1 << 4);
|
||||
{
|
||||
m_flags &= ~(1 << 4);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -255,9 +268,13 @@ void
|
||||
RreqHeader::SetUnknownSeqno (bool f)
|
||||
{
|
||||
if (f)
|
||||
m_flags |= (1 << 3);
|
||||
{
|
||||
m_flags |= (1 << 3);
|
||||
}
|
||||
else
|
||||
m_flags &= ~(1 << 3);
|
||||
{
|
||||
m_flags &= ~(1 << 3);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -269,10 +286,10 @@ RreqHeader::GetUnknownSeqno () const
|
||||
bool
|
||||
RreqHeader::operator== (RreqHeader const & o) const
|
||||
{
|
||||
return (m_flags == o.m_flags && m_reserved == o.m_reserved &&
|
||||
m_hopCount == o.m_hopCount && m_requestID == o.m_requestID &&
|
||||
m_dst == o.m_dst && m_dstSeqNo == o.m_dstSeqNo &&
|
||||
m_origin == o.m_origin && m_originSeqNo == o.m_originSeqNo);
|
||||
return (m_flags == o.m_flags && m_reserved == o.m_reserved
|
||||
&& m_hopCount == o.m_hopCount && m_requestID == o.m_requestID
|
||||
&& m_dst == o.m_dst && m_dstSeqNo == o.m_dstSeqNo
|
||||
&& m_origin == o.m_origin && m_originSeqNo == o.m_originSeqNo);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -280,9 +297,13 @@ RreqHeader::operator== (RreqHeader const & o) const
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
RrepHeader::RrepHeader (uint8_t prefixSize, uint8_t hopCount, Ipv4Address dst,
|
||||
uint32_t dstSeqNo, Ipv4Address origin, Time lifeTime) :
|
||||
m_flags (0), m_prefixSize (prefixSize), m_hopCount (hopCount),
|
||||
m_dst (dst), m_dstSeqNo (dstSeqNo), m_origin (origin)
|
||||
uint32_t dstSeqNo, Ipv4Address origin, Time lifeTime)
|
||||
: m_flags (0),
|
||||
m_prefixSize (prefixSize),
|
||||
m_hopCount (hopCount),
|
||||
m_dst (dst),
|
||||
m_dstSeqNo (dstSeqNo),
|
||||
m_origin (origin)
|
||||
{
|
||||
m_lifeTime = uint32_t (lifeTime.GetMilliSeconds ());
|
||||
}
|
||||
@@ -294,7 +315,7 @@ RrepHeader::GetTypeId ()
|
||||
{
|
||||
static TypeId tid = TypeId ("ns3::aodv::RrepHeader")
|
||||
.SetParent<Header> ()
|
||||
.SetGroupName("Aodv")
|
||||
.SetGroupName ("Aodv")
|
||||
.AddConstructor<RrepHeader> ()
|
||||
;
|
||||
return tid;
|
||||
@@ -371,9 +392,13 @@ void
|
||||
RrepHeader::SetAckRequired (bool f)
|
||||
{
|
||||
if (f)
|
||||
m_flags |= (1 << 6);
|
||||
{
|
||||
m_flags |= (1 << 6);
|
||||
}
|
||||
else
|
||||
m_flags &= ~(1 << 6);
|
||||
{
|
||||
m_flags &= ~(1 << 6);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -397,9 +422,9 @@ RrepHeader::GetPrefixSize () const
|
||||
bool
|
||||
RrepHeader::operator== (RrepHeader const & o) const
|
||||
{
|
||||
return (m_flags == o.m_flags && m_prefixSize == o.m_prefixSize &&
|
||||
m_hopCount == o.m_hopCount && m_dst == o.m_dst && m_dstSeqNo == o.m_dstSeqNo &&
|
||||
m_origin == o.m_origin && m_lifeTime == o.m_lifeTime);
|
||||
return (m_flags == o.m_flags && m_prefixSize == o.m_prefixSize
|
||||
&& m_hopCount == o.m_hopCount && m_dst == o.m_dst && m_dstSeqNo == o.m_dstSeqNo
|
||||
&& m_origin == o.m_origin && m_lifeTime == o.m_lifeTime);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -425,19 +450,19 @@ operator<< (std::ostream & os, RrepHeader const & h)
|
||||
// RREP-ACK
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
RrepAckHeader::RrepAckHeader () :
|
||||
m_reserved (0)
|
||||
RrepAckHeader::RrepAckHeader ()
|
||||
: m_reserved (0)
|
||||
{
|
||||
}
|
||||
|
||||
NS_OBJECT_ENSURE_REGISTERED (RrepAckHeader);
|
||||
|
||||
|
||||
TypeId
|
||||
RrepAckHeader::GetTypeId ()
|
||||
{
|
||||
static TypeId tid = TypeId ("ns3::aodv::RrepAckHeader")
|
||||
.SetParent<Header> ()
|
||||
.SetGroupName("Aodv")
|
||||
.SetGroupName ("Aodv")
|
||||
.AddConstructor<RrepAckHeader> ()
|
||||
;
|
||||
return tid;
|
||||
@@ -492,8 +517,9 @@ operator<< (std::ostream & os, RrepAckHeader const & h )
|
||||
//-----------------------------------------------------------------------------
|
||||
// RERR
|
||||
//-----------------------------------------------------------------------------
|
||||
RerrHeader::RerrHeader () :
|
||||
m_flag (0), m_reserved (0)
|
||||
RerrHeader::RerrHeader ()
|
||||
: m_flag (0),
|
||||
m_reserved (0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -504,7 +530,7 @@ RerrHeader::GetTypeId ()
|
||||
{
|
||||
static TypeId tid = TypeId ("ns3::aodv::RerrHeader")
|
||||
.SetParent<Header> ()
|
||||
.SetGroupName("Aodv")
|
||||
.SetGroupName ("Aodv")
|
||||
.AddConstructor<RerrHeader> ()
|
||||
;
|
||||
return tid;
|
||||
@@ -574,9 +600,13 @@ void
|
||||
RerrHeader::SetNoDelete (bool f )
|
||||
{
|
||||
if (f)
|
||||
m_flag |= (1 << 0);
|
||||
{
|
||||
m_flag |= (1 << 0);
|
||||
}
|
||||
else
|
||||
m_flag &= ~(1 << 0);
|
||||
{
|
||||
m_flag &= ~(1 << 0);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -589,7 +619,9 @@ bool
|
||||
RerrHeader::AddUnDestination (Ipv4Address dst, uint32_t seqNo )
|
||||
{
|
||||
if (m_unreachableDstSeqNo.find (dst) != m_unreachableDstSeqNo.end ())
|
||||
return true;
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
NS_ASSERT (GetDestCount () < 255); // can't support more than 255 destinations in single RERR
|
||||
m_unreachableDstSeqNo.insert (std::make_pair (dst, seqNo));
|
||||
@@ -600,7 +632,9 @@ bool
|
||||
RerrHeader::RemoveUnDestination (std::pair<Ipv4Address, uint32_t> & un )
|
||||
{
|
||||
if (m_unreachableDstSeqNo.empty ())
|
||||
return false;
|
||||
{
|
||||
return false;
|
||||
}
|
||||
std::map<Ipv4Address, uint32_t>::iterator i = m_unreachableDstSeqNo.begin ();
|
||||
un = *i;
|
||||
m_unreachableDstSeqNo.erase (i);
|
||||
@@ -619,14 +653,18 @@ bool
|
||||
RerrHeader::operator== (RerrHeader const & o ) const
|
||||
{
|
||||
if (m_flag != o.m_flag || m_reserved != o.m_reserved || GetDestCount () != o.GetDestCount ())
|
||||
return false;
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
std::map<Ipv4Address, uint32_t>::const_iterator j = m_unreachableDstSeqNo.begin ();
|
||||
std::map<Ipv4Address, uint32_t>::const_iterator k = o.m_unreachableDstSeqNo.begin ();
|
||||
for (uint8_t i = 0; i < GetDestCount (); ++i)
|
||||
{
|
||||
if ((j->first != k->first) || (j->second != k->second))
|
||||
return false;
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
j++;
|
||||
k++;
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Based on
|
||||
* Based on
|
||||
* NS-2 AODV model developed by the CMU/MONARCH group and optimized and
|
||||
* tuned by Samir Das and Mahesh Marina, University of Cincinnati;
|
||||
*
|
||||
*
|
||||
* AODV-UU implementation by Erik Nordström of Uppsala University
|
||||
* http://core.it.uu.se/core/index.php/AODV-UU
|
||||
*
|
||||
@@ -26,7 +26,7 @@
|
||||
* Pavel Boyko <boyko@iitp.ru>
|
||||
*/
|
||||
#define NS_LOG_APPEND_CONTEXT \
|
||||
if (m_ipv4) { std::clog << "[node " << m_ipv4->GetObject<Node> ()->GetId () << "] "; }
|
||||
if (m_ipv4) { std::clog << "[node " << m_ipv4->GetObject<Node> ()->GetId () << "] "; }
|
||||
|
||||
#include "aodv-routing-protocol.h"
|
||||
#include "ns3/log.h"
|
||||
@@ -44,48 +44,66 @@
|
||||
#include <algorithm>
|
||||
#include <limits>
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
namespace ns3 {
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("AodvRoutingProtocol");
|
||||
|
||||
namespace aodv
|
||||
{
|
||||
namespace aodv {
|
||||
NS_OBJECT_ENSURE_REGISTERED (RoutingProtocol);
|
||||
|
||||
/// UDP Port for AODV control traffic
|
||||
const uint32_t RoutingProtocol::AODV_PORT = 654;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Tag used by AODV implementation
|
||||
|
||||
/**
|
||||
* \ingroup aodv
|
||||
* \brief Tag used by AODV implementation
|
||||
*/
|
||||
class DeferredRouteOutputTag : public Tag
|
||||
{
|
||||
|
||||
public:
|
||||
DeferredRouteOutputTag (int32_t o = -1) : Tag (), m_oif (o) {}
|
||||
/**
|
||||
* \brief Constructor
|
||||
* \param o the output interface
|
||||
*/
|
||||
DeferredRouteOutputTag (int32_t o = -1) : Tag (),
|
||||
m_oif (o)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the type ID.
|
||||
* \return the object TypeId
|
||||
*/
|
||||
static TypeId GetTypeId ()
|
||||
{
|
||||
static TypeId tid = TypeId ("ns3::aodv::DeferredRouteOutputTag")
|
||||
.SetParent<Tag> ()
|
||||
.SetGroupName("Aodv")
|
||||
.SetGroupName ("Aodv")
|
||||
.AddConstructor<DeferredRouteOutputTag> ()
|
||||
;
|
||||
return tid;
|
||||
}
|
||||
|
||||
TypeId GetInstanceTypeId () const
|
||||
TypeId GetInstanceTypeId () const
|
||||
{
|
||||
return GetTypeId ();
|
||||
}
|
||||
|
||||
int32_t GetInterface() const
|
||||
/**
|
||||
* \brief Get the output interface
|
||||
* \return the output interface
|
||||
*/
|
||||
int32_t GetInterface () const
|
||||
{
|
||||
return m_oif;
|
||||
}
|
||||
|
||||
void SetInterface(int32_t oif)
|
||||
/**
|
||||
* \brief Set the output interface
|
||||
* \param oif the output interface
|
||||
*/
|
||||
void SetInterface (int32_t oif)
|
||||
{
|
||||
m_oif = oif;
|
||||
}
|
||||
@@ -119,43 +137,43 @@ NS_OBJECT_ENSURE_REGISTERED (DeferredRouteOutputTag);
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
RoutingProtocol::RoutingProtocol () :
|
||||
m_rreqRetries (2),
|
||||
m_ttlStart (1),
|
||||
m_ttlIncrement (2),
|
||||
m_ttlThreshold (7),
|
||||
m_timeoutBuffer (2),
|
||||
m_rreqRateLimit (10),
|
||||
m_rerrRateLimit (10),
|
||||
m_activeRouteTimeout (Seconds (3)),
|
||||
m_netDiameter (35),
|
||||
m_nodeTraversalTime (MilliSeconds (40)),
|
||||
m_netTraversalTime (Time ((2 * m_netDiameter) * m_nodeTraversalTime)),
|
||||
m_pathDiscoveryTime ( Time (2 * m_netTraversalTime)),
|
||||
m_myRouteTimeout (Time (2 * std::max (m_pathDiscoveryTime, m_activeRouteTimeout))),
|
||||
m_helloInterval (Seconds (1)),
|
||||
m_allowedHelloLoss (2),
|
||||
m_deletePeriod (Time (5 * std::max (m_activeRouteTimeout, m_helloInterval))),
|
||||
m_nextHopWait (m_nodeTraversalTime + MilliSeconds (10)),
|
||||
m_blackListTimeout (Time (m_rreqRetries * m_netTraversalTime)),
|
||||
m_maxQueueLen (64),
|
||||
m_maxQueueTime (Seconds (30)),
|
||||
m_destinationOnly (false),
|
||||
m_gratuitousReply (true),
|
||||
m_enableHello (false),
|
||||
m_routingTable (m_deletePeriod),
|
||||
m_queue (m_maxQueueLen, m_maxQueueTime),
|
||||
m_requestId (0),
|
||||
m_seqNo (0),
|
||||
m_rreqIdCache (m_pathDiscoveryTime),
|
||||
m_dpd (m_pathDiscoveryTime),
|
||||
m_nb (m_helloInterval),
|
||||
m_rreqCount (0),
|
||||
m_rerrCount (0),
|
||||
m_htimer (Timer::CANCEL_ON_DESTROY),
|
||||
m_rreqRateLimitTimer (Timer::CANCEL_ON_DESTROY),
|
||||
m_rerrRateLimitTimer (Timer::CANCEL_ON_DESTROY),
|
||||
m_lastBcastTime (Seconds (0))
|
||||
RoutingProtocol::RoutingProtocol ()
|
||||
: m_rreqRetries (2),
|
||||
m_ttlStart (1),
|
||||
m_ttlIncrement (2),
|
||||
m_ttlThreshold (7),
|
||||
m_timeoutBuffer (2),
|
||||
m_rreqRateLimit (10),
|
||||
m_rerrRateLimit (10),
|
||||
m_activeRouteTimeout (Seconds (3)),
|
||||
m_netDiameter (35),
|
||||
m_nodeTraversalTime (MilliSeconds (40)),
|
||||
m_netTraversalTime (Time ((2 * m_netDiameter) * m_nodeTraversalTime)),
|
||||
m_pathDiscoveryTime ( Time (2 * m_netTraversalTime)),
|
||||
m_myRouteTimeout (Time (2 * std::max (m_pathDiscoveryTime, m_activeRouteTimeout))),
|
||||
m_helloInterval (Seconds (1)),
|
||||
m_allowedHelloLoss (2),
|
||||
m_deletePeriod (Time (5 * std::max (m_activeRouteTimeout, m_helloInterval))),
|
||||
m_nextHopWait (m_nodeTraversalTime + MilliSeconds (10)),
|
||||
m_blackListTimeout (Time (m_rreqRetries * m_netTraversalTime)),
|
||||
m_maxQueueLen (64),
|
||||
m_maxQueueTime (Seconds (30)),
|
||||
m_destinationOnly (false),
|
||||
m_gratuitousReply (true),
|
||||
m_enableHello (false),
|
||||
m_routingTable (m_deletePeriod),
|
||||
m_queue (m_maxQueueLen, m_maxQueueTime),
|
||||
m_requestId (0),
|
||||
m_seqNo (0),
|
||||
m_rreqIdCache (m_pathDiscoveryTime),
|
||||
m_dpd (m_pathDiscoveryTime),
|
||||
m_nb (m_helloInterval),
|
||||
m_rreqCount (0),
|
||||
m_rerrCount (0),
|
||||
m_htimer (Timer::CANCEL_ON_DESTROY),
|
||||
m_rreqRateLimitTimer (Timer::CANCEL_ON_DESTROY),
|
||||
m_rerrRateLimitTimer (Timer::CANCEL_ON_DESTROY),
|
||||
m_lastBcastTime (Seconds (0))
|
||||
{
|
||||
m_nb.SetCallback (MakeCallback (&RoutingProtocol::SendRerrWhenBreaksLinkToNextHop, this));
|
||||
}
|
||||
@@ -165,7 +183,7 @@ RoutingProtocol::GetTypeId (void)
|
||||
{
|
||||
static TypeId tid = TypeId ("ns3::aodv::RoutingProtocol")
|
||||
.SetParent<Ipv4RoutingProtocol> ()
|
||||
.SetGroupName("Aodv")
|
||||
.SetGroupName ("Aodv")
|
||||
.AddConstructor<RoutingProtocol> ()
|
||||
.AddAttribute ("HelloInterval", "HELLO messages emission interval.",
|
||||
TimeValue (Seconds (1)),
|
||||
@@ -321,7 +339,7 @@ void
|
||||
RoutingProtocol::PrintRoutingTable (Ptr<OutputStreamWrapper> stream, Time::Unit unit) const
|
||||
{
|
||||
*stream->GetStream () << "Node: " << m_ipv4->GetObject<Node> ()->GetId ()
|
||||
<< "; Time: " << Now().As (unit)
|
||||
<< "; Time: " << Now ().As (unit)
|
||||
<< ", Local time: " << GetObject<Node> ()->GetLocalTime ().As (unit)
|
||||
<< ", AODV Routing table" << std::endl;
|
||||
|
||||
@@ -362,7 +380,7 @@ RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header,
|
||||
NS_LOG_FUNCTION (this << header << (oif ? oif->GetIfIndex () : 0));
|
||||
if (!p)
|
||||
{
|
||||
NS_LOG_DEBUG("Packet is == 0");
|
||||
NS_LOG_DEBUG ("Packet is == 0");
|
||||
return LoopbackRoute (header, oif); // later
|
||||
}
|
||||
if (m_socketAddresses.empty ())
|
||||
@@ -392,8 +410,8 @@ RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header,
|
||||
return route;
|
||||
}
|
||||
|
||||
// Valid route not found, in this case we return loopback.
|
||||
// Actual route request will be deferred until packet will be fully formed,
|
||||
// Valid route not found, in this case we return loopback.
|
||||
// Actual route request will be deferred until packet will be fully formed,
|
||||
// routed to loopback, received from loopback and passed to RouteInput (see below)
|
||||
uint32_t iif = (oif ? m_ipv4->GetInterfaceForDevice (oif) : -1);
|
||||
DeferredRouteOutputTag tag (iif);
|
||||
@@ -406,7 +424,7 @@ RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header,
|
||||
}
|
||||
|
||||
void
|
||||
RoutingProtocol::DeferredRouteOutput (Ptr<const Packet> p, const Ipv4Header & header,
|
||||
RoutingProtocol::DeferredRouteOutput (Ptr<const Packet> p, const Ipv4Header & header,
|
||||
UnicastForwardCallback ucb, ErrorCallback ecb)
|
||||
{
|
||||
NS_LOG_FUNCTION (this << p << header);
|
||||
@@ -419,9 +437,9 @@ RoutingProtocol::DeferredRouteOutput (Ptr<const Packet> p, const Ipv4Header & he
|
||||
NS_LOG_LOGIC ("Add packet " << p->GetUid () << " to queue. Protocol " << (uint16_t) header.GetProtocol ());
|
||||
RoutingTableEntry rt;
|
||||
bool result = m_routingTable.LookupRoute (header.GetDestination (), rt);
|
||||
if(!result || ((rt.GetFlag () != IN_SEARCH) && result))
|
||||
if (!result || ((rt.GetFlag () != IN_SEARCH) && result))
|
||||
{
|
||||
NS_LOG_LOGIC ("Send new RREQ for outbound packet to " <<header.GetDestination ());
|
||||
NS_LOG_LOGIC ("Send new RREQ for outbound packet to " << header.GetDestination ());
|
||||
SendRequest (header.GetDestination ());
|
||||
}
|
||||
}
|
||||
@@ -460,12 +478,14 @@ RoutingProtocol::RouteInput (Ptr<const Packet> p, const Ipv4Header &header,
|
||||
|
||||
// Duplicate of own packet
|
||||
if (IsMyOwnAddress (origin))
|
||||
return true;
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// AODV is not a multicast routing protocol
|
||||
if (dst.IsMulticast ())
|
||||
{
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Broadcast local delivery/forwarding
|
||||
@@ -474,60 +494,62 @@ RoutingProtocol::RouteInput (Ptr<const Packet> p, const Ipv4Header &header,
|
||||
{
|
||||
Ipv4InterfaceAddress iface = j->second;
|
||||
if (m_ipv4->GetInterfaceForAddress (iface.GetLocal ()) == iif)
|
||||
if (dst == iface.GetBroadcast () || dst.IsBroadcast ())
|
||||
{
|
||||
if (m_dpd.IsDuplicate (p, header))
|
||||
{
|
||||
NS_LOG_DEBUG ("Duplicated packet " << p->GetUid () << " from " << origin << ". Drop.");
|
||||
return true;
|
||||
}
|
||||
UpdateRouteLifeTime (origin, m_activeRouteTimeout);
|
||||
Ptr<Packet> packet = p->Copy ();
|
||||
if (lcb.IsNull () == false)
|
||||
{
|
||||
NS_LOG_LOGIC ("Broadcast local delivery to " << iface.GetLocal ());
|
||||
lcb (p, header, iif);
|
||||
// Fall through to additional processing
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_LOG_ERROR ("Unable to deliver packet locally due to null callback " << p->GetUid () << " from " << origin);
|
||||
ecb (p, header, Socket::ERROR_NOROUTETOHOST);
|
||||
}
|
||||
if (!m_enableBroadcast)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (header.GetProtocol () == UdpL4Protocol::PROT_NUMBER)
|
||||
{
|
||||
UdpHeader udpHeader;
|
||||
p->PeekHeader (udpHeader);
|
||||
if (udpHeader.GetDestinationPort () == AODV_PORT)
|
||||
{
|
||||
// AODV packets sent in broadcast are already managed
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (header.GetTtl () > 1)
|
||||
{
|
||||
NS_LOG_LOGIC ("Forward broadcast. TTL " << (uint16_t) header.GetTtl ());
|
||||
RoutingTableEntry toBroadcast;
|
||||
if (m_routingTable.LookupRoute (dst, toBroadcast))
|
||||
{
|
||||
Ptr<Ipv4Route> route = toBroadcast.GetRoute ();
|
||||
ucb (route, packet, header);
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_LOG_DEBUG ("No route to forward broadcast. Drop packet " << p->GetUid ());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_LOG_DEBUG ("TTL exceeded. Drop packet " << p->GetUid ());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
{
|
||||
if (dst == iface.GetBroadcast () || dst.IsBroadcast ())
|
||||
{
|
||||
if (m_dpd.IsDuplicate (p, header))
|
||||
{
|
||||
NS_LOG_DEBUG ("Duplicated packet " << p->GetUid () << " from " << origin << ". Drop.");
|
||||
return true;
|
||||
}
|
||||
UpdateRouteLifeTime (origin, m_activeRouteTimeout);
|
||||
Ptr<Packet> packet = p->Copy ();
|
||||
if (lcb.IsNull () == false)
|
||||
{
|
||||
NS_LOG_LOGIC ("Broadcast local delivery to " << iface.GetLocal ());
|
||||
lcb (p, header, iif);
|
||||
// Fall through to additional processing
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_LOG_ERROR ("Unable to deliver packet locally due to null callback " << p->GetUid () << " from " << origin);
|
||||
ecb (p, header, Socket::ERROR_NOROUTETOHOST);
|
||||
}
|
||||
if (!m_enableBroadcast)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (header.GetProtocol () == UdpL4Protocol::PROT_NUMBER)
|
||||
{
|
||||
UdpHeader udpHeader;
|
||||
p->PeekHeader (udpHeader);
|
||||
if (udpHeader.GetDestinationPort () == AODV_PORT)
|
||||
{
|
||||
// AODV packets sent in broadcast are already managed
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (header.GetTtl () > 1)
|
||||
{
|
||||
NS_LOG_LOGIC ("Forward broadcast. TTL " << (uint16_t) header.GetTtl ());
|
||||
RoutingTableEntry toBroadcast;
|
||||
if (m_routingTable.LookupRoute (dst, toBroadcast))
|
||||
{
|
||||
Ptr<Ipv4Route> route = toBroadcast.GetRoute ();
|
||||
ucb (route, packet, header);
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_LOG_DEBUG ("No route to forward broadcast. Drop packet " << p->GetUid ());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_LOG_DEBUG ("TTL exceeded. Drop packet " << p->GetUid ());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Unicast local delivery
|
||||
@@ -579,7 +601,7 @@ RoutingProtocol::Forwarding (Ptr<const Packet> p, const Ipv4Header & header,
|
||||
if (toDst.GetFlag () == VALID)
|
||||
{
|
||||
Ptr<Ipv4Route> route = toDst.GetRoute ();
|
||||
NS_LOG_LOGIC (route->GetSource ()<<" forwarding to " << dst << " from " << origin << " packet " << p->GetUid ());
|
||||
NS_LOG_LOGIC (route->GetSource () << " forwarding to " << dst << " from " << origin << " packet " << p->GetUid ());
|
||||
|
||||
/*
|
||||
* Each time a route is used to forward a data packet, its Active Route
|
||||
@@ -615,7 +637,7 @@ RoutingProtocol::Forwarding (Ptr<const Packet> p, const Ipv4Header & header,
|
||||
}
|
||||
}
|
||||
}
|
||||
NS_LOG_LOGIC ("route not found to "<< dst << ". Send RERR message.");
|
||||
NS_LOG_LOGIC ("route not found to " << dst << ". Send RERR message.");
|
||||
NS_LOG_DEBUG ("Drop packet " << p->GetUid () << " because no route to forward it.");
|
||||
SendRerrWhenNoRouteToForward (dst, 0, origin);
|
||||
return false;
|
||||
@@ -654,8 +676,10 @@ RoutingProtocol::NotifyInterfaceUp (uint32_t i)
|
||||
}
|
||||
Ipv4InterfaceAddress iface = l3->GetAddress (i, 0);
|
||||
if (iface.GetLocal () == Ipv4Address ("127.0.0.1"))
|
||||
return;
|
||||
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Create a socket to listen only on this interface
|
||||
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (),
|
||||
UdpSocketFactory::GetTypeId ());
|
||||
@@ -692,10 +716,14 @@ RoutingProtocol::NotifyInterfaceUp (uint32_t i)
|
||||
// Allow neighbor manager use this interface for layer 2 feedback if possible
|
||||
Ptr<WifiNetDevice> wifi = dev->GetObject<WifiNetDevice> ();
|
||||
if (wifi == 0)
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
Ptr<WifiMac> mac = wifi->GetMac ();
|
||||
if (mac == 0)
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mac->TraceConnectWithoutContext ("TxErrHeader", m_nb.GetTxErrorCallback ());
|
||||
}
|
||||
@@ -720,7 +748,7 @@ RoutingProtocol::NotifyInterfaceDown (uint32_t i)
|
||||
}
|
||||
}
|
||||
|
||||
// Close socket
|
||||
// Close socket
|
||||
Ptr<Socket> socket = FindSocketWithInterfaceAddress (m_ipv4->GetAddress (i, 0));
|
||||
NS_ASSERT (socket);
|
||||
socket->Close ();
|
||||
@@ -749,7 +777,9 @@ RoutingProtocol::NotifyAddAddress (uint32_t i, Ipv4InterfaceAddress address)
|
||||
NS_LOG_FUNCTION (this << " interface " << i << " address " << address);
|
||||
Ptr<Ipv4L3Protocol> l3 = m_ipv4->GetObject<Ipv4L3Protocol> ();
|
||||
if (!l3->IsUp (i))
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (l3->GetNAddresses (i) == 1)
|
||||
{
|
||||
Ipv4InterfaceAddress iface = l3->GetAddress (i, 0);
|
||||
@@ -757,7 +787,9 @@ RoutingProtocol::NotifyAddAddress (uint32_t i, Ipv4InterfaceAddress address)
|
||||
if (!socket)
|
||||
{
|
||||
if (iface.GetLocal () == Ipv4Address ("127.0.0.1"))
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
// Create a socket to listen only on this interface
|
||||
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (),
|
||||
UdpSocketFactory::GetTypeId ());
|
||||
@@ -770,7 +802,7 @@ RoutingProtocol::NotifyAddAddress (uint32_t i, Ipv4InterfaceAddress address)
|
||||
|
||||
// create also a subnet directed broadcast socket
|
||||
socket = Socket::CreateSocket (GetObject<Node> (),
|
||||
UdpSocketFactory::GetTypeId ());
|
||||
UdpSocketFactory::GetTypeId ());
|
||||
NS_ASSERT (socket != 0);
|
||||
socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this));
|
||||
socket->Bind (InetSocketAddress (iface.GetBroadcast (), AODV_PORT));
|
||||
@@ -830,7 +862,7 @@ RoutingProtocol::NotifyRemoveAddress (uint32_t i, Ipv4InterfaceAddress address)
|
||||
|
||||
// create also a unicast socket
|
||||
socket = Socket::CreateSocket (GetObject<Node> (),
|
||||
UdpSocketFactory::GetTypeId ());
|
||||
UdpSocketFactory::GetTypeId ());
|
||||
NS_ASSERT (socket != 0);
|
||||
socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this));
|
||||
socket->Bind (InetSocketAddress (iface.GetBroadcast (), AODV_PORT));
|
||||
@@ -876,7 +908,7 @@ RoutingProtocol::IsMyOwnAddress (Ipv4Address src)
|
||||
return false;
|
||||
}
|
||||
|
||||
Ptr<Ipv4Route>
|
||||
Ptr<Ipv4Route>
|
||||
RoutingProtocol::LoopbackRoute (const Ipv4Header & hdr, Ptr<NetDevice> oif) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this << hdr);
|
||||
@@ -896,7 +928,7 @@ RoutingProtocol::LoopbackRoute (const Ipv4Header & hdr, Ptr<NetDevice> oif) cons
|
||||
// For single interface, single address nodes, this is not a problem.
|
||||
// When there are possibly multiple outgoing interfaces, the policy
|
||||
// implemented here is to pick the first available AODV interface.
|
||||
// If RouteOutput() caller specified an outgoing interface, that
|
||||
// If RouteOutput() caller specified an outgoing interface, that
|
||||
// further constrains the selection of source address
|
||||
//
|
||||
std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin ();
|
||||
@@ -936,7 +968,9 @@ RoutingProtocol::SendRequest (Ipv4Address dst)
|
||||
return;
|
||||
}
|
||||
else
|
||||
m_rreqCount++;
|
||||
{
|
||||
m_rreqCount++;
|
||||
}
|
||||
// Create RREQ header
|
||||
RreqHeader rreqHeader;
|
||||
rreqHeader.SetDst (dst);
|
||||
@@ -954,14 +988,22 @@ RoutingProtocol::SendRequest (Ipv4Address dst)
|
||||
{
|
||||
ttl = rt.GetHop () + m_ttlIncrement;
|
||||
if (ttl > m_ttlThreshold)
|
||||
ttl = m_netDiameter;
|
||||
{
|
||||
ttl = m_netDiameter;
|
||||
}
|
||||
}
|
||||
if (ttl == m_netDiameter)
|
||||
rt.IncrementRreqCnt ();
|
||||
{
|
||||
rt.IncrementRreqCnt ();
|
||||
}
|
||||
if (rt.GetValidSeqNo ())
|
||||
rreqHeader.SetDstSeqno (rt.GetSeqNo ());
|
||||
{
|
||||
rreqHeader.SetDstSeqno (rt.GetSeqNo ());
|
||||
}
|
||||
else
|
||||
rreqHeader.SetUnknownSeqno (true);
|
||||
{
|
||||
rreqHeader.SetUnknownSeqno (true);
|
||||
}
|
||||
rt.SetHop (ttl);
|
||||
rt.SetFlag (IN_SEARCH);
|
||||
rt.SetLifeTime (m_pathDiscoveryTime);
|
||||
@@ -976,15 +1018,21 @@ RoutingProtocol::SendRequest (Ipv4Address dst)
|
||||
/*nextHop=*/ Ipv4Address (), /*lifeTime=*/ m_pathDiscoveryTime);
|
||||
// Check if TtlStart == NetDiameter
|
||||
if (ttl == m_netDiameter)
|
||||
newEntry.IncrementRreqCnt ();
|
||||
{
|
||||
newEntry.IncrementRreqCnt ();
|
||||
}
|
||||
newEntry.SetFlag (IN_SEARCH);
|
||||
m_routingTable.AddRoute (newEntry);
|
||||
}
|
||||
|
||||
if (m_gratuitousReply)
|
||||
rreqHeader.SetGratiousRrep (true);
|
||||
{
|
||||
rreqHeader.SetGratiousRrep (true);
|
||||
}
|
||||
if (m_destinationOnly)
|
||||
rreqHeader.SetDestinationOnly (true);
|
||||
{
|
||||
rreqHeader.SetDestinationOnly (true);
|
||||
}
|
||||
|
||||
m_seqNo++;
|
||||
rreqHeader.SetOriginSeqno (m_seqNo);
|
||||
@@ -1015,12 +1063,12 @@ RoutingProtocol::SendRequest (Ipv4Address dst)
|
||||
destination = Ipv4Address ("255.255.255.255");
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
destination = iface.GetBroadcast ();
|
||||
}
|
||||
NS_LOG_DEBUG ("Send RREQ with id " << rreqHeader.GetId () << " to socket");
|
||||
m_lastBcastTime = Simulator::Now ();
|
||||
Simulator::Schedule (Time (MilliSeconds (m_uniformRandomVariable->GetInteger (0, 10))), &RoutingProtocol::SendTo, this, socket, packet, destination);
|
||||
Simulator::Schedule (Time (MilliSeconds (m_uniformRandomVariable->GetInteger (0, 10))), &RoutingProtocol::SendTo, this, socket, packet, destination);
|
||||
}
|
||||
ScheduleRreqRetry (dst);
|
||||
}
|
||||
@@ -1028,7 +1076,7 @@ RoutingProtocol::SendRequest (Ipv4Address dst)
|
||||
void
|
||||
RoutingProtocol::SendTo (Ptr<Socket> socket, Ptr<Packet> packet, Ipv4Address destination)
|
||||
{
|
||||
socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT));
|
||||
socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT));
|
||||
|
||||
}
|
||||
void
|
||||
@@ -1073,7 +1121,7 @@ RoutingProtocol::RecvAodv (Ptr<Socket> socket)
|
||||
{
|
||||
receiver = m_socketAddresses[socket].GetLocal ();
|
||||
}
|
||||
else if(m_socketSubnetBroadcastAddresses.find (socket) != m_socketSubnetBroadcastAddresses.end ())
|
||||
else if (m_socketSubnetBroadcastAddresses.find (socket) != m_socketSubnetBroadcastAddresses.end ())
|
||||
{
|
||||
receiver = m_socketSubnetBroadcastAddresses[socket].GetLocal ();
|
||||
}
|
||||
@@ -1225,10 +1273,14 @@ RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address s
|
||||
if (toOrigin.GetValidSeqNo ())
|
||||
{
|
||||
if (int32_t (rreqHeader.GetOriginSeqno ()) - int32_t (toOrigin.GetSeqNo ()) > 0)
|
||||
toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno ());
|
||||
{
|
||||
toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno ());
|
||||
}
|
||||
}
|
||||
else
|
||||
toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno ());
|
||||
{
|
||||
toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno ());
|
||||
}
|
||||
toOrigin.SetValidSeqNo (true);
|
||||
toOrigin.SetNextHop (src);
|
||||
toOrigin.SetOutputDevice (m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver)));
|
||||
@@ -1244,18 +1296,18 @@ RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address s
|
||||
RoutingTableEntry toNeighbor;
|
||||
if (!m_routingTable.LookupRoute (src, toNeighbor))
|
||||
{
|
||||
NS_LOG_DEBUG ("Neighbor:" << src << " not found in routing table. Creating an entry");
|
||||
NS_LOG_DEBUG ("Neighbor:" << src << " not found in routing table. Creating an entry");
|
||||
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver));
|
||||
RoutingTableEntry newEntry (dev, src, false, rreqHeader.GetOriginSeqno (),
|
||||
m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0),
|
||||
1, src, m_activeRouteTimeout);
|
||||
m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0),
|
||||
1, src, m_activeRouteTimeout);
|
||||
m_routingTable.AddRoute (newEntry);
|
||||
}
|
||||
else
|
||||
{
|
||||
toNeighbor.SetLifeTime (m_activeRouteTimeout);
|
||||
toNeighbor.SetValidSeqNo (false);
|
||||
toNeighbor.SetSeqNo (rreqHeader.GetOriginSeqno ());
|
||||
toNeighbor.SetSeqNo (rreqHeader.GetOriginSeqno ());
|
||||
toNeighbor.SetFlag (VALID);
|
||||
toNeighbor.SetOutputDevice (m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver)));
|
||||
toNeighbor.SetInterface (m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0));
|
||||
@@ -1265,7 +1317,7 @@ RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address s
|
||||
}
|
||||
m_nb.Update (src, Time (m_allowedHelloLoss * m_helloInterval));
|
||||
|
||||
NS_LOG_LOGIC (receiver << " receive RREQ with hop count " << static_cast<uint32_t>(rreqHeader.GetHopCount ())
|
||||
NS_LOG_LOGIC (receiver << " receive RREQ with hop count " << static_cast<uint32_t> (rreqHeader.GetHopCount ())
|
||||
<< " ID " << rreqHeader.GetId ()
|
||||
<< " to destination " << rreqHeader.GetDst ());
|
||||
|
||||
@@ -1341,11 +1393,11 @@ RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address s
|
||||
destination = Ipv4Address ("255.255.255.255");
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
destination = iface.GetBroadcast ();
|
||||
}
|
||||
m_lastBcastTime = Simulator::Now ();
|
||||
Simulator::Schedule (Time (MilliSeconds (m_uniformRandomVariable->GetInteger (0, 10))), &RoutingProtocol::SendTo, this, socket, packet, destination);
|
||||
Simulator::Schedule (Time (MilliSeconds (m_uniformRandomVariable->GetInteger (0, 10))), &RoutingProtocol::SendTo, this, socket, packet, destination);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1359,7 +1411,9 @@ RoutingProtocol::SendReply (RreqHeader const & rreqHeader, RoutingTableEntry con
|
||||
* incremented value. Otherwise, the destination does not change its sequence number before generating the RREP message.
|
||||
*/
|
||||
if (!rreqHeader.GetUnknownSeqno () && (rreqHeader.GetDstSeqno () == m_seqNo + 1))
|
||||
m_seqNo++;
|
||||
{
|
||||
m_seqNo++;
|
||||
}
|
||||
RrepHeader rrepHeader ( /*prefixSize=*/ 0, /*hops=*/ 0, /*dst=*/ rreqHeader.GetDst (),
|
||||
/*dstSeqNo=*/ m_seqNo, /*origin=*/ toOrigin.GetDestination (), /*lifeTime=*/ m_myRouteTimeout);
|
||||
Ptr<Packet> packet = Create<Packet> ();
|
||||
@@ -1564,7 +1618,7 @@ RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address sen
|
||||
m_routingTable.Update (toNextHopToOrigin);
|
||||
}
|
||||
SocketIpTtlTag tag;
|
||||
p->RemovePacketTag(tag);
|
||||
p->RemovePacketTag (tag);
|
||||
if (tag.GetTtl () < 2)
|
||||
{
|
||||
NS_LOG_DEBUG ("TTL exceeded. Drop RREP destination " << dst << " origin " << rrepHeader.GetOrigin ());
|
||||
@@ -1573,7 +1627,7 @@ RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address sen
|
||||
|
||||
Ptr<Packet> packet = Create<Packet> ();
|
||||
SocketIpTtlTag ttl;
|
||||
ttl.SetTtl (tag.GetTtl() - 1);
|
||||
ttl.SetTtl (tag.GetTtl () - 1);
|
||||
packet->AddPacketTag (ttl);
|
||||
packet->AddHeader (rrepHeader);
|
||||
TypeHeader tHeader (AODVTYPE_RREP);
|
||||
@@ -1588,7 +1642,7 @@ RoutingProtocol::RecvReplyAck (Ipv4Address neighbor)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
RoutingTableEntry rt;
|
||||
if(m_routingTable.LookupRoute (neighbor, rt))
|
||||
if (m_routingTable.LookupRoute (neighbor, rt))
|
||||
{
|
||||
rt.m_ackTimer.Cancel ();
|
||||
rt.SetFlag (VALID);
|
||||
@@ -1645,18 +1699,18 @@ RoutingProtocol::RecvError (Ptr<Packet> p, Ipv4Address src )
|
||||
while (rerrHeader.RemoveUnDestination (un))
|
||||
{
|
||||
for (std::map<Ipv4Address, uint32_t>::const_iterator i =
|
||||
dstWithNextHopSrc.begin (); i != dstWithNextHopSrc.end (); ++i)
|
||||
{
|
||||
if (i->first == un.first)
|
||||
{
|
||||
unreachable.insert (un);
|
||||
}
|
||||
}
|
||||
dstWithNextHopSrc.begin (); i != dstWithNextHopSrc.end (); ++i)
|
||||
{
|
||||
if (i->first == un.first)
|
||||
{
|
||||
unreachable.insert (un);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<Ipv4Address> precursors;
|
||||
for (std::map<Ipv4Address, uint32_t>::const_iterator i = unreachable.begin ();
|
||||
i != unreachable.end ();)
|
||||
i != unreachable.end (); )
|
||||
{
|
||||
if (!rerrHeader.AddUnDestination (i->first, i->second))
|
||||
{
|
||||
@@ -1805,11 +1859,11 @@ RoutingProtocol::SendHello ()
|
||||
destination = Ipv4Address ("255.255.255.255");
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
destination = iface.GetBroadcast ();
|
||||
}
|
||||
Time jitter = Time (MilliSeconds (m_uniformRandomVariable->GetInteger (0, 10)));
|
||||
Simulator::Schedule (jitter, &RoutingProtocol::SendTo, this , socket, packet, destination);
|
||||
Simulator::Schedule (jitter, &RoutingProtocol::SendTo, this, socket, packet, destination);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1822,9 +1876,9 @@ RoutingProtocol::SendPacketFromQueue (Ipv4Address dst, Ptr<Ipv4Route> route)
|
||||
{
|
||||
DeferredRouteOutputTag tag;
|
||||
Ptr<Packet> p = ConstCast<Packet> (queueEntry.GetPacket ());
|
||||
if (p->RemovePacketTag (tag) &&
|
||||
tag.GetInterface() != -1 &&
|
||||
tag.GetInterface() != m_ipv4->GetInterfaceForDevice (route->GetOutputDevice ()))
|
||||
if (p->RemovePacketTag (tag)
|
||||
&& tag.GetInterface () != -1
|
||||
&& tag.GetInterface () != m_ipv4->GetInterfaceForDevice (route->GetOutputDevice ()))
|
||||
{
|
||||
NS_LOG_DEBUG ("Output device doesn't match. Dropped.");
|
||||
return;
|
||||
@@ -1847,12 +1901,14 @@ RoutingProtocol::SendRerrWhenBreaksLinkToNextHop (Ipv4Address nextHop)
|
||||
|
||||
RoutingTableEntry toNextHop;
|
||||
if (!m_routingTable.LookupRoute (nextHop, toNextHop))
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
toNextHop.GetPrecursors (precursors);
|
||||
rerrHeader.AddUnDestination (nextHop, toNextHop.GetSeqNo ());
|
||||
m_routingTable.GetListOfDestinationWithNextHop (nextHop, unreachable);
|
||||
for (std::map<Ipv4Address, uint32_t>::const_iterator i = unreachable.begin (); i
|
||||
!= unreachable.end ();)
|
||||
!= unreachable.end (); )
|
||||
{
|
||||
if (!rerrHeader.AddUnDestination (i->first, i->second))
|
||||
{
|
||||
@@ -1901,7 +1957,7 @@ RoutingProtocol::SendRerrWhenNoRouteToForward (Ipv4Address dst,
|
||||
// Just make sure that the RerrRateLimit timer is running and will expire
|
||||
NS_ASSERT (m_rerrRateLimitTimer.IsRunning ());
|
||||
// discard the packet and return
|
||||
NS_LOG_LOGIC ("RerrRateLimit reached at " << Simulator::Now ().GetSeconds () << " with timer delay left "
|
||||
NS_LOG_LOGIC ("RerrRateLimit reached at " << Simulator::Now ().GetSeconds () << " with timer delay left "
|
||||
<< m_rerrRateLimitTimer.GetDelayLeft ().GetSeconds ()
|
||||
<< "; suppressing RERR");
|
||||
return;
|
||||
@@ -1939,7 +1995,7 @@ RoutingProtocol::SendRerrWhenNoRouteToForward (Ipv4Address dst,
|
||||
destination = Ipv4Address ("255.255.255.255");
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
destination = iface.GetBroadcast ();
|
||||
}
|
||||
socket->SendTo (packet->Copy (), 0, InetSocketAddress (destination, AODV_PORT));
|
||||
@@ -1963,7 +2019,7 @@ RoutingProtocol::SendRerrMessage (Ptr<Packet> packet, std::vector<Ipv4Address> p
|
||||
// Just make sure that the RerrRateLimit timer is running and will expire
|
||||
NS_ASSERT (m_rerrRateLimitTimer.IsRunning ());
|
||||
// discard the packet and return
|
||||
NS_LOG_LOGIC ("RerrRateLimit reached at " << Simulator::Now ().GetSeconds () << " with timer delay left "
|
||||
NS_LOG_LOGIC ("RerrRateLimit reached at " << Simulator::Now ().GetSeconds () << " with timer delay left "
|
||||
<< m_rerrRateLimitTimer.GetDelayLeft ().GetSeconds ()
|
||||
<< "; suppressing RERR");
|
||||
return;
|
||||
@@ -1988,8 +2044,8 @@ RoutingProtocol::SendRerrMessage (Ptr<Packet> packet, std::vector<Ipv4Address> p
|
||||
RoutingTableEntry toPrecursor;
|
||||
for (std::vector<Ipv4Address>::const_iterator i = precursors.begin (); i != precursors.end (); ++i)
|
||||
{
|
||||
if (m_routingTable.LookupValidRoute (*i, toPrecursor) &&
|
||||
std::find (ifaces.begin (), ifaces.end (), toPrecursor.GetInterface ()) == ifaces.end ())
|
||||
if (m_routingTable.LookupValidRoute (*i, toPrecursor)
|
||||
&& std::find (ifaces.begin (), ifaces.end (), toPrecursor.GetInterface ()) == ifaces.end ())
|
||||
{
|
||||
ifaces.push_back (toPrecursor.GetInterface ());
|
||||
}
|
||||
@@ -2009,7 +2065,7 @@ RoutingProtocol::SendRerrMessage (Ptr<Packet> packet, std::vector<Ipv4Address> p
|
||||
destination = Ipv4Address ("255.255.255.255");
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
destination = i->GetBroadcast ();
|
||||
}
|
||||
Simulator::Schedule (Time (MilliSeconds (m_uniformRandomVariable->GetInteger (0, 10))), &RoutingProtocol::SendTo, this, socket, p, destination);
|
||||
@@ -2026,7 +2082,9 @@ RoutingProtocol::FindSocketWithInterfaceAddress (Ipv4InterfaceAddress addr ) con
|
||||
Ptr<Socket> socket = j->first;
|
||||
Ipv4InterfaceAddress iface = j->second;
|
||||
if (iface == addr)
|
||||
return socket;
|
||||
{
|
||||
return socket;
|
||||
}
|
||||
}
|
||||
Ptr<Socket> socket;
|
||||
return socket;
|
||||
@@ -2042,7 +2100,9 @@ RoutingProtocol::FindSubnetBroadcastSocketWithInterfaceAddress (Ipv4InterfaceAdd
|
||||
Ptr<Socket> socket = j->first;
|
||||
Ipv4InterfaceAddress iface = j->second;
|
||||
if (iface == addr)
|
||||
return socket;
|
||||
{
|
||||
return socket;
|
||||
}
|
||||
}
|
||||
Ptr<Socket> socket;
|
||||
return socket;
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Based on
|
||||
* Based on
|
||||
* NS-2 AODV model developed by the CMU/MONARCH group and optimized and
|
||||
* tuned by Samir Das and Mahesh Marina, University of Cincinnati;
|
||||
*
|
||||
*
|
||||
* AODV-UU implementation by Erik Nordström of Uppsala University
|
||||
* http://core.it.uu.se/core/index.php/AODV-UU
|
||||
*
|
||||
@@ -32,13 +32,11 @@
|
||||
#include "ns3/socket.h"
|
||||
#include "ns3/log.h"
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
namespace ns3 {
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("AodvRequestQueue");
|
||||
|
||||
namespace aodv
|
||||
{
|
||||
namespace aodv {
|
||||
uint32_t
|
||||
RequestQueue::GetSize ()
|
||||
{
|
||||
@@ -56,7 +54,9 @@ RequestQueue::Enqueue (QueueEntry & entry)
|
||||
if ((i->GetPacket ()->GetUid () == entry.GetPacket ()->GetUid ())
|
||||
&& (i->GetIpv4Header ().GetDestination ()
|
||||
== entry.GetIpv4Header ().GetDestination ()))
|
||||
return false;
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
entry.SetExpireTime (m_queueTimeout);
|
||||
if (m_queue.size () == m_maxLen)
|
||||
@@ -108,14 +108,25 @@ RequestQueue::Find (Ipv4Address dst)
|
||||
!= m_queue.end (); ++i)
|
||||
{
|
||||
if (i->GetIpv4Header ().GetDestination () == dst)
|
||||
return true;
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief IsExpired structure
|
||||
*/
|
||||
struct IsExpired
|
||||
{
|
||||
bool
|
||||
/**
|
||||
* Check if the entry is expired
|
||||
*
|
||||
* \param e QueueEntry entry
|
||||
* \return true if expired, false otherwise
|
||||
*/
|
||||
operator() (QueueEntry const & e) const
|
||||
{
|
||||
return (e.GetExpireTime () < Seconds (0));
|
||||
@@ -147,5 +158,5 @@ RequestQueue::Drop (QueueEntry en, std::string reason)
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace aodv
|
||||
} // namespace ns3
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Based on
|
||||
* Based on
|
||||
* NS-2 AODV model developed by the CMU/MONARCH group and optimized and
|
||||
* tuned by Samir Das and Mahesh Marina, University of Cincinnati;
|
||||
*
|
||||
*
|
||||
* AODV-UU implementation by Erik Nordström of Uppsala University
|
||||
* http://core.it.uu.se/core/index.php/AODV-UU
|
||||
*
|
||||
@@ -32,24 +32,28 @@
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/log.h"
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
namespace ns3 {
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("AodvRoutingTable");
|
||||
|
||||
namespace aodv
|
||||
{
|
||||
namespace aodv {
|
||||
|
||||
/*
|
||||
The Routing Table
|
||||
*/
|
||||
|
||||
RoutingTableEntry::RoutingTableEntry (Ptr<NetDevice> dev, Ipv4Address dst, bool vSeqNo, uint32_t seqNo,
|
||||
Ipv4InterfaceAddress iface, uint16_t hops, Ipv4Address nextHop, Time lifetime) :
|
||||
m_ackTimer (Timer::CANCEL_ON_DESTROY),
|
||||
m_validSeqNo (vSeqNo), m_seqNo (seqNo), m_hops (hops),
|
||||
m_lifeTime (lifetime + Simulator::Now ()), m_iface (iface), m_flag (VALID),
|
||||
m_reqCount (0), m_blackListState (false), m_blackListTimeout (Simulator::Now ())
|
||||
Ipv4InterfaceAddress iface, uint16_t hops, Ipv4Address nextHop, Time lifetime)
|
||||
: m_ackTimer (Timer::CANCEL_ON_DESTROY),
|
||||
m_validSeqNo (vSeqNo),
|
||||
m_seqNo (seqNo),
|
||||
m_hops (hops),
|
||||
m_lifeTime (lifetime + Simulator::Now ()),
|
||||
m_iface (iface),
|
||||
m_flag (VALID),
|
||||
m_reqCount (0),
|
||||
m_blackListState (false),
|
||||
m_blackListTimeout (Simulator::Now ())
|
||||
{
|
||||
m_ipv4Route = Create<Ipv4Route> ();
|
||||
m_ipv4Route->SetDestination (dst);
|
||||
@@ -72,7 +76,9 @@ RoutingTableEntry::InsertPrecursor (Ipv4Address id)
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -129,7 +135,9 @@ RoutingTableEntry::GetPrecursors (std::vector<Ipv4Address> & prec) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
if (IsPrecursorListEmpty ())
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (std::vector<Ipv4Address>::const_iterator i = m_precursorList.begin (); i
|
||||
!= m_precursorList.end (); ++i)
|
||||
{
|
||||
@@ -138,10 +146,14 @@ RoutingTableEntry::GetPrecursors (std::vector<Ipv4Address> & prec) const
|
||||
!= prec.end (); ++j)
|
||||
{
|
||||
if (*j == *i)
|
||||
result = false;
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
if (result)
|
||||
prec.push_back (*i);
|
||||
{
|
||||
prec.push_back (*i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,7 +162,9 @@ RoutingTableEntry::Invalidate (Time badLinkLifetime)
|
||||
{
|
||||
NS_LOG_FUNCTION (this << badLinkLifetime.GetSeconds ());
|
||||
if (m_flag == INVALID)
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
m_flag = INVALID;
|
||||
m_reqCount = 0;
|
||||
m_lifeTime = badLinkLifetime + Simulator::Now ();
|
||||
@@ -181,7 +195,7 @@ RoutingTableEntry::Print (Ptr<OutputStreamWrapper> stream) const
|
||||
}
|
||||
}
|
||||
*os << "\t";
|
||||
*os << std::setiosflags (std::ios::fixed) <<
|
||||
*os << std::setiosflags (std::ios::fixed) <<
|
||||
std::setiosflags (std::ios::left) << std::setprecision (2) <<
|
||||
std::setw (14) << (m_lifeTime - Simulator::Now ()).GetSeconds ();
|
||||
*os << "\t" << m_hops << "\n";
|
||||
@@ -191,8 +205,8 @@ RoutingTableEntry::Print (Ptr<OutputStreamWrapper> stream) const
|
||||
The Routing Table
|
||||
*/
|
||||
|
||||
RoutingTable::RoutingTable (Time t) :
|
||||
m_badLinkLifetime (t)
|
||||
RoutingTable::RoutingTable (Time t)
|
||||
: m_badLinkLifetime (t)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -251,7 +265,9 @@ RoutingTable::AddRoute (RoutingTableEntry & rt)
|
||||
NS_LOG_FUNCTION (this);
|
||||
Purge ();
|
||||
if (rt.GetFlag () != IN_SEARCH)
|
||||
rt.SetRreqCnt (0);
|
||||
{
|
||||
rt.SetRreqCnt (0);
|
||||
}
|
||||
std::pair<std::map<Ipv4Address, RoutingTableEntry>::iterator, bool> result =
|
||||
m_ipv4AddressEntry.insert (std::make_pair (rt.GetDestination (), rt));
|
||||
return result.second;
|
||||
@@ -336,9 +352,11 @@ RoutingTable::DeleteAllRoutesFromInterface (Ipv4InterfaceAddress iface)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
if (m_ipv4AddressEntry.empty ())
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (std::map<Ipv4Address, RoutingTableEntry>::iterator i =
|
||||
m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end ();)
|
||||
m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end (); )
|
||||
{
|
||||
if (i->second.GetInterface () == iface)
|
||||
{
|
||||
@@ -347,7 +365,9 @@ RoutingTable::DeleteAllRoutesFromInterface (Ipv4InterfaceAddress iface)
|
||||
m_ipv4AddressEntry.erase (tmp);
|
||||
}
|
||||
else
|
||||
++i;
|
||||
{
|
||||
++i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -356,9 +376,11 @@ RoutingTable::Purge ()
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
if (m_ipv4AddressEntry.empty ())
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (std::map<Ipv4Address, RoutingTableEntry>::iterator i =
|
||||
m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end ();)
|
||||
m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end (); )
|
||||
{
|
||||
if (i->second.GetLifeTime () < Seconds (0))
|
||||
{
|
||||
@@ -375,9 +397,11 @@ RoutingTable::Purge ()
|
||||
++i;
|
||||
}
|
||||
else
|
||||
++i;
|
||||
{
|
||||
++i;
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
++i;
|
||||
}
|
||||
@@ -389,9 +413,11 @@ RoutingTable::Purge (std::map<Ipv4Address, RoutingTableEntry> &table) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
if (table.empty ())
|
||||
return;
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (std::map<Ipv4Address, RoutingTableEntry>::iterator i =
|
||||
table.begin (); i != table.end ();)
|
||||
table.begin (); i != table.end (); )
|
||||
{
|
||||
if (i->second.GetLifeTime () < Seconds (0))
|
||||
{
|
||||
@@ -408,9 +434,11 @@ RoutingTable::Purge (std::map<Ipv4Address, RoutingTableEntry> &table) const
|
||||
++i;
|
||||
}
|
||||
else
|
||||
++i;
|
||||
{
|
||||
++i;
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
++i;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user