in process
This commit is contained in:
@@ -38,7 +38,6 @@
|
||||
#include "ns3/ipv4-header.h"
|
||||
#include "ns3/udp-header.h"
|
||||
#include "ns3/nstime.h"
|
||||
#include "src/internet-stack/ipv4-raw-socket-impl.h"
|
||||
|
||||
|
||||
/// UDP Port for AODV control traffic
|
||||
@@ -178,6 +177,7 @@ RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t
|
||||
{
|
||||
SendRequest(dst, false, false);
|
||||
sockerr = Socket::ERROR_NOROUTETOHOST;
|
||||
return rtentry;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -187,8 +187,11 @@ RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t
|
||||
rtentry->SetGateway (rt.GetNextHop());
|
||||
// TODO store interface index, not address?
|
||||
rtentry->SetOutputDevice (m_ipv4->GetNetDevice(m_ipv4->GetInterfaceForAddress (rt.GetInterface())));
|
||||
NS_ASSERT (rtentry != 0);
|
||||
NS_LOG_LOGIC("exist route to " << rtentry->GetDestination());
|
||||
return rtentry;
|
||||
}
|
||||
return rtentry;
|
||||
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -318,7 +321,6 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool G, bool D)
|
||||
rreqHeader.SetHopCount(0);
|
||||
|
||||
// Send RREQ as subnet directed broadcast from each (own) interface
|
||||
Ipv4Header ipv4Header;
|
||||
Ptr<Packet> packet = Create<Packet> ();
|
||||
for(std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin(); j != m_socketAddresses.end(); ++j)
|
||||
{
|
||||
@@ -425,38 +427,32 @@ RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address s
|
||||
// silently discards the newly received RREQ.
|
||||
if (LookupBroadcastId (origin, id))
|
||||
{
|
||||
NS_LOG_DEBUG ("RREQ duplicate from " << origin << " dropped by id " << id);
|
||||
return;
|
||||
NS_LOG_DEBUG ("RREQ duplicate from " << origin << " dropped by id " << id);
|
||||
return;
|
||||
}
|
||||
// Increment RREQ hop count
|
||||
uint8_t hop = rreqHeader.GetHopCount() + 1;
|
||||
rreqHeader.SetHopCount (hop);
|
||||
|
||||
|
||||
// Reverse route to the Originator IP Address is created, or updating
|
||||
aodv_rt_entry toOrigin;
|
||||
if(! rtable.rt_lookup(origin, toOrigin))
|
||||
{
|
||||
// TODO c-tor
|
||||
toOrigin.SetDst (origin);
|
||||
toOrigin.SetValidSeqNo (true);
|
||||
toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno());
|
||||
toOrigin.SetNextHop (src);
|
||||
toOrigin.SetFlag (RTF_UP);
|
||||
toOrigin.SetHop (hop);
|
||||
toOrigin.SetInterface (receiver);
|
||||
toOrigin.SetLifeTime(Simulator::Now() + Scalar(2)*NET_TRAVERSAL_TIME - Scalar(2*hop)*NODE_TRAVERSAL_TIME);
|
||||
rtable.rt_add (toOrigin);
|
||||
aodv_rt_entry newEntry(/*dst=*/origin, /*validSeno=*/true, /*seqNo=*/rreqHeader.GetOriginSeqno(),
|
||||
/*iface=*/receiver, /*hops=*/hop, /*nextHop*/src,
|
||||
/*timeLife=*/Simulator::Now() + Scalar(2)*NET_TRAVERSAL_TIME - Scalar(2*hop)*NODE_TRAVERSAL_TIME );
|
||||
rtable.rt_add (newEntry);
|
||||
}
|
||||
else if (toOrigin.GetSeqNo() < rreqHeader.GetOriginSeqno()) // TODO check logic
|
||||
else // TODO check logic
|
||||
{
|
||||
toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno());
|
||||
toOrigin.SetValidSeqNo(true);
|
||||
toOrigin.SetNextHop(src);
|
||||
toOrigin.SetHop(hop);
|
||||
Time minimalLifetime = Simulator::Now() + Scalar(2)*NET_TRAVERSAL_TIME - Scalar(2*hop)*NODE_TRAVERSAL_TIME;
|
||||
if (toOrigin.GetLifeTime() < minimalLifetime)
|
||||
toOrigin.SetLifeTime(minimalLifetime);
|
||||
// TODO rtable.Update(origin, toOrigin) !!!
|
||||
if (toOrigin.GetSeqNo() < rreqHeader.GetOriginSeqno()) toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno());
|
||||
toOrigin.SetValidSeqNo(true);
|
||||
toOrigin.SetNextHop(src);
|
||||
toOrigin.SetHop(hop);
|
||||
Time minimalLifetime = Simulator::Now() + Scalar(2)*NET_TRAVERSAL_TIME - Scalar(2*hop)*NODE_TRAVERSAL_TIME;
|
||||
if (toOrigin.GetLifeTime() < minimalLifetime)
|
||||
toOrigin.SetLifeTime(minimalLifetime);
|
||||
rtable.Update(origin, toOrigin);
|
||||
}
|
||||
|
||||
// A node generates a RREP if either:
|
||||
@@ -467,6 +463,7 @@ RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address s
|
||||
Ipv4Address addr = m_ipv4->GetAddress (k, 0).GetLocal ();
|
||||
if (addr == rreqHeader.GetDst())
|
||||
{
|
||||
rtable.rt_lookup(origin, toOrigin);
|
||||
SendReply (rreqHeader, toOrigin, socket);
|
||||
return;
|
||||
}
|
||||
@@ -653,8 +650,6 @@ RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address my ,Ipv4Address src)
|
||||
toNextHopToDst.pc_insert(toOrigin.GetNextHop());
|
||||
|
||||
// TODO add operation over unidirctinal links
|
||||
// ipv4Header.SetSource(toOrigin.GetInterface());
|
||||
// ipv4Header.SetDestination(toOrigin.GetNextHop());
|
||||
p->AddHeader(rrepHeader);
|
||||
p->AddHeader(tHeader);
|
||||
std::map< Ipv4Address, Ptr<Socket> >::const_iterator j = m_addressSocket.find(toOrigin.GetInterface());
|
||||
@@ -731,15 +726,10 @@ RoutingProtocol::SendReplyByIntermediateNode(aodv_rt_entry & toDst, aodv_rt_entr
|
||||
toDst.pc_insert(toOrigin.GetNextHop());
|
||||
toOrigin.pc_insert(toDst.GetNextHop());
|
||||
|
||||
Ipv4Header ipv4Header;
|
||||
|
||||
ipv4Header.SetSource(toOrigin.GetInterface());
|
||||
ipv4Header.SetDestination(toOrigin.GetNextHop());
|
||||
|
||||
Ptr<Packet> packet = Create<Packet> ();
|
||||
packet->AddHeader(rrepHeader);
|
||||
packet->AddHeader(tHeader);
|
||||
packet->AddHeader(ipv4Header);
|
||||
std::map< Ipv4Address, Ptr<Socket> >::const_iterator j = m_addressSocket.find(toOrigin.GetInterface());
|
||||
j->second->Send(packet);
|
||||
|
||||
@@ -751,14 +741,9 @@ RoutingProtocol::SendReplyByIntermediateNode(aodv_rt_entry & toDst, aodv_rt_entr
|
||||
rrepHeader.SetOrigin(toDst.GetDst());
|
||||
rrepHeader.SetLifeTime(toOrigin.GetLifeTime() - Simulator::Now());
|
||||
|
||||
|
||||
ipv4Header.SetSource(toDst.GetInterface());
|
||||
ipv4Header.SetDestination(toDst.GetNextHop());
|
||||
|
||||
Ptr<Packet> packetToDst = Create<Packet> ();
|
||||
packetToDst->AddHeader(rrepHeader);
|
||||
packetToDst->AddHeader(tHeader);
|
||||
packetToDst->AddHeader(ipv4Header);
|
||||
j = m_addressSocket.find(toDst.GetInterface());
|
||||
j->second->Send(packet);
|
||||
}
|
||||
|
||||
@@ -43,13 +43,6 @@ namespace ns3
|
||||
{
|
||||
namespace aodv
|
||||
{
|
||||
/// Various constants used for the expanding ring search
|
||||
//\{
|
||||
#define TTL_START 5 /// (?) in RFC 1
|
||||
#define TTL_THRESHOLD 7
|
||||
#define TTL_INCREMENT 2
|
||||
//\}
|
||||
|
||||
/// List of neighbors TODO document & move inside protocol
|
||||
class NeighborList
|
||||
{
|
||||
|
||||
@@ -33,36 +33,18 @@ namespace aodv {
|
||||
The Routing Table
|
||||
*/
|
||||
|
||||
aodv_rt_entry::aodv_rt_entry()
|
||||
{
|
||||
rt_req_timeout = MilliSeconds(0.0);
|
||||
rt_req_cnt = 0;
|
||||
rt_dst = Ipv4Address("127.0.0.1");
|
||||
validSeqNo = false;
|
||||
rt_seqno = 0;
|
||||
rt_hops = rt_last_hop_count = INFINITY2;
|
||||
rt_nexthop = Ipv4Address("127.0.0.1");
|
||||
rt_lifetime = MilliSeconds(0.0);
|
||||
rt_flags = RTF_DOWN;
|
||||
|
||||
for (int i=0; i < MAX_HISTORY; i++)
|
||||
aodv_rt_entry::aodv_rt_entry(Ipv4Address dst, bool vSeqNo, u_int32_t seqNo, Ipv4Address iface, u_int16_t hops,
|
||||
Ipv4Address nextHop, Time lifetime)
|
||||
: rt_dst(dst), validSeqNo(vSeqNo), rt_seqno(seqNo), interface(iface), rt_hops(hops), rt_last_hop_count(hops),
|
||||
rt_nexthop(nextHop), rt_lifetime(lifetime), rt_req_cnt(0)
|
||||
{
|
||||
rt_flags = RTF_UP;
|
||||
for(uint8_t i = 0; i < MAX_HISTORY; ++i)
|
||||
{
|
||||
rt_disc_latency[i] = 0.0;
|
||||
rt_disc_latency[i] = 0;
|
||||
}
|
||||
hist_indx = 0;
|
||||
rt_req_last_ttl = 0;
|
||||
}
|
||||
|
||||
aodv_rt_entry::aodv_rt_entry(Ipv4Address dst, bool vSeqNo, u_int32_t seqNo,
|
||||
Ipv4Address iface, u_int16_t hops, Ipv4Address nextHop, Time lifetime)
|
||||
{
|
||||
rt_dst = dst;
|
||||
validSeqNo = vSeqNo;
|
||||
if (validSeqNo) rt_seqno = seqNo;
|
||||
rt_hops = hops;
|
||||
interface = iface;
|
||||
rt_nexthop = nextHop;
|
||||
rt_lifetime = lifetime;
|
||||
}
|
||||
|
||||
aodv_rt_entry::~aodv_rt_entry()
|
||||
@@ -153,6 +135,16 @@ aodv_rtable::rt_add(aodv_rt_entry const & rt)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
aodv_rtable::Update(Ipv4Address dst, aodv_rt_entry & rt)
|
||||
{
|
||||
std::map<Ipv4Address, aodv_rt_entry>::iterator i = rthead.find(dst);
|
||||
if (i == rthead.end()) return false;
|
||||
i->second = rt;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
aodv_rtable::SetEntryState (Ipv4Address id, uint8_t state)
|
||||
{
|
||||
@@ -195,7 +187,10 @@ AodvRtableTest::RunTests ()
|
||||
|
||||
aodv_rtable rtable;
|
||||
rtable.rt_add(entry2);
|
||||
entry2.SetLifeTime(Seconds(10));
|
||||
NS_TEST_ASSERT(rtable.Update(entry2.GetDst(), entry2));
|
||||
NS_TEST_ASSERT(rtable.rt_lookup(dst2, entry1));
|
||||
NS_TEST_ASSERT(entry1.GetLifeTime() == entry2.GetLifeTime());
|
||||
NS_TEST_ASSERT(entry1 == dst2);
|
||||
NS_TEST_ASSERT(!rtable.rt_lookup(dst1, entry1));
|
||||
NS_TEST_ASSERT(rtable.rt_delete(dst2));
|
||||
|
||||
@@ -37,7 +37,12 @@ namespace aodv {
|
||||
#define INFINITY2 0xff
|
||||
#define DELETE_PERIOD 10 // seconds. TODO: remove defines
|
||||
|
||||
|
||||
enum RouteFlags
|
||||
{
|
||||
RTF_DOWN = 0,
|
||||
RTF_UP = 1,
|
||||
RTF_IN_REPAIR = 2
|
||||
};
|
||||
|
||||
/**
|
||||
* \ingroup aodv
|
||||
@@ -46,10 +51,9 @@ namespace aodv {
|
||||
class aodv_rt_entry
|
||||
{
|
||||
public:
|
||||
aodv_rt_entry();
|
||||
// TODO add all members to c-tor
|
||||
aodv_rt_entry(Ipv4Address dst, bool vSeqNo, u_int32_t seqNo, Ipv4Address iface,
|
||||
u_int16_t hops, Ipv4Address nextHop, Time lifetime);
|
||||
aodv_rt_entry(Ipv4Address dst = Ipv4Address(), bool vSeqNo = false, u_int32_t seqNo = 0, Ipv4Address iface = Ipv4Address(), u_int16_t hops = 0,
|
||||
Ipv4Address nextHop = Ipv4Address(), Time lifetime = Seconds(0));
|
||||
|
||||
~aodv_rt_entry();
|
||||
|
||||
///\name Precursors management
|
||||
@@ -132,8 +136,7 @@ private:
|
||||
uint16_t rt_last_hop_count;
|
||||
/// Next hop IP address
|
||||
Ipv4Address rt_nexthop;
|
||||
/// List of precursors
|
||||
std::vector<Ipv4Address> rt_pclist;
|
||||
|
||||
/**
|
||||
* \brief Expiration or deletion time of the route
|
||||
* Lifetime field in the routing table plays dual role --
|
||||
@@ -144,11 +147,10 @@ private:
|
||||
/// Routing flags: down, up or in repair
|
||||
uint8_t rt_flags; /*TODO use enum*/
|
||||
|
||||
#define RTF_DOWN 0
|
||||
#define RTF_UP 1
|
||||
#define RTF_IN_REPAIR 2
|
||||
#define MAX_HISTORY 3
|
||||
|
||||
/// List of precursors
|
||||
std::vector<Ipv4Address> rt_pclist;
|
||||
/// When I can send another request
|
||||
Time rt_req_timeout;
|
||||
/// Number of route requests
|
||||
@@ -157,8 +159,6 @@ private:
|
||||
// TODO review and delete
|
||||
double rt_disc_latency[MAX_HISTORY];
|
||||
char hist_indx;
|
||||
/// Last ttl value used
|
||||
uint16_t rt_req_last_ttl;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -190,6 +190,8 @@ public:
|
||||
* \return true on success
|
||||
*/
|
||||
bool rt_lookup(Ipv4Address dst, aodv_rt_entry & rt) const;
|
||||
/// Update routing table
|
||||
bool Update(Ipv4Address dst, aodv_rt_entry & rt);
|
||||
/// Set routing table entry flags
|
||||
void SetEntryState (Ipv4Address dst, uint8_t state /*TODO use enum*/);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user