35 #include "ns3/inet-socket-address.h"
36 #include "ns3/trace-source-accessor.h"
37 #include "ns3/udp-socket-factory.h"
38 #include "ns3/wifi-net-device.h"
39 #include "ns3/boolean.h"
40 #include "ns3/double.h"
41 #include "ns3/uinteger.h"
81 return sizeof(int32_t);
99 os <<
"DeferredRouteOutputTag: output interface = " <<
oif;
106 static TypeId tid =
TypeId (
"ns3::dsdv::RoutingProtocol")
108 .AddConstructor<RoutingProtocol> ()
109 .AddAttribute (
"PeriodicUpdateInterval",
"Periodic interval between exchange of full routing tables among nodes. ",
113 .AddAttribute (
"SettlingTime",
"Minimum time an update is to be stored in adv table before sending out"
114 "in case of change in metric (in seconds)",
118 .AddAttribute (
"MaxQueueLen",
"Maximum number of packets that we allow a routing protocol to buffer.",
121 MakeUintegerChecker<uint32_t> ())
122 .AddAttribute (
"MaxQueuedPacketsPerDst",
"Maximum number of packets that we allow per destination to buffer.",
125 MakeUintegerChecker<uint32_t> ())
126 .AddAttribute (
"MaxQueueTime",
"Maximum time packets can be queued (in seconds)",
130 .AddAttribute (
"EnableBuffering",
"Enables buffering of data packets if no route to destination is available",
134 MakeBooleanChecker ())
135 .AddAttribute (
"EnableWST",
"Enables Weighted Settling Time for the updates before advertising",
139 MakeBooleanChecker ())
140 .AddAttribute (
"Holdtimes",
"Times the forwarding Interval to purge the route.",
143 MakeUintegerChecker<uint32_t> ())
144 .AddAttribute (
"WeightedFactor",
"WeightedFactor for the settling time if Weighted Settling Time is enabled",
147 MakeDoubleChecker<double> ())
148 .AddAttribute (
"EnableRouteAggregation",
"Enables Weighted Settling Time for the updates before advertising",
152 MakeBooleanChecker ())
153 .AddAttribute (
"RouteAggregationTime",
"Time to aggregate updates before sending them out (in seconds)",
201 m_advRoutingTable (),
203 m_periodicUpdateTimer (
Timer::CANCEL_ON_DESTROY)
219 iter->first->Close ();
265 std::map<Ipv4Address, RoutingTableEntry> removedAddresses;
270 <<
", Packet id: " << p->
GetUid () <<
", Destination address in Packet: " << dst);
273 for (std::map<Ipv4Address, RoutingTableEntry>::iterator rmItr = removedAddresses.begin ();
274 rmItr != removedAddresses.end (); ++rmItr)
276 rmItr->second.SetEntriesChanged (
true);
277 rmItr->second.SetSeqNo (rmItr->second.GetSeqNo () + 1);
280 if (!removedAddresses.empty ())
290 if (rt.GetHop () == 1)
292 route = rt.GetRoute ();
295 <<
" to neighboring destination "
313 <<
" to destination " << dst <<
" via "
314 << rt.GetNextHop ());
328 uint32_t iif = (oif ?
m_ipv4->GetInterfaceForDevice (oif) : -1);
341 UnicastForwardCallback ucb,
358 UnicastForwardCallback ucb,
365 <<
" on interface " << idev->GetAddress ()
375 int32_t iif =
m_ipv4->GetInterfaceForDevice (idev);
415 if (lcb.
IsNull () ==
false)
418 lcb (p, header, iif);
423 NS_LOG_ERROR (
"Unable to deliver packet locally due to null callback " << p->
GetUid () <<
" from " << origin);
433 ucb (route,packet,header);
445 if (
m_ipv4->IsDestinationAddress (dst, iif))
447 if (lcb.
IsNull () ==
false)
450 lcb (p, header, iif);
454 NS_LOG_ERROR (
"Unable to deliver packet locally due to null callback " << p->
GetUid () <<
" from " << origin);
469 <<
" via nexthop neighbor " << toDst.
GetNextHop ());
470 ucb (route,p,header);
475 <<
" as there is no route to forward it.");
509 int32_t
interface =
m_ipv4->GetInterfaceForAddress (addr);
510 if (oif ==
m_ipv4->GetNetDevice (static_cast<uint32_t> (interface)))
537 uint32_t packetSize = packet->GetSize ();
539 <<
" and packet id: " << packet->GetUid ());
541 for (; packetSize > 0; packetSize = packetSize - 12)
545 packet->RemoveHeader (dsdvHeader);
552 if (dsdvHeader.
GetDst () == interface.GetLocal ())
556 NS_LOG_DEBUG (
"Sent Dsdv update back to the same Destination, "
557 "with infinite metric. Time left to send fwd update: "
563 NS_LOG_DEBUG (
"Received update for my address. Discarding this.");
573 << sender <<
" to " << receiver <<
". Details are: Destination: " << dsdvHeader.
GetDst () <<
", Seq No: "
578 if (permanentTableVerifier ==
false)
587 m_ipv4->GetAddress (
m_ipv4->GetInterfaceForAddress (receiver), 0),
601 NS_LOG_DEBUG (
"Discarding this update as this route is not present in "
602 "main routing table and received with infinite metric");
610 std::map<Ipv4Address, RoutingTableEntry> allRoutes;
612 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = allRoutes.begin (); i != allRoutes.end (); ++i)
614 NS_LOG_DEBUG (
"ADV table routes are:" << i->second.GetDestination ());
622 if (dsdvHeader.
GetDstSeqno () > advTableEntry.GetSeqNo ())
627 NS_LOG_DEBUG (
"Canceling the timer to update route with better seq number");
630 if (dsdvHeader.
GetHopCount () != advTableEntry.GetHop ())
632 advTableEntry.SetSeqNo (dsdvHeader.
GetDstSeqno ());
634 advTableEntry.SetFlag (
VALID);
635 advTableEntry.SetEntriesChanged (
true);
636 advTableEntry.SetNextHop (sender);
638 NS_LOG_DEBUG (
"Received update with better sequence number and changed metric.Waiting for WST");
640 advTableEntry.SetSettlingTime (tempSettlingtime);
642 <<
"s as there is no event running for this route");
653 advTableEntry.SetSeqNo (dsdvHeader.
GetDstSeqno ());
655 advTableEntry.SetFlag (
VALID);
656 advTableEntry.SetEntriesChanged (
true);
657 advTableEntry.SetNextHop (sender);
660 NS_LOG_DEBUG (
"Route with better sequence number and same metric received. Advertised without WST");
663 else if (dsdvHeader.
GetDstSeqno () == advTableEntry.GetSeqNo ())
665 if (dsdvHeader.
GetHopCount () < advTableEntry.GetHop ())
670 NS_LOG_DEBUG (
"Canceling any existing timer to update route with same sequence number "
671 "and better hop count");
673 advTableEntry.SetSeqNo (dsdvHeader.
GetDstSeqno ());
675 advTableEntry.SetFlag (
VALID);
676 advTableEntry.SetEntriesChanged (
true);
677 advTableEntry.SetNextHop (sender);
680 advTableEntry.SetSettlingTime (tempSettlingtime);
682 <<
" as there is no current event running for this route");
700 if (advTableEntry.GetNextHop () == sender)
708 NS_LOG_DEBUG (
"Received update with same seq number and "
709 "same/worst metric for, " << dsdvHeader.
GetDst () <<
". Discarding the update.");
719 NS_LOG_DEBUG (dsdvHeader.
GetDst () <<
" : Received update with old seq number. Discarding the update.");
724 NS_LOG_DEBUG (
"Route with infinite metric received for "
725 << dsdvHeader.
GetDst () <<
" from " << sender);
727 if (sender == advTableEntry.GetNextHop ())
729 NS_LOG_DEBUG (
"Triggering an update for this unreachable route:");
730 std::map<Ipv4Address, RoutingTableEntry> dstsWithNextHopSrc;
733 advTableEntry.SetSeqNo (dsdvHeader.
GetDstSeqno ());
734 advTableEntry.SetEntriesChanged (
true);
736 for (std::map<Ipv4Address, RoutingTableEntry>::iterator i = dstsWithNextHopSrc.begin (); i
737 != dstsWithNextHopSrc.end (); ++i)
739 i->second.SetSeqNo (i->second.GetSeqNo () + 1);
740 i->second.SetEntriesChanged (
true);
752 " : Discard this link break update as it was received from a different neighbor "
753 "and I can reach the destination");
758 std::map<Ipv4Address, RoutingTableEntry> allRoutes;
775 std::map<Ipv4Address, RoutingTableEntry> allRoutes;
784 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = allRoutes.begin (); i != allRoutes.end (); ++i)
786 NS_LOG_LOGIC (
"Destination: " << i->second.GetDestination ()
787 <<
" SeqNo:" << i->second.GetSeqNo () <<
" HopCount:"
788 << i->second.GetHop () + 1);
792 dsdvHeader.
SetDst (i->second.GetDestination ());
795 temp.SetFlag (
VALID);
796 temp.SetEntriesChanged (
false);
798 if (!(temp.GetSeqNo () % 2))
804 NS_LOG_DEBUG (
"Deleted this route from the advertised table");
810 NS_LOG_DEBUG (
"EventID " << event.GetUid () <<
" associated with "
811 << temp.GetDestination () <<
" has not expired, waiting in adv table");
818 dsdvHeader.
SetDst (
m_ipv4->GetAddress (1, 0).GetLocal ());
821 NS_LOG_DEBUG (
"Adding my update as well to the packet");
836 <<
" with packet id : " << packet->
GetUid () <<
" and packet Size: " << packet->
GetSize ());
840 NS_LOG_FUNCTION (
"Update not sent as there are no updates to be triggered");
848 std::map<Ipv4Address, RoutingTableEntry> removedAddresses, allRoutes;
852 if (allRoutes.empty ())
863 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = allRoutes.begin (); i != allRoutes.end (); ++i)
866 if (i->second.GetHop () == 0)
869 dsdvHeader.
SetDst (
m_ipv4->GetAddress (1,0).GetLocal ());
870 dsdvHeader.
SetDstSeqno (i->second.GetSeqNo () + 2);
879 dsdvHeader.
SetDst (i->second.GetDestination ());
884 NS_LOG_DEBUG (
"Forwarding the update for " << i->first);
888 <<
", LifeTime: " << i->second.GetLifeTime ().GetSeconds ());
890 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator rmItr = removedAddresses.begin (); rmItr
891 != removedAddresses.end (); ++rmItr)
894 removedHeader.
SetDst (rmItr->second.GetDestination ());
895 removedHeader.
SetDstSeqno (rmItr->second.GetSeqNo () + 1);
896 removedHeader.
SetHopCount (rmItr->second.GetHop () + 1);
898 NS_LOG_DEBUG (
"Update for removed record is: Destination: " << removedHeader.
GetDst ()
902 socket->
Send (packet);
948 <<
" interface is up");
951 if (iface.GetLocal () ==
Ipv4Address (
"127.0.0.1"))
999 NS_LOG_FUNCTION (
this <<
" interface " << i <<
" address " << address);
1037 if (l3->GetNAddresses (i))
1094 std::map<Ipv4Address, RoutingTableEntry> allRoutes;
1096 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = allRoutes.begin (); i != allRoutes.end (); ++i)
1106 <<
" to neighboring destination "
1139 NS_LOG_DEBUG (
"Output device doesn't match. Dropped.");
1147 ucb (route,p,header);
1175 NS_LOG_DEBUG (
"Calculated weightedTime:" << weightedTime.GetSeconds ());
1176 return weightedTime;
1185 NS_LOG_FUNCTION (
"Merging advertised table changes with main table before sending out periodic update");
1186 std::map<Ipv4Address, RoutingTableEntry> allRoutes;
1188 if (allRoutes.size () > 0)
1190 for (std::map<Ipv4Address, RoutingTableEntry>::const_iterator i = allRoutes.begin (); i != allRoutes.end (); ++i)
1206 NS_LOG_DEBUG (
"Event currently running. Cannot Merge Routing Tables");
void Start()
Start protocol operation.
static TypeId GetTypeId(void)
Get the type ID.
static const uint32_t DSDV_PORT
UDP Port for DSDV control traffic.
static Ipv4Mask GetOnes(void)
keep track of time values and allow control of global simulation resolution
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
Ipv4Address GetIpv4(void) const
static Ipv4Address GetAny(void)
void SetEntriesChanged(bool entriesChanged)
#define NS_LOG_FUNCTION(parameters)
std::map< Ptr< Socket >, Ipv4InterfaceAddress > m_socketAddresses
Raw socket per each IP interface, map socket -> iface address (IP + mask)
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
Ipv4Mask GetMask(void) const
Get the network mask.
Ipv4Address GetNextHop() const
bool EnableRouteAggregation
This is a flag to enable route aggregation.
void MergeTriggerPeriodicUpdates()
Time m_periodicUpdateInterval
PeriodicUpdateInterval specifies the periodic time interval between which the a node broadcasts its e...
bool EnableBuffering
Flag that is used to enable or disable buffering.
bool AnyRunningEvent(Ipv4Address address)
Force delete an update waiting for settling time to complete as a better update to same destination w...
Ipv4Header GetIpv4Header() const
Ipv4Address GetLocal(void) const
Get the local address.
virtual bool SetAllowBroadcast(bool allowBroadcast)=0
Configure whether broadcast datagram transmissions are allowed.
ErrorCallback m_ecb
Error callback for own packets.
a class to represent an Ipv4 address mask
virtual void SetIpv4(Ptr< Ipv4 > ipv4)
void AddPacketTag(const Tag &tag) const
Add a packet tag.
static TypeId GetTypeId()
uint64_t GetUid(void) const
A packet is allocated a new uid when it is created empty or with zero-filled payload.
EventId GetEventId(Ipv4Address address)
Get the EcentId associated with that address.
uint32_t GetSerializedSize() const
bool IsNull(void) const
Check for null implementation.
bool EnableWST
Flag that is used to enable or disable Weighted Settling Time.
TypeId GetInstanceTypeId() const
#define NS_ASSERT(condition)
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
void SetFlag(RouteFlags flag)
uint32_t GetSeqNo() const
void SetMaxPacketsPerDst(uint32_t len)
uint32_t GetSize(void) const
virtual void DoDispose()
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
bool IsMulticast(void) const
virtual void NotifyInterfaceDown(uint32_t interface)
virtual void DoDispose(void)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
void GetListOfAllRoutes(std::map< Ipv4Address, RoutingTableEntry > &allRoutes)
Lookup list of all addresses in the routing table.
double m_weightedFactor
This is the wighted factor to determine the weighted settling time.
TAG_BUFFER_INLINE uint32_t ReadU32(void)
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
SocketErrno
Enumeration of the possible errors returned by a socket.
void SendPacketFromQueue(Ipv4Address dst, Ptr< Ipv4Route > route)
Send packet from queue.
int32_t oif
Positive if output device is fixed in RouteOutput.
bool Update(RoutingTableEntry &rt)
Updating the routing Table with routing table entry rt.
Ptr< Ipv4Route > GetRoute() const
a polymophic address class
void SendPeriodicUpdate()
Broadcasts the entire routing table for every PeriodicUpdateInterval.
bool GetEnableRAFlag() const
void SetSource(Ipv4Address src)
Ptr< NetDevice > GetOutputDevice(void) const
bool ForceDeleteIpv4Event(Ipv4Address address)
Force delete an update waiting for settling time to complete as a better update to same destination w...
double GetSeconds(void) const
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
Ptr< Socket > FindSocketWithInterfaceAddress(Ipv4InterfaceAddress iface) const
Find socket with local interface address iface.
hold objects of type ns3::Time
void Schedule(void)
Schedule a new event using the currently-configured delay, function, and arguments.
void SetGateway(Ipv4Address gw)
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream) const
Print the Routing Table entries.
Hold an unsigned integer type.
TAG_BUFFER_INLINE void WriteU32(uint32_t v)
void SetSeqNo(uint32_t sequenceNumber)
void Purge(std::map< Ipv4Address, RoutingTableEntry > &removedAddresses)
Delete all outdated entries if Lifetime is expired.
bool IsBroadcast(void) const
uint32_t m_maxQueueLen
The maximum number of packets that we allow a routing protocol to buffer.
Ptr< Ipv4Route > LoopbackRoute(const Ipv4Header &header, Ptr< NetDevice > oif) const
Create loopback route for given header.
void Deserialize(TagBuffer i)
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
uint32_t GetUid(void) const
bool RouteInput(Ptr< const Packet > p, const Ipv4Header &header, Ptr< const NetDevice > idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb)
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
Ipv4Address GetSource(void) const
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
static TypeId GetTypeId(void)
#define NS_LOG_LOGIC(msg)
Time GetSettlingTime() const
void SetMaxQueueLen(uint32_t len)
UnicastForwardCallback m_scb
Unicast callback for own packets.
Ptr< Packet > Copy(void) const
tag a set of bytes in a packet
Ptr< Ipv4Route > RouteOutput(Ptr< Packet > p, const Ipv4Header &header, Ptr< NetDevice > oif, Socket::SocketErrno &sockerr)
Query routing cache for an existing route, for an outbound packet.
virtual ~RoutingProtocol()
Implement the Ipv4 layer.
Time GetSettlingTime(Ipv4Address dst)
Get settlingTime for a destination.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
void DeferredRouteOutput(Ptr< const Packet > p, const Ipv4Header &header, UnicastForwardCallback ucb, ErrorCallback ecb)
Queue packet untill we find a route.
void LookForQueuedPackets(void)
Look for any queued packets to send them out.
Time m_routeAggregationTime
Parameter that holds the route aggregation time interval.
static InetSocketAddress ConvertFrom(const Address &address)
bool Dequeue(Ipv4Address dst, QueueEntry &entry)
Return first found (the earliest) entry for given destination.
PacketQueue m_queue
A "drop front on full" queue used by the routing layer to buffer packets to which it does not have a ...
void DeleteAllRoutesFromInterface(Ipv4InterfaceAddress iface)
Delete all route from interface with address iface.
UnicastForwardCallback GetUnicastForwardCallback() const
NS_LOG_COMPONENT_DEFINE("DsdvRoutingProtocol")
Time m_maxQueueTime
The maximum period of time that a routing protocol is allowed to buffer a packet for.
bool AddRoute(RoutingTableEntry &r)
Add routing table entry if it doesn't yet exist in routing table.
void RecvDsdv(Ptr< Socket > socket)
Receive and process dsdv control packet.
void SetQueueTimeout(Time t)
bool GetEnableBufferFlag() const
static EventId ScheduleNow(MEM mem_ptr, OBJ obj)
Schedule an event to expire Now.
Ipv4Address m_mainAddress
Nodes IP address.
static Time Now(void)
Return the "current simulation time".
void SetOutputDevice(Ptr< NetDevice > outputDevice)
Equivalent in Linux to dst_entry.dev.
static Ipv4Address GetLoopback(void)
void SendTriggeredUpdate()
Sends trigger update from a node.
uint32_t m_maxQueuedPacketsPerDst
The maximum number of packets that we allow per destination to buffer.
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
void Serialize(TagBuffer i) const
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
#define NS_ASSERT_MSG(condition, message)
void GetListOfDestinationWithNextHop(Ipv4Address nxtHp, std::map< Ipv4Address, RoutingTableEntry > &dstList)
Lookup list of addresses for which nxtHp is the next Hop address.
bool DeleteIpv4Event(Ipv4Address address)
Clear up the entry from the map after the event is completed.
Ipv4Address GetDestination(void) const
void Send(Ptr< Ipv4Route >, Ptr< const Packet >, const Ipv4Header &)
Ipv4 addresses are stored in host order in this class.
Ipv4Address GetBroadcast(void) const
Get the broadcast address.
bool DeleteRoute(Ipv4Address dst)
Delete routing table entry with destination address dst, if it exists.
a class to store IPv4 address information on an interface
void SetEnableRAFlag(bool f)
an identifier for simulation events.
Ptr< NetDevice > m_lo
Loopback device used to defer route requests until a route is found.
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
#define NS_LOG_DEBUG(msg)
bool GetEntriesChanged() const
Ptr< const Packet > GetPacket() const
Tag used by DSDV implementation.
void SetEnableBufferFlag(bool f)
Abstract base class for IPv4 routing protocols.
Ipv4Address GetDestination() const
void Clear()
Delete all entries from routing table.
DeferredRouteOutputTag(int32_t o=-1)
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
Ptr< Ipv4 > m_ipv4
IP protocol.
void Setholddowntime(Time t)
RoutingTable m_advRoutingTable
Advertised Routing table for the node.
#define NS_LOG_ERROR(msg)
virtual void NotifyInterfaceUp(uint32_t interface)
void Print(std::ostream &os) const
bool AddIpv4Event(Ipv4Address address, EventId id)
Add an event for a destination address so that the update to for that destination is sent after the e...
void Print(Ptr< OutputStreamWrapper > stream) const
Print routing table.
bool LookupRoute(Ipv4Address dst, RoutingTableEntry &rt)
Lookup routing table entry with destination address dst.
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)=0
Read a single packet from the socket and retrieve the sender address.
Timer m_periodicUpdateTimer
Timer to trigger periodic updates from a node.
uint32_t GetSize()
Number of entries.
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
virtual int Close(void)=0
Close a socket.
RoutingTable m_routingTable
Main Routing table for the node.
void Drop(Ptr< const Packet >, const Ipv4Header &, Socket::SocketErrno)
Notify that packet is dropped for some reason.
Time GetDelayLeft(void) const
Hold a floating point type.
void SetAttribute(std::string name, const AttributeValue &value)
a unique identifier for an interface.
Time m_settlingTime
SettlingTime specifies the time for which a node waits before propagating an update.
TypeId SetParent(TypeId tid)
static Time GetMaximumSimulationTime(void)
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
void AddHeader(const Header &header)
Add header to this packet.
bool Find(Ipv4Address dst)
Finds whether a packet with destination dst exists in the queue.
void SetDestination(Ipv4Address dest)
Callback< void, Ptr< Ipv4Route >, Ptr< const Packet >, const Ipv4Header & > UnicastForwardCallback
Callback for unicast packets to be forwarded.
uint32_t Holdtimes
Holdtimes is the multiplicative factor of PeriodicUpdateInterval for which the node waits since the l...
bool Enqueue(QueueEntry &entry)
Push entry in queue, if there is no entry with the same packet and destination address in queue...