coding style + comments

This commit is contained in:
Borovkova Elena
2009-08-20 13:28:49 +04:00
parent c387240efd
commit c40e3aa995
4 changed files with 203 additions and 178 deletions

View File

@@ -42,10 +42,12 @@ namespace aodv
The Routing Table
*/
RoutingTableEntry::RoutingTableEntry (Ptr<NetDevice> dev, Ipv4Address dst, bool vSeqNo, u_int32_t seqNo, Ipv4InterfaceAddress iface, u_int16_t hops,
Ipv4Address nextHop, Time lifetime ) : 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_ackTimer (Timer::CANCEL_ON_DESTROY)
RoutingTableEntry::RoutingTableEntry (Ptr<NetDevice> dev, Ipv4Address dst, bool vSeqNo, u_int32_t seqNo,
Ipv4InterfaceAddress iface, u_int16_t hops, Ipv4Address nextHop, Time lifetime) :
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_ackTimer (Timer::CANCEL_ON_DESTROY)
{
m_ipv4Route = Create<Ipv4Route> ();
m_ipv4Route->SetDestination (dst);
@@ -59,7 +61,7 @@ RoutingTableEntry::~RoutingTableEntry ()
}
bool
RoutingTableEntry::InsertPrecursor (Ipv4Address id )
RoutingTableEntry::InsertPrecursor (Ipv4Address id)
{
if (!LookupPrecursor (id))
{
@@ -71,18 +73,20 @@ RoutingTableEntry::InsertPrecursor (Ipv4Address id )
}
bool
RoutingTableEntry::LookupPrecursor (Ipv4Address id )
RoutingTableEntry::LookupPrecursor (Ipv4Address id)
{
for (std::vector<Ipv4Address>::const_iterator i = m_precursorList.begin (); i != m_precursorList.end (); ++i)
for (std::vector<Ipv4Address>::const_iterator i = m_precursorList.begin (); i
!= m_precursorList.end (); ++i)
if (*i == id)
return true;
return false;
}
bool
RoutingTableEntry::DeletePrecursor (Ipv4Address id )
RoutingTableEntry::DeletePrecursor (Ipv4Address id)
{
std::vector<Ipv4Address>::iterator i = std::remove (m_precursorList.begin (), m_precursorList.end (), id);
std::vector<Ipv4Address>::iterator i = std::remove (m_precursorList.begin (),
m_precursorList.end (), id);
if (i == m_precursorList.end ())
return false;
else
@@ -94,7 +98,6 @@ void
RoutingTableEntry::DeleteAllPrecursors ()
{
m_precursorList.clear ();
NS_ASSERT(m_precursorList.empty ());
}
bool
@@ -104,14 +107,16 @@ RoutingTableEntry::IsPrecursorListEmpty () const
}
void
RoutingTableEntry::GetPrecursors (std::vector<Ipv4Address> & prec ) const
RoutingTableEntry::GetPrecursors (std::vector<Ipv4Address> & prec) const
{
if (IsPrecursorListEmpty ())
return;
for (std::vector<Ipv4Address>::const_iterator i = m_precursorList.begin (); i != m_precursorList.end (); ++i)
for (std::vector<Ipv4Address>::const_iterator i = m_precursorList.begin (); i
!= m_precursorList.end (); ++i)
{
bool result = true;
for (std::vector<Ipv4Address>::const_iterator j = prec.begin (); j != prec.end (); ++j)
for (std::vector<Ipv4Address>::const_iterator j = prec.begin (); j
!= prec.end (); ++j)
if (*j == *i)
result = false;
if (result)
@@ -120,7 +125,7 @@ RoutingTableEntry::GetPrecursors (std::vector<Ipv4Address> & prec ) const
}
void
RoutingTableEntry::Invalidate (Time badLinkLifetime )
RoutingTableEntry::Invalidate (Time badLinkLifetime)
{
if (m_flag == INVALID)
return;
@@ -130,9 +135,10 @@ RoutingTableEntry::Invalidate (Time badLinkLifetime )
}
void
RoutingTableEntry::Print (std::ostream & os ) const
RoutingTableEntry::Print (std::ostream & os) const
{
os << m_ipv4Route->GetDestination () << "\t" << m_ipv4Route->GetGateway () << "\t" << m_iface.GetLocal ()<< "\t";
os << m_ipv4Route->GetDestination () << "\t" << m_ipv4Route->GetGateway ()
<< "\t" << m_iface.GetLocal () << "\t";
switch (m_flag)
{
case VALID:
@@ -151,7 +157,8 @@ RoutingTableEntry::Print (std::ostream & os ) const
break;
}
}
os << "\t" << (m_lifeTime - Simulator::Now ()).GetSeconds () << "\t" << m_hops <<"\n";
os << "\t" << (m_lifeTime - Simulator::Now ()).GetSeconds () << "\t"
<< m_hops << "\n";
}
#ifdef RUN_SELF_TESTS
@@ -175,69 +182,69 @@ AodvRtableEntryTest::RunTests ()
RoutingTableEntry rt (/*output device*/dev, /*dst*/Ipv4Address("1.2.3.4"), /*validSeqNo*/true, /*seqNo*/10,
/*interface*/iface, /*hop*/5, /*next hop*/Ipv4Address("3.3.3.3"), /*lifetime*/Seconds(10));
NS_TEST_ASSERT_EQUAL (rt.GetOutputDevice (), dev);
NS_TEST_ASSERT_EQUAL (rt.GetDestination (), Ipv4Address("1.2.3.4"));
NS_TEST_ASSERT_EQUAL (rt.GetDestination (), Ipv4Address ("1.2.3.4"));
NS_TEST_ASSERT_EQUAL (rt.GetValidSeqNo (), true);
NS_TEST_ASSERT_EQUAL (rt.GetSeqNo (), 10);
NS_TEST_ASSERT_EQUAL (rt.GetInterface(), iface);
NS_TEST_ASSERT_EQUAL (rt.GetHop(), 5);
NS_TEST_ASSERT_EQUAL (rt.GetInterface (), iface);
NS_TEST_ASSERT_EQUAL (rt.GetHop (), 5);
NS_TEST_ASSERT_EQUAL (rt.GetNextHop (), Ipv4Address ("3.3.3.3"));
NS_TEST_ASSERT_EQUAL (rt.GetLifeTime (), Seconds (10));
NS_TEST_ASSERT_EQUAL (rt.GetFlag (), VALID);
NS_TEST_ASSERT_EQUAL (rt.GetRreqCnt(), 0);
NS_TEST_ASSERT_EQUAL (rt.IsPrecursorListEmpty(), true);
NS_TEST_ASSERT_EQUAL (rt.GetRreqCnt (), 0);
NS_TEST_ASSERT_EQUAL (rt.IsPrecursorListEmpty (), true);
Ptr<NetDevice> dev2;
Ipv4InterfaceAddress iface2;
rt.SetOutputDevice(dev2);
rt.SetOutputDevice (dev2);
NS_TEST_ASSERT_EQUAL (rt.GetOutputDevice (), dev2);
rt.SetInterface(iface2);
NS_TEST_ASSERT_EQUAL (rt.GetInterface(), iface2);
rt.SetValidSeqNo(false);
rt.SetInterface (iface2);
NS_TEST_ASSERT_EQUAL (rt.GetInterface (), iface2);
rt.SetValidSeqNo (false);
NS_TEST_ASSERT_EQUAL (rt.GetValidSeqNo (), false);
rt.SetFlag(INVALID);
rt.SetFlag (INVALID);
NS_TEST_ASSERT_EQUAL (rt.GetFlag (), INVALID);
rt.SetFlag(IN_SEARCH);
rt.SetFlag (IN_SEARCH);
NS_TEST_ASSERT_EQUAL (rt.GetFlag (), IN_SEARCH);
rt.SetHop(12);
rt.SetHop (12);
NS_TEST_ASSERT_EQUAL (rt.GetHop (), 12);
rt.SetLifeTime(Seconds(1));
NS_TEST_ASSERT_EQUAL (rt.GetLifeTime (), Seconds(1));
rt.SetNextHop(Ipv4Address("1.1.1.1"));
rt.SetLifeTime (Seconds (1));
NS_TEST_ASSERT_EQUAL (rt.GetLifeTime (), Seconds (1));
rt.SetNextHop (Ipv4Address ("1.1.1.1"));
NS_TEST_ASSERT_EQUAL (rt.GetNextHop (), Ipv4Address ("1.1.1.1"));
rt.SetUnidirectional(true);
rt.SetUnidirectional (true);
NS_TEST_ASSERT_EQUAL (rt.IsUnidirectional (), true);
rt.SetBalcklistTimeout (Seconds(7));
NS_TEST_ASSERT_EQUAL (rt.GetBlacklistTimeout(), Seconds (7));
rt.SetRreqCnt(2);
NS_TEST_ASSERT_EQUAL (rt.GetRreqCnt(), 2);
rt.IncrementRreqCnt();
NS_TEST_ASSERT_EQUAL (rt.GetRreqCnt(), 3);
rt.Invalidate(Seconds(13));
rt.SetBalcklistTimeout (Seconds (7));
NS_TEST_ASSERT_EQUAL (rt.GetBlacklistTimeout (), Seconds (7));
rt.SetRreqCnt (2);
NS_TEST_ASSERT_EQUAL (rt.GetRreqCnt (), 2);
rt.IncrementRreqCnt ();
NS_TEST_ASSERT_EQUAL (rt.GetRreqCnt (), 3);
rt.Invalidate (Seconds (13));
NS_TEST_ASSERT_EQUAL (rt.GetFlag (), INVALID);
NS_TEST_ASSERT_EQUAL (rt.GetLifeTime (), Seconds (13));
rt.SetLifeTime(Seconds(0.1));
rt.SetLifeTime (Seconds (0.1));
NS_TEST_ASSERT_EQUAL (rt.GetLifeTime (), Seconds (0.1));
Ptr<Ipv4Route> route = rt.GetRoute();
NS_TEST_ASSERT_EQUAL (route->GetDestination(), Ipv4Address("1.2.3.4"));
Ptr<Ipv4Route> route = rt.GetRoute ();
NS_TEST_ASSERT_EQUAL (route->GetDestination (), Ipv4Address ("1.2.3.4"));
NS_TEST_ASSERT_EQUAL (rt.InsertPrecursor(Ipv4Address("10.0.0.1")), true);
NS_TEST_ASSERT_EQUAL (rt.IsPrecursorListEmpty(), false);
NS_TEST_ASSERT_EQUAL (rt.InsertPrecursor(Ipv4Address("10.0.0.2")), true);
NS_TEST_ASSERT_EQUAL (rt.InsertPrecursor(Ipv4Address("10.0.0.2")), false);
NS_TEST_ASSERT_EQUAL (rt.LookupPrecursor(Ipv4Address("10.0.0.3")), false);
NS_TEST_ASSERT_EQUAL (rt.LookupPrecursor(Ipv4Address("10.0.0.1")), true);
NS_TEST_ASSERT_EQUAL (rt.DeletePrecursor(Ipv4Address("10.0.0.2")), true);
NS_TEST_ASSERT_EQUAL (rt.LookupPrecursor(Ipv4Address("10.0.0.2")), false);
NS_TEST_ASSERT_EQUAL (rt.InsertPrecursor (Ipv4Address ("10.0.0.1")), true);
NS_TEST_ASSERT_EQUAL (rt.IsPrecursorListEmpty (), false);
NS_TEST_ASSERT_EQUAL (rt.InsertPrecursor (Ipv4Address ("10.0.0.2")), true);
NS_TEST_ASSERT_EQUAL (rt.InsertPrecursor (Ipv4Address ("10.0.0.2")), false);
NS_TEST_ASSERT_EQUAL (rt.LookupPrecursor (Ipv4Address ("10.0.0.3")), false);
NS_TEST_ASSERT_EQUAL (rt.LookupPrecursor (Ipv4Address ("10.0.0.1")), true);
NS_TEST_ASSERT_EQUAL (rt.DeletePrecursor (Ipv4Address ("10.0.0.2")), true);
NS_TEST_ASSERT_EQUAL (rt.LookupPrecursor (Ipv4Address ("10.0.0.2")), false);
std::vector<Ipv4Address> prec;
rt.GetPrecursors(prec);
NS_TEST_ASSERT_EQUAL (prec.size(), 1);
NS_TEST_ASSERT_EQUAL (rt.InsertPrecursor(Ipv4Address("10.0.0.4")), true);
NS_TEST_ASSERT_EQUAL (rt.DeletePrecursor(Ipv4Address("10.0.0.5")), false);
rt.GetPrecursors(prec);
NS_TEST_ASSERT_EQUAL (prec.size(), 2);
rt.DeleteAllPrecursors();
NS_TEST_ASSERT_EQUAL (rt.IsPrecursorListEmpty(), true);
rt.GetPrecursors(prec);
rt.GetPrecursors (prec);
NS_TEST_ASSERT_EQUAL (prec.size (), 1);
NS_TEST_ASSERT_EQUAL (rt.InsertPrecursor (Ipv4Address ("10.0.0.4")), true);
NS_TEST_ASSERT_EQUAL (rt.DeletePrecursor (Ipv4Address ("10.0.0.5")), false);
rt.GetPrecursors (prec);
NS_TEST_ASSERT_EQUAL (prec.size (), 2);
rt.DeleteAllPrecursors ();
NS_TEST_ASSERT_EQUAL (rt.IsPrecursorListEmpty (), true);
rt.GetPrecursors (prec);
NS_TEST_ASSERT_EQUAL (prec.size (), 2);
return result;
@@ -253,12 +260,13 @@ RoutingTable::RoutingTable (Time t) : m_badLinkLifetime (t)
}
bool
RoutingTable::LookupRoute (Ipv4Address id, RoutingTableEntry & rt )
RoutingTable::LookupRoute (Ipv4Address id, RoutingTableEntry & rt)
{
Purge ();
if (m_ipv4AddressEntry.empty ())
return false;
std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = m_ipv4AddressEntry.find (id);
std::map<Ipv4Address, RoutingTableEntry>::const_iterator i =
m_ipv4AddressEntry.find (id);
if (i == m_ipv4AddressEntry.end ())
return false;
rt = i->second;
@@ -266,7 +274,7 @@ RoutingTable::LookupRoute (Ipv4Address id, RoutingTableEntry & rt )
}
bool
RoutingTable::DeleteRoute (Ipv4Address dst )
RoutingTable::DeleteRoute (Ipv4Address dst)
{
Purge ();
if (m_ipv4AddressEntry.erase (dst) != 0)
@@ -275,18 +283,20 @@ RoutingTable::DeleteRoute (Ipv4Address dst )
}
bool
RoutingTable::AddRoute (RoutingTableEntry & rt )
RoutingTable::AddRoute (RoutingTableEntry & rt)
{
if (rt.GetFlag () != IN_SEARCH)
rt.SetRreqCnt (0);
std::pair<std::map<Ipv4Address, RoutingTableEntry>::iterator, bool> result = m_ipv4AddressEntry.insert (std::make_pair (rt.GetDestination (), rt));
std::pair<std::map<Ipv4Address, RoutingTableEntry>::iterator, bool> result =
m_ipv4AddressEntry.insert (std::make_pair (rt.GetDestination (), rt));
return result.second;
}
bool
RoutingTable::Update (RoutingTableEntry & rt )
RoutingTable::Update (RoutingTableEntry & rt)
{
std::map<Ipv4Address, RoutingTableEntry>::iterator i = m_ipv4AddressEntry.find (rt.GetDestination ());
std::map<Ipv4Address, RoutingTableEntry>::iterator i =
m_ipv4AddressEntry.find (rt.GetDestination ());
if (i == m_ipv4AddressEntry.end ())
return false;
i->second = rt;
@@ -296,13 +306,14 @@ RoutingTable::Update (RoutingTableEntry & rt )
}
bool
RoutingTable::SetEntryState (Ipv4Address id, RouteFlags state )
RoutingTable::SetEntryState (Ipv4Address id, RouteFlags state)
{
std::map<Ipv4Address, RoutingTableEntry>::iterator i = m_ipv4AddressEntry.find (id);
std::map<Ipv4Address, RoutingTableEntry>::iterator i =
m_ipv4AddressEntry.find (id);
if (i == m_ipv4AddressEntry.end ())
return false;
i->second.SetFlag (state);
i->second.SetRreqCnt(0);
i->second.SetRreqCnt (0);
return true;
}
@@ -311,34 +322,38 @@ RoutingTable::GetListOfDestinationWithNextHop (Ipv4Address nextHop, std::map<Ipv
{
Purge ();
unreachable.clear ();
for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end (); ++i)
if (i->second.GetNextHop () == nextHop)
{
unreachable.insert (std::make_pair (i->first, i->second.GetSeqNo ()));
}
for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i =
m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end (); ++i)
if (i->second.GetNextHop () == nextHop)
{
unreachable.insert (std::make_pair (i->first, i->second.GetSeqNo ()));
}
}
void
RoutingTable::InvalidateRoutesWithDst (const std::map<Ipv4Address, uint32_t> & unreachable )
RoutingTable::InvalidateRoutesWithDst (const std::map<Ipv4Address, uint32_t> & unreachable)
{
Purge ();
for (std::map<Ipv4Address, RoutingTableEntry>::iterator i = m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end (); ++i)
for (std::map<Ipv4Address, RoutingTableEntry>::iterator i =
m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end (); ++i)
{
for (std::map<Ipv4Address, uint32_t>::const_iterator j = unreachable.begin (); j != unreachable.end (); ++j)
for (std::map<Ipv4Address, uint32_t>::const_iterator j =
unreachable.begin (); j != unreachable.end (); ++j)
if ((i->first == j->first) && (i->second.GetFlag () == VALID))
{
NS_LOG_LOGIC ("invalidate route with dst " << i->first);
NS_LOG_LOGIC ("Invalidate route with destination address " << i->first);
i->second.Invalidate (m_badLinkLifetime);
}
}
}
void
RoutingTable::DeleteAllRoutesFromInterface (Ipv4InterfaceAddress iface)
{
if (m_ipv4AddressEntry.empty ()) return;
for (std::map<Ipv4Address, RoutingTableEntry>::iterator i = m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end ();)
if (m_ipv4AddressEntry.empty ())
return;
for (std::map<Ipv4Address, RoutingTableEntry>::iterator i =
m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end ();)
{
if (i->second.GetInterface () == iface)
{
@@ -346,7 +361,8 @@ RoutingTable::DeleteAllRoutesFromInterface (Ipv4InterfaceAddress iface)
++i;
m_ipv4AddressEntry.erase (tmp);
}
else ++i;
else
++i;
}
}
@@ -355,7 +371,8 @@ RoutingTable::Purge ()
{
if (m_ipv4AddressEntry.empty ())
return;
for (std::map<Ipv4Address, RoutingTableEntry>::iterator i = m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end ();)
for (std::map<Ipv4Address, RoutingTableEntry>::iterator i =
m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end ();)
{
if (i->second.GetLifeTime () < Seconds (0))
{
@@ -367,9 +384,8 @@ RoutingTable::Purge ()
}
else if (i->second.GetFlag () == VALID)
{
NS_LOG_LOGIC ("invalidate route with dst " << i->first );
NS_LOG_LOGIC ("Invalidate route with destination address " << i->first);
i->second.Invalidate (m_badLinkLifetime);
NS_LOG_LOGIC (Simulator::Now().GetSeconds());
++i;
}
else
@@ -380,23 +396,26 @@ RoutingTable::Purge ()
}
bool
RoutingTable::MarkLinkAsUinidirectional (Ipv4Address neighbor, Time blacklistTimeout )
RoutingTable::MarkLinkAsUinidirectional (Ipv4Address neighbor, Time blacklistTimeout)
{
std::map<Ipv4Address, RoutingTableEntry>::iterator i = m_ipv4AddressEntry.find (neighbor);
std::map<Ipv4Address, RoutingTableEntry>::iterator i =
m_ipv4AddressEntry.find (neighbor);
if (i == m_ipv4AddressEntry.end ())
return false;
i->second.SetUnidirectional (true);
i->second.SetBalcklistTimeout (blacklistTimeout);
i->second.SetRreqCnt(0);
i->second.SetRreqCnt (0);
return true;
}
void
RoutingTable::Print (std::ostream &os )
RoutingTable::Print (std::ostream &os)
{
Purge ();
os << "\nAODV Routing table\n" << "Destination\tGateway\t\tInterface\tFlag\tExpire\tHops\n";
for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end (); ++i)
os << "\nAODV Routing table\n"
<< "Destination\tGateway\t\tInterface\tFlag\tExpire\tHops\n";
for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i =
m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end (); ++i)
{
i->second.Print (os);
}
@@ -419,10 +438,10 @@ static AodvRtableTest g_AodvRtableTest;
bool
AodvRtableTest::RunTests ()
{
RoutingTable rtable (Seconds(2));
NS_TEST_ASSERT_EQUAL (rtable.GetBadLinkLifetime(), Seconds(2));
rtable.SetBadLinkLifetime(Seconds(1));
NS_TEST_ASSERT_EQUAL (rtable.GetBadLinkLifetime(), Seconds(1));
RoutingTable rtable (Seconds (2));
NS_TEST_ASSERT_EQUAL (rtable.GetBadLinkLifetime (), Seconds (2));
rtable.SetBadLinkLifetime (Seconds (1));
NS_TEST_ASSERT_EQUAL (rtable.GetBadLinkLifetime (), Seconds (1));
Ptr<NetDevice> dev;
Ipv4InterfaceAddress iface;
RoutingTableEntry rt (/*output device*/dev, /*dst*/Ipv4Address("1.2.3.4"), /*validSeqNo*/true, /*seqNo*/10,
@@ -432,37 +451,36 @@ AodvRtableTest::RunTests ()
RoutingTableEntry rt2 (/*output device*/dev, /*dst*/Ipv4Address("4.3.2.1"), /*validSeqNo*/false, /*seqNo*/0,
/*interface*/iface, /*hop*/15, /*next hop*/Ipv4Address("1.1.1.1"), /*lifetime*/Seconds(1));
NS_TEST_ASSERT_EQUAL (rtable.AddRoute (rt2), true);
NS_TEST_ASSERT_EQUAL (rtable.LookupRoute(rt2.GetDestination(), rt), true);
NS_TEST_ASSERT_EQUAL (rtable.LookupRoute (rt2.GetDestination (), rt), true);
NS_TEST_ASSERT_EQUAL (rt2.GetDestination (), rt.GetDestination ());
rt.SetHop(20);
rt.InsertPrecursor(Ipv4Address("10.0.0.3"));
rt.SetHop (20);
rt.InsertPrecursor (Ipv4Address ("10.0.0.3"));
NS_TEST_ASSERT_EQUAL (rtable.Update (rt), true);
RoutingTableEntry rt3;
NS_TEST_ASSERT_EQUAL (rtable.LookupRoute(Ipv4Address("10.0.0.1"), rt), false);
NS_TEST_ASSERT_EQUAL (rtable.LookupRoute (Ipv4Address ("10.0.0.1"), rt), false);
NS_TEST_ASSERT_EQUAL (rtable.Update (rt3), false);
NS_TEST_ASSERT_EQUAL (rtable.SetEntryState(Ipv4Address("10.0.0.1"), INVALID), false);
NS_TEST_ASSERT_EQUAL (rtable.SetEntryState(Ipv4Address("1.2.3.4"), IN_SEARCH), true);
NS_TEST_ASSERT_EQUAL (rtable.DeleteRoute(Ipv4Address("5.5.5.5")), false);
RoutingTableEntry rt4 (/*output device*/dev, /*dst*/Ipv4Address("5.5.5.5"), /*validSeqNo*/false, /*seqNo*/0,
/*interface*/iface, /*hop*/15, /*next hop*/Ipv4Address("1.1.1.1"), /*lifetime*/Seconds(-10));
NS_TEST_ASSERT_EQUAL (rtable.SetEntryState (Ipv4Address ("10.0.0.1"), INVALID), false);
NS_TEST_ASSERT_EQUAL (rtable.SetEntryState (Ipv4Address ("1.2.3.4"), IN_SEARCH), true);
NS_TEST_ASSERT_EQUAL (rtable.DeleteRoute (Ipv4Address ("5.5.5.5")), false);
RoutingTableEntry rt4 (/*output device*/dev, /*dst*/Ipv4Address ("5.5.5.5"), /*validSeqNo*/false, /*seqNo*/0,
/*interface*/iface, /*hop*/15, /*next hop*/Ipv4Address ("1.1.1.1"), /*lifetime*/Seconds (-10));
NS_TEST_ASSERT_EQUAL (rtable.AddRoute (rt4), true);
NS_TEST_ASSERT_EQUAL (rtable.SetEntryState(Ipv4Address("5.5.5.5"), INVALID), true);
NS_TEST_ASSERT_EQUAL (rtable.LookupRoute(Ipv4Address("5.5.5.5"), rt), false);
NS_TEST_ASSERT_EQUAL (rtable.MarkLinkAsUinidirectional(Ipv4Address("1.2.3.4"), Seconds(2)), true);
NS_TEST_ASSERT_EQUAL (rtable.LookupRoute(Ipv4Address("1.2.3.4"), rt), true);
NS_TEST_ASSERT_EQUAL (rt.IsUnidirectional(), true);
rt.SetLifeTime(Seconds(-5));
NS_TEST_ASSERT_EQUAL (rtable.SetEntryState (Ipv4Address ("5.5.5.5"), INVALID), true);
NS_TEST_ASSERT_EQUAL (rtable.LookupRoute (Ipv4Address ("5.5.5.5"), rt), false);
NS_TEST_ASSERT_EQUAL (rtable.MarkLinkAsUinidirectional (Ipv4Address ("1.2.3.4"), Seconds (2)), true);
NS_TEST_ASSERT_EQUAL (rtable.LookupRoute (Ipv4Address ("1.2.3.4"), rt), true);
NS_TEST_ASSERT_EQUAL (rt.IsUnidirectional (), true);
rt.SetLifeTime (Seconds (-5));
NS_TEST_ASSERT_EQUAL (rtable.Update (rt), true);
std::map<Ipv4Address, uint32_t> unreachable;
rtable.GetListOfDestinationWithNextHop (Ipv4Address("1.1.1.1"), unreachable);
NS_TEST_ASSERT_EQUAL (unreachable.size (), 1);
unreachable.insert (std::make_pair(Ipv4Address("4.3.2.1"), 3));
rtable.InvalidateRoutesWithDst(unreachable);
NS_TEST_ASSERT_EQUAL (rtable.LookupRoute(Ipv4Address("4.3.2.1"), rt), true);
NS_TEST_ASSERT_EQUAL (rt.GetFlag(), INVALID);
NS_TEST_ASSERT_EQUAL (rtable.DeleteRoute(Ipv4Address("1.2.3.4")), true);
NS_TEST_ASSERT_EQUAL (rtable.DeleteRoute(Ipv4Address("1.2.3.4")), false);
rtable.GetListOfDestinationWithNextHop (Ipv4Address ("1.1.1.1"), unreachable);
NS_TEST_ASSERT_EQUAL (unreachable.size (), 2);
unreachable.insert (std::make_pair (Ipv4Address ("4.3.2.1"), 3));
rtable.InvalidateRoutesWithDst (unreachable);
NS_TEST_ASSERT_EQUAL (rtable.LookupRoute (Ipv4Address ("4.3.2.1"), rt), true);
NS_TEST_ASSERT_EQUAL (rt.GetFlag (), INVALID);
NS_TEST_ASSERT_EQUAL (rtable.DeleteRoute (Ipv4Address ("1.2.3.4")), true);
NS_TEST_ASSERT_EQUAL (rtable.DeleteRoute (Ipv4Address ("1.2.3.4")), false);
return result;
}

View File

@@ -59,11 +59,12 @@ enum RouteFlags
class RoutingTableEntry
{
public:
RoutingTableEntry(Ptr<NetDevice> dev = 0,Ipv4Address dst = Ipv4Address(), bool vSeqNo = false, u_int32_t m_seqNo = 0,
Ipv4InterfaceAddress iface = Ipv4InterfaceAddress(), u_int16_t hops = 0,
Ipv4Address nextHop = Ipv4Address(), Time lifetime = Simulator::Now());
/// c-to
RoutingTableEntry (Ptr<NetDevice> dev = 0,Ipv4Address dst = Ipv4Address(), bool vSeqNo = false, u_int32_t m_seqNo = 0,
Ipv4InterfaceAddress iface = Ipv4InterfaceAddress(), u_int16_t hops = 0,
Ipv4Address nextHop = Ipv4Address(), Time lifetime = Simulator::Now());
~RoutingTableEntry();
~RoutingTableEntry ();
///\name Precursors management
//\{
@@ -72,70 +73,71 @@ public:
* \param id precursor address
* \return true on success
*/
bool InsertPrecursor(Ipv4Address id);
bool InsertPrecursor (Ipv4Address id);
/**
* Lookup precursor by address
* \param id precursor address
* \return true on success
*/
bool LookupPrecursor(Ipv4Address id);
bool LookupPrecursor (Ipv4Address id);
/**
* \brief Delete precursor
* \param id precursor address
* \return true on success
*/
bool DeletePrecursor(Ipv4Address id);
bool DeletePrecursor (Ipv4Address id);
/// Delete all precursors
void DeleteAllPrecursors();
void DeleteAllPrecursors ();
/**
* Check that precursor list empty
* \return true if precursor list empty
*/
bool IsPrecursorListEmpty() const;
bool IsPrecursorListEmpty () const;
/**
* Inserts precursors in vector prec if they does not yet exist in vector
*/
void GetPrecursors(std::vector<Ipv4Address> & prec) const;
void GetPrecursors (std::vector<Ipv4Address> & prec) const;
//\}
/// Mark entry as "down" (i.e. disable it)
void Invalidate (Time badLinkLifetime);
///\name Fields
//\{
Ipv4Address GetDestination() const { return m_ipv4Route->GetDestination(); }
Ptr<Ipv4Route> GetRoute() const { return m_ipv4Route; }
void SetRoute(Ptr<Ipv4Route> r) { m_ipv4Route = r; }
Ipv4Address GetDestination () const { return m_ipv4Route->GetDestination(); }
Ptr<Ipv4Route> GetRoute () const { return m_ipv4Route; }
void SetRoute (Ptr<Ipv4Route> r) { m_ipv4Route = r; }
void SetNextHop (Ipv4Address nextHop) { m_ipv4Route->SetGateway(nextHop); }
Ipv4Address GetNextHop () const { return m_ipv4Route->GetGateway(); }
void SetOutputDevice(Ptr<NetDevice> dev) { m_ipv4Route->SetOutputDevice(dev); }
Ptr<NetDevice> GetOutputDevice() const { return m_ipv4Route->GetOutputDevice(); }
Ipv4InterfaceAddress GetInterface() const { return m_iface;}
void SetOutputDevice (Ptr<NetDevice> dev) { m_ipv4Route->SetOutputDevice(dev); }
Ptr<NetDevice> GetOutputDevice () const { return m_ipv4Route->GetOutputDevice(); }
Ipv4InterfaceAddress GetInterface () const { return m_iface;}
void SetInterface (Ipv4InterfaceAddress iface) { m_iface = iface; }
void SetValidSeqNo(bool s) { m_validSeqNo = s; }
bool GetValidSeqNo() const { return m_validSeqNo; }
void SetSeqNo(uint32_t sn) { m_seqNo = sn; }
uint32_t GetSeqNo() const { return m_seqNo; }
void SetHop(uint16_t hop) { m_hops = hop; }
uint16_t GetHop() const {return m_hops; }
void SetLifeTime(Time lt) { m_lifeTime = lt + Simulator::Now(); }
Time GetLifeTime() const { return m_lifeTime - Simulator::Now(); }
void SetFlag(RouteFlags flag) { m_flag = flag; }
RouteFlags GetFlag() const { return m_flag; }
void SetRreqCnt(uint8_t n) { m_reqCount = n; }
uint8_t GetRreqCnt() const { return m_reqCount; }
void IncrementRreqCnt() { m_reqCount++; }
void SetUnidirectional(bool u) { m_blackListState = u; }
void SetValidSeqNo (bool s) { m_validSeqNo = s; }
bool GetValidSeqNo () const { return m_validSeqNo; }
void SetSeqNo (uint32_t sn) { m_seqNo = sn; }
uint32_t GetSeqNo () const { return m_seqNo; }
void SetHop (uint16_t hop) { m_hops = hop; }
uint16_t GetHop () const {return m_hops; }
void SetLifeTime (Time lt) { m_lifeTime = lt + Simulator::Now(); }
Time GetLifeTime () const { return m_lifeTime - Simulator::Now(); }
void SetFlag (RouteFlags flag) { m_flag = flag; }
RouteFlags GetFlag () const { return m_flag; }
void SetRreqCnt (uint8_t n) { m_reqCount = n; }
uint8_t GetRreqCnt () const { return m_reqCount; }
void IncrementRreqCnt () { m_reqCount++; }
void SetUnidirectional (bool u) { m_blackListState = u; }
bool IsUnidirectional () const { return m_blackListState; }
void SetBalcklistTimeout (Time t) { m_blackListTimeout = t; }
Time GetBlacklistTimeout () { return m_blackListTimeout; }
Time GetBlacklistTimeout () const { return m_blackListTimeout; }
//\}
/**
* \brief Compare destination address
* \return true if equal
*/
bool operator==(Ipv4Address const dst) const
bool operator== (Ipv4Address const dst) const
{
return (m_ipv4Route->GetDestination() == dst);
return (m_ipv4Route->GetDestination () == dst);
}
void Print(std::ostream & os) const;
@@ -162,7 +164,7 @@ private:
Ptr<Ipv4Route> m_ipv4Route;
/// Output interface address
Ipv4InterfaceAddress m_iface;
/// Routing flags: down, up or in repair
/// Routing flags: valid, invalid or in search
RouteFlags m_flag;
/// List of precursors
@@ -173,6 +175,7 @@ private:
uint8_t m_reqCount;
/// Indicate if this entry is in "blacklist"
bool m_blackListState;
/// Time for which the node is put into the blacklist
Time m_blackListTimeout;
public:
/// RREP_ACK timer
@@ -186,7 +189,8 @@ public:
class RoutingTable
{
public:
RoutingTable(Time t);
/// c-tor
RoutingTable (Time t);
///\name Handle life time of invalid route
//\{
Time GetBadLinkLifetime () const { return m_badLinkLifetime; }
@@ -197,27 +201,25 @@ public:
* \param r routing table entry
* \return true in success
*/
bool AddRoute(RoutingTableEntry & r);
bool AddRoute (RoutingTableEntry & r);
/**
* Delete routing table entry
* Delete routing table entry with destination address dst, if it exists.
* \param dst destination address
* \return true on success
*/
bool DeleteRoute(Ipv4Address dst);
bool DeleteRoute (Ipv4Address dst);
/**
* Lookup routing table entry
* Lookup routing table entry with destination address dst
* \param dst destination address
* \param rt entry with destination address dst, if exists
* \return true on success
*/
bool LookupRoute(Ipv4Address dst, RoutingTableEntry & rt);
bool LookupRoute (Ipv4Address dst, RoutingTableEntry & rt);
/// Update routing table
bool Update(RoutingTableEntry & rt);
bool Update (RoutingTableEntry & rt);
/// Set routing table entry flags
bool SetEntryState (Ipv4Address dst, RouteFlags state /*TODO use enum*/);
/**
* Lookup valid routing entries with next hop Address dst and not empty list of precursors.
*/
bool SetEntryState (Ipv4Address dst, RouteFlags state);
/// Lookup routing entries with next hop Address dst and not empty list of precursors.
void GetListOfDestinationWithNextHop (Ipv4Address nextHop, std::map<Ipv4Address, uint32_t> & unreachable);
/**
* Update routing entries with this destinations as follows:
@@ -229,6 +231,7 @@ public:
void InvalidateRoutesWithDst (std::map<Ipv4Address, uint32_t> const & unreachable);
/// Delete all route from interface with address iface
void DeleteAllRoutesFromInterface (Ipv4InterfaceAddress iface);
/// Delete all entries from routing table
void Clear () { m_ipv4AddressEntry.clear (); }
/// Delete all outdated entries and invalidate valid entry if Lifetime is expired
void Purge ();
@@ -242,6 +245,7 @@ public:
private:
std::map<Ipv4Address, RoutingTableEntry> m_ipv4AddressEntry;
/// Deletion time for invalid routes
Time m_badLinkLifetime;
};

View File

@@ -34,7 +34,7 @@ namespace ns3
namespace aodv
{
void
IdCache::InsertId (Ipv4Address addr, uint32_t id, Time saveTime )
IdCache::InsertId (Ipv4Address addr, uint32_t id, Time saveTime)
{
if (LookupId (addr, id))
return;
@@ -43,10 +43,11 @@ IdCache::InsertId (Ipv4Address addr, uint32_t id, Time saveTime )
m_idCache.push_back (uniqueId);
}
bool
IdCache::LookupId (Ipv4Address addr, uint32_t id )
IdCache::LookupId (Ipv4Address addr, uint32_t id)
{
Purge ();
for (std::vector<UniqueId>::const_iterator i = m_idCache.begin (); i != m_idCache.end (); ++i)
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;
return false;
@@ -54,7 +55,8 @@ IdCache::LookupId (Ipv4Address addr, uint32_t id )
void
IdCache::Purge ()
{
m_idCache.erase (remove_if (m_idCache.begin (), m_idCache.end (), IsExpired ()), m_idCache.end ());
m_idCache.erase (remove_if (m_idCache.begin (), m_idCache.end (),
IsExpired ()), m_idCache.end ());
}
uint32_t
@@ -68,7 +70,8 @@ IdCache::GetSize ()
/// Unit test for id cache
struct IdCacheTest : public Test
{
IdCacheTest () : Test ("AODV/IdCache"), result(true) {}
IdCacheTest () : Test ("AODV/IdCache"), result(true)
{}
virtual bool RunTests();
void CheckTimeout1 ();
void CheckTimeout2 ();
@@ -84,14 +87,14 @@ static IdCacheTest g_IdCacheTest;
bool
IdCacheTest::RunTests ()
{
cache.InsertId(Ipv4Address ("1.2.3.4"), 3, Seconds(5));
cache.InsertId (Ipv4Address ("1.2.3.4"), 3, Seconds(5));
NS_TEST_ASSERT_EQUAL (cache.LookupId (Ipv4Address ("1.2.3.4"), 4), false);
NS_TEST_ASSERT_EQUAL (cache.LookupId (Ipv4Address ("4.3.2.1"), 3), false);
NS_TEST_ASSERT_EQUAL (cache.LookupId (Ipv4Address ("1.2.3.4"), 3), true);
cache.InsertId(Ipv4Address ("1.1.1.1"), 4, Seconds(5));
cache.InsertId(Ipv4Address ("1.1.1.1"), 4, Seconds(5));
cache.InsertId(Ipv4Address ("2.2.2.2"), 5, Seconds(16));
cache.InsertId(Ipv4Address ("3.3.3.3"), 6, Seconds(27));
cache.InsertId (Ipv4Address ("1.1.1.1"), 4, Seconds(5));
cache.InsertId (Ipv4Address ("1.1.1.1"), 4, Seconds(5));
cache.InsertId (Ipv4Address ("2.2.2.2"), 5, Seconds(16));
cache.InsertId (Ipv4Address ("3.3.3.3"), 6, Seconds(27));
NS_TEST_ASSERT_EQUAL (cache.GetSize (), 4);
Simulator::Schedule (Seconds(1), &IdCacheTest::CheckTimeout1, this);

View File

@@ -55,7 +55,8 @@ public:
/// Remove all expired entries
void Purge ();
/// Return number of entries in cache
uint32_t GetSize ();
uint32_t
GetSize ();
private:
struct UniqueId
{
@@ -65,8 +66,7 @@ private:
};
struct IsExpired
{
bool
operator() (const struct UniqueId & u ) const
bool operator() (const struct UniqueId & u) const
{
return (u.m_expire < Simulator::Now ());
}