This commit is contained in:
Pavel Boyko
2009-07-15 16:04:29 +04:00
4 changed files with 76 additions and 54 deletions

View File

@@ -233,42 +233,42 @@ std::ostream & operator<<(std::ostream & os, RreqHeader const & h)
void
RreqHeader::SetGratiousRrep (bool f)
{
if (f) rq_flags |= (1 << 2);
else rq_flags &= ~(1 << 2);
if (f) rq_flags |= (1 << 5);
else rq_flags &= ~(1 << 5);
}
bool
RreqHeader::GetGratiousRrep () const
{
return (rq_flags & (1 << 2));
return (rq_flags & (1 << 5));
}
void
RreqHeader::SetDestinationOnly (bool f)
{
if (f) rq_flags |= (1 << 3);
else rq_flags &= ~(1 << 3);
}
bool
RreqHeader::GetDestinationOnly () const
{
return (rq_flags & (1 << 3));
}
void
RreqHeader::SetUnknownSeqno (bool f)
{
if (f) rq_flags |= (1 << 4);
else rq_flags &= ~(1 << 4);
}
bool
RreqHeader::GetUnknownSeqno () const
RreqHeader::GetDestinationOnly () const
{
return (rq_flags & (1 << 4));
}
void
RreqHeader::SetUnknownSeqno (bool f)
{
if (f) rq_flags |= (1 << 3);
else rq_flags &= ~(1 << 3);
}
bool
RreqHeader::GetUnknownSeqno () const
{
return (rq_flags & (1 << 3));
}
bool
RreqHeader::operator==(RreqHeader const & o) const
{
@@ -394,14 +394,14 @@ RrepHeader::GetLifeTime () const
void
RrepHeader::SetAckRequired (bool f)
{
if (f) rp_flags |= (1 << 1);
else rp_flags &= ~(1 << 1);
if (f) rp_flags |= (1 << 6);
else rp_flags &= ~(1 << 6);
}
bool
RrepHeader::GetAckRequired () const
{
return (rp_flags & (1 << 1));
return (rp_flags & (1 << 6));
}
void

View File

@@ -330,6 +330,7 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool G, bool D)
rreqHeader.SetOrigin (iface.GetLocal());
InsertBroadcastId (iface.GetLocal(), bid);
packet->AddHeader (rreqHeader);
packet->AddHeader (tHeader);
socket->Send (packet);
@@ -533,6 +534,7 @@ RoutingProtocol::SendReply (RreqHeader const & rreqHeader, aodv_rt_entry const &
rrepHeader.SetDst(rreqHeader.GetDst());
rrepHeader.SetLifeTime(MY_ROUTE_TIMEOUT);
Ptr<Packet> packet = Create<Packet> ();
packet->AddHeader(rrepHeader);
TypeHeader tHeader(AODVTYPE_RREP);
@@ -542,16 +544,12 @@ RoutingProtocol::SendReply (RreqHeader const & rreqHeader, aodv_rt_entry const &
}
void
RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address my ,Ipv4Address src)
RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address receiverIfaceAddr ,Ipv4Address senderIfaceAddr)
{
#if 0
TypeHeader tHeader(AODVTYPE_RREP);
p->RemoveHeader(tHeader);
RrepHeader rrepHeader;
p->RemoveHeader(rrepHeader);
uint8_t hop = rrepHeader.GetHopCount();
hop++;
uint8_t hop = rrepHeader.GetHopCount() + 1;
rrepHeader.SetHopCount(hop);
aodv_rt_entry toDst;
@@ -571,14 +569,9 @@ RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address my ,Ipv4Address src)
// The forward route for this destination is created if it does not already exist.
if(!rtable.rt_lookup(rrepHeader.GetDst(), toDst))
{
toDst.SetDst(rrepHeader.GetDst());
toDst.SetFlag(RTF_UP);
toDst.SetHop(hop);
toDst.SetInterface(my);
toDst.SetLifeTime(Simulator::Now() + rrepHeader.GetLifeTime());
toDst.SetNextHop(src);
toDst.SetSeqNo(rrepHeader.GetDstSeqno());
toDst.SetValidSeqNo(true);
aodv_rt_entry newEntry(/*dst=*/rrepHeader.GetDst(), /*validSeqNo=*/true, /*seqno=*/rrepHeader.GetDstSeqno(), /*iface=*/receiverIfaceAddr,
/*hop=*/hop, /*nextHop=*/senderIfaceAddr, /*lifeTime=*/Simulator::Now() + rrepHeader.GetLifeTime());
rtable.rt_add(newEntry);
}
// The existing entry is updated only in the following circumstances:
else
@@ -590,9 +583,10 @@ RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address my ,Ipv4Address src)
toDst.SetSeqNo(rrepHeader.GetDstSeqno());
toDst.SetValidSeqNo(true);
toDst.SetFlag(RTF_UP);
toDst.SetNextHop(src);
toDst.SetNextHop(senderIfaceAddr);
toDst.SetLifeTime(Simulator::Now() + rrepHeader.GetLifeTime());
toDst.SetHop(hop);
rtable.Update(rrepHeader.GetDst(), toDst);
}
// (ii) the Destination Sequence Number in the RREP is greater than
// the node's copy of the destination sequence number and the
@@ -601,9 +595,10 @@ RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address my ,Ipv4Address src)
{
toDst.SetSeqNo(rrepHeader.GetDstSeqno());
toDst.SetFlag(RTF_UP);
toDst.SetNextHop(src);
toDst.SetNextHop(senderIfaceAddr);
toDst.SetLifeTime(Simulator::Now() + rrepHeader.GetLifeTime());
toDst.SetHop(hop);
rtable.Update(rrepHeader.GetDst(), toDst);
}
else
{
@@ -611,55 +606,67 @@ RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address my ,Ipv4Address src)
if( (rrepHeader.GetDstSeqno() == toDst.GetSeqNo()) && (toDst.GetFlag() != RTF_UP) )
{
toDst.SetFlag(RTF_UP);
toDst.SetNextHop(src);
toDst.SetNextHop(senderIfaceAddr);
toDst.SetLifeTime(Simulator::Now() + rrepHeader.GetLifeTime());
toDst.SetHop(hop);
rtable.Update(rrepHeader.GetDst(), toDst);
}
// (iv) the sequence numbers are the same, and the New Hop Count is
// smaller than the hop count in route table entry.
else if( (rrepHeader.GetDstSeqno() == toDst.GetSeqNo()) && (hop < toDst.GetHop()) )
{
toDst.SetFlag(RTF_UP);
toDst.SetNextHop(src);
toDst.SetNextHop(senderIfaceAddr);
toDst.SetLifeTime(Simulator::Now() + rrepHeader.GetLifeTime());
toDst.SetHop(hop);
rtable.Update(rrepHeader.GetDst(), toDst);
}
}
if(my == rrepHeader.GetOrigin())
{
if(receiverIfaceAddr == rrepHeader.GetOrigin())
{
//TODO may be send messeges from queue
return;
}
}
else
{
{
aodv_rt_entry toOrigin;
if(!rtable.rt_lookup(rrepHeader.GetOrigin(), toOrigin))
{
// imposible!
// drop();
{
// imposible!
// drop();
return;
}
}
rtable.rt_lookup(rrepHeader.GetDst(), toDst);
toDst.pc_insert(toOrigin.GetNextHop());
if( toOrigin.GetLifeTime() < (Simulator::Now() + ACTIVE_ROUTE_TIMEOUT) )
toOrigin.SetLifeTime(Simulator::Now() + ACTIVE_ROUTE_TIMEOUT);
rtable.Update(rrepHeader.GetDst(), toDst);
if ( toOrigin.GetLifeTime() < (Simulator::Now() + ACTIVE_ROUTE_TIMEOUT) )
{
toOrigin.SetLifeTime(Simulator::Now() + ACTIVE_ROUTE_TIMEOUT);
rtable.Update(toOrigin.GetDst(), toOrigin);
}
aodv_rt_entry toNextHopToDst;
aodv_rt_entry toNextHopToOrigin;
rtable.rt_lookup(toDst.GetNextHop(), toNextHopToDst);
toNextHopToDst.pc_insert(toOrigin.GetNextHop());
rtable.Update(toDst.GetNextHop(), toNextHopToDst);
// TODO add operation over unidirctinal links
p->AddHeader(rrepHeader);
TypeHeader tHeader(AODVTYPE_RREP);
p->AddHeader(tHeader);
std::map< Ipv4Address, Ptr<Socket> >::const_iterator j = m_addressSocket.find(toOrigin.GetInterface());
j->second->Send(p);
}
for (std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin(); j != m_socketAddresses.end(); ++j)
{
if(j->second.GetLocal() == toOrigin.GetInterface())
j->first->Send(p);
}
}
}
#endif
}
void

View File

@@ -144,7 +144,6 @@ aodv_rtable::Update(Ipv4Address dst, aodv_rt_entry & rt)
return true;
}
void
aodv_rtable::SetEntryState (Ipv4Address id, uint8_t state)
{
@@ -152,6 +151,19 @@ aodv_rtable::SetEntryState (Ipv4Address id, uint8_t state)
if (i != rthead.end()) (*i).second.rt_flags = state;
}
void
aodv_rtable::Print(std::ostream &os) const
{
os << "AODV Routing table\n"
<< "Destination\tGateway\tInterface\tExpire\n";
for (std::map<Ipv4Address, aodv_rt_entry>::const_iterator i = rthead.begin(); i != rthead.end(); ++i)
{
os << i->first << "\t\t" << i->second.GetNextHop() << "\t\t" << i->second.GetInterface() << "\t\t" << i->second.GetLifeTime() << "\n";
}
}
#ifdef RUN_SELF_TESTS
/// Unit test for aodv_rqueue
struct AodvRtableTest : public Test
@@ -187,6 +199,7 @@ AodvRtableTest::RunTests ()
aodv_rtable rtable;
rtable.rt_add(entry2);
rtable.Print(std::cout);
entry2.SetLifeTime(Seconds(10));
NS_TEST_ASSERT(rtable.Update(entry2.GetDst(), entry2));
NS_TEST_ASSERT(rtable.rt_lookup(dst2, entry1));

View File

@@ -194,6 +194,8 @@ public:
bool Update(Ipv4Address dst, aodv_rt_entry & rt);
/// Set routing table entry flags
void SetEntryState (Ipv4Address dst, uint8_t state /*TODO use enum*/);
/// Print routing table
void Print(std::ostream &os) const;
private:
std::map<Ipv4Address, aodv_rt_entry> rthead;