From 92026672acd717ffd3122a0f651aa87a8294ae06 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Tue, 10 Aug 2010 13:02:38 -0400 Subject: [PATCH] Bug 879 - source address selection for AODV using DeferredRouteRequest --- src/routing/aodv/aodv-routing-protocol.cc | 43 ++++++++++++++++-- src/routing/aodv/aodv-routing-protocol.h | 2 +- src/routing/aodv/test/tcp-chain-test-0-0.pcap | Bin 2142 -> 47868 bytes src/routing/aodv/test/tcp-chain-test-9-0.pcap | Bin 1972 -> 23948 bytes 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index 2d4e51101..895afc3fb 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -265,7 +265,7 @@ RoutingProtocol::RouteOutput (Ptr p, const Ipv4Header &header, NS_LOG_FUNCTION (this << header << (oif? oif->GetIfIndex () : 0)); if (! p) { - return LoopbackRoute (header); // later + return LoopbackRoute (header, oif); // later } if (m_socketAddresses.empty ()) { @@ -303,7 +303,7 @@ RoutingProtocol::RouteOutput (Ptr p, const Ipv4Header &header, { p->AddPacketTag (tag); } - return LoopbackRoute (header); + return LoopbackRoute (header, oif); } void @@ -689,13 +689,48 @@ RoutingProtocol::IsMyOwnAddress (Ipv4Address src) } Ptr -RoutingProtocol::LoopbackRoute (const Ipv4Header & hdr) const +RoutingProtocol::LoopbackRoute (const Ipv4Header & hdr, Ptr oif) const { NS_LOG_FUNCTION (this << hdr); NS_ASSERT (m_lo != 0); Ptr rt = Create (); rt->SetDestination (hdr.GetDestination ()); - rt->SetSource (Ipv4Address ("127.0.0.1")); + // + // Source address selection here is tricky. The loopback route is + // returned when AODV does not have a route; this causes the packet + // to be looped back and handled (cached) in RouteInput() method + // while a route is found. However, connection-oriented protocols + // like TCP need to create an endpoint four-tuple (src, src port, + // dst, dst port) and create a pseudo-header for checksumming. So, + // AODV needs to guess correctly what the eventual source address + // will be. + // + // 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 + // further constrains the selection of source address + // + std::map , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); + if (oif) + { + // Iterate to find an address on the oif device + for (j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) + { + Ipv4Address addr = j->second.GetLocal (); + int32_t interface = m_ipv4->GetInterfaceForAddress (addr); + if (oif == m_ipv4->GetNetDevice (static_cast (interface))) + { + rt->SetSource (addr); + break; + } + } + } + else + { + rt->SetSource (j->second.GetLocal ()); + } + NS_ASSERT_MSG (rt->GetSource() != Ipv4Address (), "Valid AODV source address not found"); rt->SetGateway (Ipv4Address ("127.0.0.1")); rt->SetOutputDevice (m_lo); return rt; diff --git a/src/routing/aodv/aodv-routing-protocol.h b/src/routing/aodv/aodv-routing-protocol.h index 370050352..5b0628e13 100644 --- a/src/routing/aodv/aodv-routing-protocol.h +++ b/src/routing/aodv/aodv-routing-protocol.h @@ -180,7 +180,7 @@ private: /// Process hello message void ProcessHello (RrepHeader const & rrepHeader, Ipv4Address receiverIfaceAddr); /// Create loopback route for given header - Ptr LoopbackRoute (const Ipv4Header & header) const; + Ptr LoopbackRoute (const Ipv4Header & header, Ptr oif) const; ///\name Receive control packets //\{ diff --git a/src/routing/aodv/test/tcp-chain-test-0-0.pcap b/src/routing/aodv/test/tcp-chain-test-0-0.pcap index d700a47ce2bbc6f89f22478145ed8af86eccc1f8..bda5164ef5c78519b845089b2e1b1e2515e223e0 100644 GIT binary patch literal 47868 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 JJb53R9su?S53m3L