diff --git a/src/routing/aodv/aodv-packet.cc b/src/routing/aodv/aodv-packet.cc index 0014fb795..876c7b51f 100644 --- a/src/routing/aodv/aodv-packet.cc +++ b/src/routing/aodv/aodv-packet.cc @@ -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 (); } diff --git a/src/routing/aodv/aodv-packet.h b/src/routing/aodv/aodv-packet.h index 27cfc64dc..0e2705787 100644 --- a/src/routing/aodv/aodv-packet.h +++ b/src/routing/aodv/aodv-packet.h @@ -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 &); diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index ef3c87299..c1e6acacd 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -472,7 +472,7 @@ RoutingProtocol::RecvRequest (Ptr 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 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) { -#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 = Create (); packet->AddHeader(rrepHeader); + TypeHeader tHeader (AODVTYPE_RREP); packet->AddHeader(tHeader); - std::map< Ipv4Address, Ptr >::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 packetToDst = Create (); 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 } diff --git a/src/routing/aodv/aodv-routing-protocol.h b/src/routing/aodv/aodv-routing-protocol.h index 9db6a2cd8..ddcbcbae0 100644 --- a/src/routing/aodv/aodv-routing-protocol.h +++ b/src/routing/aodv/aodv-routing-protocol.h @@ -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); - /// 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); /// Send RERR void SendError (Ipv4Address failed); //\}