in process

This commit is contained in:
Borovkova Elena
2009-07-15 12:39:17 +04:00
parent 93ed50fad1
commit d168543db9
4 changed files with 57 additions and 82 deletions

View File

@@ -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);
}

View File

@@ -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
{

View File

@@ -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));

View File

@@ -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*/);