author | Borovkova Elena <borovkovaes@iitp.ru> |
Wed, 19 Aug 2009 12:41:52 +0400 | |
changeset 5694 | a1da0ba7d1a8 |
parent 5692 | 4cc0291326c6 |
child 5695 | 098168f99e72 |
permissions | -rw-r--r-- |
5560 | 1 |
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 |
/* |
|
5591
e0448da5da14
AODV copyright changed to IITP
Pavel Boyko <boyko@iitp.ru>
parents:
5590
diff
changeset
|
3 |
* Copyright (c) 2009 IITP RAS |
5560 | 4 |
* |
5 |
* This program is free software; you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License version 2 as |
|
7 |
* published by the Free Software Foundation; |
|
8 |
* |
|
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
17 |
* |
|
5591
e0448da5da14
AODV copyright changed to IITP
Pavel Boyko <boyko@iitp.ru>
parents:
5590
diff
changeset
|
18 |
* Based on |
e0448da5da14
AODV copyright changed to IITP
Pavel Boyko <boyko@iitp.ru>
parents:
5590
diff
changeset
|
19 |
* NS-2 AODV model developed by the CMU/MONARCH group and optimized and |
e0448da5da14
AODV copyright changed to IITP
Pavel Boyko <boyko@iitp.ru>
parents:
5590
diff
changeset
|
20 |
* tuned by Samir Das and Mahesh Marina, University of Cincinnati; |
e0448da5da14
AODV copyright changed to IITP
Pavel Boyko <boyko@iitp.ru>
parents:
5590
diff
changeset
|
21 |
* |
e0448da5da14
AODV copyright changed to IITP
Pavel Boyko <boyko@iitp.ru>
parents:
5590
diff
changeset
|
22 |
* AODV-UU implementation by Erik Nordström of Uppsala University |
e0448da5da14
AODV copyright changed to IITP
Pavel Boyko <boyko@iitp.ru>
parents:
5590
diff
changeset
|
23 |
* http://core.it.uu.se/core/index.php/AODV-UU |
5560 | 24 |
* |
5591
e0448da5da14
AODV copyright changed to IITP
Pavel Boyko <boyko@iitp.ru>
parents:
5590
diff
changeset
|
25 |
* Authors: Elena Borovkova <borovkovaes@iitp.ru> |
e0448da5da14
AODV copyright changed to IITP
Pavel Boyko <boyko@iitp.ru>
parents:
5590
diff
changeset
|
26 |
* Pavel Boyko <boyko@iitp.ru> |
5560 | 27 |
*/ |
28 |
#include "aodv-routing-protocol.h" |
|
5579 | 29 |
#include "ns3/socket.h" |
5560 | 30 |
#include "ns3/simulator.h" |
31 |
#include "ns3/log.h" |
|
32 |
#include "ns3/random-variable.h" |
|
33 |
#include "ns3/inet-socket-address.h" |
|
34 |
#include "ns3/ipv4-routing-protocol.h" |
|
35 |
#include "ns3/ipv4-route.h" |
|
36 |
#include "ns3/uinteger.h" |
|
37 |
#include "ns3/enum.h" |
|
38 |
#include "ns3/trace-source-accessor.h" |
|
39 |
#include "ns3/ipv4-header.h" |
|
5580 | 40 |
#include "ns3/udp-header.h" |
5575 | 41 |
#include "ns3/nstime.h" |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
42 |
#include "ns3/net-device.h" |
5677 | 43 |
#include "ns3/udp-socket-factory.h" |
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
44 |
#include "ns3/wifi-net-device.h" |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
45 |
#include "ns3/adhoc-wifi-mac.h" |
5622
aa34a270824c
route lifetime management fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5621
diff
changeset
|
46 |
#include <algorithm> |
5613
c2e4bad4affc
Raw socket nearly work
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5612
diff
changeset
|
47 |
|
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
48 |
#include "ns3/icmpv4.h" |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
49 |
|
5560 | 50 |
NS_LOG_COMPONENT_DEFINE ("AodvRoutingProtocol"); |
51 |
||
52 |
namespace ns3 |
|
53 |
{ |
|
54 |
namespace aodv |
|
55 |
{ |
|
56 |
NS_OBJECT_ENSURE_REGISTERED (RoutingProtocol); |
|
57 |
||
5647
b5e2bb381517
#define AODV_PORT killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5645
diff
changeset
|
58 |
/// UDP Port for AODV control traffic |
b5e2bb381517
#define AODV_PORT killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5645
diff
changeset
|
59 |
const uint32_t RoutingProtocol::AODV_PORT = 654; |
5606
e6248d1eea81
handle active neighbors added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5605
diff
changeset
|
60 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
61 |
RoutingProtocol::RoutingProtocol () : |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
62 |
RreqRetries (2), |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
63 |
RreqRateLimit (10), |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
64 |
ActiveRouteTimeout (Seconds (3)), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
65 |
NetDiameter (35), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
66 |
NodeTraversalTime (MilliSeconds (40)), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
67 |
NetTraversalTime (Scalar (2 * NetDiameter) * NodeTraversalTime), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
68 |
PathDiscoveryTime ( Scalar (2) * NetTraversalTime), |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
69 |
MyRouteTimeout (Scalar (2) * std::max (PathDiscoveryTime, ActiveRouteTimeout)), |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
70 |
HelloInterval(Seconds (1)), |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
71 |
AllowedHelloLoss (2), |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
72 |
DeletePeriod (Scalar(5) * std::max(ActiveRouteTimeout, HelloInterval)), |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
73 |
NextHopWait (NodeTraversalTime + MilliSeconds (10)), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
74 |
TimeoutBuffer (2), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
75 |
BlackListTimeout(Scalar (RreqRetries) * NetTraversalTime), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
76 |
MaxQueueLen (64), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
77 |
MaxQueueTime (Seconds(30)), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
78 |
DestinationOnly (false), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
79 |
GratuitousReply (true), |
5658 | 80 |
EnableHello (true), |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
81 |
m_routingTable (DeletePeriod), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
82 |
m_queue (MaxQueueLen, MaxQueueTime), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
83 |
m_requestId (0), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
84 |
m_seqNo (0), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
85 |
m_nb(HelloInterval), |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
86 |
m_rreqCount (0), |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
87 |
htimer (Timer::CANCEL_ON_DESTROY), |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
88 |
m_rreqRateLimitTimer (Timer::CANCEL_ON_DESTROY) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
89 |
{ |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
90 |
if (EnableHello) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
91 |
{ |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
92 |
m_nb.SetCallback (MakeCallback (&RoutingProtocol::SendRerrWhenBreaksLinkToNextHop, this)); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
93 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
94 |
} |
5560 | 95 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
96 |
TypeId |
5560 | 97 |
RoutingProtocol::GetTypeId (void) |
98 |
{ |
|
5619 | 99 |
static TypeId tid = TypeId ("ns3::aodv::RoutingProtocol") |
100 |
.SetParent<Ipv4RoutingProtocol> () |
|
101 |
.AddConstructor<RoutingProtocol> () |
|
102 |
.AddAttribute ("HelloInterval", "HELLO messages emission interval.", |
|
103 |
TimeValue (Seconds (1)), |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
104 |
MakeTimeAccessor (&RoutingProtocol::HelloInterval), |
5619 | 105 |
MakeTimeChecker ()) |
106 |
.AddAttribute ("RreqRetries", "Maximum number of retransmissions of RREQ to discover a route", |
|
107 |
UintegerValue (2), |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
108 |
MakeUintegerAccessor (&RoutingProtocol::RreqRetries), |
5619 | 109 |
MakeUintegerChecker<uint32_t> ()) |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
110 |
.AddAttribute ("RreqRateLimit", "Maximum number of RREQ per second.", |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
111 |
UintegerValue (10), |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
112 |
MakeUintegerAccessor (&RoutingProtocol::RreqRateLimit), |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
113 |
MakeUintegerChecker<uint32_t> ()) |
5625 | 114 |
.AddAttribute ("NodeTraversalTime", "Conservative estimate of the average one hop traversal time for packets and should include " |
5619 | 115 |
"queuing delays, interrupt processing times and transfer times.", |
116 |
TimeValue (MilliSeconds (40)), |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
117 |
MakeTimeAccessor (&RoutingProtocol::NodeTraversalTime), |
5619 | 118 |
MakeTimeChecker ()) |
119 |
.AddAttribute ("ActiveRouteTimeout", "Period of time during which the route is considered to be valid", |
|
120 |
TimeValue (Seconds (3)), |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
121 |
MakeTimeAccessor (&RoutingProtocol::ActiveRouteTimeout), |
5619 | 122 |
MakeTimeChecker ()) |
123 |
.AddAttribute ("NetDiameter", "Net diameter measures the maximum possible number of hops between two nodes in the network", |
|
124 |
UintegerValue (35), |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
125 |
MakeUintegerAccessor (&RoutingProtocol::NetDiameter), |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
126 |
MakeUintegerChecker<uint32_t> ()) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
127 |
.AddAttribute ("MaxQueueLen", "Maximum number of packets that we allow a routing protocol to buffer.", |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
128 |
UintegerValue (64), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
129 |
MakeUintegerAccessor (&RoutingProtocol::MaxQueueLen), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
130 |
MakeUintegerChecker<uint32_t> ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
131 |
.AddAttribute ("MaxQueueTime", "Maximum time packets can be queued (in seconds)", |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
132 |
TimeValue (Seconds (30)), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
133 |
MakeTimeAccessor (&RoutingProtocol::MaxQueueTime), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
134 |
MakeTimeChecker ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
135 |
.AddAttribute ("AllowedHelloLoss", "Number of hello messages which may be loss for valid link.", |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
136 |
UintegerValue (2), |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
137 |
MakeUintegerAccessor (&RoutingProtocol::AllowedHelloLoss), |
5619 | 138 |
MakeUintegerChecker<uint16_t> ()) |
5654 | 139 |
.AddAttribute ("GratuitousReply", "Indicates whether a gratuitous RREP should be unicast to the node originated route discovery.", |
5634
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
140 |
BooleanValue (true), |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
141 |
MakeBooleanAccessor (&RoutingProtocol::SetGratuitousReplyFlag, |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
142 |
&RoutingProtocol::GetGratuitousReplyFlag), |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
143 |
MakeBooleanChecker ()) |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
144 |
.AddAttribute ("DestinationOnly", "Indicates only the destination may respond to this RREQ.", |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
145 |
BooleanValue (false), |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
146 |
MakeBooleanAccessor (&RoutingProtocol::SetDesinationOnlyFlag, |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
147 |
&RoutingProtocol::GetDesinationOnlyFlag), |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
148 |
MakeBooleanChecker ()) |
5654 | 149 |
.AddAttribute ("EnableHello", "Indicates whether a hello messages enable.", |
5658 | 150 |
BooleanValue (true), |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
151 |
MakeBooleanAccessor (&RoutingProtocol::SetHelloEnable, |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
152 |
&RoutingProtocol::GetHelloEnable), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
153 |
MakeBooleanChecker ()) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
154 |
; |
5560 | 155 |
return tid; |
156 |
} |
|
5674 | 157 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
158 |
RoutingProtocol::~RoutingProtocol () |
5560 | 159 |
{ |
160 |
} |
|
161 |
||
162 |
void |
|
163 |
RoutingProtocol::DoDispose () |
|
164 |
{ |
|
165 |
m_ipv4 = 0; |
|
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
166 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::iterator iter = m_socketAddresses.begin (); iter != m_socketAddresses.end (); iter++) |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
167 |
{ |
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
168 |
iter->first->Close (); |
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
169 |
} |
5560 | 170 |
m_socketAddresses.clear (); |
171 |
Ipv4RoutingProtocol::DoDispose (); |
|
172 |
} |
|
173 |
||
5582 | 174 |
void |
175 |
RoutingProtocol::Start () |
|
176 |
{ |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
177 |
m_scb = MakeCallback (&RoutingProtocol::Send, this); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
178 |
m_ecb = MakeCallback (&RoutingProtocol::Drop, this); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
179 |
|
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
180 |
if (EnableHello) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
181 |
{ |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
182 |
m_nb.ScheduleTimer (); |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
183 |
} |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
184 |
m_rreqRateLimitTimer.SetFunction (&RoutingProtocol::RreqRateLimitTimerExpire, this); |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
185 |
m_rreqRateLimitTimer.Schedule (Seconds (1)); |
5582 | 186 |
} |
187 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
188 |
Ptr<Ipv4Route> |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
189 |
RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr ) |
5560 | 190 |
{ |
5692
4cc0291326c6
udp traffic added into aodv script + problem with remove fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5690
diff
changeset
|
191 |
NS_LOG_FUNCTION (this << header.GetDestination ()); |
5667
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
192 |
if (m_socketAddresses.empty ()) |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
193 |
{ |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
194 |
sockerr = Socket::ERROR_NOROUTETOHOST; |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
195 |
NS_LOG_LOGIC ("No aodv interfaces"); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
196 |
Ptr<Ipv4Route> route; |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
197 |
return route; |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
198 |
} |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
199 |
sockerr = Socket::ERROR_NOTERROR; |
5607 | 200 |
Ptr<Ipv4Route> route; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
201 |
Ipv4Address dst = header.GetDestination (); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
202 |
RoutingTableEntry rt; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
203 |
if (m_routingTable.LookupRoute (dst, rt)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
204 |
{ |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
205 |
if (rt.GetFlag () == VALID) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
206 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
207 |
route = rt.GetRoute (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
208 |
NS_ASSERT (route != 0); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
209 |
NS_LOG_LOGIC("exist route to " << route->GetDestination() << " from iface " << route->GetSource()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
210 |
UpdateRouteLifeTime (dst, ActiveRouteTimeout); |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
211 |
UpdateRouteLifeTime (route->GetGateway(), ActiveRouteTimeout); |
5658 | 212 |
// m_nb.Update (route->GetGateway(), ActiveRouteTimeout); //? |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
213 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
214 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
215 |
{ |
5680
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
216 |
bool result = true; |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
217 |
// May be null pointer (e.g. tcp-socket give null pointer) |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
218 |
if (p != Ptr<Packet> ()) |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
219 |
{ |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
220 |
QueueEntry newEntry (p, header, m_scb, m_ecb); |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
221 |
result = m_queue.Enqueue (newEntry); |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
222 |
if (result) |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
223 |
NS_LOG_LOGIC ("Add packet " << p->GetUid() << " to queue"); |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
224 |
|
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
225 |
} |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
226 |
if ((rt.GetFlag () == INVALID) && result) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
227 |
{ |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
228 |
SendRequest (dst); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
229 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
230 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
231 |
} |
5578
020a5aa8b40c
SendRequeat in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5577
diff
changeset
|
232 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
233 |
{ |
5680
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
234 |
bool result = true; |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
235 |
if (p != Ptr<Packet> ()) |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
236 |
{ |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
237 |
QueueEntry newEntry (p, header, m_scb, m_ecb); |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
238 |
// Some protocols may ask route several times for a single packet. |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
239 |
result = m_queue.Enqueue (newEntry); |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
240 |
if (result) |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
241 |
NS_LOG_LOGIC ("Add packet " << p->GetUid() << " to queue. Protocol " << (uint16_t) header.GetProtocol ()); |
5680
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
242 |
} |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
243 |
if (result) |
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
244 |
SendRequest (dst); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
245 |
} |
5625 | 246 |
return route; |
5560 | 247 |
} |
248 |
||
249 |
bool |
|
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
250 |
RoutingProtocol::RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev, UnicastForwardCallback ucb, |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
251 |
MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb ) |
5560 | 252 |
{ |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
253 |
NS_LOG_FUNCTION (this << p->GetUid() << header.GetDestination() << idev->GetAddress()); |
5667
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
254 |
if (m_socketAddresses.empty ()) |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
255 |
{ |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
256 |
NS_LOG_LOGIC ("No aodv interfaces"); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
257 |
return false; |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
258 |
} |
5579 | 259 |
NS_ASSERT (m_ipv4 != 0); |
260 |
// Check if input device supports IP |
|
261 |
NS_ASSERT (m_ipv4->GetInterfaceForDevice (idev) >= 0); |
|
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
262 |
int32_t iif = m_ipv4->GetInterfaceForDevice (idev); |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
263 |
|
5582 | 264 |
Ipv4Address dst = header.GetDestination (); |
5609 | 265 |
Ipv4Address origin = header.GetSource (); |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
266 |
|
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
267 |
if (IsMyOwnAddress (origin)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
268 |
return true; |
5579 | 269 |
|
5694
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
270 |
if (dst == Ipv4Address::GetBroadcast()) |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
271 |
{ |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
272 |
NS_LOG_LOGIC ("Broadcast local delivery"); |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
273 |
Ptr<Packet> packet = p->Copy (); |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
274 |
lcb (p, header, iif); |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
275 |
if (header.GetTtl () > 1) |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
276 |
{ |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
277 |
NS_LOG_LOGIC ("Forward broadcast"); |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
278 |
Ptr<Ipv4Route> route; |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
279 |
ucb (route, packet, header); |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
280 |
} |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
281 |
else |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
282 |
{ |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
283 |
NS_LOG_WARN ("TTL exceeded. Drop packet " << p->GetUid ()); |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
284 |
} |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
285 |
return true; |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
286 |
} |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
287 |
|
5582 | 288 |
// Local delivery to AODV interfaces |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
289 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
290 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
291 |
Ipv4InterfaceAddress iface = j->second; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
292 |
if (m_ipv4->GetInterfaceForAddress (iface.GetLocal ()) == iif) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
293 |
if (dst == iface.GetBroadcast ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
294 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
295 |
if (m_idCache.LookupId (origin, p->GetUid ())) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
296 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
297 |
NS_LOG_LOGIC("Duplicated packet from " << origin); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
298 |
return true; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
299 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
300 |
m_idCache.InsertId (origin, p->GetUid (), PathDiscoveryTime); |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
301 |
UpdateRouteLifeTime (origin, ActiveRouteTimeout); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
302 |
NS_LOG_LOGIC ("Broadcast local delivery to " << iface.GetLocal ()); |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
303 |
Ptr<Packet> packet = p->Copy(); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
304 |
lcb (p, header, iif); |
5690 | 305 |
if (header.GetTtl () > 1) |
5689
56aac7757f06
bcast forwarding seems to be fixed
Pavel Boyko <boyko@iitp.ru>
parents:
5687
diff
changeset
|
306 |
{ |
5694
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
307 |
NS_LOG_LOGIC ("Forward broadcast. TTL " << (uint16_t) header.GetTtl ()); |
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
308 |
Ptr<Ipv4Route> route; |
5689
56aac7757f06
bcast forwarding seems to be fixed
Pavel Boyko <boyko@iitp.ru>
parents:
5687
diff
changeset
|
309 |
ucb (route, packet, header); |
56aac7757f06
bcast forwarding seems to be fixed
Pavel Boyko <boyko@iitp.ru>
parents:
5687
diff
changeset
|
310 |
} |
5692
4cc0291326c6
udp traffic added into aodv script + problem with remove fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5690
diff
changeset
|
311 |
else |
4cc0291326c6
udp traffic added into aodv script + problem with remove fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5690
diff
changeset
|
312 |
{ |
4cc0291326c6
udp traffic added into aodv script + problem with remove fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5690
diff
changeset
|
313 |
NS_LOG_WARN ("TTL exceeded. Drop packet " << p->GetUid ()); |
4cc0291326c6
udp traffic added into aodv script + problem with remove fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5690
diff
changeset
|
314 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
315 |
return true; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
316 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
317 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
318 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
319 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
320 |
Ipv4InterfaceAddress iface = j->second; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
321 |
if (dst == iface.GetLocal ()) |
5615
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
322 |
{ |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
323 |
UpdateRouteLifeTime (origin, ActiveRouteTimeout); |
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
324 |
RoutingTableEntry toOrigin; |
5686
7dcbf7db5610
Broken link monitoring fixed, now it works in aodv-with-interface-down test
Pavel Boyko <boyko@iitp.ru>
parents:
5683
diff
changeset
|
325 |
if (m_routingTable.LookupRoute (origin, toOrigin)) |
7dcbf7db5610
Broken link monitoring fixed, now it works in aodv-with-interface-down test
Pavel Boyko <boyko@iitp.ru>
parents:
5683
diff
changeset
|
326 |
{ |
7dcbf7db5610
Broken link monitoring fixed, now it works in aodv-with-interface-down test
Pavel Boyko <boyko@iitp.ru>
parents:
5683
diff
changeset
|
327 |
UpdateRouteLifeTime (toOrigin.GetNextHop (), ActiveRouteTimeout); |
7dcbf7db5610
Broken link monitoring fixed, now it works in aodv-with-interface-down test
Pavel Boyko <boyko@iitp.ru>
parents:
5683
diff
changeset
|
328 |
m_nb.Update (toOrigin.GetNextHop (), ActiveRouteTimeout); |
7dcbf7db5610
Broken link monitoring fixed, now it works in aodv-with-interface-down test
Pavel Boyko <boyko@iitp.ru>
parents:
5683
diff
changeset
|
329 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
330 |
NS_LOG_LOGIC ("Unicast local delivery to " << iface.GetLocal ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
331 |
lcb (p, header, iif); |
5615
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
332 |
return true; |
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
333 |
} |
5579 | 334 |
} |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
335 |
|
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
336 |
// TODO: local delivery to non-AODV interfaces |
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
337 |
// Forwarding |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
338 |
return Forwarding (p, header, ucb, ecb); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
339 |
} |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
340 |
|
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
341 |
bool |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
342 |
RoutingProtocol::Forwarding (Ptr<const Packet> p, const Ipv4Header & header, UnicastForwardCallback ucb, ErrorCallback ecb) |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
343 |
{ |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
344 |
Ipv4Address dst = header.GetDestination (); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
345 |
Ipv4Address origin = header.GetSource (); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
346 |
m_routingTable.Purge (); |
5609 | 347 |
RoutingTableEntry toDst; |
348 |
if (m_routingTable.LookupRoute (dst, toDst)) |
|
5622
aa34a270824c
route lifetime management fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5621
diff
changeset
|
349 |
{ |
5676 | 350 |
if (toDst.GetFlag () == VALID) |
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
351 |
{ |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
352 |
Ptr<Ipv4Route> route = toDst.GetRoute (); |
5655 | 353 |
NS_LOG_LOGIC(route->GetSource()<<" forwarding to " << dst << " from " << origin << " packet " << p->GetUid ()); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
354 |
|
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
355 |
/** |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
356 |
* Each time a route is used to forward a data packet, its Active Route |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
357 |
* Lifetime field of the source, destination and the next hop on the |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
358 |
* path to the destination is updated to be no less than the current |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
359 |
* time plus ActiveRouteTimeout. |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
360 |
*/ |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
361 |
UpdateRouteLifeTime (origin, ActiveRouteTimeout); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
362 |
UpdateRouteLifeTime (dst, ActiveRouteTimeout); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
363 |
UpdateRouteLifeTime (route->GetGateway (), ActiveRouteTimeout); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
364 |
/** |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
365 |
* Since the route between each originator and destination pair is expected to be symmetric, the |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
366 |
* Active Route Lifetime for the previous hop, along the reverse path back to the IP source, is also updated |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
367 |
* to be no less than the current time plus ActiveRouteTimeout |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
368 |
*/ |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
369 |
RoutingTableEntry toOrigin; |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
370 |
m_routingTable.LookupRoute (origin, toOrigin); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
371 |
UpdateRouteLifeTime (toOrigin.GetNextHop (), ActiveRouteTimeout); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
372 |
|
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
373 |
m_nb.Update (route->GetGateway (), ActiveRouteTimeout); //? |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
374 |
m_nb.Update (toOrigin.GetNextHop (), ActiveRouteTimeout); |
5609 | 375 |
|
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
376 |
ucb (route, p, header); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
377 |
return true; |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
378 |
} |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
379 |
else |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
380 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
381 |
if (toDst.GetValidSeqNo ()) |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
382 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
383 |
SendRerrWhenNoRouteToForward (dst, toDst.GetSeqNo (), origin); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
384 |
return false; |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
385 |
} |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
386 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
387 |
} |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
388 |
NS_LOG_LOGIC("route not found to "<< dst << ". Send RERR message."); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
389 |
SendRerrWhenNoRouteToForward (dst, 0, origin); |
5578
020a5aa8b40c
SendRequeat in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5577
diff
changeset
|
390 |
return false; |
5560 | 391 |
} |
392 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
393 |
void |
5560 | 394 |
RoutingProtocol::SetIpv4 (Ptr<Ipv4> ipv4) |
395 |
{ |
|
5616
9d22b787ea7c
RawSocketImpl::ForwardUp fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5615
diff
changeset
|
396 |
NS_ASSERT (ipv4 != 0); |
9d22b787ea7c
RawSocketImpl::ForwardUp fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5615
diff
changeset
|
397 |
NS_ASSERT (m_ipv4 == 0); |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
398 |
|
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
399 |
if (EnableHello) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
400 |
{ |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
401 |
htimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this); |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
402 |
htimer.Schedule(MilliSeconds(UniformVariable().GetValue (0.0, 100.0))); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
403 |
} |
5571
b82fbde6cf8d
BroadcastIdCache methods and SendRequest() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5562
diff
changeset
|
404 |
|
5560 | 405 |
m_ipv4 = ipv4; |
406 |
Simulator::ScheduleNow (&RoutingProtocol::Start, this); |
|
407 |
} |
|
408 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
409 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
410 |
RoutingProtocol::NotifyInterfaceUp (uint32_t i ) |
5560 | 411 |
{ |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
412 |
NS_LOG_FUNCTION (this << m_ipv4->GetAddress (i, 0).GetLocal ()); |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
413 |
Ptr<Ipv4L3Protocol> l3 = m_ipv4->GetObject<Ipv4L3Protocol> (); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
414 |
Ptr<Ipv4Interface> interface = l3->GetInterface (i); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
415 |
if (interface->GetNAddresses () > 1) |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
416 |
{ |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
417 |
NS_LOG_LOGIC ("AODV does not work with more then one address per each interface."); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
418 |
} |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
419 |
Ipv4InterfaceAddress iface = interface->GetAddress (0); |
5666
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
420 |
if (iface.GetLocal () == Ipv4Address ("127.0.0.1")) |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
421 |
return; |
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
422 |
|
5666
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
423 |
// Create a socket to listen only on this interface |
5677 | 424 |
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), UdpSocketFactory::GetTypeId()); |
5666
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
425 |
NS_ASSERT (socket != 0); |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
426 |
socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
427 |
socket->Bind(InetSocketAddress (iface.GetLocal(), AODV_PORT)); |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
428 |
socket->Connect (InetSocketAddress (iface.GetBroadcast(), AODV_PORT)); |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
429 |
m_socketAddresses.insert (std::make_pair (socket, iface)); |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
430 |
|
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
431 |
// Add local broadcast record to the routing table |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
432 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (iface.GetLocal ())); |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
433 |
RoutingTableEntry rt (/*device=*/dev, /*dst=*/iface.GetBroadcast (), /*know seqno=*/true, /*seqno=*/0, /*iface=*/iface, |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
434 |
/*hops=*/1, /*next hop=*/iface.GetBroadcast (), /*lifetime=*/Seconds (1e9)); // TODO use infty |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
435 |
m_routingTable.AddRoute (rt); |
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
436 |
|
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
437 |
// Allow neighbor manager use this interface for layer 2 feedback if possible |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
438 |
Ptr<WifiNetDevice> wifi = dev->GetObject<WifiNetDevice> (); |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
439 |
if (wifi == 0) return; |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
440 |
Ptr<WifiMac> mac = wifi->GetMac ()->GetObject<AdhocWifiMac> (); |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
441 |
if (mac == 0) return; |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
442 |
|
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
443 |
mac->TraceConnectWithoutContext("TxErrHeader", m_nb.GetTxErrorCallback()); |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
444 |
m_nb.AddArpCache (interface->GetArpCache()); |
5560 | 445 |
} |
446 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
447 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
448 |
RoutingProtocol::NotifyInterfaceDown (uint32_t i ) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
449 |
{ |
5569 | 450 |
NS_LOG_FUNCTION (this << m_ipv4->GetAddress (i, 0).GetLocal ()); |
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
451 |
|
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
452 |
// Discable layer 2 link state monitoring (if possible) |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
453 |
Ptr<Ipv4L3Protocol> l3 = m_ipv4->GetObject<Ipv4L3Protocol> (); |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
454 |
Ptr<Ipv4Interface> interface = l3->GetInterface (i); |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
455 |
Ptr<NetDevice> dev = interface->GetDevice(); |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
456 |
Ptr<WifiNetDevice> wifi = dev->GetObject<WifiNetDevice> (); |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
457 |
if (wifi != 0) |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
458 |
{ |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
459 |
Ptr<WifiMac> mac = wifi->GetMac ()->GetObject<AdhocWifiMac> (); |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
460 |
if (mac != 0) |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
461 |
{ |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
462 |
mac->TraceDisconnectWithoutContext ("TxErrHeader", m_nb.GetTxErrorCallback()); |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
463 |
m_nb.DelArpCache (interface->GetArpCache()); |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
464 |
} |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
465 |
} |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
466 |
|
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
467 |
// Close socket |
5667
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
468 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (m_ipv4->GetAddress (i, 0)); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
469 |
NS_ASSERT (socket); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
470 |
socket->Close (); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
471 |
m_socketAddresses.erase (socket); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
472 |
if (m_socketAddresses.empty ()) |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
473 |
{ |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
474 |
NS_LOG_LOGIC ("No aodv interfaces"); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
475 |
htimer.Cancel (); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
476 |
m_nb.Clear (); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
477 |
m_routingTable.Clear (); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
478 |
return; |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
479 |
} |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
480 |
m_routingTable.DeleteAllRoutesFromInterface (m_ipv4->GetAddress (i, 0)); |
5560 | 481 |
} |
482 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
483 |
void |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
484 |
RoutingProtocol::NotifyAddAddress (uint32_t i, Ipv4InterfaceAddress address ) |
5560 | 485 |
{ |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
486 |
NS_LOG_FUNCTION (this << " interface " << i << " address " << address); |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
487 |
Ptr<Ipv4L3Protocol> l3 = m_ipv4->GetObject<Ipv4L3Protocol> (); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
488 |
Ptr<Ipv4Interface> interface = l3->GetInterface (i); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
489 |
if (interface->IsDown ()) return; |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
490 |
if (interface->GetNAddresses() == 1) |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
491 |
{ |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
492 |
Ipv4InterfaceAddress iface = interface->GetAddress (0); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
493 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (iface); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
494 |
if (!socket) |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
495 |
{ |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
496 |
if (iface.GetLocal () == Ipv4Address ("127.0.0.1")) |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
497 |
return; |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
498 |
// Create a socket to listen only on this interface |
5677 | 499 |
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), UdpSocketFactory::GetTypeId()); |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
500 |
NS_ASSERT (socket != 0); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
501 |
socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
502 |
socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT)); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
503 |
socket->Connect (InetSocketAddress (iface.GetBroadcast (), AODV_PORT)); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
504 |
m_socketAddresses.insert (std::make_pair (socket, iface)); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
505 |
|
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
506 |
// Add local broadcast record to the routing table |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
507 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (iface.GetLocal ())); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
508 |
RoutingTableEntry rt (/*device=*/dev, /*dst=*/iface.GetBroadcast (), /*know seqno=*/true, /*seqno=*/0, /*iface=*/iface, |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
509 |
/*hops=*/1, /*next hop=*/iface.GetBroadcast (), /*lifetime=*/Seconds (1e9)); // TODO use infty |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
510 |
m_routingTable.AddRoute (rt); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
511 |
} |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
512 |
} |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
513 |
else |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
514 |
{ |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
515 |
NS_LOG_LOGIC ("AODV does not work with more then one address per each interface. Ignore added address"); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
516 |
} |
5560 | 517 |
} |
518 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
519 |
void |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
520 |
RoutingProtocol::NotifyRemoveAddress (uint32_t i, Ipv4InterfaceAddress address ) |
5560 | 521 |
{ |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
522 |
NS_LOG_FUNCTION (this); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
523 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (address); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
524 |
if (socket) |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
525 |
{ |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
526 |
m_routingTable.DeleteAllRoutesFromInterface (address); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
527 |
m_socketAddresses.erase (socket); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
528 |
Ptr<Ipv4L3Protocol> l3 = m_ipv4->GetObject<Ipv4L3Protocol> (); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
529 |
Ptr<Ipv4Interface> interface = l3->GetInterface (i); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
530 |
if (interface->GetNAddresses ()) |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
531 |
{ |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
532 |
Ipv4InterfaceAddress iface = interface->GetAddress (0); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
533 |
// Create a socket to listen only on this interface |
5677 | 534 |
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), UdpSocketFactory::GetTypeId()); |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
535 |
NS_ASSERT (socket != 0); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
536 |
socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
537 |
socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT)); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
538 |
socket->Connect (InetSocketAddress (iface.GetBroadcast (), AODV_PORT)); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
539 |
m_socketAddresses.insert (std::make_pair (socket, iface)); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
540 |
|
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
541 |
// Add local broadcast record to the routing table |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
542 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (iface.GetLocal ())); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
543 |
RoutingTableEntry rt (/*device=*/dev, /*dst=*/iface.GetBroadcast (), /*know seqno=*/true, /*seqno=*/0, /*iface=*/iface, |
5674 | 544 |
/*hops=*/1, /*next hop=*/iface.GetBroadcast (), /*lifetime=*/Seconds (1e9)); // TODO use infty |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
545 |
m_routingTable.AddRoute (rt); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
546 |
} |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
547 |
if (m_socketAddresses.empty ()) |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
548 |
{ |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
549 |
NS_LOG_LOGIC ("No aodv interfaces"); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
550 |
htimer.Cancel (); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
551 |
m_nb.Clear (); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
552 |
m_routingTable.Clear (); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
553 |
return; |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
554 |
} |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
555 |
} |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
556 |
else |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
557 |
{ |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
558 |
NS_LOG_LOGIC ("Remove address not participating in AODV operation"); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
559 |
} |
5560 | 560 |
} |
561 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
562 |
bool |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
563 |
RoutingProtocol::IsMyOwnAddress (Ipv4Address src ) |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
564 |
{ |
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
565 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
566 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
567 |
Ipv4InterfaceAddress iface = j->second; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
568 |
if (src == iface.GetLocal ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
569 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
570 |
return true; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
571 |
} |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
572 |
} |
5594
106389f6d383
Duplicate detection fixed in RREQ forwarding
Pavel Boyko <boyko@iitp.ru>
parents:
5593
diff
changeset
|
573 |
return false; |
106389f6d383
Duplicate detection fixed in RREQ forwarding
Pavel Boyko <boyko@iitp.ru>
parents:
5593
diff
changeset
|
574 |
} |
106389f6d383
Duplicate detection fixed in RREQ forwarding
Pavel Boyko <boyko@iitp.ru>
parents:
5593
diff
changeset
|
575 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
576 |
void |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
577 |
RoutingProtocol::SendRequest (Ipv4Address dst) |
5582 | 578 |
{ |
5614
e4ac62d42079
BuildHeader added + support of raw socket in ipv4-l3-protol added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5613
diff
changeset
|
579 |
NS_LOG_FUNCTION ( this << dst); |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
580 |
// A node SHOULD NOT originate more than RREQ_RATELIMIT RREQ messages per second. |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
581 |
if (m_rreqCount == RreqRateLimit) |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
582 |
{ |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
583 |
Simulator::Schedule(m_rreqRateLimitTimer.GetDelayLeft() + MilliSeconds(0.1), &RoutingProtocol::SendRequest, this, dst); |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
584 |
return; |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
585 |
} |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
586 |
else |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
587 |
m_rreqCount++; |
5582 | 588 |
// Create RREQ header |
589 |
RreqHeader rreqHeader; |
|
590 |
rreqHeader.SetDst (dst); |
|
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
591 |
|
5609 | 592 |
RoutingTableEntry rt; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
593 |
if (m_routingTable.LookupRoute (dst, rt)) |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
594 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
595 |
rreqHeader.SetHopCount (rt.GetHop ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
596 |
if (rt.GetValidSeqNo ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
597 |
rreqHeader.SetDstSeqno (rt.GetSeqNo ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
598 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
599 |
rreqHeader.SetUnknownSeqno (true); |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
600 |
rt.SetFlag (IN_SEARCH); |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
601 |
m_routingTable.AddRoute (rt); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
602 |
} |
5582 | 603 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
604 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
605 |
Ptr<NetDevice> dev; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
606 |
rreqHeader.SetUnknownSeqno (true); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
607 |
RoutingTableEntry newEntry (dev, dst, false, 0, Ipv4InterfaceAddress (), 0, Ipv4Address (), Seconds (0)); |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
608 |
newEntry.SetFlag (IN_SEARCH); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
609 |
m_routingTable.AddRoute (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
610 |
} |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
611 |
|
5634
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
612 |
if (GratuitousReply) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
613 |
rreqHeader.SetGratiousRrep (true); |
5634
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
614 |
if (DestinationOnly) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
615 |
rreqHeader.SetDestinationOnly (true); |
5601 | 616 |
|
5597
8e4c7f2aaead
mothods, classes and members renamed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5594
diff
changeset
|
617 |
m_seqNo++; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
618 |
rreqHeader.SetOriginSeqno (m_seqNo); |
5615
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
619 |
m_requestId++; |
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
620 |
rreqHeader.SetId (m_requestId); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
621 |
rreqHeader.SetHopCount (0); |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
622 |
|
5625 | 623 |
// Send RREQ as subnet directed broadcast from each interface used by aodv |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
624 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
625 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
626 |
Ptr<Socket> socket = j->first; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
627 |
Ipv4InterfaceAddress iface = j->second; |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
628 |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
629 |
rreqHeader.SetOrigin (iface.GetLocal ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
630 |
m_idCache.InsertId (iface.GetLocal (), m_requestId, PathDiscoveryTime); |
5582 | 631 |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
632 |
Ptr<Packet> packet = Create<Packet> (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
633 |
packet->AddHeader (rreqHeader); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
634 |
TypeHeader tHeader (AODVTYPE_RREQ); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
635 |
packet->AddHeader (tHeader); |
5677 | 636 |
socket->Send(packet); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
637 |
} |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
638 |
ScheduleRreqRetry (dst); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
639 |
if (EnableHello) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
640 |
{ |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
641 |
htimer.Cancel (); |
5654 | 642 |
htimer.Schedule (HelloInterval - Scalar(0.01)*MilliSeconds(UniformVariable().GetValue (0, 10))); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
643 |
} |
5582 | 644 |
} |
645 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
646 |
void |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
647 |
RoutingProtocol::ScheduleRreqRetry (Ipv4Address dst) |
5641
3e119b71a445
neighbor's timer moved in class Neighbors
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5639
diff
changeset
|
648 |
{ |
3e119b71a445
neighbor's timer moved in class Neighbors
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5639
diff
changeset
|
649 |
if (m_addressReqTimer.find (dst) == m_addressReqTimer.end ()) |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
650 |
{ |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
651 |
Timer timer (Timer::CANCEL_ON_DESTROY); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
652 |
m_addressReqTimer[dst] = timer; |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
653 |
} |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
654 |
m_addressReqTimer[dst].SetFunction (&RoutingProtocol::RouteRequestTimerExpire, this); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
655 |
m_addressReqTimer[dst].Cancel (); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
656 |
m_addressReqTimer[dst].SetArguments (dst); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
657 |
RoutingTableEntry rt; |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
658 |
m_routingTable.LookupRoute (dst, rt); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
659 |
rt.IncrementRreqCnt (); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
660 |
m_routingTable.Update (rt); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
661 |
m_addressReqTimer[dst].Schedule (Scalar (rt.GetRreqCnt ()) * NetTraversalTime); |
5641
3e119b71a445
neighbor's timer moved in class Neighbors
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5639
diff
changeset
|
662 |
} |
3e119b71a445
neighbor's timer moved in class Neighbors
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5639
diff
changeset
|
663 |
|
3e119b71a445
neighbor's timer moved in class Neighbors
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5639
diff
changeset
|
664 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
665 |
RoutingProtocol::RecvAodv (Ptr<Socket> socket ) |
5560 | 666 |
{ |
5579 | 667 |
NS_LOG_FUNCTION (this); |
5560 | 668 |
Address sourceAddress; |
5615
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
669 |
Ptr<Packet> packet = socket->RecvFrom (sourceAddress); |
5677 | 670 |
InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress); |
671 |
Ipv4Address sender = inetSourceAddr.GetIpv4 (); |
|
5612 | 672 |
Ipv4Address receiver = m_socketAddresses[socket].GetLocal (); |
673 |
NS_LOG_DEBUG ("AODV node " << this << " received a AODV packet from " << sender << " to " << receiver); |
|
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
674 |
|
5612 | 675 |
UpdateRouteToNeighbor (sender, receiver); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
676 |
TypeHeader tHeader (AODVTYPE_RREQ); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
677 |
packet->RemoveHeader (tHeader); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
678 |
if (!tHeader.IsValid ()) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
679 |
{ |
5659
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
680 |
NS_LOG_WARN ("AODV message " << packet->GetUid() << " with unknown type received: " << tHeader.Get()); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
681 |
return; // drop |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
682 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
683 |
switch (tHeader.Get ()) |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
684 |
{ |
5583 | 685 |
case AODVTYPE_RREQ: |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
686 |
{ |
5677 | 687 |
RecvRequest (packet, receiver, sender); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
688 |
break; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
689 |
} |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
690 |
case AODVTYPE_RREP: |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
691 |
{ |
5677 | 692 |
RecvReply (packet, receiver, sender); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
693 |
break; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
694 |
} |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
695 |
case AODVTYPE_RERR: |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
696 |
{ |
5612 | 697 |
RecvError (packet, sender); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
698 |
break; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
699 |
} |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
700 |
case AODVTYPE_RREP_ACK: |
5612 | 701 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
702 |
RecvReplyAck (sender); |
5612 | 703 |
break; |
704 |
} |
|
5583 | 705 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
706 |
} |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
707 |
|
5607 | 708 |
bool |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
709 |
RoutingProtocol::UpdateRouteLifeTime (Ipv4Address addr, Time lifetime ) |
5607 | 710 |
{ |
5609 | 711 |
RoutingTableEntry rt; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
712 |
if (m_routingTable.LookupRoute (addr, rt)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
713 |
{ |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
714 |
rt.SetFlag (VALID); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
715 |
rt.SetRreqCnt (0); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
716 |
rt.SetLifeTime (std::max (lifetime, rt.GetLifeTime ())); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
717 |
m_routingTable.Update (rt); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
718 |
return true; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
719 |
} |
5607 | 720 |
return false; |
721 |
} |
|
722 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
723 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
724 |
RoutingProtocol::UpdateRouteToNeighbor (Ipv4Address sender, Ipv4Address receiver ) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
725 |
{ |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
726 |
NS_LOG_FUNCTION (this << "sender " << sender << " receiver " << receiver ); |
5609 | 727 |
RoutingTableEntry toNeighbor; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
728 |
if (!m_routingTable.LookupRoute (sender, toNeighbor)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
729 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
730 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver)); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
731 |
RoutingTableEntry newEntry (/*device=*/dev, /*dst=*/sender, /*know seqno=*/false, /*seqno=*/0, |
5658 | 732 |
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0), |
733 |
/*hops=*/1, /*next hop=*/sender, /*lifetime=*/ActiveRouteTimeout); |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
734 |
m_routingTable.AddRoute (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
735 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
736 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
737 |
{ |
5657
5983e16013d9
UpdateRouteToNeighbor changed to take into account case, when route to node exists in routing table with hop count != 1
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5656
diff
changeset
|
738 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver)); |
5983e16013d9
UpdateRouteToNeighbor changed to take into account case, when route to node exists in routing table with hop count != 1
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5656
diff
changeset
|
739 |
RoutingTableEntry newEntry (/*device=*/dev, /*dst=*/sender, /*know seqno=*/false, /*seqno=*/0, |
5658 | 740 |
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0), |
741 |
/*hops=*/1, /*next hop=*/sender, /*lifetime=*/std::max (ActiveRouteTimeout, toNeighbor.GetLifeTime ())); |
|
5657
5983e16013d9
UpdateRouteToNeighbor changed to take into account case, when route to node exists in routing table with hop count != 1
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5656
diff
changeset
|
742 |
m_routingTable.Update (newEntry); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
743 |
} |
5583 | 744 |
} |
5578
020a5aa8b40c
SendRequeat in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5577
diff
changeset
|
745 |
|
5583 | 746 |
void |
5677 | 747 |
RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address src) |
5560 | 748 |
{ |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
749 |
NS_LOG_FUNCTION (this); |
5575 | 750 |
RreqHeader rreqHeader; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
751 |
p->RemoveHeader (rreqHeader); // TODO check that header correctly found |
5621
e6e336252f25
finding duplicated broadcast packet by packet uid
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5619
diff
changeset
|
752 |
|
e6e336252f25
finding duplicated broadcast packet by packet uid
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5619
diff
changeset
|
753 |
// A node ignores all RREQs received from any node in its blacklist |
e6e336252f25
finding duplicated broadcast packet by packet uid
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5619
diff
changeset
|
754 |
RoutingTableEntry toPrev; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
755 |
if (m_routingTable.LookupRoute (src, toPrev)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
756 |
{ |
5632 | 757 |
if (toPrev.IsUnidirectional ()) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
758 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
759 |
} |
5621
e6e336252f25
finding duplicated broadcast packet by packet uid
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5619
diff
changeset
|
760 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
761 |
uint32_t id = rreqHeader.GetId (); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
762 |
Ipv4Address origin = rreqHeader.GetOrigin (); |
5575 | 763 |
|
5609 | 764 |
/* |
765 |
* Node checks to determine whether it has received a RREQ with the same Originator IP Address and RREQ ID. |
|
766 |
* If such a RREQ has been received, the node silently discards the newly received RREQ. |
|
767 |
*/ |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
768 |
if (m_idCache.LookupId (origin, id)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
769 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
770 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
771 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
772 |
m_idCache.InsertId (origin, id, PathDiscoveryTime); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
773 |
|
5583 | 774 |
// Increment RREQ hop count |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
775 |
uint8_t hop = rreqHeader.GetHopCount () + 1; |
5583 | 776 |
rreqHeader.SetHopCount (hop); |
5584 | 777 |
|
5609 | 778 |
/* |
779 |
* When the reverse route is created or updated, the following actions on the route are also carried out: |
|
780 |
* 1. the Originator Sequence Number from the RREQ is compared to the corresponding destination sequence number |
|
781 |
* in the route table entry and copied if greater than the existing value there |
|
782 |
* 2. the valid sequence number field is set to true; |
|
783 |
* 3. the next hop in the routing table becomes the node from which the RREQ was received |
|
784 |
* 4. the hop count is copied from the Hop Count in the RREQ message; |
|
785 |
* 5. the Lifetime is set to be the maximum of (ExistingLifetime, MinimalLifetime), where |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
786 |
* MinimalLifetime = current time + 2*NetTraversalTime - 2*HopCount*NodeTraversalTime |
5609 | 787 |
*/ |
788 |
RoutingTableEntry toOrigin; |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
789 |
if (!m_routingTable.LookupRoute (origin, toOrigin)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
790 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
791 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver)); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
792 |
RoutingTableEntry newEntry (/*device=*/dev, /*dst=*/origin, /*validSeno=*/true, /*seqNo=*/rreqHeader.GetOriginSeqno (), |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
793 |
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0), /*hops=*/hop, |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
794 |
/*nextHop*/src, /*timeLife=*/Scalar (2) * NetTraversalTime - Scalar (2 * hop) * NodeTraversalTime); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
795 |
m_routingTable.AddRoute (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
796 |
} |
5599
5069c4c46ddb
SendReplyByIntermediateNode added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5598
diff
changeset
|
797 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
798 |
{ |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
799 |
if (toOrigin.GetValidSeqNo ()) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
800 |
{ |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
801 |
if (int32_t (rreqHeader.GetOriginSeqno ()) - int32_t (toOrigin.GetSeqNo ()) > 0) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
802 |
toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno ()); |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
803 |
} |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
804 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
805 |
toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
806 |
toOrigin.SetValidSeqNo (true); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
807 |
toOrigin.SetNextHop (src); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
808 |
toOrigin.SetOutputDevice (m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver))); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
809 |
toOrigin.SetInterface (m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0)); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
810 |
toOrigin.SetHop (hop); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
811 |
toOrigin.SetLifeTime (std::max (Scalar (2) * NetTraversalTime - Scalar (2 * hop) * NodeTraversalTime, toOrigin.GetLifeTime ())); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
812 |
m_routingTable.Update (toOrigin); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
813 |
} |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
814 |
NS_LOG_LOGIC (receiver << " recieve RREQ to destination " << rreqHeader.GetDst ()); |
5575 | 815 |
|
816 |
// A node generates a RREP if either: |
|
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
817 |
// (i) it is itself the destination, |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
818 |
if (IsMyOwnAddress (rreqHeader.GetDst ())) |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
819 |
{ |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
820 |
m_routingTable.LookupRoute (origin, toOrigin); |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
821 |
SendReply (rreqHeader, toOrigin); |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
822 |
return; |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
823 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
824 |
/* |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
825 |
* (ii) or it has an active route to the destination, the destination sequence number in the node's existing route table entry for the destination |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
826 |
* is valid and greater than or equal to the Destination Sequence Number of the RREQ, and the "destination only" flag is NOT set. |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
827 |
*/ |
5609 | 828 |
RoutingTableEntry toDst; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
829 |
Ipv4Address dst = rreqHeader.GetDst (); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
830 |
if (m_routingTable.LookupRoute (dst, toDst)) |
5575 | 831 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
832 |
/* |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
833 |
* The Destination Sequence number for the requested destination is set to the maximum of the corresponding value |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
834 |
* received in the RREQ message, and the destination sequence value currently maintained by the node for the requested destination. |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
835 |
* However, the forwarding node MUST NOT modify its maintained value for the destination sequence number, even if the value |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
836 |
* received in the incoming RREQ is larger than the value currently maintained by the forwarding node. |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
837 |
*/ |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
838 |
if (rreqHeader.GetUnknownSeqno () || ( (int32_t (toDst.GetSeqNo ()) - int32_t (rreqHeader.GetDstSeqno ()) > 0) && toDst.GetValidSeqNo () )) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
839 |
{ |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
840 |
if (!rreqHeader.GetDestinationOnly () && toDst.GetFlag() == VALID) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
841 |
{ |
5653 | 842 |
m_routingTable.LookupRoute (origin, toOrigin); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
843 |
SendReplyByIntermediateNode (toDst, toOrigin, rreqHeader.GetGratiousRrep ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
844 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
845 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
846 |
rreqHeader.SetDstSeqno (toDst.GetSeqNo ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
847 |
rreqHeader.SetUnknownSeqno (false); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
848 |
} |
5575 | 849 |
} |
5655 | 850 |
|
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
851 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
852 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
853 |
Ptr<Socket> socket = j->first; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
854 |
Ipv4InterfaceAddress iface = j->second; |
5677 | 855 |
Ptr<Packet> packet = Create<Packet> (); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
856 |
packet->AddHeader (rreqHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
857 |
TypeHeader tHeader (AODVTYPE_RREQ); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
858 |
packet->AddHeader (tHeader); |
5677 | 859 |
socket->Send (packet); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
860 |
} |
5609 | 861 |
|
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
862 |
if (EnableHello) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
863 |
{ |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
864 |
htimer.Cancel (); |
5653 | 865 |
htimer.Schedule (HelloInterval - Scalar(0.1)*MilliSeconds(UniformVariable().GetValue (0.0, 10.0))); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
866 |
} |
5583 | 867 |
} |
5573
040121bb814c
BroadcastId methods and SendRequest() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5572
diff
changeset
|
868 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
869 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
870 |
RoutingProtocol::SendReply (RreqHeader const & rreqHeader, RoutingTableEntry const & toOrigin ) |
5583 | 871 |
{ |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
872 |
NS_LOG_FUNCTION (this << toOrigin.GetDestination ()); |
5610
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
873 |
/* |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
874 |
* Destination node MUST increment its own sequence number by one if the sequence number in the RREQ packet is equal to that |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
875 |
* incremented value. Otherwise, the destination does not change its sequence number before generating the RREP message. |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
876 |
*/ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
877 |
if (!rreqHeader.GetUnknownSeqno () && (rreqHeader.GetDstSeqno () == m_seqNo + 1)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
878 |
m_seqNo++; |
5610
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
879 |
RrepHeader rrepHeader ( /*prefixSize=*/0, /*hops=*/toOrigin.GetHop (), /*dst=*/rreqHeader.GetDst (), |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
880 |
/*dstSeqNo=*/m_seqNo, /*origin=*/toOrigin.GetDestination (), /*lifeTime=*/MyRouteTimeout); |
5610
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
881 |
Ptr<Packet> packet = Create<Packet> (); |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
882 |
packet->AddHeader (rrepHeader); |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
883 |
TypeHeader tHeader (AODVTYPE_RREP); |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
884 |
packet->AddHeader (tHeader); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
885 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
886 |
NS_ASSERT (socket); |
5677 | 887 |
socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); |
5610
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
888 |
} |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
889 |
|
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
890 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
891 |
RoutingProtocol::SendReplyByIntermediateNode (RoutingTableEntry & toDst, RoutingTableEntry & toOrigin, bool gratRep ) |
5610
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
892 |
{ |
5653 | 893 |
NS_LOG_FUNCTION(this); |
5610
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
894 |
RrepHeader rrepHeader (/*prefix size=*/0, /*hops=*/toDst.GetHop (), /*dst=*/toDst.GetDestination (), /*dst seqno=*/toDst.GetSeqNo (), |
5656
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
895 |
/*origin=*/toOrigin.GetDestination (), /*lifetime=*/toDst.GetLifeTime ()); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
896 |
/* If the node we received a RREQ for is a neighbor we are |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
897 |
* probably facing a unidirectional link... Better request a RREP-ack |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
898 |
*/ |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
899 |
if (toDst.GetHop () == 1) |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
900 |
{ |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
901 |
rrepHeader.SetAckRequired (true); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
902 |
RoutingTableEntry toNextHop; |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
903 |
m_routingTable.LookupRoute (toOrigin.GetNextHop (), toNextHop); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
904 |
toNextHop.m_ackTimer.SetFunction (&RoutingProtocol::AckTimerExpire, this); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
905 |
toNextHop.m_ackTimer.SetArguments (toNextHop.GetDestination (), BlackListTimeout); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
906 |
toNextHop.m_ackTimer.SetDelay (NextHopWait); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
907 |
} |
5610
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
908 |
toDst.InsertPrecursor (toOrigin.GetNextHop ()); |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
909 |
toOrigin.InsertPrecursor (toDst.GetNextHop ()); |
5627
3fb6bda728ad
unit test for routing table updated
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5626
diff
changeset
|
910 |
m_routingTable.Update (toDst); |
3fb6bda728ad
unit test for routing table updated
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5626
diff
changeset
|
911 |
m_routingTable.Update (toOrigin); |
5587 | 912 |
|
5583 | 913 |
Ptr<Packet> packet = Create<Packet> (); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
914 |
packet->AddHeader (rrepHeader); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
915 |
TypeHeader tHeader (AODVTYPE_RREP); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
916 |
packet->AddHeader (tHeader); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
917 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
918 |
NS_ASSERT (socket); |
5677 | 919 |
socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
920 |
|
5610
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
921 |
// Generating gratuitous RREPs |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
922 |
if (gratRep) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
923 |
{ |
5659
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
924 |
RrepHeader gratRepHeader (/*prefix size=*/0, /*hops=*/toOrigin.GetHop (), /*dst=*/toOrigin.GetDestination (), /*dst seqno=*/toOrigin.GetSeqNo (), |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
925 |
/*origin=*/toDst.GetDestination (), /*lifetime=*/toOrigin.GetLifeTime ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
926 |
Ptr<Packet> packetToDst = Create<Packet> (); |
5659
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
927 |
packetToDst->AddHeader (gratRepHeader); |
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
928 |
TypeHeader type (AODVTYPE_RREP); |
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
929 |
packetToDst->AddHeader (type); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
930 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toDst.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
931 |
NS_ASSERT (socket); |
5659
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
932 |
NS_LOG_LOGIC ("Send gratuitous RREP " << packet->GetUid()); |
5677 | 933 |
socket->SendTo (packetToDst, 0, InetSocketAddress (toDst.GetNextHop (), AODV_PORT)); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
934 |
} |
5560 | 935 |
} |
936 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
937 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
938 |
RoutingProtocol::SendReplyAck (Ipv4Address neighbor ) |
5560 | 939 |
{ |
5679 | 940 |
NS_LOG_FUNCTION (this << " to " << neighbor); |
5611
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
941 |
RrepAckHeader h; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
942 |
TypeHeader typeHeader (AODVTYPE_RREP_ACK); |
5611
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
943 |
Ptr<Packet> packet = Create<Packet> (); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
944 |
packet->AddHeader (h); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
945 |
packet->AddHeader (typeHeader); |
5612 | 946 |
RoutingTableEntry toNeighbor; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
947 |
m_routingTable.LookupRoute (neighbor, toNeighbor); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
948 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toNeighbor.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
949 |
NS_ASSERT (socket); |
5677 | 950 |
socket->SendTo (packet, 0, InetSocketAddress (neighbor, AODV_PORT)); |
5611
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
951 |
} |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
952 |
|
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
953 |
void |
5677 | 954 |
RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address sender) |
5611
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
955 |
{ |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
956 |
NS_LOG_FUNCTION(this << " src " << sender); |
5576 | 957 |
RrepHeader rrepHeader; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
958 |
p->RemoveHeader (rrepHeader); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
959 |
Ipv4Address dst = rrepHeader.GetDst (); |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
960 |
NS_LOG_LOGIC("RREP destination " << dst << " RREP origin " << rrepHeader.GetOrigin()); |
5576 | 961 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
962 |
uint8_t hop = rrepHeader.GetHopCount () + 1; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
963 |
rrepHeader.SetHopCount (hop); |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
964 |
|
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
965 |
// If RREP is Hello message |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
966 |
if (dst == rrepHeader.GetOrigin ()) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
967 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
968 |
ProcessHello (rrepHeader, receiver); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
969 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
970 |
} |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
971 |
|
5611
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
972 |
/* |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
973 |
* If the route table entry to the destination is created or updated, then the following actions occur: |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
974 |
* - the route is marked as active, |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
975 |
* - the destination sequence number is marked as valid, |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
976 |
* - the next hop in the route entry is assigned to be the node from which the RREP is received, |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
977 |
* which is indicated by the source IP address field in the IP header, |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
978 |
* - the hop count is set to the value of the hop count from RREP message + 1 |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
979 |
* - the expiry time is set to the current time plus the value of the Lifetime in the RREP message, |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
980 |
* - and the destination sequence number is the Destination Sequence Number in the RREP message. |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
981 |
*/ |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
982 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver)); |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
983 |
RoutingTableEntry newEntry (/*device=*/dev, /*dst=*/dst, /*validSeqNo=*/true, /*seqno=*/rrepHeader.GetDstSeqno (), |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
984 |
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0),/*hop=*/hop, |
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
985 |
/*nextHop=*/sender, /*lifeTime=*/rrepHeader.GetLifeTime ()); |
5609 | 986 |
RoutingTableEntry toDst; |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
987 |
if (m_routingTable.LookupRoute (dst, toDst)) |
5576 | 988 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
989 |
/* |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
990 |
* The existing entry is updated only in the following circumstances: |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
991 |
* (i) the sequence number in the routing table is marked as invalid in route table entry. |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
992 |
*/ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
993 |
if (!toDst.GetValidSeqNo ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
994 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
995 |
m_routingTable.Update (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
996 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
997 |
// (ii)the Destination Sequence Number in the RREP is greater than the node's copy of the destination sequence number and the known value is valid, |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
998 |
else if ((int32_t (rrepHeader.GetDstSeqno ()) - int32_t (toDst.GetSeqNo ())) > 0) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
999 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1000 |
m_routingTable.Update (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1001 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1002 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1003 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1004 |
// (iii) the sequence numbers are the same, but the route is marked as inactive. |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
1005 |
if ((rrepHeader.GetDstSeqno () == toDst.GetSeqNo ()) && (toDst.GetFlag () != VALID)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1006 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1007 |
m_routingTable.Update (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1008 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1009 |
// (iv) the sequence numbers are the same, and the New Hop Count is smaller than the hop count in route table entry. |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1010 |
else if ((rrepHeader.GetDstSeqno () == toDst.GetSeqNo ()) && (hop < toDst.GetHop ())) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1011 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1012 |
m_routingTable.Update (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1013 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1014 |
} |
5576 | 1015 |
} |
5601 | 1016 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1017 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1018 |
// The forward route for this destination is created if it does not already exist. |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1019 |
NS_LOG_LOGIC("add new route"); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1020 |
m_routingTable.AddRoute (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1021 |
} |
5612 | 1022 |
// Acknowledge receipt of the RREP by sending a RREP-ACK message back |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1023 |
if (rrepHeader.GetAckRequired ()) |
5659
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1024 |
{ |
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1025 |
SendReplyAck (sender); |
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1026 |
rrepHeader.SetAckRequired (false); |
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1027 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1028 |
NS_LOG_LOGIC ("receiver " << receiver << " origin " << rrepHeader.GetOrigin ()); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1029 |
if (IsMyOwnAddress (rrepHeader.GetOrigin ())) |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
1030 |
{ |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
1031 |
if (toDst.GetFlag () == IN_SEARCH) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1032 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1033 |
m_routingTable.Update (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1034 |
m_addressReqTimer[dst].Cancel (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1035 |
m_addressReqTimer.erase (dst); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1036 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1037 |
SendPacketFromQueue (rrepHeader.GetDst (), newEntry.GetRoute ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1038 |
return; |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
1039 |
} |
5576 | 1040 |
|
5609 | 1041 |
RoutingTableEntry toOrigin; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1042 |
if (!m_routingTable.LookupRoute (rrepHeader.GetOrigin (), toOrigin)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1043 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1044 |
return; // Impossible! drop. |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1045 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1046 |
toOrigin.SetLifeTime (std::max (ActiveRouteTimeout, toOrigin.GetLifeTime ())); |
5627
3fb6bda728ad
unit test for routing table updated
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5626
diff
changeset
|
1047 |
m_routingTable.Update (toOrigin); |
5622
aa34a270824c
route lifetime management fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5621
diff
changeset
|
1048 |
|
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1049 |
// Update information about precursors |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1050 |
m_routingTable.LookupRoute (rrepHeader.GetDst (), toDst); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1051 |
toDst.InsertPrecursor (toOrigin.GetNextHop ()); |
5627
3fb6bda728ad
unit test for routing table updated
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5626
diff
changeset
|
1052 |
m_routingTable.Update (toDst); |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1053 |
|
5609 | 1054 |
RoutingTableEntry toNextHopToDst; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1055 |
m_routingTable.LookupRoute (toDst.GetNextHop (), toNextHopToDst); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1056 |
toNextHopToDst.InsertPrecursor (toOrigin.GetNextHop ()); |
5627
3fb6bda728ad
unit test for routing table updated
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5626
diff
changeset
|
1057 |
m_routingTable.Update (toNextHopToDst); |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
1058 |
|
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1059 |
toOrigin.InsertPrecursor (toDst.GetNextHop ()); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1060 |
m_routingTable.Update (toOrigin); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1061 |
|
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1062 |
RoutingTableEntry toNextHopToOrigin; |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1063 |
m_routingTable.LookupRoute (toOrigin.GetNextHop (), toNextHopToOrigin); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1064 |
toNextHopToOrigin.InsertPrecursor (toDst.GetNextHop ()); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1065 |
m_routingTable.Update (toNextHopToOrigin); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1066 |
|
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
1067 |
Ptr<Packet> packet = Create<Packet> (); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1068 |
packet->AddHeader (rrepHeader); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1069 |
TypeHeader tHeader (AODVTYPE_RREP); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1070 |
packet->AddHeader (tHeader); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1071 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1072 |
NS_ASSERT (socket); |
5677 | 1073 |
socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1074 |
} |
5586 | 1075 |
|
5612 | 1076 |
void |
5677 | 1077 |
RoutingProtocol::RecvReplyAck (Ipv4Address neighbor) |
5612 | 1078 |
{ |
5679 | 1079 |
NS_LOG_FUNCTION (this); |
1080 |
RoutingTableEntry rt; |
|
1081 |
if(m_routingTable.LookupRoute(neighbor, rt)) |
|
1082 |
{ |
|
1083 |
rt.m_ackTimer.Cancel (); |
|
1084 |
rt.SetFlag (VALID); |
|
1085 |
m_routingTable.Update(rt); |
|
1086 |
} |
|
5612 | 1087 |
} |
1088 |
||
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1089 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1090 |
RoutingProtocol::ProcessHello (RrepHeader const & rrepHeader, Ipv4Address receiver ) |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1091 |
{ |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
1092 |
NS_LOG_FUNCTION(this << "from " << rrepHeader.GetDst ()); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1093 |
/* |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1094 |
* Whenever a node receives a Hello message from a neighbor, the node |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1095 |
* SHOULD make sure that it has an active route to the neighbor, and |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1096 |
* create one if necessary. |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1097 |
*/ |
5609 | 1098 |
RoutingTableEntry toNeighbor; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1099 |
if (!m_routingTable.LookupRoute (rrepHeader.GetDst (), toNeighbor)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1100 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1101 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver)); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1102 |
RoutingTableEntry newEntry (/*device=*/dev, /*dst=*/rrepHeader.GetDst (), /*validSeqNo=*/true, /*seqno=*/rrepHeader.GetDstSeqno (), |
5653 | 1103 |
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0), |
1104 |
/*hop=*/1, /*nextHop=*/rrepHeader.GetDst (), /*lifeTime=*/rrepHeader.GetLifeTime ()); |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1105 |
m_routingTable.AddRoute (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1106 |
} |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1107 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1108 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1109 |
toNeighbor.SetLifeTime (std::max (Scalar (AllowedHelloLoss) * HelloInterval, toNeighbor.GetLifeTime ())); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1110 |
toNeighbor.SetSeqNo (rrepHeader.GetDstSeqno ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1111 |
toNeighbor.SetValidSeqNo (true); |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
1112 |
toNeighbor.SetFlag (VALID); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1113 |
toNeighbor.SetOutputDevice (m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver))); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1114 |
toNeighbor.SetInterface (m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0)); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1115 |
m_routingTable.Update (toNeighbor); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1116 |
} |
5658 | 1117 |
if (EnableHello) |
1118 |
{ |
|
1119 |
m_nb.Update (rrepHeader.GetDst (), Scalar (AllowedHelloLoss) * HelloInterval); |
|
1120 |
} |
|
5560 | 1121 |
} |
1122 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1123 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1124 |
RoutingProtocol::RecvError (Ptr<Packet> p, Ipv4Address src ) |
5560 | 1125 |
{ |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1126 |
NS_LOG_FUNCTION (this << " from " << src); |
5607 | 1127 |
RerrHeader rerrHeader; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1128 |
p->RemoveHeader (rerrHeader); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1129 |
std::map<Ipv4Address, uint32_t> dstWithNextHopSrc; |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1130 |
std::map<Ipv4Address, uint32_t> unreachable; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1131 |
m_routingTable.GetListOfDestinationWithNextHop (src, dstWithNextHopSrc); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1132 |
std::pair<Ipv4Address, uint32_t> un; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1133 |
while (rerrHeader.RemoveUnDestination (un)) |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1134 |
{ |
5638
1b5112aa7de4
neighbors moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5635
diff
changeset
|
1135 |
if (m_nb.IsNeighbor (un.first)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1136 |
SendRerrWhenBreaksLinkToNextHop (un.first); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1137 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1138 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1139 |
for (std::map<Ipv4Address, uint32_t>::const_iterator i = dstWithNextHopSrc.begin (); i != dstWithNextHopSrc.end (); ++i) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1140 |
if (i->first == un.first) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1141 |
unreachable.insert (un); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1142 |
} |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1143 |
} |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1144 |
|
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1145 |
std::vector<Ipv4Address> precursors; |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1146 |
for (std::map<Ipv4Address, uint32_t>::const_iterator i = unreachable.begin (); i != unreachable.end ();) |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1147 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1148 |
if (!rerrHeader.AddUnDestination (i->first, i->second)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1149 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1150 |
TypeHeader typeHeader (AODVTYPE_RERR); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1151 |
Ptr<Packet> packet = Create<Packet> (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1152 |
packet->AddHeader (rerrHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1153 |
packet->AddHeader (typeHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1154 |
SendRerrMessage (packet, precursors); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1155 |
rerrHeader.Clear (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1156 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1157 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1158 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1159 |
RoutingTableEntry toDst; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1160 |
m_routingTable.LookupRoute (i->first, toDst); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1161 |
toDst.GetPrecursors (precursors); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1162 |
++i; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1163 |
} |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1164 |
} |
5673
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1165 |
if (rerrHeader.GetDestCount () != 0) |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1166 |
{ |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1167 |
TypeHeader typeHeader (AODVTYPE_RERR); |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1168 |
Ptr<Packet> packet = Create<Packet> (); |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1169 |
packet->AddHeader (rerrHeader); |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1170 |
packet->AddHeader (typeHeader); |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1171 |
SendRerrMessage (packet, precursors); |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1172 |
} |
5677 | 1173 |
m_routingTable.InvalidateRoutesWithDst (unreachable); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1174 |
} |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1175 |
|
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1176 |
void |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
1177 |
RoutingProtocol::RouteRequestTimerExpire (Ipv4Address dst) |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1178 |
{ |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1179 |
NS_LOG_LOGIC(this); |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1180 |
RoutingTableEntry toDst; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1181 |
m_routingTable.LookupRoute (dst, toDst); |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
1182 |
if (toDst.GetFlag () == VALID) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1183 |
{ |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1184 |
SendPacketFromQueue (dst, toDst.GetRoute ()); |
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1185 |
NS_LOG_LOGIC ("route to " << dst << " found"); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1186 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1187 |
} |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1188 |
/** |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1189 |
* If a route discovery has been attempted RreqRetries times at the maximum TTL without |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1190 |
* receiving any RREP, all data packets destined for the corresponding destination SHOULD be |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1191 |
* dropped from the buffer and a Destination Unreachable message SHOULD be delivered to the application. |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1192 |
*/ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1193 |
if (toDst.GetRreqCnt () == RreqRetries) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1194 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1195 |
NS_LOG_LOGIC("route discovery to " << dst << " has been attempted RreqRetries times"); |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1196 |
m_addressReqTimer.erase(dst); |
5654 | 1197 |
m_routingTable.DeleteRoute(dst); |
5639
f39f45cddd86
unit test for neighbors added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5638
diff
changeset
|
1198 |
NS_LOG_LOGIC ("Route not found. Drop packet with dst " << dst); |
5660
ed22e758b5f5
RoutingProtocol::DropFromQueue killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5659
diff
changeset
|
1199 |
m_queue.DropPacketWithDst(dst); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1200 |
return; |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1201 |
} |
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1202 |
|
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
1203 |
if (toDst.GetFlag () == IN_SEARCH) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1204 |
{ |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
1205 |
NS_LOG_LOGIC ("Send new RREQ to " << dst << " ttl " << NetDiameter); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
1206 |
SendRequest (dst); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1207 |
} |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1208 |
else |
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1209 |
{ |
5639
f39f45cddd86
unit test for neighbors added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5638
diff
changeset
|
1210 |
NS_LOG_LOGIC ("Route down. Stop search. Drop packet with destination " << dst); |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1211 |
m_addressReqTimer.erase(dst); |
5654 | 1212 |
m_routingTable.DeleteRoute(dst); |
5660
ed22e758b5f5
RoutingProtocol::DropFromQueue killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5659
diff
changeset
|
1213 |
m_queue.DropPacketWithDst(dst); |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1214 |
} |
5561
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1215 |
} |
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1216 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1217 |
void |
5561
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1218 |
RoutingProtocol::HelloTimerExpire () |
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1219 |
{ |
5607 | 1220 |
NS_LOG_FUNCTION(this); |
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1221 |
SendHello (); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1222 |
htimer.Cancel (); |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1223 |
Time t = Scalar(0.01)*MilliSeconds(UniformVariable().GetValue (0.0, 100.0)); |
5659
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1224 |
htimer.Schedule (HelloInterval - t); |
5561
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1225 |
} |
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1226 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1227 |
void |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1228 |
RoutingProtocol::RreqRateLimitTimerExpire () |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1229 |
{ |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1230 |
m_rreqCount = 0; |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1231 |
m_rreqRateLimitTimer.Schedule(Seconds(1)); |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1232 |
} |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1233 |
|
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1234 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1235 |
RoutingProtocol::AckTimerExpire (Ipv4Address neighbor, Time blacklistTimeout ) |
5612 | 1236 |
{ |
1237 |
NS_LOG_FUNCTION(this); |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1238 |
m_routingTable.MarkLinkAsUinidirectional (neighbor, blacklistTimeout); |
5612 | 1239 |
} |
1240 |
||
1241 |
void |
|
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1242 |
RoutingProtocol::SendHello () |
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1243 |
{ |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
1244 |
NS_LOG_FUNCTION(this); |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1245 |
/* Broadcast a RREP with TTL = 1 with the RREP message fields set as follows: |
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1246 |
* Destination IP Address The node's IP address. |
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1247 |
* Destination Sequence Number The node's latest sequence number. |
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1248 |
* Hop Count 0 |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1249 |
* Lifetime AllowedHelloLoss * HelloInterval |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1250 |
*/ |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
1251 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1252 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1253 |
Ptr<Socket> socket = j->first; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1254 |
Ipv4InterfaceAddress iface = j->second; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1255 |
RrepHeader helloHeader (/*prefix size=*/0, /*hops=*/0, /*dst=*/iface.GetLocal (), /*dst seqno=*/m_seqNo, |
5677 | 1256 |
/*origin=*/iface.GetLocal (),/*lifetime=*/Scalar (AllowedHelloLoss) * HelloInterval); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1257 |
Ptr<Packet> packet = Create<Packet> (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1258 |
packet->AddHeader (helloHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1259 |
TypeHeader tHeader (AODVTYPE_RREP); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1260 |
packet->AddHeader (tHeader); |
5677 | 1261 |
socket->Send (packet); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1262 |
} |
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1263 |
} |
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1264 |
|
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1265 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1266 |
RoutingProtocol::SendPacketFromQueue (Ipv4Address dst, Ptr<Ipv4Route> route ) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1267 |
{ |
5617
23f363019fd1
RecvReply changed to respond properly to receive RREP with origin address != receiver address, but == local address of another interface
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5616
diff
changeset
|
1268 |
NS_LOG_FUNCTION(this); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1269 |
QueueEntry queueEntry; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1270 |
while (m_queue.Dequeue (dst, queueEntry)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1271 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1272 |
UnicastForwardCallback ucb = queueEntry.GetUnicastForwardCallback (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1273 |
ucb (route, queueEntry.GetPacket (), queueEntry.GetIpv4Header ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1274 |
} |
5561
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1275 |
} |
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1276 |
|
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1277 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1278 |
RoutingProtocol::Send (Ptr<Ipv4Route> route, Ptr<const Packet> packet, const Ipv4Header & header ) |
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1279 |
{ |
5680
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
1280 |
NS_LOG_FUNCTION (this << packet->GetUid() << (uint16_t) header.GetProtocol()); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1281 |
Ptr<Ipv4L3Protocol> l3 = m_ipv4->GetObject<Ipv4L3Protocol> (); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1282 |
NS_ASSERT(l3 != 0); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1283 |
Ptr<Packet> p = packet->Copy (); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1284 |
// TODO know protocol number |
5680
25c3039f4144
problem with protocol number fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5679
diff
changeset
|
1285 |
l3->Send (p, route->GetSource (), header.GetDestination (), header.GetProtocol(), route); |
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1286 |
} |
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1287 |
|
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1288 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1289 |
RoutingProtocol::SendRerrWhenBreaksLinkToNextHop (Ipv4Address nextHop ) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1290 |
{ |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1291 |
NS_LOG_FUNCTION (this << nextHop); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1292 |
RerrHeader rerrHeader; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1293 |
std::vector<Ipv4Address> precursors; |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1294 |
std::map<Ipv4Address, uint32_t> unreachable; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1295 |
|
5609 | 1296 |
RoutingTableEntry toNextHop; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1297 |
if (!m_routingTable.LookupRoute (nextHop, toNextHop)) |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1298 |
return; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1299 |
toNextHop.GetPrecursors (precursors); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1300 |
rerrHeader.AddUnDestination (nextHop, toNextHop.GetSeqNo ()); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1301 |
m_routingTable.GetListOfDestinationWithNextHop (nextHop, unreachable); |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1302 |
NS_LOG_LOGIC ("number of unreachable destination " << unreachable.size ()); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1303 |
for (std::map<Ipv4Address, uint32_t>::const_iterator i = unreachable.begin (); i != unreachable.end ();) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1304 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1305 |
if (!rerrHeader.AddUnDestination (i->first, i->second)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1306 |
{ |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1307 |
NS_LOG_LOGIC ("Send RERR message with maximum size."); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1308 |
TypeHeader typeHeader (AODVTYPE_RERR); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1309 |
Ptr<Packet> packet = Create<Packet> (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1310 |
packet->AddHeader (rerrHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1311 |
packet->AddHeader (typeHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1312 |
SendRerrMessage (packet, precursors); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1313 |
rerrHeader.Clear (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1314 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1315 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1316 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1317 |
RoutingTableEntry toDst; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1318 |
m_routingTable.LookupRoute (i->first, toDst); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1319 |
toDst.GetPrecursors (precursors); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1320 |
++i; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1321 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1322 |
} |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1323 |
if (rerrHeader.GetDestCount () != 0) |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1324 |
{ |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1325 |
TypeHeader typeHeader (AODVTYPE_RERR); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1326 |
Ptr<Packet> packet = Create<Packet> (); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1327 |
packet->AddHeader (rerrHeader); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1328 |
packet->AddHeader (typeHeader); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1329 |
SendRerrMessage (packet, precursors); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1330 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1331 |
unreachable.insert (std::make_pair (nextHop, toNextHop.GetSeqNo ())); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1332 |
m_routingTable.InvalidateRoutesWithDst (unreachable); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1333 |
} |
5607 | 1334 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1335 |
void |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1336 |
RoutingProtocol::SendRerrWhenNoRouteToForward (Ipv4Address dst, uint32_t dstSeqNo, Ipv4Address origin) |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1337 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1338 |
NS_LOG_FUNCTION (this); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1339 |
RerrHeader rerrHeader; |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1340 |
rerrHeader.AddUnDestination(dst, dstSeqNo); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1341 |
RoutingTableEntry toOrigin; |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1342 |
Ptr<Packet> packet = Create<Packet> (); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1343 |
packet->AddHeader (rerrHeader); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1344 |
packet->AddHeader (TypeHeader (AODVTYPE_RERR)); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1345 |
if (m_routingTable.LookupRoute(origin, toOrigin)) |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1346 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1347 |
if (toOrigin.GetFlag () == VALID) |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1348 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1349 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1350 |
NS_ASSERT (socket); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1351 |
NS_LOG_LOGIC ("unicast RERR to the source of the data transmission"); |
5677 | 1352 |
socket->SendTo(packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1353 |
} |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1354 |
|
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1355 |
} |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1356 |
else |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1357 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1358 |
for (std::map< Ptr<Socket>, Ipv4InterfaceAddress >::const_iterator i = m_socketAddresses.begin (); i != m_socketAddresses.end (); ++i) |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1359 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1360 |
Ptr<Socket> socket = i->first; |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1361 |
Ipv4InterfaceAddress iface = i->second; |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1362 |
NS_ASSERT (socket); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1363 |
NS_LOG_LOGIC ("broadcast RERR meassage from interface " << iface.GetLocal()); |
5677 | 1364 |
socket->Send (packet); |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1365 |
} |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1366 |
} |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1367 |
} |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1368 |
|
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1369 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1370 |
RoutingProtocol::SendRerrMessage (Ptr<Packet> packet, std::vector<Ipv4Address> precursors ) |
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1371 |
{ |
5653 | 1372 |
NS_LOG_FUNCTION(this); |
1373 |
||
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
1374 |
if (precursors.empty ()) |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1375 |
{ |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1376 |
NS_LOG_LOGIC ("No precursors"); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1377 |
return; // TODO too many unreachable destinations, but no precursors |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1378 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1379 |
// If there is only one precursor, RERR SHOULD be unicast toward that precursor |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1380 |
if (precursors.size () == 1) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1381 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1382 |
RoutingTableEntry toPrecursor; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1383 |
m_routingTable.LookupRoute (precursors.front (), toPrecursor); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1384 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toPrecursor.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1385 |
NS_ASSERT (socket); |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1386 |
NS_LOG_LOGIC ("one precursor => unicast RERR to " << toPrecursor.GetDestination() << " from " << toPrecursor.GetInterface ().GetLocal ()); |
5677 | 1387 |
socket->SendTo(packet, 0, InetSocketAddress (precursors.front (), AODV_PORT)); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1388 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1389 |
} |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1390 |
|
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1391 |
// Should only transmit RERR on those interfaces which have precursor nodes for the broken route |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1392 |
std::vector<Ipv4InterfaceAddress> ifaces; |
5609 | 1393 |
RoutingTableEntry toPrecursor; |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1394 |
for (std::vector<Ipv4Address>::const_iterator i = precursors.begin (); i != precursors.end (); ++i) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1395 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1396 |
if (!m_routingTable.LookupRoute (*i, toPrecursor)) |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1397 |
break; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1398 |
bool result = true; |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1399 |
for (std::vector<Ipv4InterfaceAddress>::const_iterator i = ifaces.begin (); i != ifaces.end (); ++i) |
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1400 |
if (*i == toPrecursor.GetInterface ()) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1401 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1402 |
result = false; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1403 |
break; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1404 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1405 |
if (result) |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1406 |
ifaces.push_back (toPrecursor.GetInterface ()); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1407 |
} |
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1408 |
|
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1409 |
for (std::vector<Ipv4InterfaceAddress>::const_iterator i = ifaces.begin (); i != ifaces.end (); ++i) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1410 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1411 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (*i); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1412 |
NS_ASSERT (socket); |
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
1413 |
NS_LOG_LOGIC ("broadcast RERR message from interface " << i->GetLocal()); |
5677 | 1414 |
socket->Send (packet); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1415 |
} |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1416 |
|
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1417 |
} |
5576 | 1418 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1419 |
Ptr<Socket> |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1420 |
RoutingProtocol::FindSocketWithInterfaceAddress (Ipv4InterfaceAddress addr ) const |
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1421 |
{ |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1422 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1423 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1424 |
Ptr<Socket> socket = j->first; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1425 |
Ipv4InterfaceAddress iface = j->second; |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1426 |
if (iface == addr) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1427 |
return socket; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1428 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1429 |
Ptr<Socket> socket; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1430 |
return socket; |
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1431 |
} |
5561
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1432 |
|
5661
917c6c7be9f9
RoutingProtocol::Drop added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5660
diff
changeset
|
1433 |
void |
917c6c7be9f9
RoutingProtocol::Drop added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5660
diff
changeset
|
1434 |
RoutingProtocol::Drop(Ptr<const Packet> packet, const Ipv4Header & header, Socket::SocketErrno err) |
917c6c7be9f9
RoutingProtocol::Drop added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5660
diff
changeset
|
1435 |
{ |
917c6c7be9f9
RoutingProtocol::Drop added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5660
diff
changeset
|
1436 |
NS_LOG_LOGIC (this <<" drop own packet " << packet->GetUid() << " to " << header.GetDestination () << " from queue. Error " << err); |
917c6c7be9f9
RoutingProtocol::Drop added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5660
diff
changeset
|
1437 |
} |
917c6c7be9f9
RoutingProtocol::Drop added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5660
diff
changeset
|
1438 |
|
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1439 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1440 |
} |