SendReplyByIntermediateNode added

This commit is contained in:
Borovkova Elena
2009-07-17 14:27:53 +04:00
parent ba02be81fa
commit 0f89af7fd3
4 changed files with 45 additions and 50 deletions

View File

@@ -166,9 +166,6 @@ bool TypeHeaderTest::RunTests ()
RreqHeader::RreqHeader () : m_flags(0), m_reserved(0), m_hopCount(0), m_broadcastID(0),
m_dstSeqNo(0), m_srcSeqNo(0)
{
SetGratiousRrep (false);
SetDestinationOnly (false);
SetUnknownSeqno (false);
}
TypeId
@@ -192,7 +189,7 @@ RreqHeader::Serialize (Buffer::Iterator i) const
i.WriteHtonU32 (m_broadcastID);
WriteTo (i, m_dst);
i.WriteHtonU32 (m_dstSeqNo);
WriteTo (i, m_src);
WriteTo (i, m_origin);
i.WriteHtonU32 (m_srcSeqNo);
}
@@ -206,7 +203,7 @@ RreqHeader::Deserialize (Buffer::Iterator start)
m_broadcastID = i.ReadNtohU32 ();
ReadFrom (i, m_dst);
m_dstSeqNo = i.ReadNtohU32 ();
ReadFrom (i, m_src);
ReadFrom (i, m_origin);
m_srcSeqNo = i.ReadNtohU32 ();
uint32_t dist = i.GetDistanceFrom (start);
@@ -220,7 +217,7 @@ RreqHeader::Print (std::ostream &os) const
os << "RREQ ID " << m_broadcastID << "\n"
<< "destination: ipv4 " << m_dst << " "
<< "sequence number " << m_dstSeqNo << "\n"
<< "source: ipv4 " << m_src << " "
<< "source: ipv4 " << m_origin << " "
<< "sequence number " << m_srcSeqNo << "\n"
<< "flags:\n"
<< "Gratuitous RREP " << (*this).GetGratiousRrep() << "\n"
@@ -279,7 +276,7 @@ RreqHeader::operator==(RreqHeader const & o) const
return (m_flags == o.m_flags && m_reserved == o.m_reserved &&
m_hopCount == o.m_hopCount && m_broadcastID == o.m_broadcastID &&
m_dst == o.m_dst && m_dstSeqNo == o.m_dstSeqNo &&
m_src == o.m_src && m_srcSeqNo == o.m_srcSeqNo);
m_origin == o.m_origin && m_srcSeqNo == o.m_srcSeqNo);
}
#ifdef RUN_SELF_TESTS
@@ -323,11 +320,14 @@ bool RreqHeaderTest::RunTests ()
// RREP
//-----------------------------------------------------------------------------
RrepHeader::RrepHeader() :m_flags(0), m_prefixSize(0), m_hopCount(0), m_dstSeqNo(0)
RrepHeader::RrepHeader(uint8_t flags,uint8_t prefixSize, uint8_t hopCount, Ipv4Address dst,
uint32_t dstSeqNo, Ipv4Address origin, Time lifeTime) : m_flags(flags), m_prefixSize(prefixSize), m_hopCount(hopCount),
m_dst(dst), m_dstSeqNo(dstSeqNo), m_origin(origin)
{
SetAckRequired(false);
m_lifeTime = uint32_t(lifeTime.GetMilliSeconds());
}
TypeId
RrepHeader::GetInstanceTypeId() const
{
@@ -348,7 +348,7 @@ RrepHeader::Serialize (Buffer::Iterator i) const
i.WriteU8 (m_hopCount);
WriteTo (i, m_dst);
i.WriteHtonU32 (m_dstSeqNo);
WriteTo (i, m_src);
WriteTo (i, m_origin);
i.WriteHtonU32 (m_lifeTime);
}
@@ -362,7 +362,7 @@ RrepHeader::Deserialize (Buffer::Iterator start)
m_hopCount = i.ReadU8 ();
ReadFrom (i, m_dst);
m_dstSeqNo = i.ReadNtohU32 ();
ReadFrom (i, m_src);
ReadFrom (i, m_origin);
m_lifeTime = i.ReadNtohU32 ();
uint32_t dist = i.GetDistanceFrom (start);
@@ -378,7 +378,7 @@ RrepHeader::Print (std::ostream &os) const
if(m_prefixSize != 0)
os << "prefix size " << m_prefixSize << "\n";
else os << "\n";
os << "source ipv4 " << m_src << "\n"
os << "source ipv4 " << m_origin << "\n"
<< "life time " << m_lifeTime << "\n"
<< "acknowledgment required flag " << (*this).GetAckRequired() << "\n";
}
@@ -425,20 +425,20 @@ RrepHeader::operator==(RrepHeader const & o) const
{
return (m_flags == o.m_flags && m_prefixSize == o.m_prefixSize &&
m_hopCount == o.m_hopCount && m_dst == o.m_dst &&
m_dstSeqNo == o.m_dstSeqNo && m_src == o.m_src &&
m_dstSeqNo == o.m_dstSeqNo && m_origin == o.m_origin &&
m_lifeTime == o.m_lifeTime);
}
void
RrepHeader::SetHello(Ipv4Address src, uint32_t srcSeqNo, Time lifetime)
RrepHeader::SetHello(Ipv4Address origin, uint32_t srcSeqNo, Time lifetime)
{
m_flags = 0;
m_prefixSize = 0;
m_hopCount = 0;
m_dst = src;
m_dst = origin;
m_dstSeqNo = srcSeqNo;
m_src = src;
m_origin = origin;
m_lifeTime = lifetime.GetMilliSeconds ();
}

View File

@@ -119,8 +119,8 @@ public:
Ipv4Address GetDst () const { return m_dst; }
void SetDstSeqno (uint32_t s) { m_dstSeqNo = s; }
uint32_t GetDstSeqno () const { return m_dstSeqNo; }
void SetOrigin (Ipv4Address a) { m_src = a; }
Ipv4Address GetOrigin () const { return m_src; }
void SetOrigin (Ipv4Address a) { m_origin = a; }
Ipv4Address GetOrigin () const { return m_origin; }
void SetOriginSeqno (uint32_t s) { m_srcSeqNo = s; }
uint32_t GetOriginSeqno () const { return m_srcSeqNo; }
//\}
@@ -143,7 +143,7 @@ private:
uint32_t m_broadcastID; ///< RREQ ID
Ipv4Address m_dst; ///< Destination IP Address
uint32_t m_dstSeqNo; ///< Destination Sequence Number
Ipv4Address m_src; ///< Source IP Address
Ipv4Address m_origin; ///< Originator IP Address
uint32_t m_srcSeqNo; ///< Source Sequence Number
};
@@ -171,7 +171,8 @@ std::ostream & operator<<(std::ostream & os, RreqHeader const &);
class RrepHeader : public Header
{
public:
RrepHeader();
RrepHeader(uint8_t flags = 0, uint8_t prefixSize = 0, uint8_t hopCount = 0, Ipv4Address dst = Ipv4Address(),
uint32_t dstSeqNo = 0, Ipv4Address origin = Ipv4Address(), Time lifetime = MilliSeconds(0));
///\name Header serialization/deserialization
//\{
TypeId GetInstanceTypeId() const;
@@ -189,8 +190,8 @@ public:
Ipv4Address GetDst () const { return m_dst; }
void SetDstSeqno (uint32_t s) { m_dstSeqNo = s; }
uint32_t GetDstSeqno () const { return m_dstSeqNo; }
void SetOrigin (Ipv4Address a) { m_src = a; }
Ipv4Address GetOrigin () const { return m_src; }
void SetOrigin (Ipv4Address a) { m_origin = a; }
Ipv4Address GetOrigin () const { return m_origin; }
void SetLifeTime (Time t);
Time GetLifeTime () const;
//\}
@@ -213,8 +214,8 @@ private:
uint8_t m_hopCount; ///< Hop Count
Ipv4Address m_dst; ///< Destination IP Address
uint32_t m_dstSeqNo; ///< Destination Sequence Number
Ipv4Address m_src; ///< Source IP Address
uint32_t m_lifeTime; ///< Lifetime
Ipv4Address m_origin; ///< Source IP Address
uint32_t m_lifeTime; ///< Lifetime (in milliseconds)
};
std::ostream & operator<<(std::ostream & os, RrepHeader const &);

View File

@@ -472,7 +472,7 @@ RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address s
/*timeLife=*/Simulator::Now() + Scalar(2)*NET_TRAVERSAL_TIME - Scalar(2*hop)*NODE_TRAVERSAL_TIME );
m_routingTable.AddRoute (newEntry);
}
else // TODO check logic
else
{
if (int32_t(rreqHeader.GetOriginSeqno()) - int32_t(toOrigin.GetSeqNo()) > 0 ) toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno());
toOrigin.SetValidSeqNo(true);
@@ -517,11 +517,11 @@ RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address s
// received in the incoming RREQ is larger than the value currently maintained
// by the forwarding node.
uint32_t dstSeqNo = toDst.GetSeqNo();
if (rreqHeader.GetUnknownSeqno() || (rreqHeader.GetDstSeqno() < dstSeqNo))
if (rreqHeader.GetUnknownSeqno() || (int32_t(toDst.GetSeqNo()) - int32_t(rreqHeader.GetDstSeqno()) > 0))
{
if(!rreqHeader.GetDestinationOnly() && toDst.GetValidSeqNo() && (toDst.GetFlag() == RTF_UP))
{
SendReplyByIntermediateNode(toDst, toOrigin, rreqHeader.GetGratiousRrep());
SendReplyByIntermediateNode(toDst, toOrigin, rreqHeader.GetGratiousRrep(), socket);
return;
}
rreqHeader.SetOriginSeqno(dstSeqNo);
@@ -738,43 +738,33 @@ RoutingProtocol::SendHello ()
void
RoutingProtocol::SendReplyByIntermediateNode(RoutingTableEntry & toDst, RoutingTableEntry & toOrigin, bool gratRep)
RoutingProtocol::SendReplyByIntermediateNode (RoutingTableEntry & toDst, RoutingTableEntry & toOrigin, bool gratRep, Ptr<Socket> socket)
{
#if 0
RrepHeader rrepHeader;
TypeHeader tHeader(AODVTYPE_RREP);
rrepHeader.SetDst(toDst.GetDst());
rrepHeader.SetOrigin(toOrigin.GetDst());
rrepHeader.SetDstSeqno(toDst.GetSeqNo());
rrepHeader.SetHopCount(toDst.GetHop());
rrepHeader.SetLifeTime(toDst.GetLifeTime() - Simulator::Now());
RrepHeader rrepHeader (/*flags=*/0, /*prefix size=*/0, /*hops=*/toDst.GetHop(), /*dst=*/toDst.GetDestination(), /*dst seqno=*/toDst.GetSeqNo(),
/*origin=*/toOrigin.GetDestination(), /*lifetime=*/toDst.GetLifeTime() - Simulator::Now() );
toDst.InsertPrecursor(toOrigin.GetNextHop());
toOrigin.InsertPrecursor(toDst.GetNextHop());
m_routingTable.Update (toDst.GetDestination(),toDst);
m_routingTable.Update (toOrigin.GetDestination(), toOrigin);
Ptr<Packet> packet = Create<Packet> ();
packet->AddHeader(rrepHeader);
TypeHeader tHeader (AODVTYPE_RREP);
packet->AddHeader(tHeader);
std::map< Ipv4Address, Ptr<Socket> >::const_iterator j = m_addressSocket.find(toOrigin.GetInterface());
j->second->Send(packet);
socket->SendTo (packet, 0, InetSocketAddress(toOrigin.GetDestination (), AODV_PORT));
if(gratRep)
{
rrepHeader.SetHopCount(toOrigin.GetHop());
rrepHeader.SetDst(toOrigin.GetDst());
rrepHeader.SetDstSeqno(toOrigin.GetSeqNo());
rrepHeader.SetOrigin(toDst.GetDst());
rrepHeader.SetLifeTime(toOrigin.GetLifeTime() - Simulator::Now());
RrepHeader gratRepHeader (/*flags=*/0, /*prefix size=*/0, /*hops=*/toOrigin.GetHop(), /*dst=*/toOrigin.GetDestination(), /*dst seqno=*/toOrigin.GetSeqNo(),
/*origin=*/toDst.GetDestination(), /*lifetime=*/toOrigin.GetLifeTime() - Simulator::Now());
Ptr<Packet> packetToDst = Create<Packet> ();
packetToDst->AddHeader(rrepHeader);
packetToDst->AddHeader(tHeader);
j = m_addressSocket.find(toDst.GetInterface());
j->second->Send(packet);
socket->SendTo (packetToDst, 0, InetSocketAddress(toDst.GetDestination (), AODV_PORT));
}
#endif
}

View File

@@ -161,8 +161,12 @@ private:
void SendRequest (Ipv4Address dst, bool G, bool D);
/// Send RREP
void SendReply (RreqHeader const & rreqHeader, RoutingTableEntry const & toOrigin, Ptr<Socket> socket);
/// TODO
void SendReplyByIntermediateNode(RoutingTableEntry & toDst, RoutingTableEntry & toOrigin, bool gratRep = false);
/** Send RREP by intermediate node
* \param toDst routing table entry to destination
* \param toOrigin routing table entry to originator
* \param gratRep indicates whether a gratuitous RREP should be unicast to destination
*/
void SendReplyByIntermediateNode (RoutingTableEntry & toDst, RoutingTableEntry & toOrigin, bool gratRep, Ptr<Socket> socket);
/// Send RERR
void SendError (Ipv4Address failed);
//\}