From 34b3df714e5347e00c03e6220e36add816d2ceb7 Mon Sep 17 00:00:00 2001 From: Borovkova Elena Date: Sat, 1 Aug 2009 11:08:30 +0400 Subject: [PATCH] finding duplicated broadcast packet by packet uid --- src/routing/aodv/aodv-routing-protocol.cc | 60 +++++++++++++---------- src/routing/aodv/aodv-routing-protocol.h | 15 +++--- 2 files changed, 41 insertions(+), 34 deletions(-) diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index 227bb91aa..06fe86c34 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -86,20 +86,20 @@ RoutingProtocol::PurgeRequestId () } void -RoutingProtocol::InsertBroadcastId(Ipv4Address src, uint32_t bid) +RoutingProtocol::InsertPacketUid(Ipv4Address src, uint32_t bid) { NS_LOG_FUNCTION(this); - if (LookupBroadcastId (src, bid)) + if (LookupPacketUid (src, bid)) return; - struct BroadcastId broadcastId = { src, bid, BCAST_ID_SAVE + Simulator::Now () }; - m_broadcastIdCache.push_back (broadcastId); + struct PacketUid packetUid = { src, bid, BCAST_ID_SAVE + Simulator::Now () }; + m_packetUidCache.push_back (packetUid); } bool -RoutingProtocol::LookupBroadcastId(Ipv4Address src, uint32_t bid) +RoutingProtocol::LookupPacketUid(Ipv4Address src, uint32_t bid) { - PurgeBroadcastId (); - for (std::vector::const_iterator i = m_broadcastIdCache.begin (); i != m_broadcastIdCache.end (); ++i) - if (i->m_src == src && i->m_broadcastId == bid) + PurgePacketUid (); + for (std::vector::const_iterator i = m_packetUidCache.begin (); i != m_packetUidCache.end (); ++i) + if (i->m_src == src && i->m_packetUid == bid) { NS_LOG_LOGIC("duplicated packet from " << src << " uid " << bid); return true; @@ -107,11 +107,11 @@ RoutingProtocol::LookupBroadcastId(Ipv4Address src, uint32_t bid) return false; } void -RoutingProtocol::PurgeBroadcastId () +RoutingProtocol::PurgePacketUid () { NS_LOG_FUNCTION(this); - std::vector::iterator i = remove_if (m_broadcastIdCache.begin (), m_broadcastIdCache.end (), IsExpiredForBroadcast ()); - m_broadcastIdCache.erase (i, m_broadcastIdCache.end ()); + std::vector::iterator i = remove_if (m_packetUidCache.begin (), m_packetUidCache.end (), IsExpiredForBroadcast ()); + m_packetUidCache.erase (i, m_packetUidCache.end ()); } bool @@ -178,7 +178,7 @@ RoutingProtocol::RoutingProtocol () : */ NEXT_HOP_WAIT(NODE_TRAVERSAL_TIME + MilliSeconds (10)), TTL_START(1), TTL_INCREMENT(2), TTL_THRESHOLD(7), - m_requestId (0), m_broadcastId(0), m_seqNo (0), btimer (Timer::CANCEL_ON_DESTROY), htimer (Timer::CANCEL_ON_DESTROY), ntimer (Timer::CANCEL_ON_DESTROY), + m_requestId (0), m_seqNo (0), btimer (Timer::CANCEL_ON_DESTROY), htimer (Timer::CANCEL_ON_DESTROY), ntimer (Timer::CANCEL_ON_DESTROY), rtimer (Timer::CANCEL_ON_DESTROY), lrtimer (Timer::CANCEL_ON_DESTROY), m_routeRequestTimer (Timer::CANCEL_ON_DESTROY) @@ -348,12 +348,12 @@ RoutingProtocol::RouteInput (Ptr p, const Ipv4Header &header, Ptr< if (m_ipv4->GetInterfaceForAddress (iface.GetLocal ()) == iif) if (dst == iface.GetBroadcast ()) { - if(LookupBroadcastId(origin, header.GetIdentification())) + if(LookupPacketUid(origin, p->GetUid())) { NS_LOG_LOGIC("Duplicated packet from " << origin); return true; } - InsertBroadcastId(origin, header.GetIdentification()); + InsertPacketUid(origin, p->GetUid()); NS_LOG_LOGIC ("Broadcast local delivery to " << iface.GetLocal ()); lcb (p, header, iif); // TODO has TTL, forward @@ -542,9 +542,8 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool D, bool G) Ptr packet = Create (); packet->AddHeader(rreqHeader); packet->AddHeader(tHeader); - m_broadcastId++; BuildPacket(/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/iface.GetLocal (), - /*destination address*/iface.GetBroadcast(), /*id*/ m_broadcastId, /*TTL*/ NET_DIAMETER); //TODO add seqno for broadcast + /*destination address*/iface.GetBroadcast(), /*id*/ 0, /*TTL*/ NET_DIAMETER); //TODO add seqno for broadcast socket->Send (packet); } @@ -660,6 +659,15 @@ RoutingProtocol::RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address s NS_LOG_FUNCTION (this << receiver << src); RreqHeader rreqHeader; p->RemoveHeader (rreqHeader); // TODO check that header correctly found + + // A node ignores all RREQs received from any node in its blacklist + RoutingTableEntry toPrev; + if(m_routingTable.LookupRoute(src, toPrev)) + { + if(toPrev.IsInBlacklist()) + return; + } + uint32_t id = rreqHeader.GetId (); Ipv4Address origin = rreqHeader.GetOrigin (); @@ -789,14 +797,15 @@ RoutingProtocol::SendReply (RreqHeader const & rreqHeader, RoutingTableEntry con if (!rreqHeader.GetUnknownSeqno () && (rreqHeader.GetDstSeqno () == m_seqNo + 1)) m_seqNo++; RrepHeader rrepHeader ( /*prefixSize=*/0, /*hops=*/toOrigin.GetHop (), /*dst=*/rreqHeader.GetDst (), /*dstSeqNo=*/m_seqNo, /*origin=*/toOrigin.GetDestination (), /*lifeTime=*/MY_ROUTE_TIMEOUT); - // TODO when?? -// rrepHeader.SetAckRequired(true); - RoutingTableEntry toNextHop; - m_routingTable.LookupRoute(toOrigin.GetNextHop (), toNextHop); - toNextHop.m_ackTimer.SetFunction(&RoutingProtocol::AckTimerExpire, this); - toNextHop.m_ackTimer.SetArguments(toNextHop.GetDestination(), BLACKLIST_TIMEOUT); - toNextHop.m_ackTimer.SetDelay(NEXT_HOP_WAIT); - + if(0) // TODO when + { + rrepHeader.SetAckRequired(true); + RoutingTableEntry toNextHop; + m_routingTable.LookupRoute(toOrigin.GetNextHop (), toNextHop); + toNextHop.m_ackTimer.SetFunction(&RoutingProtocol::AckTimerExpire, this); + toNextHop.m_ackTimer.SetArguments(toNextHop.GetDestination(), BLACKLIST_TIMEOUT); + toNextHop.m_ackTimer.SetDelay(NEXT_HOP_WAIT); + } Ptr packet = Create (); packet->AddHeader (rrepHeader); TypeHeader tHeader (AODVTYPE_RREP); @@ -1265,9 +1274,8 @@ RoutingProtocol::SendRerrMessage (Ptr packet, std::vector p for (std::vector::const_iterator i = ifaces.begin (); i != ifaces.end (); ++i) { Ptr socket = FindSocketWithInterfaceAddress (*i); - m_broadcastId++; BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/*i, - /*destination address*/m_socketAddresses[socket].GetBroadcast(), /*id*/m_broadcastId , /*TTL*/ 1); + /*destination address*/m_socketAddresses[socket].GetBroadcast(), /*id*/0 , /*TTL*/ 1); socket->Send (packet,0); } diff --git a/src/routing/aodv/aodv-routing-protocol.h b/src/routing/aodv/aodv-routing-protocol.h index 3bee9ccad..989130975 100644 --- a/src/routing/aodv/aodv-routing-protocol.h +++ b/src/routing/aodv/aodv-routing-protocol.h @@ -122,23 +122,23 @@ private: ///\name Handle duplicated packets //\{ - void InsertBroadcastId (Ipv4Address src, uint32_t bid); - bool LookupBroadcastId (Ipv4Address src, uint32_t bid); - void PurgeBroadcastId (); - struct BroadcastId + void InsertPacketUid (Ipv4Address src, uint32_t bid); + bool LookupPacketUid (Ipv4Address src, uint32_t bid); + void PurgePacketUid (); + struct PacketUid { Ipv4Address m_src; - uint32_t m_broadcastId; + uint32_t m_packetUid; Time m_expire; }; struct IsExpiredForBroadcast { - bool operator()(const struct BroadcastId & p) const + bool operator()(const struct PacketUid & p) const { return (p.m_expire < Simulator::Now()); } }; - std::vector m_broadcastIdCache; + std::vector m_packetUidCache; //\} /**\name Handle neighbors @@ -179,7 +179,6 @@ private: AodvQueue m_queue; /// Broadcast ID uint32_t m_requestId; - uint32_t m_broadcastId; /// Request sequence number uint32_t m_seqNo;