From cf5bd2898a19ec9295854fd08e8ebc32cf33a589 Mon Sep 17 00:00:00 2001 From: Borovkova Elena Date: Mon, 17 Aug 2009 12:15:55 +0400 Subject: [PATCH] RoutingProtocol::NotifyInterfaceDown added --- src/routing/aodv/aodv-neighbor.h | 2 + src/routing/aodv/aodv-routing-protocol.cc | 56 +++++++++++------------ src/routing/aodv/aodv-routing-protocol.h | 2 - src/routing/aodv/aodv-rtable.cc | 16 +++++++ src/routing/aodv/aodv-rtable.h | 3 ++ 5 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/routing/aodv/aodv-neighbor.h b/src/routing/aodv/aodv-neighbor.h index 46fcc7e45..22031d104 100644 --- a/src/routing/aodv/aodv-neighbor.h +++ b/src/routing/aodv/aodv-neighbor.h @@ -67,6 +67,8 @@ public: void Purge (); /// Schedule m_ntimer. void ScheduleTimer (); + /// Remove all entries + void Clear () { m_nb.clear (); } ///\name Handle link failure callback //\{ void SetCallback (Callback cb) { m_handleLinleFailure = cb;} diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index 24797ff09..d2dd6cb5b 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -90,7 +90,6 @@ RoutingProtocol::RoutingProtocol () : m_nb(HelloInterval), m_repairedDst (Ipv4Address ()), htimer (Timer::CANCEL_ON_DESTROY), - rtimer (Timer::CANCEL_ON_DESTROY), lrtimer (Timer::CANCEL_ON_DESTROY) { @@ -211,30 +210,6 @@ RoutingProtocol::DoDispose () void RoutingProtocol::Start () { - // Open sockets for control traffic on each IP interface - const Ipv4Address loopback ("127.0.0.1"); - for (uint32_t i = 0; i < m_ipv4->GetNInterfaces (); i++) - { - Ipv4InterfaceAddress iface = m_ipv4->GetAddress (i, 0); - if (iface.GetLocal () == loopback) - continue; - - // Create a socket to listen only on this interface - Ptr l3 = m_ipv4->GetObject (); - Ptr socket = l3->CreateRawSocket2(); - NS_ASSERT (socket != 0); - socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); - socket->Bind(InetSocketAddress (iface.GetLocal(), AODV_PORT)); - socket->Connect (InetSocketAddress (iface.GetBroadcast(), AODV_PORT)); - m_socketAddresses.insert (std::make_pair (socket, iface)); - - // Add local broadcast record to the routing table - Ptr dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (iface.GetLocal ())); - RoutingTableEntry rt (/*device=*/dev, /*dst=*/iface.GetBroadcast (), /*know seqno=*/true, /*seqno=*/0, /*iface=*/iface, - /*hops=*/1, /*next hop=*/iface.GetBroadcast (), /*lifetime=*/Seconds (1e9)); // TODO use infty - m_routingTable.AddRoute (rt); - } - m_scb = MakeCallback (&RoutingProtocol::Send, this); m_ecb = MakeCallback (&RoutingProtocol::Drop, this); @@ -248,6 +223,13 @@ Ptr RoutingProtocol::RouteOutput (Ptr p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr ) { NS_LOG_FUNCTION (this << p->GetUid() << header.GetDestination()); + if (m_socketAddresses.empty ()) + { + sockerr = Socket::ERROR_NOROUTETOHOST; + NS_LOG_LOGIC ("No aodv interfaces"); + Ptr route; + return route; + } sockerr = Socket::ERROR_NOTERROR; Ptr route; Ipv4Address dst = header.GetDestination (); @@ -295,7 +277,11 @@ RoutingProtocol::RouteInput (Ptr p, const Ipv4Header &header, Ptr< MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb ) { NS_LOG_FUNCTION (this << p->GetUid() << header.GetDestination() << idev->GetAddress()); - + if (m_socketAddresses.empty ()) + { + NS_LOG_LOGIC ("No aodv interfaces"); + return false; + } NS_ASSERT (m_ipv4 != 0); // Check if input device supports IP NS_ASSERT (m_ipv4->GetInterfaceForDevice (idev) >= 0); @@ -458,10 +444,20 @@ void RoutingProtocol::NotifyInterfaceDown (uint32_t i ) { NS_LOG_FUNCTION (this << m_ipv4->GetAddress (i, 0).GetLocal ()); -// Ptr socket = FindSocketWithInterfaceAddress (m_ipv4->GetAddress (i, 0)); -// m_socketAddresses.erase (socket); -// m_routingTable.DeleteAllRouteFromInterface (m_ipv4->GetAddress (i, 0)); - // TODO + Ptr socket = FindSocketWithInterfaceAddress (m_ipv4->GetAddress (i, 0)); + NS_ASSERT (socket); + socket->Close (); + m_socketAddresses.erase (socket); + if (m_socketAddresses.empty ()) + { + NS_LOG_LOGIC ("No aodv interfaces"); + htimer.Cancel (); + lrtimer.Cancel (); + m_nb.Clear (); + m_routingTable.Clear (); + return; + } + m_routingTable.DeleteAllRoutesFromInterface (m_ipv4->GetAddress (i, 0)); } void diff --git a/src/routing/aodv/aodv-routing-protocol.h b/src/routing/aodv/aodv-routing-protocol.h index df4876b12..3a648fd8b 100644 --- a/src/routing/aodv/aodv-routing-protocol.h +++ b/src/routing/aodv/aodv-routing-protocol.h @@ -247,8 +247,6 @@ private: //\{ Timer htimer; // TODO independent hello timers for all interfaces void HelloTimerExpire (); - Timer rtimer; - void RouteCacheTimerExpire (); Timer lrtimer; void LocalRepairTimerExpire (); std::map m_addressReqTimer; diff --git a/src/routing/aodv/aodv-rtable.cc b/src/routing/aodv/aodv-rtable.cc index b06ca3f0a..06350eedc 100644 --- a/src/routing/aodv/aodv-rtable.cc +++ b/src/routing/aodv/aodv-rtable.cc @@ -345,6 +345,22 @@ RoutingTable::InvalidateRoutesWithDst (const std::map & u } +void +RoutingTable::DeleteAllRoutesFromInterface (Ipv4InterfaceAddress iface) +{ + if (m_ipv4AddressEntry.empty ()) return; + for (std::map::iterator i = m_ipv4AddressEntry.begin (); i != m_ipv4AddressEntry.end ();) + { + if (i->second.GetInterface () == iface) + { + std::map::iterator tmp = i; + ++i; + m_ipv4AddressEntry.erase (tmp); + } + else ++i; + } +} + void RoutingTable::Purge () { diff --git a/src/routing/aodv/aodv-rtable.h b/src/routing/aodv/aodv-rtable.h index 5d73b5184..3e9009694 100644 --- a/src/routing/aodv/aodv-rtable.h +++ b/src/routing/aodv/aodv-rtable.h @@ -229,6 +229,9 @@ public: * 3. The Lifetime field is updated to current time plus DELETE_PERIOD. */ void InvalidateRoutesWithDst (std::map const & unreachable); + /// Delete all route from interface with address iface + void DeleteAllRoutesFromInterface (Ipv4InterfaceAddress iface); + void Clear () { m_ipv4AddressEntry.clear (); } /// Delete all outdated entries and invalidate valid entry if Lifetime is expired void Purge (); /** Mark entry as unidirectional (e.g. add this neighbor to "blacklist" for blacklistTimeout period)