diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index 5a791f5e6..f9064d62a 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -38,7 +38,6 @@ #include "ns3/ipv4-header.h" #include "ns3/udp-header.h" #include "ns3/nstime.h" -#include "src/internet-stack/ipv4-raw-socket-impl.h" /// UDP Port for AODV control traffic @@ -178,6 +177,7 @@ RoutingProtocol::RouteOutput (Ptr p, const Ipv4Header &header, uint32_t { SendRequest(dst, false, false); sockerr = Socket::ERROR_NOROUTETOHOST; + return rtentry; } else { @@ -187,8 +187,11 @@ RoutingProtocol::RouteOutput (Ptr p, const Ipv4Header &header, uint32_t rtentry->SetGateway (rt.GetNextHop()); // TODO store interface index, not address? rtentry->SetOutputDevice (m_ipv4->GetNetDevice(m_ipv4->GetInterfaceForAddress (rt.GetInterface()))); + NS_ASSERT (rtentry != 0); + NS_LOG_LOGIC("exist route to " << rtentry->GetDestination()); + return rtentry; } - return rtentry; + } bool @@ -318,7 +321,6 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool G, bool D) rreqHeader.SetHopCount(0); // Send RREQ as subnet directed broadcast from each (own) interface - Ipv4Header ipv4Header; Ptr packet = Create (); for(std::map, Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin(); j != m_socketAddresses.end(); ++j) { @@ -425,38 +427,32 @@ RoutingProtocol::RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address s // silently discards the newly received RREQ. if (LookupBroadcastId (origin, id)) { - NS_LOG_DEBUG ("RREQ duplicate from " << origin << " dropped by id " << id); - return; + NS_LOG_DEBUG ("RREQ duplicate from " << origin << " dropped by id " << id); + return; } // Increment RREQ hop count uint8_t hop = rreqHeader.GetHopCount() + 1; rreqHeader.SetHopCount (hop); - + // Reverse route to the Originator IP Address is created, or updating aodv_rt_entry toOrigin; if(! rtable.rt_lookup(origin, toOrigin)) { - // TODO c-tor - toOrigin.SetDst (origin); - toOrigin.SetValidSeqNo (true); - toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno()); - toOrigin.SetNextHop (src); - toOrigin.SetFlag (RTF_UP); - toOrigin.SetHop (hop); - toOrigin.SetInterface (receiver); - toOrigin.SetLifeTime(Simulator::Now() + Scalar(2)*NET_TRAVERSAL_TIME - Scalar(2*hop)*NODE_TRAVERSAL_TIME); - rtable.rt_add (toOrigin); + aodv_rt_entry newEntry(/*dst=*/origin, /*validSeno=*/true, /*seqNo=*/rreqHeader.GetOriginSeqno(), + /*iface=*/receiver, /*hops=*/hop, /*nextHop*/src, + /*timeLife=*/Simulator::Now() + Scalar(2)*NET_TRAVERSAL_TIME - Scalar(2*hop)*NODE_TRAVERSAL_TIME ); + rtable.rt_add (newEntry); } - else if (toOrigin.GetSeqNo() < rreqHeader.GetOriginSeqno()) // TODO check logic + else // TODO check logic { - toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno()); - toOrigin.SetValidSeqNo(true); - toOrigin.SetNextHop(src); - toOrigin.SetHop(hop); - Time minimalLifetime = Simulator::Now() + Scalar(2)*NET_TRAVERSAL_TIME - Scalar(2*hop)*NODE_TRAVERSAL_TIME; - if (toOrigin.GetLifeTime() < minimalLifetime) - toOrigin.SetLifeTime(minimalLifetime); - // TODO rtable.Update(origin, toOrigin) !!! + if (toOrigin.GetSeqNo() < rreqHeader.GetOriginSeqno()) toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno()); + toOrigin.SetValidSeqNo(true); + toOrigin.SetNextHop(src); + toOrigin.SetHop(hop); + Time minimalLifetime = Simulator::Now() + Scalar(2)*NET_TRAVERSAL_TIME - Scalar(2*hop)*NODE_TRAVERSAL_TIME; + if (toOrigin.GetLifeTime() < minimalLifetime) + toOrigin.SetLifeTime(minimalLifetime); + rtable.Update(origin, toOrigin); } // A node generates a RREP if either: @@ -467,6 +463,7 @@ RoutingProtocol::RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address s Ipv4Address addr = m_ipv4->GetAddress (k, 0).GetLocal (); if (addr == rreqHeader.GetDst()) { + rtable.rt_lookup(origin, toOrigin); SendReply (rreqHeader, toOrigin, socket); return; } @@ -653,8 +650,6 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Address my ,Ipv4Address src) toNextHopToDst.pc_insert(toOrigin.GetNextHop()); // TODO add operation over unidirctinal links -// ipv4Header.SetSource(toOrigin.GetInterface()); -// ipv4Header.SetDestination(toOrigin.GetNextHop()); p->AddHeader(rrepHeader); p->AddHeader(tHeader); std::map< Ipv4Address, Ptr >::const_iterator j = m_addressSocket.find(toOrigin.GetInterface()); @@ -731,15 +726,10 @@ RoutingProtocol::SendReplyByIntermediateNode(aodv_rt_entry & toDst, aodv_rt_entr toDst.pc_insert(toOrigin.GetNextHop()); toOrigin.pc_insert(toDst.GetNextHop()); - Ipv4Header ipv4Header; - - ipv4Header.SetSource(toOrigin.GetInterface()); - ipv4Header.SetDestination(toOrigin.GetNextHop()); Ptr packet = Create (); packet->AddHeader(rrepHeader); packet->AddHeader(tHeader); - packet->AddHeader(ipv4Header); std::map< Ipv4Address, Ptr >::const_iterator j = m_addressSocket.find(toOrigin.GetInterface()); j->second->Send(packet); @@ -751,14 +741,9 @@ RoutingProtocol::SendReplyByIntermediateNode(aodv_rt_entry & toDst, aodv_rt_entr rrepHeader.SetOrigin(toDst.GetDst()); rrepHeader.SetLifeTime(toOrigin.GetLifeTime() - Simulator::Now()); - - ipv4Header.SetSource(toDst.GetInterface()); - ipv4Header.SetDestination(toDst.GetNextHop()); - Ptr packetToDst = Create (); packetToDst->AddHeader(rrepHeader); packetToDst->AddHeader(tHeader); - packetToDst->AddHeader(ipv4Header); j = m_addressSocket.find(toDst.GetInterface()); j->second->Send(packet); } diff --git a/src/routing/aodv/aodv-routing-protocol.h b/src/routing/aodv/aodv-routing-protocol.h index 26f3a2de5..6a54deefa 100644 --- a/src/routing/aodv/aodv-routing-protocol.h +++ b/src/routing/aodv/aodv-routing-protocol.h @@ -43,13 +43,6 @@ namespace ns3 { namespace aodv { -/// Various constants used for the expanding ring search -//\{ -#define TTL_START 5 /// (?) in RFC 1 -#define TTL_THRESHOLD 7 -#define TTL_INCREMENT 2 -//\} - /// List of neighbors TODO document & move inside protocol class NeighborList { diff --git a/src/routing/aodv/aodv-rtable.cc b/src/routing/aodv/aodv-rtable.cc index 0151a9d6d..3e50423f0 100644 --- a/src/routing/aodv/aodv-rtable.cc +++ b/src/routing/aodv/aodv-rtable.cc @@ -33,36 +33,18 @@ namespace aodv { The Routing Table */ -aodv_rt_entry::aodv_rt_entry() -{ - rt_req_timeout = MilliSeconds(0.0); - rt_req_cnt = 0; - rt_dst = Ipv4Address("127.0.0.1"); - validSeqNo = false; - rt_seqno = 0; - rt_hops = rt_last_hop_count = INFINITY2; - rt_nexthop = Ipv4Address("127.0.0.1"); - rt_lifetime = MilliSeconds(0.0); - rt_flags = RTF_DOWN; - for (int i=0; i < MAX_HISTORY; i++) +aodv_rt_entry::aodv_rt_entry(Ipv4Address dst, bool vSeqNo, u_int32_t seqNo, Ipv4Address iface, u_int16_t hops, + Ipv4Address nextHop, Time lifetime) + : rt_dst(dst), validSeqNo(vSeqNo), rt_seqno(seqNo), interface(iface), rt_hops(hops), rt_last_hop_count(hops), + rt_nexthop(nextHop), rt_lifetime(lifetime), rt_req_cnt(0) +{ + rt_flags = RTF_UP; + for(uint8_t i = 0; i < MAX_HISTORY; ++i) { - rt_disc_latency[i] = 0.0; + rt_disc_latency[i] = 0; } hist_indx = 0; - rt_req_last_ttl = 0; -} - -aodv_rt_entry::aodv_rt_entry(Ipv4Address dst, bool vSeqNo, u_int32_t seqNo, - Ipv4Address iface, u_int16_t hops, Ipv4Address nextHop, Time lifetime) -{ - rt_dst = dst; - validSeqNo = vSeqNo; - if (validSeqNo) rt_seqno = seqNo; - rt_hops = hops; - interface = iface; - rt_nexthop = nextHop; - rt_lifetime = lifetime; } aodv_rt_entry::~aodv_rt_entry() @@ -153,6 +135,16 @@ aodv_rtable::rt_add(aodv_rt_entry const & rt) return true; } +bool +aodv_rtable::Update(Ipv4Address dst, aodv_rt_entry & rt) +{ + std::map::iterator i = rthead.find(dst); + if (i == rthead.end()) return false; + i->second = rt; + return true; +} + + void aodv_rtable::SetEntryState (Ipv4Address id, uint8_t state) { @@ -195,7 +187,10 @@ AodvRtableTest::RunTests () aodv_rtable rtable; rtable.rt_add(entry2); + entry2.SetLifeTime(Seconds(10)); + NS_TEST_ASSERT(rtable.Update(entry2.GetDst(), entry2)); NS_TEST_ASSERT(rtable.rt_lookup(dst2, entry1)); + NS_TEST_ASSERT(entry1.GetLifeTime() == entry2.GetLifeTime()); NS_TEST_ASSERT(entry1 == dst2); NS_TEST_ASSERT(!rtable.rt_lookup(dst1, entry1)); NS_TEST_ASSERT(rtable.rt_delete(dst2)); diff --git a/src/routing/aodv/aodv-rtable.h b/src/routing/aodv/aodv-rtable.h index ebfc9e8d9..bb9fe682d 100644 --- a/src/routing/aodv/aodv-rtable.h +++ b/src/routing/aodv/aodv-rtable.h @@ -37,7 +37,12 @@ namespace aodv { #define INFINITY2 0xff #define DELETE_PERIOD 10 // seconds. TODO: remove defines - +enum RouteFlags +{ + RTF_DOWN = 0, + RTF_UP = 1, + RTF_IN_REPAIR = 2 +}; /** * \ingroup aodv @@ -46,10 +51,9 @@ namespace aodv { class aodv_rt_entry { public: - aodv_rt_entry(); - // TODO add all members to c-tor - aodv_rt_entry(Ipv4Address dst, bool vSeqNo, u_int32_t seqNo, Ipv4Address iface, - u_int16_t hops, Ipv4Address nextHop, Time lifetime); + aodv_rt_entry(Ipv4Address dst = Ipv4Address(), bool vSeqNo = false, u_int32_t seqNo = 0, Ipv4Address iface = Ipv4Address(), u_int16_t hops = 0, + Ipv4Address nextHop = Ipv4Address(), Time lifetime = Seconds(0)); + ~aodv_rt_entry(); ///\name Precursors management @@ -132,8 +136,7 @@ private: uint16_t rt_last_hop_count; /// Next hop IP address Ipv4Address rt_nexthop; - /// List of precursors - std::vector rt_pclist; + /** * \brief Expiration or deletion time of the route * Lifetime field in the routing table plays dual role -- @@ -144,11 +147,10 @@ private: /// Routing flags: down, up or in repair uint8_t rt_flags; /*TODO use enum*/ -#define RTF_DOWN 0 -#define RTF_UP 1 -#define RTF_IN_REPAIR 2 #define MAX_HISTORY 3 + /// List of precursors + std::vector rt_pclist; /// When I can send another request Time rt_req_timeout; /// Number of route requests @@ -157,8 +159,6 @@ private: // TODO review and delete double rt_disc_latency[MAX_HISTORY]; char hist_indx; - /// Last ttl value used - uint16_t rt_req_last_ttl; }; /** @@ -190,6 +190,8 @@ public: * \return true on success */ bool rt_lookup(Ipv4Address dst, aodv_rt_entry & rt) const; + /// Update routing table + bool Update(Ipv4Address dst, aodv_rt_entry & rt); /// Set routing table entry flags void SetEntryState (Ipv4Address dst, uint8_t state /*TODO use enum*/);