diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index 44c63bf61..bc85777e2 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -274,23 +274,20 @@ RoutingProtocol::RouteOutput (Ptr p, const Ipv4Header &header, Ptr route; Ipv4Address dst = header.GetDestination (); RoutingTableEntry rt; - if (m_routingTable.LookupRoute (dst, rt)) + if (m_routingTable.LookupValidRoute (dst, rt)) { - if (rt.GetFlag () == VALID) + route = rt.GetRoute (); + NS_ASSERT (route != 0); + NS_LOG_DEBUG ("Exist route to " << route->GetDestination() << " from interface " << route->GetSource()); + if (oif != 0 && route->GetOutputDevice () != oif) { - route = rt.GetRoute (); - NS_ASSERT (route != 0); - NS_LOG_DEBUG ("Exist route to " << route->GetDestination() << " from interface " << route->GetSource()); - if (oif != 0 && route->GetOutputDevice () != oif) - { - NS_LOG_DEBUG ("Output device doesn't match. Dropped."); - sockerr = Socket::ERROR_NOROUTETOHOST; - return Ptr (); - } - UpdateRouteLifeTime (dst, ActiveRouteTimeout); - UpdateRouteLifeTime (route->GetGateway (), ActiveRouteTimeout); - return route; + NS_LOG_DEBUG ("Output device doesn't match. Dropped."); + sockerr = Socket::ERROR_NOROUTETOHOST; + return Ptr (); } + UpdateRouteLifeTime (dst, ActiveRouteTimeout); + UpdateRouteLifeTime (route->GetGateway (), ActiveRouteTimeout); + return route; } // Valid route not found, in this case we return loopback. @@ -403,7 +400,7 @@ RoutingProtocol::RouteInput (Ptr p, const Ipv4Header &header, { UpdateRouteLifeTime (origin, ActiveRouteTimeout); RoutingTableEntry toOrigin; - if (m_routingTable.LookupRoute (origin, toOrigin)) + if (m_routingTable.LookupValidRoute (origin, toOrigin)) { UpdateRouteLifeTime (toOrigin.GetNextHop (), ActiveRouteTimeout); m_nb.Update (toOrigin.GetNextHop (), ActiveRouteTimeout); @@ -1159,7 +1156,7 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Address receiver, Ipv4Address sen } RoutingTableEntry toOrigin; - if (!m_routingTable.LookupRoute (rrepHeader.GetOrigin (), toOrigin)) + if (! m_routingTable.LookupRoute (rrepHeader.GetOrigin (), toOrigin) || toOrigin.GetFlag () == IN_SEARCH) { return; // Impossible! drop. } @@ -1167,23 +1164,25 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Address receiver, Ipv4Address sen m_routingTable.Update (toOrigin); // Update information about precursors - m_routingTable.LookupRoute (rrepHeader.GetDst (), toDst); - toDst.InsertPrecursor (toOrigin.GetNextHop ()); - m_routingTable.Update (toDst); + if (m_routingTable.LookupValidRoute (rrepHeader.GetDst (), toDst)) + { + toDst.InsertPrecursor (toOrigin.GetNextHop ()); + m_routingTable.Update (toDst); - RoutingTableEntry toNextHopToDst; - m_routingTable.LookupRoute (toDst.GetNextHop (), toNextHopToDst); - toNextHopToDst.InsertPrecursor (toOrigin.GetNextHop ()); - m_routingTable.Update (toNextHopToDst); + RoutingTableEntry toNextHopToDst; + m_routingTable.LookupRoute (toDst.GetNextHop (), toNextHopToDst); + toNextHopToDst.InsertPrecursor (toOrigin.GetNextHop ()); + m_routingTable.Update (toNextHopToDst); - toOrigin.InsertPrecursor (toDst.GetNextHop ()); - m_routingTable.Update (toOrigin); - - RoutingTableEntry toNextHopToOrigin; - m_routingTable.LookupRoute (toOrigin.GetNextHop (), toNextHopToOrigin); - toNextHopToOrigin.InsertPrecursor (toDst.GetNextHop ()); - m_routingTable.Update (toNextHopToOrigin); + toOrigin.InsertPrecursor (toDst.GetNextHop ()); + m_routingTable.Update (toOrigin); + RoutingTableEntry toNextHopToOrigin; + m_routingTable.LookupRoute (toOrigin.GetNextHop (), toNextHopToOrigin); + toNextHopToOrigin.InsertPrecursor (toDst.GetNextHop ()); + m_routingTable.Update (toNextHopToOrigin); + } + Ptr packet = Create (); packet->AddHeader (rrepHeader); TypeHeader tHeader (AODVTYPE_RREP); @@ -1305,8 +1304,7 @@ RoutingProtocol::RouteRequestTimerExpire (Ipv4Address dst) { NS_LOG_LOGIC(this); RoutingTableEntry toDst; - m_routingTable.LookupRoute (dst, toDst); - if (toDst.GetFlag () == VALID) + if (m_routingTable.LookupValidRoute (dst, toDst)) { SendPacketFromQueue (dst, toDst.GetRoute ()); NS_LOG_LOGIC ("route to " << dst << " found"); @@ -1471,18 +1469,14 @@ RoutingProtocol::SendRerrWhenNoRouteToForward (Ipv4Address dst, Ptr packet = Create (); packet->AddHeader (rerrHeader); packet->AddHeader (TypeHeader (AODVTYPE_RERR)); - if (m_routingTable.LookupRoute (origin, toOrigin)) + if (m_routingTable.LookupValidRoute (origin, toOrigin)) { - if (toOrigin.GetFlag () == VALID) - { - Ptr socket = FindSocketWithInterfaceAddress ( - toOrigin.GetInterface ()); - NS_ASSERT (socket); - NS_LOG_LOGIC ("Unicast RERR to the source of the data transmission"); - socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); - } - - } + Ptr socket = FindSocketWithInterfaceAddress ( + toOrigin.GetInterface ()); + NS_ASSERT (socket); + NS_LOG_LOGIC ("Unicast RERR to the source of the data transmission"); + socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); + } else { for (std::map , Ipv4InterfaceAddress>::const_iterator i = @@ -1511,40 +1505,26 @@ RoutingProtocol::SendRerrMessage (Ptr packet, std::vector p if (precursors.size () == 1) { RoutingTableEntry toPrecursor; - if (!m_routingTable.LookupRoute (precursors.front (), toPrecursor)) - return; - Ptr socket = FindSocketWithInterfaceAddress (toPrecursor.GetInterface ()); - NS_ASSERT (socket); - if (toPrecursor.GetFlag () == VALID) + if (m_routingTable.LookupValidRoute (precursors.front (), toPrecursor)) { + Ptr socket = FindSocketWithInterfaceAddress (toPrecursor.GetInterface ()); + NS_ASSERT (socket); NS_LOG_LOGIC ("one precursor => unicast RERR to " << toPrecursor.GetDestination() << " from " << toPrecursor.GetInterface ().GetLocal ()); socket->SendTo (packet, 0, InetSocketAddress (precursors.front (), AODV_PORT)); } - else - NS_LOG_LOGIC ("One precursor, but no valid route to this precursor"); return; } // Should only transmit RERR on those interfaces which have precursor nodes for the broken route std::vector ifaces; RoutingTableEntry toPrecursor; - for (std::vector::const_iterator i = precursors.begin (); i - != precursors.end (); ++i) + for (std::vector::const_iterator i = precursors.begin (); i != precursors.end (); ++i) { - if (!m_routingTable.LookupRoute (*i, toPrecursor)) - break; - bool result = true; - for (std::vector::const_iterator i = - ifaces.begin (); i != ifaces.end (); ++i) + if (m_routingTable.LookupValidRoute (*i, toPrecursor) && + std::find (ifaces.begin (), ifaces.end (), toPrecursor.GetInterface ()) == ifaces.end ()) { - if (*i == toPrecursor.GetInterface ()) - { - result = false; - break; - } + ifaces.push_back (toPrecursor.GetInterface ()); } - if (result) - ifaces.push_back (toPrecursor.GetInterface ()); } for (std::vector::const_iterator i = ifaces.begin (); i != ifaces.end (); ++i) diff --git a/src/routing/aodv/aodv-rtable.cc b/src/routing/aodv/aodv-rtable.cc index f196f8485..3bec99e30 100644 --- a/src/routing/aodv/aodv-rtable.cc +++ b/src/routing/aodv/aodv-rtable.cc @@ -187,6 +187,14 @@ RoutingTable::LookupRoute (Ipv4Address id, RoutingTableEntry & rt) return true; } +bool +RoutingTable::LookupValidRoute (Ipv4Address id, RoutingTableEntry & rt) +{ + if (! LookupRoute (id, rt)) + return false; + return (rt.GetFlag () == VALID); +} + bool RoutingTable::DeleteRoute (Ipv4Address dst) { diff --git a/src/routing/aodv/aodv-rtable.h b/src/routing/aodv/aodv-rtable.h index 32c04d2a4..a2350a78e 100644 --- a/src/routing/aodv/aodv-rtable.h +++ b/src/routing/aodv/aodv-rtable.h @@ -213,6 +213,8 @@ public: * \return true on success */ bool LookupRoute (Ipv4Address dst, RoutingTableEntry & rt); + /// Lookup route in VALID state + bool LookupValidRoute (Ipv4Address dst, RoutingTableEntry & rt); /// Update routing table bool Update (RoutingTableEntry & rt); /// Set routing table entry flags