AODV bug 812 fixed

This commit is contained in:
Pavel Boyko
2010-03-01 14:40:07 +03:00
parent 70e3f52753
commit 9dfa71d4e5
3 changed files with 54 additions and 64 deletions

View File

@@ -274,23 +274,20 @@ RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header,
Ptr<Ipv4Route> 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<Ipv4Route> ();
}
UpdateRouteLifeTime (dst, ActiveRouteTimeout);
UpdateRouteLifeTime (route->GetGateway (), ActiveRouteTimeout);
return route;
NS_LOG_DEBUG ("Output device doesn't match. Dropped.");
sockerr = Socket::ERROR_NOROUTETOHOST;
return Ptr<Ipv4Route> ();
}
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<const Packet> 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<Packet> 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<Packet> 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> packet = Create<Packet> ();
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> packet = Create<Packet> ();
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> 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> 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<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator i =
@@ -1511,40 +1505,26 @@ RoutingProtocol::SendRerrMessage (Ptr<Packet> packet, std::vector<Ipv4Address> p
if (precursors.size () == 1)
{
RoutingTableEntry toPrecursor;
if (!m_routingTable.LookupRoute (precursors.front (), toPrecursor))
return;
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toPrecursor.GetInterface ());
NS_ASSERT (socket);
if (toPrecursor.GetFlag () == VALID)
if (m_routingTable.LookupValidRoute (precursors.front (), toPrecursor))
{
Ptr<Socket> 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<Ipv4InterfaceAddress> ifaces;
RoutingTableEntry toPrecursor;
for (std::vector<Ipv4Address>::const_iterator i = precursors.begin (); i
!= precursors.end (); ++i)
for (std::vector<Ipv4Address>::const_iterator i = precursors.begin (); i != precursors.end (); ++i)
{
if (!m_routingTable.LookupRoute (*i, toPrecursor))
break;
bool result = true;
for (std::vector<Ipv4InterfaceAddress>::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<Ipv4InterfaceAddress>::const_iterator i = ifaces.begin (); i != ifaces.end (); ++i)

View File

@@ -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)
{

View File

@@ -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