finding duplicated broadcast packet by packet uid

This commit is contained in:
Borovkova Elena
2009-08-01 11:08:30 +04:00
parent 0b297aa835
commit 34b3df714e
2 changed files with 41 additions and 34 deletions

View File

@@ -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<BroadcastId>::const_iterator i = m_broadcastIdCache.begin (); i != m_broadcastIdCache.end (); ++i)
if (i->m_src == src && i->m_broadcastId == bid)
PurgePacketUid ();
for (std::vector<PacketUid>::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<BroadcastId>::iterator i = remove_if (m_broadcastIdCache.begin (), m_broadcastIdCache.end (), IsExpiredForBroadcast ());
m_broadcastIdCache.erase (i, m_broadcastIdCache.end ());
std::vector<PacketUid>::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<const Packet> 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> packet = Create<Packet> ();
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<Packet> 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> packet = Create<Packet> ();
packet->AddHeader (rrepHeader);
TypeHeader tHeader (AODVTYPE_RREP);
@@ -1265,9 +1274,8 @@ RoutingProtocol::SendRerrMessage (Ptr<Packet> packet, std::vector<Ipv4Address> p
for (std::vector<Ipv4Address>::const_iterator i = ifaces.begin (); i != ifaces.end (); ++i)
{
Ptr<Socket> 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);
}

View File

@@ -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<BroadcastId> m_broadcastIdCache;
std::vector<PacketUid> 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;