author | Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
Wed, 25 Aug 2010 21:31:43 +0200 | |
changeset 7044 | f94b264549d1 |
parent 7040 | 444bb5c76bff |
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 |
* |
5722 | 25 |
* Authors: Elena Buchatskaia <borovkovaes@iitp.ru> |
5591
e0448da5da14
AODV copyright changed to IITP
Pavel Boyko <boyko@iitp.ru>
parents:
5590
diff
changeset
|
26 |
* Pavel Boyko <boyko@iitp.ru> |
5560 | 27 |
*/ |
6465 | 28 |
#define NS_LOG_APPEND_CONTEXT \ |
29 |
if (m_ipv4) { std::clog << "[node " << m_ipv4->GetObject<Node> ()->GetId () << "] "; } |
|
30 |
||
5560 | 31 |
#include "aodv-routing-protocol.h" |
32 |
#include "ns3/log.h" |
|
6065 | 33 |
#include "ns3/boolean.h" |
5560 | 34 |
#include "ns3/random-variable.h" |
35 |
#include "ns3/inet-socket-address.h" |
|
36 |
#include "ns3/trace-source-accessor.h" |
|
5677 | 37 |
#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
|
38 |
#include "ns3/wifi-net-device.h" |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
39 |
#include "ns3/adhoc-wifi-mac.h" |
5622
aa34a270824c
route lifetime management fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5621
diff
changeset
|
40 |
#include <algorithm> |
6088 | 41 |
#include <limits> |
5613
c2e4bad4affc
Raw socket nearly work
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5612
diff
changeset
|
42 |
|
5560 | 43 |
NS_LOG_COMPONENT_DEFINE ("AodvRoutingProtocol"); |
44 |
||
45 |
namespace ns3 |
|
46 |
{ |
|
47 |
namespace aodv |
|
48 |
{ |
|
49 |
NS_OBJECT_ENSURE_REGISTERED (RoutingProtocol); |
|
50 |
||
5647
b5e2bb381517
#define AODV_PORT killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5645
diff
changeset
|
51 |
/// UDP Port for AODV control traffic |
b5e2bb381517
#define AODV_PORT killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5645
diff
changeset
|
52 |
const uint32_t RoutingProtocol::AODV_PORT = 654; |
5606
e6248d1eea81
handle active neighbors added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5605
diff
changeset
|
53 |
|
6088 | 54 |
//----------------------------------------------------------------------------- |
55 |
/// Tag used by AODV implementation |
|
56 |
struct DeferredRouteOutputTag : public Tag |
|
57 |
{ |
|
58 |
/// Positive if output device is fixed in RouteOutput |
|
59 |
int32_t oif; |
|
60 |
||
61 |
DeferredRouteOutputTag (int32_t o = -1) : Tag(), oif (o) {} |
|
62 |
||
63 |
static TypeId GetTypeId () |
|
64 |
{ |
|
65 |
static TypeId tid = TypeId ("ns3::aodv::DeferredRouteOutputTag").SetParent<Tag> (); |
|
66 |
return tid; |
|
67 |
} |
|
68 |
||
69 |
TypeId GetInstanceTypeId () const |
|
70 |
{ |
|
71 |
return GetTypeId (); |
|
72 |
} |
|
73 |
||
74 |
uint32_t GetSerializedSize () const |
|
75 |
{ |
|
76 |
return sizeof(int32_t); |
|
77 |
} |
|
78 |
||
79 |
void Serialize (TagBuffer i) const |
|
80 |
{ |
|
81 |
i.WriteU32 (oif); |
|
82 |
} |
|
83 |
||
84 |
void Deserialize (TagBuffer i) |
|
85 |
{ |
|
86 |
oif = i.ReadU32 (); |
|
87 |
} |
|
88 |
||
89 |
void Print (std::ostream &os) const |
|
90 |
{ |
|
91 |
os << "DeferredRouteOutputTag: output interface = " << oif; |
|
92 |
} |
|
93 |
}; |
|
94 |
||
95 |
//----------------------------------------------------------------------------- |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
96 |
RoutingProtocol::RoutingProtocol () : |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
97 |
RreqRetries (2), |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
98 |
RreqRateLimit (10), |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
99 |
ActiveRouteTimeout (Seconds (3)), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
100 |
NetDiameter (35), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
101 |
NodeTraversalTime (MilliSeconds (40)), |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
102 |
NetTraversalTime (2 * NetDiameter * NodeTraversalTime), |
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
103 |
PathDiscoveryTime ( 2 * NetTraversalTime), |
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
104 |
MyRouteTimeout (2 * std::max (PathDiscoveryTime, ActiveRouteTimeout)), |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
105 |
HelloInterval(Seconds (1)), |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
106 |
AllowedHelloLoss (2), |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
107 |
DeletePeriod (5 * std::max(ActiveRouteTimeout, HelloInterval)), |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
108 |
NextHopWait (NodeTraversalTime + MilliSeconds (10)), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
109 |
TimeoutBuffer (2), |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
110 |
BlackListTimeout(RreqRetries * NetTraversalTime), |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
111 |
MaxQueueLen (64), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
112 |
MaxQueueTime (Seconds(30)), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
113 |
DestinationOnly (false), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
114 |
GratuitousReply (true), |
5658 | 115 |
EnableHello (true), |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
116 |
m_routingTable (DeletePeriod), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
117 |
m_queue (MaxQueueLen, MaxQueueTime), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
118 |
m_requestId (0), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
119 |
m_seqNo (0), |
5717 | 120 |
m_rreqIdCache (PathDiscoveryTime), |
121 |
m_dpd (PathDiscoveryTime), |
|
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
122 |
m_nb(HelloInterval), |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
123 |
m_rreqCount (0), |
5720
92594e167a58
[aodv] Code style fixes proposed by Faker in his review
Pavel Boyko <boyko@iitp.ru>
parents:
5719
diff
changeset
|
124 |
m_htimer (Timer::CANCEL_ON_DESTROY), |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
125 |
m_rreqRateLimitTimer (Timer::CANCEL_ON_DESTROY) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
126 |
{ |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
127 |
if (EnableHello) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
128 |
{ |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
129 |
m_nb.SetCallback (MakeCallback (&RoutingProtocol::SendRerrWhenBreaksLinkToNextHop, this)); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
130 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
131 |
} |
5560 | 132 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
133 |
TypeId |
5560 | 134 |
RoutingProtocol::GetTypeId (void) |
135 |
{ |
|
5619 | 136 |
static TypeId tid = TypeId ("ns3::aodv::RoutingProtocol") |
137 |
.SetParent<Ipv4RoutingProtocol> () |
|
138 |
.AddConstructor<RoutingProtocol> () |
|
139 |
.AddAttribute ("HelloInterval", "HELLO messages emission interval.", |
|
140 |
TimeValue (Seconds (1)), |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
141 |
MakeTimeAccessor (&RoutingProtocol::HelloInterval), |
5619 | 142 |
MakeTimeChecker ()) |
143 |
.AddAttribute ("RreqRetries", "Maximum number of retransmissions of RREQ to discover a route", |
|
144 |
UintegerValue (2), |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
145 |
MakeUintegerAccessor (&RoutingProtocol::RreqRetries), |
5619 | 146 |
MakeUintegerChecker<uint32_t> ()) |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
147 |
.AddAttribute ("RreqRateLimit", "Maximum number of RREQ per second.", |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
148 |
UintegerValue (10), |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
149 |
MakeUintegerAccessor (&RoutingProtocol::RreqRateLimit), |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
150 |
MakeUintegerChecker<uint32_t> ()) |
5625 | 151 |
.AddAttribute ("NodeTraversalTime", "Conservative estimate of the average one hop traversal time for packets and should include " |
5619 | 152 |
"queuing delays, interrupt processing times and transfer times.", |
153 |
TimeValue (MilliSeconds (40)), |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
154 |
MakeTimeAccessor (&RoutingProtocol::NodeTraversalTime), |
5619 | 155 |
MakeTimeChecker ()) |
5701 | 156 |
.AddAttribute ("NextHopWait", "Period of our waiting for the neighbour's RREP_ACK = 10 ms + NodeTraversalTime", |
157 |
TimeValue (MilliSeconds (50)), |
|
158 |
MakeTimeAccessor (&RoutingProtocol::NextHopWait), |
|
159 |
MakeTimeChecker ()) |
|
5619 | 160 |
.AddAttribute ("ActiveRouteTimeout", "Period of time during which the route is considered to be valid", |
161 |
TimeValue (Seconds (3)), |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
162 |
MakeTimeAccessor (&RoutingProtocol::ActiveRouteTimeout), |
5619 | 163 |
MakeTimeChecker ()) |
5701 | 164 |
.AddAttribute ("MyRouteTimeout", "Value of lifetime field in RREP generating by this node = 2 * max(ActiveRouteTimeout, PathDiscoveryTime)", |
165 |
TimeValue (Seconds (11.2)), |
|
166 |
MakeTimeAccessor (&RoutingProtocol::MyRouteTimeout), |
|
167 |
MakeTimeChecker ()) |
|
168 |
.AddAttribute ("BlackListTimeout", "Time for which the node is put into the blacklist = RreqRetries * NetTraversalTime", |
|
169 |
TimeValue (Seconds (5.6)), |
|
170 |
MakeTimeAccessor (&RoutingProtocol::BlackListTimeout), |
|
171 |
MakeTimeChecker ()) |
|
172 |
.AddAttribute ("DeletePeriod", "DeletePeriod is intended to provide an upper bound on the time for which an upstream node A " |
|
173 |
"can have a neighbor B as an active next hop for destination D, while B has invalidated the route to D." |
|
174 |
" = 5 * max (HelloInterval, ActiveRouteTimeout)", |
|
175 |
TimeValue (Seconds (15)), |
|
176 |
MakeTimeAccessor (&RoutingProtocol::DeletePeriod), |
|
177 |
MakeTimeChecker ()) |
|
178 |
.AddAttribute ("TimeoutBuffer", "Its purpose is to provide a buffer for the timeout so that if the RREP is delayed" |
|
179 |
" due to congestion, a timeout is less likely to occur while the RREP is still en route back to the source.", |
|
180 |
UintegerValue (2), |
|
181 |
MakeUintegerAccessor (&RoutingProtocol::TimeoutBuffer), |
|
182 |
MakeUintegerChecker<uint16_t> ()) |
|
5619 | 183 |
.AddAttribute ("NetDiameter", "Net diameter measures the maximum possible number of hops between two nodes in the network", |
184 |
UintegerValue (35), |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
185 |
MakeUintegerAccessor (&RoutingProtocol::NetDiameter), |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
186 |
MakeUintegerChecker<uint32_t> ()) |
5701 | 187 |
.AddAttribute ("NetTraversalTime", "Estimate of the average net traversal time = 2 * NodeTraversalTime * NetDiameter", |
188 |
TimeValue (Seconds (2.8)), |
|
189 |
MakeTimeAccessor (&RoutingProtocol::NetTraversalTime), |
|
190 |
MakeTimeChecker ()) |
|
191 |
.AddAttribute ("PathDiscoveryTime", "Estimate of maximum time needed to find route in network = 2 * NetTraversalTime", |
|
192 |
TimeValue (Seconds (5.6)), |
|
193 |
MakeTimeAccessor (&RoutingProtocol::PathDiscoveryTime), |
|
194 |
MakeTimeChecker ()) |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
195 |
.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
|
196 |
UintegerValue (64), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
197 |
MakeUintegerAccessor (&RoutingProtocol::MaxQueueLen), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
198 |
MakeUintegerChecker<uint32_t> ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
199 |
.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
|
200 |
TimeValue (Seconds (30)), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
201 |
MakeTimeAccessor (&RoutingProtocol::MaxQueueTime), |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
202 |
MakeTimeChecker ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
203 |
.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
|
204 |
UintegerValue (2), |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
205 |
MakeUintegerAccessor (&RoutingProtocol::AllowedHelloLoss), |
5619 | 206 |
MakeUintegerChecker<uint16_t> ()) |
5654 | 207 |
.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
|
208 |
BooleanValue (true), |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
209 |
MakeBooleanAccessor (&RoutingProtocol::SetGratuitousReplyFlag, |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
210 |
&RoutingProtocol::GetGratuitousReplyFlag), |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
211 |
MakeBooleanChecker ()) |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
212 |
.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
|
213 |
BooleanValue (false), |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
214 |
MakeBooleanAccessor (&RoutingProtocol::SetDesinationOnlyFlag, |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
215 |
&RoutingProtocol::GetDesinationOnlyFlag), |
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
216 |
MakeBooleanChecker ()) |
5654 | 217 |
.AddAttribute ("EnableHello", "Indicates whether a hello messages enable.", |
5658 | 218 |
BooleanValue (true), |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
219 |
MakeBooleanAccessor (&RoutingProtocol::SetHelloEnable, |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
220 |
&RoutingProtocol::GetHelloEnable), |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
221 |
MakeBooleanChecker ()) |
5717 | 222 |
.AddAttribute ("EnableBroadcast", "Indicates whether a broadcast data packets forwarding enable.", |
223 |
BooleanValue (true), |
|
224 |
MakeBooleanAccessor (&RoutingProtocol::SetBroadcastEnable, |
|
225 |
&RoutingProtocol::GetBroadcastEnable), |
|
226 |
MakeBooleanChecker ()) |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
227 |
; |
5560 | 228 |
return tid; |
229 |
} |
|
5674 | 230 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
231 |
RoutingProtocol::~RoutingProtocol () |
5560 | 232 |
{ |
233 |
} |
|
234 |
||
235 |
void |
|
236 |
RoutingProtocol::DoDispose () |
|
237 |
{ |
|
238 |
m_ipv4 = 0; |
|
5699 | 239 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::iterator iter = |
240 |
m_socketAddresses.begin (); iter != m_socketAddresses.end (); iter++) |
|
241 |
{ |
|
242 |
iter->first->Close (); |
|
243 |
} |
|
5560 | 244 |
m_socketAddresses.clear (); |
245 |
Ipv4RoutingProtocol::DoDispose (); |
|
246 |
} |
|
247 |
||
5582 | 248 |
void |
249 |
RoutingProtocol::Start () |
|
250 |
{ |
|
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
251 |
NS_LOG_FUNCTION (this); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
252 |
if (EnableHello) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
253 |
{ |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
254 |
m_nb.ScheduleTimer (); |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
255 |
} |
5699 | 256 |
m_rreqRateLimitTimer.SetFunction (&RoutingProtocol::RreqRateLimitTimerExpire, |
257 |
this); |
|
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
258 |
m_rreqRateLimitTimer.Schedule (Seconds (1)); |
5582 | 259 |
} |
260 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
261 |
Ptr<Ipv4Route> |
5699 | 262 |
RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, |
5856
7fd20c798a7d
bug 742: Implementation of SO_BINDTODEVICE
Antti Mäkelä <zarhan@cc.hut.fi>
parents:
5843
diff
changeset
|
263 |
Ptr<NetDevice> oif, Socket::SocketErrno &sockerr) |
5560 | 264 |
{ |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
265 |
NS_LOG_FUNCTION (this << header << (oif? oif->GetIfIndex () : 0)); |
6088 | 266 |
if (! p) |
267 |
{ |
|
6547
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
268 |
return LoopbackRoute (header, oif); // later |
6088 | 269 |
} |
5667
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
270 |
if (m_socketAddresses.empty ()) |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
271 |
{ |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
272 |
sockerr = Socket::ERROR_NOROUTETOHOST; |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
273 |
NS_LOG_LOGIC ("No aodv interfaces"); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
274 |
Ptr<Ipv4Route> route; |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
275 |
return route; |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
276 |
} |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
277 |
sockerr = Socket::ERROR_NOTERROR; |
5607 | 278 |
Ptr<Ipv4Route> route; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
279 |
Ipv4Address dst = header.GetDestination (); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
280 |
RoutingTableEntry rt; |
6090 | 281 |
if (m_routingTable.LookupValidRoute (dst, rt)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
282 |
{ |
6090 | 283 |
route = rt.GetRoute (); |
284 |
NS_ASSERT (route != 0); |
|
285 |
NS_LOG_DEBUG ("Exist route to " << route->GetDestination() << " from interface " << route->GetSource()); |
|
286 |
if (oif != 0 && route->GetOutputDevice () != oif) |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
287 |
{ |
6090 | 288 |
NS_LOG_DEBUG ("Output device doesn't match. Dropped."); |
289 |
sockerr = Socket::ERROR_NOROUTETOHOST; |
|
290 |
return Ptr<Ipv4Route> (); |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
291 |
} |
6090 | 292 |
UpdateRouteLifeTime (dst, ActiveRouteTimeout); |
293 |
UpdateRouteLifeTime (route->GetGateway (), ActiveRouteTimeout); |
|
294 |
return route; |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
295 |
} |
6088 | 296 |
|
297 |
// Valid route not found, in this case we return loopback. |
|
298 |
// Actual route request will be deferred until packet will be fully formed, |
|
299 |
// routed to loopback, received from loopback and passed to RouteInput (see below) |
|
300 |
uint32_t iif = (oif ? m_ipv4->GetInterfaceForDevice (oif) : -1); |
|
301 |
DeferredRouteOutputTag tag (iif); |
|
302 |
if (! p->PeekPacketTag (tag)) |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
303 |
{ |
6088 | 304 |
p->AddPacketTag (tag); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
305 |
} |
6547
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
306 |
return LoopbackRoute (header, oif); |
6088 | 307 |
} |
308 |
||
309 |
void |
|
310 |
RoutingProtocol::DeferredRouteOutput (Ptr<const Packet> p, const Ipv4Header & header, |
|
311 |
UnicastForwardCallback ucb, ErrorCallback ecb) |
|
312 |
{ |
|
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
313 |
NS_LOG_FUNCTION (this << p << header); |
6088 | 314 |
NS_ASSERT (p != 0 && p != Ptr<Packet> ()); |
315 |
||
316 |
QueueEntry newEntry (p, header, ucb, ecb); |
|
317 |
bool result = m_queue.Enqueue (newEntry); |
|
318 |
if (result) |
|
319 |
{ |
|
320 |
NS_LOG_LOGIC ("Add packet " << p->GetUid() << " to queue. Protocol " << (uint16_t) header.GetProtocol ()); |
|
6483
5dbb70a41b85
Bug 966 - AODV originates new RREQ on each packet, when doesn't have valid route
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6465
diff
changeset
|
321 |
RoutingTableEntry rt; |
5dbb70a41b85
Bug 966 - AODV originates new RREQ on each packet, when doesn't have valid route
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6465
diff
changeset
|
322 |
bool result = m_routingTable.LookupRoute(header.GetDestination (), rt); |
5dbb70a41b85
Bug 966 - AODV originates new RREQ on each packet, when doesn't have valid route
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6465
diff
changeset
|
323 |
if(!result || ((rt.GetFlag() != IN_SEARCH) && result)) |
5dbb70a41b85
Bug 966 - AODV originates new RREQ on each packet, when doesn't have valid route
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6465
diff
changeset
|
324 |
{ |
5dbb70a41b85
Bug 966 - AODV originates new RREQ on each packet, when doesn't have valid route
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6465
diff
changeset
|
325 |
NS_LOG_LOGIC ("Send RREQ to" <<header.GetDestination ()); |
5dbb70a41b85
Bug 966 - AODV originates new RREQ on each packet, when doesn't have valid route
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6465
diff
changeset
|
326 |
SendRequest (header.GetDestination ()); |
5dbb70a41b85
Bug 966 - AODV originates new RREQ on each packet, when doesn't have valid route
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6465
diff
changeset
|
327 |
} |
6088 | 328 |
} |
5560 | 329 |
} |
330 |
||
331 |
bool |
|
5699 | 332 |
RoutingProtocol::RouteInput (Ptr<const Packet> p, const Ipv4Header &header, |
333 |
Ptr<const NetDevice> idev, UnicastForwardCallback ucb, |
|
334 |
MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb) |
|
5560 | 335 |
{ |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
336 |
NS_LOG_FUNCTION (this << p->GetUid() << header.GetDestination() << idev->GetAddress()); |
5667
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
337 |
if (m_socketAddresses.empty ()) |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
338 |
{ |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
339 |
NS_LOG_LOGIC ("No aodv interfaces"); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
340 |
return false; |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
341 |
} |
5579 | 342 |
NS_ASSERT (m_ipv4 != 0); |
6088 | 343 |
NS_ASSERT (p != 0); |
5579 | 344 |
// Check if input device supports IP |
345 |
NS_ASSERT (m_ipv4->GetInterfaceForDevice (idev) >= 0); |
|
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
346 |
int32_t iif = m_ipv4->GetInterfaceForDevice (idev); |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
347 |
|
5582 | 348 |
Ipv4Address dst = header.GetDestination (); |
5609 | 349 |
Ipv4Address origin = header.GetSource (); |
6088 | 350 |
|
351 |
// Deferred route request |
|
352 |
if (idev == m_lo) |
|
353 |
{ |
|
354 |
DeferredRouteOutputTag tag; |
|
355 |
if (p->PeekPacketTag (tag)) |
|
356 |
{ |
|
357 |
DeferredRouteOutput (p, header, ucb, ecb); |
|
358 |
return true; |
|
359 |
} |
|
360 |
} |
|
361 |
||
362 |
// Duplicate of own packet |
|
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
363 |
if (IsMyOwnAddress (origin)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
364 |
return true; |
5579 | 365 |
|
6088 | 366 |
// Broadcast local delivery/forwarding |
5699 | 367 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = |
368 |
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
|
369 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
370 |
Ipv4InterfaceAddress iface = j->second; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
371 |
if (m_ipv4->GetInterfaceForAddress (iface.GetLocal ()) == iif) |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
372 |
if (dst == iface.GetBroadcast () || dst.IsBroadcast ()) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
373 |
{ |
5721 | 374 |
if (m_dpd.IsDuplicate (p, header)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
375 |
{ |
5699 | 376 |
NS_LOG_DEBUG ("Duplicated packet " << p->GetUid () << " from " << origin << ". Drop."); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
377 |
return true; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
378 |
} |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
379 |
UpdateRouteLifeTime (origin, ActiveRouteTimeout); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
380 |
NS_LOG_LOGIC ("Broadcast local delivery to " << iface.GetLocal ()); |
5699 | 381 |
Ptr<Packet> packet = p->Copy (); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
382 |
lcb (p, header, iif); |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
383 |
if (!EnableBroadcast) |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
384 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
385 |
return true; |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
386 |
} |
5690 | 387 |
if (header.GetTtl () > 1) |
5689
56aac7757f06
bcast forwarding seems to be fixed
Pavel Boyko <boyko@iitp.ru>
parents:
5687
diff
changeset
|
388 |
{ |
5694
a1da0ba7d1a8
broadcast UDP traffic in aodv script
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5692
diff
changeset
|
389 |
NS_LOG_LOGIC ("Forward broadcast. TTL " << (uint16_t) header.GetTtl ()); |
5697
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
390 |
RoutingTableEntry toBroadcast; |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
391 |
if (m_routingTable.LookupRoute (dst, toBroadcast)) |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
392 |
{ |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
393 |
Ptr<Ipv4Route> route = toBroadcast.GetRoute (); |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
394 |
ucb (route, packet, header); |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
395 |
} |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
396 |
else |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
397 |
{ |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
398 |
NS_LOG_DEBUG ("No route to forward broadcast. Drop packet " << p->GetUid ()); |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
399 |
} |
5689
56aac7757f06
bcast forwarding seems to be fixed
Pavel Boyko <boyko@iitp.ru>
parents:
5687
diff
changeset
|
400 |
} |
5692
4cc0291326c6
udp traffic added into aodv script + problem with remove fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5690
diff
changeset
|
401 |
else |
4cc0291326c6
udp traffic added into aodv script + problem with remove fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5690
diff
changeset
|
402 |
{ |
5699 | 403 |
NS_LOG_DEBUG ("TTL exceeded. Drop packet " << p->GetUid ()); |
5692
4cc0291326c6
udp traffic added into aodv script + problem with remove fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5690
diff
changeset
|
404 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
405 |
return true; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
406 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
407 |
} |
6088 | 408 |
|
409 |
// Unicast local delivery |
|
410 |
if (m_ipv4->IsDestinationAddress (dst, iif)) |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
411 |
{ |
6088 | 412 |
UpdateRouteLifeTime (origin, ActiveRouteTimeout); |
413 |
RoutingTableEntry toOrigin; |
|
6090 | 414 |
if (m_routingTable.LookupValidRoute (origin, toOrigin)) |
5615
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
415 |
{ |
6088 | 416 |
UpdateRouteLifeTime (toOrigin.GetNextHop (), ActiveRouteTimeout); |
417 |
m_nb.Update (toOrigin.GetNextHop (), ActiveRouteTimeout); |
|
5615
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
418 |
} |
6088 | 419 |
NS_LOG_LOGIC ("Unicast local delivery to " << dst); |
420 |
lcb (p, header, iif); |
|
421 |
return true; |
|
5579 | 422 |
} |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
423 |
|
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
424 |
// Forwarding |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
425 |
return Forwarding (p, header, ucb, ecb); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
426 |
} |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
427 |
|
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
428 |
bool |
5699 | 429 |
RoutingProtocol::Forwarding (Ptr<const Packet> p, const Ipv4Header & header, |
430 |
UnicastForwardCallback ucb, ErrorCallback ecb) |
|
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
431 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
432 |
NS_LOG_FUNCTION (this); |
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
433 |
Ipv4Address dst = header.GetDestination (); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
434 |
Ipv4Address origin = header.GetSource (); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
435 |
m_routingTable.Purge (); |
5609 | 436 |
RoutingTableEntry toDst; |
437 |
if (m_routingTable.LookupRoute (dst, toDst)) |
|
5622
aa34a270824c
route lifetime management fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5621
diff
changeset
|
438 |
{ |
5676 | 439 |
if (toDst.GetFlag () == VALID) |
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
440 |
{ |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
441 |
Ptr<Ipv4Route> route = toDst.GetRoute (); |
5699 | 442 |
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
|
443 |
|
5699 | 444 |
/* |
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
445 |
* 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
|
446 |
* 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
|
447 |
* 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
|
448 |
* time plus ActiveRouteTimeout. |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
449 |
*/ |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
450 |
UpdateRouteLifeTime (origin, ActiveRouteTimeout); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
451 |
UpdateRouteLifeTime (dst, ActiveRouteTimeout); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
452 |
UpdateRouteLifeTime (route->GetGateway (), ActiveRouteTimeout); |
5699 | 453 |
/* |
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
454 |
* 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
|
455 |
* 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
|
456 |
* to be no less than the current time plus ActiveRouteTimeout |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
457 |
*/ |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
458 |
RoutingTableEntry toOrigin; |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
459 |
m_routingTable.LookupRoute (origin, toOrigin); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
460 |
UpdateRouteLifeTime (toOrigin.GetNextHop (), ActiveRouteTimeout); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
461 |
|
5699 | 462 |
m_nb.Update (route->GetGateway (), ActiveRouteTimeout); |
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
463 |
m_nb.Update (toOrigin.GetNextHop (), ActiveRouteTimeout); |
5609 | 464 |
|
5648
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
465 |
ucb (route, p, header); |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
466 |
return true; |
85aae1523c46
forwarding detached from RouteInput
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5647
diff
changeset
|
467 |
} |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
468 |
else |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
469 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
470 |
if (toDst.GetValidSeqNo ()) |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
471 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
472 |
SendRerrWhenNoRouteToForward (dst, toDst.GetSeqNo (), origin); |
5699 | 473 |
NS_LOG_DEBUG ("Drop packet " << p->GetUid () << " because no route to forward it."); |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
474 |
return false; |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
475 |
} |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
476 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
477 |
} |
5699 | 478 |
NS_LOG_LOGIC ("route not found to "<< dst << ". Send RERR message."); |
479 |
NS_LOG_DEBUG ("Drop packet " << p->GetUid () << " because no route to forward it."); |
|
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
480 |
SendRerrWhenNoRouteToForward (dst, 0, origin); |
5578
020a5aa8b40c
SendRequeat in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5577
diff
changeset
|
481 |
return false; |
5560 | 482 |
} |
483 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
484 |
void |
5560 | 485 |
RoutingProtocol::SetIpv4 (Ptr<Ipv4> ipv4) |
486 |
{ |
|
5616
9d22b787ea7c
RawSocketImpl::ForwardUp fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5615
diff
changeset
|
487 |
NS_ASSERT (ipv4 != 0); |
9d22b787ea7c
RawSocketImpl::ForwardUp fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5615
diff
changeset
|
488 |
NS_ASSERT (m_ipv4 == 0); |
6088 | 489 |
|
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
490 |
if (EnableHello) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
491 |
{ |
5720
92594e167a58
[aodv] Code style fixes proposed by Faker in his review
Pavel Boyko <boyko@iitp.ru>
parents:
5719
diff
changeset
|
492 |
m_htimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this); |
92594e167a58
[aodv] Code style fixes proposed by Faker in his review
Pavel Boyko <boyko@iitp.ru>
parents:
5719
diff
changeset
|
493 |
m_htimer.Schedule (MilliSeconds (UniformVariable ().GetInteger (0, 100))); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
494 |
} |
5571
b82fbde6cf8d
BroadcastIdCache methods and SendRequest() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5562
diff
changeset
|
495 |
|
5560 | 496 |
m_ipv4 = ipv4; |
6088 | 497 |
|
498 |
// Create lo route. It is asserted that the only one interface up for now is loopback |
|
499 |
NS_ASSERT (m_ipv4->GetNInterfaces () == 1 && m_ipv4->GetAddress (0, 0).GetLocal () == Ipv4Address ("127.0.0.1")); |
|
500 |
m_lo = m_ipv4->GetNetDevice (0); |
|
501 |
NS_ASSERT (m_lo != 0); |
|
502 |
// Remember lo route |
|
503 |
RoutingTableEntry rt (/*device=*/m_lo, /*dst=*/Ipv4Address::GetLoopback (), /*know seqno=*/true, /*seqno=*/0, |
|
504 |
/*iface=*/Ipv4InterfaceAddress (Ipv4Address::GetLoopback (), Ipv4Mask ("255.0.0.0")), |
|
505 |
/*hops=*/1, /*next hop=*/Ipv4Address::GetLoopback (), |
|
506 |
/*lifetime=*/Simulator::GetMaximumSimulationTime ()); |
|
507 |
m_routingTable.AddRoute (rt); |
|
508 |
||
5560 | 509 |
Simulator::ScheduleNow (&RoutingProtocol::Start, this); |
510 |
} |
|
511 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
512 |
void |
5699 | 513 |
RoutingProtocol::NotifyInterfaceUp (uint32_t i) |
5560 | 514 |
{ |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
515 |
NS_LOG_FUNCTION (this << m_ipv4->GetAddress (i, 0).GetLocal ()); |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
516 |
Ptr<Ipv4L3Protocol> l3 = m_ipv4->GetObject<Ipv4L3Protocol> (); |
5700
7c93ecc5a430
use Ipv4L3Protocol instead of Ptr<Ipv4Interface>
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5699
diff
changeset
|
517 |
if (l3->GetNAddresses (i) > 1) |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
518 |
{ |
5729
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
519 |
NS_LOG_WARN ("AODV does not work with more then one address per each interface."); |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
520 |
} |
5700
7c93ecc5a430
use Ipv4L3Protocol instead of Ptr<Ipv4Interface>
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5699
diff
changeset
|
521 |
Ipv4InterfaceAddress iface = l3->GetAddress (i, 0); |
5666
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
522 |
if (iface.GetLocal () == Ipv4Address ("127.0.0.1")) |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
523 |
return; |
6088 | 524 |
|
5666
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
525 |
// Create a socket to listen only on this interface |
5699 | 526 |
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), |
527 |
UdpSocketFactory::GetTypeId ()); |
|
5666
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
528 |
NS_ASSERT (socket != 0); |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
529 |
socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
530 |
socket->BindToNetDevice (l3->GetNetDevice (i)); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
531 |
socket->Bind (InetSocketAddress (Ipv4Address::GetAny (), AODV_PORT)); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
532 |
socket->SetAllowBroadcast (true); |
5699 | 533 |
socket->SetAttribute ("IpTtl", UintegerValue (1)); |
5666
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
534 |
m_socketAddresses.insert (std::make_pair (socket, iface)); |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
535 |
|
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
536 |
// Add local broadcast record to the routing table |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
537 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (iface.GetLocal ())); |
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
538 |
RoutingTableEntry rt (/*device=*/dev, /*dst=*/iface.GetBroadcast (), /*know seqno=*/true, /*seqno=*/0, /*iface=*/iface, |
5711 | 539 |
/*hops=*/1, /*next hop=*/iface.GetBroadcast (), /*lifetime=*/Simulator::GetMaximumSimulationTime ()); |
5666
e22f5d735495
RoutingProtocol::NotifyInterfaceUp added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5665
diff
changeset
|
540 |
m_routingTable.AddRoute (rt); |
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
541 |
|
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
542 |
// 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
|
543 |
Ptr<WifiNetDevice> wifi = dev->GetObject<WifiNetDevice> (); |
5699 | 544 |
if (wifi == 0) |
545 |
return; |
|
5735 | 546 |
Ptr<WifiMac> mac = wifi->GetMac (); |
5699 | 547 |
if (mac == 0) |
548 |
return; |
|
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
549 |
|
5699 | 550 |
mac->TraceConnectWithoutContext ("TxErrHeader", m_nb.GetTxErrorCallback ()); |
5700
7c93ecc5a430
use Ipv4L3Protocol instead of Ptr<Ipv4Interface>
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5699
diff
changeset
|
551 |
m_nb.AddArpCache (l3->GetInterface (i)->GetArpCache ()); |
5560 | 552 |
} |
553 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
554 |
void |
5699 | 555 |
RoutingProtocol::NotifyInterfaceDown (uint32_t i) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
556 |
{ |
5569 | 557 |
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
|
558 |
|
5699 | 559 |
// Disable layer 2 link state monitoring (if possible) |
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
560 |
Ptr<Ipv4L3Protocol> l3 = m_ipv4->GetObject<Ipv4L3Protocol> (); |
5700
7c93ecc5a430
use Ipv4L3Protocol instead of Ptr<Ipv4Interface>
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5699
diff
changeset
|
561 |
Ptr<NetDevice> dev = l3->GetNetDevice (i); |
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
562 |
Ptr<WifiNetDevice> wifi = dev->GetObject<WifiNetDevice> (); |
5699 | 563 |
if (wifi != 0) |
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
564 |
{ |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
565 |
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
|
566 |
if (mac != 0) |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
567 |
{ |
5699 | 568 |
mac->TraceDisconnectWithoutContext ("TxErrHeader", |
569 |
m_nb.GetTxErrorCallback ()); |
|
5700
7c93ecc5a430
use Ipv4L3Protocol instead of Ptr<Ipv4Interface>
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5699
diff
changeset
|
570 |
m_nb.DelArpCache (l3->GetInterface (i)->GetArpCache ()); |
5681
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
571 |
} |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
572 |
} |
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
573 |
|
795c049199c5
Includes cleanup + layer 2 link failure detection (untested)
Pavel Boyko <boyko@iitp.ru>
parents:
5677
diff
changeset
|
574 |
// Close socket |
5667
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
575 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (m_ipv4->GetAddress (i, 0)); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
576 |
NS_ASSERT (socket); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
577 |
socket->Close (); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
578 |
m_socketAddresses.erase (socket); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
579 |
if (m_socketAddresses.empty ()) |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
580 |
{ |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
581 |
NS_LOG_LOGIC ("No aodv interfaces"); |
5720
92594e167a58
[aodv] Code style fixes proposed by Faker in his review
Pavel Boyko <boyko@iitp.ru>
parents:
5719
diff
changeset
|
582 |
m_htimer.Cancel (); |
5667
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
583 |
m_nb.Clear (); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
584 |
m_routingTable.Clear (); |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
585 |
return; |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
586 |
} |
2a81f8bf0199
RoutingProtocol::NotifyInterfaceDown added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5666
diff
changeset
|
587 |
m_routingTable.DeleteAllRoutesFromInterface (m_ipv4->GetAddress (i, 0)); |
5560 | 588 |
} |
589 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
590 |
void |
5699 | 591 |
RoutingProtocol::NotifyAddAddress (uint32_t i, Ipv4InterfaceAddress address) |
5560 | 592 |
{ |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
593 |
NS_LOG_FUNCTION (this << " interface " << i << " address " << address); |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
594 |
Ptr<Ipv4L3Protocol> l3 = m_ipv4->GetObject<Ipv4L3Protocol> (); |
5700
7c93ecc5a430
use Ipv4L3Protocol instead of Ptr<Ipv4Interface>
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5699
diff
changeset
|
595 |
if (!l3->IsUp (i)) |
5699 | 596 |
return; |
5700
7c93ecc5a430
use Ipv4L3Protocol instead of Ptr<Ipv4Interface>
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5699
diff
changeset
|
597 |
if (l3->GetNAddresses (i) == 1) |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
598 |
{ |
5700
7c93ecc5a430
use Ipv4L3Protocol instead of Ptr<Ipv4Interface>
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5699
diff
changeset
|
599 |
Ipv4InterfaceAddress iface = l3->GetAddress (i, 0); |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
600 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (iface); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
601 |
if (!socket) |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
602 |
{ |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
603 |
if (iface.GetLocal () == Ipv4Address ("127.0.0.1")) |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
604 |
return; |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
605 |
// Create a socket to listen only on this interface |
5699 | 606 |
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), |
607 |
UdpSocketFactory::GetTypeId ()); |
|
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
608 |
NS_ASSERT (socket != 0); |
5699 | 609 |
socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv,this)); |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
610 |
socket->BindToNetDevice (l3->GetNetDevice (i)); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
611 |
// Bind to any IP address so that broadcasts can be received |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
612 |
socket->Bind (InetSocketAddress (Ipv4Address::GetAny(), AODV_PORT)); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
613 |
socket->SetAllowBroadcast (true); |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
614 |
m_socketAddresses.insert (std::make_pair (socket, iface)); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
615 |
|
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
616 |
// Add local broadcast record to the routing table |
5699 | 617 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice ( |
618 |
m_ipv4->GetInterfaceForAddress (iface.GetLocal ())); |
|
619 |
RoutingTableEntry rt (/*device=*/dev, /*dst=*/iface.GetBroadcast (), /*know seqno=*/true, |
|
620 |
/*seqno=*/0, /*iface=*/iface, /*hops=*/1, |
|
5711 | 621 |
/*next hop=*/iface.GetBroadcast (), /*lifetime=*/Simulator::GetMaximumSimulationTime ()); |
5668
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
622 |
m_routingTable.AddRoute (rt); |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
623 |
} |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
624 |
} |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
625 |
else |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
626 |
{ |
01d09aa60c45
RoutingProtocol::NotifyAddAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5667
diff
changeset
|
627 |
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
|
628 |
} |
5560 | 629 |
} |
630 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
631 |
void |
5699 | 632 |
RoutingProtocol::NotifyRemoveAddress (uint32_t i, Ipv4InterfaceAddress address) |
5560 | 633 |
{ |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
634 |
NS_LOG_FUNCTION (this); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
635 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (address); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
636 |
if (socket) |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
637 |
{ |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
638 |
m_routingTable.DeleteAllRoutesFromInterface (address); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
639 |
m_socketAddresses.erase (socket); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
640 |
Ptr<Ipv4L3Protocol> l3 = m_ipv4->GetObject<Ipv4L3Protocol> (); |
5700
7c93ecc5a430
use Ipv4L3Protocol instead of Ptr<Ipv4Interface>
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5699
diff
changeset
|
641 |
if (l3->GetNAddresses (i)) |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
642 |
{ |
5700
7c93ecc5a430
use Ipv4L3Protocol instead of Ptr<Ipv4Interface>
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5699
diff
changeset
|
643 |
Ipv4InterfaceAddress iface = l3->GetAddress (i, 0); |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
644 |
// Create a socket to listen only on this interface |
5699 | 645 |
Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), |
646 |
UdpSocketFactory::GetTypeId ()); |
|
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
647 |
NS_ASSERT (socket != 0); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
648 |
socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
649 |
// Bind to any IP address so that broadcasts can be received |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
650 |
socket->Bind (InetSocketAddress (Ipv4Address::GetAny(), AODV_PORT)); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
651 |
socket->SetAllowBroadcast (true); |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
652 |
m_socketAddresses.insert (std::make_pair (socket, iface)); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
653 |
|
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
654 |
// Add local broadcast record to the routing table |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
655 |
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (iface.GetLocal ())); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
656 |
RoutingTableEntry rt (/*device=*/dev, /*dst=*/iface.GetBroadcast (), /*know seqno=*/true, /*seqno=*/0, /*iface=*/iface, |
5711 | 657 |
/*hops=*/1, /*next hop=*/iface.GetBroadcast (), /*lifetime=*/Simulator::GetMaximumSimulationTime ()); |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
658 |
m_routingTable.AddRoute (rt); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
659 |
} |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
660 |
if (m_socketAddresses.empty ()) |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
661 |
{ |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
662 |
NS_LOG_LOGIC ("No aodv interfaces"); |
5720
92594e167a58
[aodv] Code style fixes proposed by Faker in his review
Pavel Boyko <boyko@iitp.ru>
parents:
5719
diff
changeset
|
663 |
m_htimer.Cancel (); |
5669
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
664 |
m_nb.Clear (); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
665 |
m_routingTable.Clear (); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
666 |
return; |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
667 |
} |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
668 |
} |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
669 |
else |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
670 |
{ |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
671 |
NS_LOG_LOGIC ("Remove address not participating in AODV operation"); |
cdacd9c46201
RoutingProtocol::NotifyRemoveAddress added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5668
diff
changeset
|
672 |
} |
5560 | 673 |
} |
674 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
675 |
bool |
5699 | 676 |
RoutingProtocol::IsMyOwnAddress (Ipv4Address src) |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
677 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
678 |
NS_LOG_FUNCTION (this << src); |
5699 | 679 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = |
680 |
m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
|
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
681 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
682 |
Ipv4InterfaceAddress iface = j->second; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
683 |
if (src == iface.GetLocal ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
684 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
685 |
return true; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
686 |
} |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
687 |
} |
5594
106389f6d383
Duplicate detection fixed in RREQ forwarding
Pavel Boyko <boyko@iitp.ru>
parents:
5593
diff
changeset
|
688 |
return false; |
106389f6d383
Duplicate detection fixed in RREQ forwarding
Pavel Boyko <boyko@iitp.ru>
parents:
5593
diff
changeset
|
689 |
} |
106389f6d383
Duplicate detection fixed in RREQ forwarding
Pavel Boyko <boyko@iitp.ru>
parents:
5593
diff
changeset
|
690 |
|
6088 | 691 |
Ptr<Ipv4Route> |
6547
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
692 |
RoutingProtocol::LoopbackRoute (const Ipv4Header & hdr, Ptr<NetDevice> oif) const |
6088 | 693 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
694 |
NS_LOG_FUNCTION (this << hdr); |
6088 | 695 |
NS_ASSERT (m_lo != 0); |
696 |
Ptr<Ipv4Route> rt = Create<Ipv4Route> (); |
|
697 |
rt->SetDestination (hdr.GetDestination ()); |
|
6547
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
698 |
// |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
699 |
// Source address selection here is tricky. The loopback route is |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
700 |
// returned when AODV does not have a route; this causes the packet |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
701 |
// to be looped back and handled (cached) in RouteInput() method |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
702 |
// while a route is found. However, connection-oriented protocols |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
703 |
// like TCP need to create an endpoint four-tuple (src, src port, |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
704 |
// dst, dst port) and create a pseudo-header for checksumming. So, |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
705 |
// AODV needs to guess correctly what the eventual source address |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
706 |
// will be. |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
707 |
// |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
708 |
// For single interface, single address nodes, this is not a problem. |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
709 |
// When there are possibly multiple outgoing interfaces, the policy |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
710 |
// implemented here is to pick the first available AODV interface. |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
711 |
// If RouteOutput() caller specified an outgoing interface, that |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
712 |
// further constrains the selection of source address |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
713 |
// |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
714 |
std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
715 |
if (oif) |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
716 |
{ |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
717 |
// Iterate to find an address on the oif device |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
718 |
for (j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
719 |
{ |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
720 |
Ipv4Address addr = j->second.GetLocal (); |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
721 |
int32_t interface = m_ipv4->GetInterfaceForAddress (addr); |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
722 |
if (oif == m_ipv4->GetNetDevice (static_cast<uint32_t> (interface))) |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
723 |
{ |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
724 |
rt->SetSource (addr); |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
725 |
break; |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
726 |
} |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
727 |
} |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
728 |
} |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
729 |
else |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
730 |
{ |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
731 |
rt->SetSource (j->second.GetLocal ()); |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
732 |
} |
6804b85fe140
Bug 879 - source address selection for AODV using DeferredRouteRequest
Tom Henderson <tomh@tomh.org>
parents:
6484
diff
changeset
|
733 |
NS_ASSERT_MSG (rt->GetSource() != Ipv4Address (), "Valid AODV source address not found"); |
6088 | 734 |
rt->SetGateway (Ipv4Address ("127.0.0.1")); |
735 |
rt->SetOutputDevice (m_lo); |
|
736 |
return rt; |
|
737 |
} |
|
738 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
739 |
void |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
740 |
RoutingProtocol::SendRequest (Ipv4Address dst) |
5582 | 741 |
{ |
5614
e4ac62d42079
BuildHeader added + support of raw socket in ipv4-l3-protol added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5613
diff
changeset
|
742 |
NS_LOG_FUNCTION ( this << dst); |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
743 |
// 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
|
744 |
if (m_rreqCount == RreqRateLimit) |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
745 |
{ |
5708
55abd6e61f17
MilliSeconds(double) fixed to MilliSeconds(int)
Pavel Boyko <boyko@iitp.ru>
parents:
5704
diff
changeset
|
746 |
Simulator::Schedule (m_rreqRateLimitTimer.GetDelayLeft () + MicroSeconds (100), |
5699 | 747 |
&RoutingProtocol::SendRequest, this, dst); |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
748 |
return; |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
749 |
} |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
750 |
else |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
751 |
m_rreqCount++; |
5582 | 752 |
// Create RREQ header |
753 |
RreqHeader rreqHeader; |
|
754 |
rreqHeader.SetDst (dst); |
|
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
755 |
|
5609 | 756 |
RoutingTableEntry rt; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
757 |
if (m_routingTable.LookupRoute (dst, rt)) |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
758 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
759 |
rreqHeader.SetHopCount (rt.GetHop ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
760 |
if (rt.GetValidSeqNo ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
761 |
rreqHeader.SetDstSeqno (rt.GetSeqNo ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
762 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
763 |
rreqHeader.SetUnknownSeqno (true); |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
764 |
rt.SetFlag (IN_SEARCH); |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
765 |
m_routingTable.AddRoute (rt); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
766 |
} |
5582 | 767 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
768 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
769 |
rreqHeader.SetUnknownSeqno (true); |
5843
aa227ef4f60f
AODV: fix strange routing record with destination 102.102.102.102, thank to Mariusz Skrocki.
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5749
diff
changeset
|
770 |
Ptr<NetDevice> dev = 0; |
aa227ef4f60f
AODV: fix strange routing record with destination 102.102.102.102, thank to Mariusz Skrocki.
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5749
diff
changeset
|
771 |
RoutingTableEntry newEntry (/*device=*/dev, /*dst=*/dst, /*validSeqNo=*/false, /*seqno=*/0, |
aa227ef4f60f
AODV: fix strange routing record with destination 102.102.102.102, thank to Mariusz Skrocki.
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5749
diff
changeset
|
772 |
/*iface=*/Ipv4InterfaceAddress(),/*hop=*/0, |
aa227ef4f60f
AODV: fix strange routing record with destination 102.102.102.102, thank to Mariusz Skrocki.
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5749
diff
changeset
|
773 |
/*nextHop=*/Ipv4Address(), /*lifeTime=*/Seconds(0)); |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
774 |
newEntry.SetFlag (IN_SEARCH); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
775 |
m_routingTable.AddRoute (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
776 |
} |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
777 |
|
5634
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
778 |
if (GratuitousReply) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
779 |
rreqHeader.SetGratiousRrep (true); |
5634
0638143639ad
D and G flags moved in protocol parameters
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5632
diff
changeset
|
780 |
if (DestinationOnly) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
781 |
rreqHeader.SetDestinationOnly (true); |
5601 | 782 |
|
5597
8e4c7f2aaead
mothods, classes and members renamed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5594
diff
changeset
|
783 |
m_seqNo++; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
784 |
rreqHeader.SetOriginSeqno (m_seqNo); |
5615
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
785 |
m_requestId++; |
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
786 |
rreqHeader.SetId (m_requestId); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
787 |
rreqHeader.SetHopCount (0); |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
788 |
|
5625 | 789 |
// Send RREQ as subnet directed broadcast from each interface used by aodv |
5699 | 790 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = |
791 |
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
|
792 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
793 |
Ptr<Socket> socket = j->first; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
794 |
Ipv4InterfaceAddress iface = j->second; |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
795 |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
796 |
rreqHeader.SetOrigin (iface.GetLocal ()); |
5721 | 797 |
m_rreqIdCache.IsDuplicate (iface.GetLocal (), m_requestId); |
5582 | 798 |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
799 |
Ptr<Packet> packet = Create<Packet> (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
800 |
packet->AddHeader (rreqHeader); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
801 |
TypeHeader tHeader (AODVTYPE_RREQ); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
802 |
packet->AddHeader (tHeader); |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
803 |
// Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
804 |
Ipv4Address destination; |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
805 |
if (iface.GetMask () == Ipv4Mask::GetOnes ()) |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
806 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
807 |
destination = Ipv4Address ("255.255.255.255"); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
808 |
} |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
809 |
else |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
810 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
811 |
destination = iface.GetBroadcast (); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
812 |
} |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
813 |
socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT)); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
814 |
} |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
815 |
ScheduleRreqRetry (dst); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
816 |
if (EnableHello) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
817 |
{ |
5720
92594e167a58
[aodv] Code style fixes proposed by Faker in his review
Pavel Boyko <boyko@iitp.ru>
parents:
5719
diff
changeset
|
818 |
m_htimer.Cancel (); |
7040
444bb5c76bff
get rid of Scalar and co.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
6547
diff
changeset
|
819 |
int rng = UniformVariable ().GetInteger (0, 10); |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
820 |
m_htimer.Schedule (HelloInterval - Time (0.01 * MilliSeconds (rng))); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
821 |
} |
5582 | 822 |
} |
823 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
824 |
void |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
825 |
RoutingProtocol::ScheduleRreqRetry (Ipv4Address dst) |
5641
3e119b71a445
neighbor's timer moved in class Neighbors
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5639
diff
changeset
|
826 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
827 |
NS_LOG_FUNCTION (this << dst); |
5641
3e119b71a445
neighbor's timer moved in class Neighbors
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5639
diff
changeset
|
828 |
if (m_addressReqTimer.find (dst) == m_addressReqTimer.end ()) |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
829 |
{ |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
830 |
Timer timer (Timer::CANCEL_ON_DESTROY); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
831 |
m_addressReqTimer[dst] = timer; |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
832 |
} |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
833 |
m_addressReqTimer[dst].SetFunction (&RoutingProtocol::RouteRequestTimerExpire, this); |
5699 | 834 |
m_addressReqTimer[dst].Remove (); |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
835 |
m_addressReqTimer[dst].SetArguments (dst); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
836 |
RoutingTableEntry rt; |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
837 |
m_routingTable.LookupRoute (dst, rt); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
838 |
rt.IncrementRreqCnt (); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
839 |
m_routingTable.Update (rt); |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
840 |
m_addressReqTimer[dst].Schedule (Time (rt.GetRreqCnt () * NetTraversalTime)); |
5641
3e119b71a445
neighbor's timer moved in class Neighbors
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5639
diff
changeset
|
841 |
} |
3e119b71a445
neighbor's timer moved in class Neighbors
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5639
diff
changeset
|
842 |
|
3e119b71a445
neighbor's timer moved in class Neighbors
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5639
diff
changeset
|
843 |
void |
5699 | 844 |
RoutingProtocol::RecvAodv (Ptr<Socket> socket) |
5560 | 845 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
846 |
NS_LOG_FUNCTION (this << socket); |
5560 | 847 |
Address sourceAddress; |
5615
85bb591dc8ad
routing table changed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5614
diff
changeset
|
848 |
Ptr<Packet> packet = socket->RecvFrom (sourceAddress); |
5677 | 849 |
InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress); |
850 |
Ipv4Address sender = inetSourceAddr.GetIpv4 (); |
|
5612 | 851 |
Ipv4Address receiver = m_socketAddresses[socket].GetLocal (); |
852 |
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
|
853 |
|
5612 | 854 |
UpdateRouteToNeighbor (sender, receiver); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
855 |
TypeHeader tHeader (AODVTYPE_RREQ); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
856 |
packet->RemoveHeader (tHeader); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
857 |
if (!tHeader.IsValid ()) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
858 |
{ |
5699 | 859 |
NS_LOG_DEBUG ("AODV message " << packet->GetUid() << " with unknown type received: " << tHeader.Get() << ". Drop"); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
860 |
return; // drop |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
861 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
862 |
switch (tHeader.Get ()) |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
863 |
{ |
5583 | 864 |
case AODVTYPE_RREQ: |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
865 |
{ |
5677 | 866 |
RecvRequest (packet, receiver, sender); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
867 |
break; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
868 |
} |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
869 |
case AODVTYPE_RREP: |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
870 |
{ |
5677 | 871 |
RecvReply (packet, receiver, sender); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
872 |
break; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
873 |
} |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
874 |
case AODVTYPE_RERR: |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
875 |
{ |
5612 | 876 |
RecvError (packet, sender); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
877 |
break; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
878 |
} |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
879 |
case AODVTYPE_RREP_ACK: |
5612 | 880 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
881 |
RecvReplyAck (sender); |
5612 | 882 |
break; |
883 |
} |
|
5583 | 884 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
885 |
} |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
886 |
|
5607 | 887 |
bool |
5699 | 888 |
RoutingProtocol::UpdateRouteLifeTime (Ipv4Address addr, Time lifetime) |
5607 | 889 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
890 |
NS_LOG_FUNCTION (this << addr << lifetime); |
5609 | 891 |
RoutingTableEntry rt; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
892 |
if (m_routingTable.LookupRoute (addr, rt)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
893 |
{ |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
894 |
rt.SetFlag (VALID); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
895 |
rt.SetRreqCnt (0); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
896 |
rt.SetLifeTime (std::max (lifetime, rt.GetLifeTime ())); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
897 |
m_routingTable.Update (rt); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
898 |
return true; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
899 |
} |
5607 | 900 |
return false; |
901 |
} |
|
902 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
903 |
void |
5699 | 904 |
RoutingProtocol::UpdateRouteToNeighbor (Ipv4Address sender, Ipv4Address receiver) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
905 |
{ |
5699 | 906 |
NS_LOG_FUNCTION (this << "sender " << sender << " receiver " << receiver); |
5609 | 907 |
RoutingTableEntry toNeighbor; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
908 |
if (!m_routingTable.LookupRoute (sender, toNeighbor)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
909 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
910 |
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
|
911 |
RoutingTableEntry newEntry (/*device=*/dev, /*dst=*/sender, /*know seqno=*/false, /*seqno=*/0, |
5658 | 912 |
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0), |
913 |
/*hops=*/1, /*next hop=*/sender, /*lifetime=*/ActiveRouteTimeout); |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
914 |
m_routingTable.AddRoute (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
915 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
916 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
917 |
{ |
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
|
918 |
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
|
919 |
RoutingTableEntry newEntry (/*device=*/dev, /*dst=*/sender, /*know seqno=*/false, /*seqno=*/0, |
5658 | 920 |
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0), |
921 |
/*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
|
922 |
m_routingTable.Update (newEntry); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
923 |
} |
5843
aa227ef4f60f
AODV: fix strange routing record with destination 102.102.102.102, thank to Mariusz Skrocki.
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5749
diff
changeset
|
924 |
|
5583 | 925 |
} |
5578
020a5aa8b40c
SendRequeat in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5577
diff
changeset
|
926 |
|
5583 | 927 |
void |
5677 | 928 |
RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address src) |
5560 | 929 |
{ |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
930 |
NS_LOG_FUNCTION (this); |
5575 | 931 |
RreqHeader rreqHeader; |
5699 | 932 |
p->RemoveHeader (rreqHeader); |
5621
e6e336252f25
finding duplicated broadcast packet by packet uid
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5619
diff
changeset
|
933 |
|
e6e336252f25
finding duplicated broadcast packet by packet uid
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5619
diff
changeset
|
934 |
// 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
|
935 |
RoutingTableEntry toPrev; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
936 |
if (m_routingTable.LookupRoute (src, toPrev)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
937 |
{ |
5632 | 938 |
if (toPrev.IsUnidirectional ()) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
939 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
940 |
} |
5621
e6e336252f25
finding duplicated broadcast packet by packet uid
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5619
diff
changeset
|
941 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
942 |
uint32_t id = rreqHeader.GetId (); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
943 |
Ipv4Address origin = rreqHeader.GetOrigin (); |
5575 | 944 |
|
5609 | 945 |
/* |
946 |
* Node checks to determine whether it has received a RREQ with the same Originator IP Address and RREQ ID. |
|
947 |
* If such a RREQ has been received, the node silently discards the newly received RREQ. |
|
948 |
*/ |
|
5721 | 949 |
if (m_rreqIdCache.IsDuplicate (origin, id)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
950 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
951 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
952 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
953 |
|
5583 | 954 |
// Increment RREQ hop count |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
955 |
uint8_t hop = rreqHeader.GetHopCount () + 1; |
5583 | 956 |
rreqHeader.SetHopCount (hop); |
5584 | 957 |
|
5609 | 958 |
/* |
959 |
* When the reverse route is created or updated, the following actions on the route are also carried out: |
|
960 |
* 1. the Originator Sequence Number from the RREQ is compared to the corresponding destination sequence number |
|
961 |
* in the route table entry and copied if greater than the existing value there |
|
962 |
* 2. the valid sequence number field is set to true; |
|
963 |
* 3. the next hop in the routing table becomes the node from which the RREQ was received |
|
964 |
* 4. the hop count is copied from the Hop Count in the RREQ message; |
|
965 |
* 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
|
966 |
* MinimalLifetime = current time + 2*NetTraversalTime - 2*HopCount*NodeTraversalTime |
5609 | 967 |
*/ |
968 |
RoutingTableEntry toOrigin; |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
969 |
if (!m_routingTable.LookupRoute (origin, toOrigin)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
970 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
971 |
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
|
972 |
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
|
973 |
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0), /*hops=*/hop, |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
974 |
/*nextHop*/src, /*timeLife=*/Time (2 * NetTraversalTime - 2 * hop * NodeTraversalTime)); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
975 |
m_routingTable.AddRoute (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
976 |
} |
5599
5069c4c46ddb
SendReplyByIntermediateNode added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5598
diff
changeset
|
977 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
978 |
{ |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
979 |
if (toOrigin.GetValidSeqNo ()) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
980 |
{ |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
981 |
if (int32_t (rreqHeader.GetOriginSeqno ()) - int32_t (toOrigin.GetSeqNo ()) > 0) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
982 |
toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno ()); |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
983 |
} |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
984 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
985 |
toOrigin.SetSeqNo (rreqHeader.GetOriginSeqno ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
986 |
toOrigin.SetValidSeqNo (true); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
987 |
toOrigin.SetNextHop (src); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
988 |
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
|
989 |
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
|
990 |
toOrigin.SetHop (hop); |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
991 |
toOrigin.SetLifeTime (std::max (Time (2 * NetTraversalTime - 2 * hop * NodeTraversalTime), toOrigin.GetLifeTime ())); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
992 |
m_routingTable.Update (toOrigin); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
993 |
} |
5699 | 994 |
NS_LOG_LOGIC (receiver << " receive RREQ to destination " << rreqHeader.GetDst ()); |
5575 | 995 |
|
996 |
// A node generates a RREP if either: |
|
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
997 |
// (i) it is itself the destination, |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
998 |
if (IsMyOwnAddress (rreqHeader.GetDst ())) |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
999 |
{ |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
1000 |
m_routingTable.LookupRoute (origin, toOrigin); |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
1001 |
SendReply (rreqHeader, toOrigin); |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
1002 |
return; |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
1003 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1004 |
/* |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
1005 |
* (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
|
1006 |
* 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
|
1007 |
*/ |
5609 | 1008 |
RoutingTableEntry toDst; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1009 |
Ipv4Address dst = rreqHeader.GetDst (); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1010 |
if (m_routingTable.LookupRoute (dst, toDst)) |
5575 | 1011 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1012 |
/* |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1013 |
* 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
|
1014 |
* 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
|
1015 |
* 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
|
1016 |
* 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
|
1017 |
*/ |
5699 | 1018 |
if (rreqHeader.GetUnknownSeqno () || ( (int32_t (toDst.GetSeqNo ()) - int32_t (rreqHeader.GetDstSeqno ()) > 0) |
1019 |
&& toDst.GetValidSeqNo () )) |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1020 |
{ |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
1021 |
if (!rreqHeader.GetDestinationOnly () && toDst.GetFlag() == VALID) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1022 |
{ |
5653 | 1023 |
m_routingTable.LookupRoute (origin, toOrigin); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1024 |
SendReplyByIntermediateNode (toDst, toOrigin, rreqHeader.GetGratiousRrep ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1025 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1026 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1027 |
rreqHeader.SetDstSeqno (toDst.GetSeqNo ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1028 |
rreqHeader.SetUnknownSeqno (false); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1029 |
} |
5575 | 1030 |
} |
5655 | 1031 |
|
5699 | 1032 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = |
1033 |
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
|
1034 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1035 |
Ptr<Socket> socket = j->first; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1036 |
Ipv4InterfaceAddress iface = j->second; |
5677 | 1037 |
Ptr<Packet> packet = Create<Packet> (); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1038 |
packet->AddHeader (rreqHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1039 |
TypeHeader tHeader (AODVTYPE_RREQ); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1040 |
packet->AddHeader (tHeader); |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1041 |
// Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1042 |
Ipv4Address destination; |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1043 |
if (iface.GetMask () == Ipv4Mask::GetOnes ()) |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1044 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1045 |
destination = Ipv4Address ("255.255.255.255"); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1046 |
} |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1047 |
else |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1048 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1049 |
destination = iface.GetBroadcast (); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1050 |
} |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1051 |
socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT)); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1052 |
} |
5609 | 1053 |
|
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
1054 |
if (EnableHello) |
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
1055 |
{ |
5720
92594e167a58
[aodv] Code style fixes proposed by Faker in his review
Pavel Boyko <boyko@iitp.ru>
parents:
5719
diff
changeset
|
1056 |
m_htimer.Cancel (); |
7040
444bb5c76bff
get rid of Scalar and co.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
6547
diff
changeset
|
1057 |
int rng = UniformVariable().GetInteger (0, 10); |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
1058 |
m_htimer.Schedule (Time (HelloInterval - 0.1 * MilliSeconds(rng))); |
5651
26deb6597b42
optimizations made configurable
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5650
diff
changeset
|
1059 |
} |
5583 | 1060 |
} |
5573
040121bb814c
BroadcastId methods and SendRequest() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5572
diff
changeset
|
1061 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1062 |
void |
5699 | 1063 |
RoutingProtocol::SendReply (RreqHeader const & rreqHeader, RoutingTableEntry const & toOrigin) |
5583 | 1064 |
{ |
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
1065 |
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
|
1066 |
/* |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
1067 |
* 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
|
1068 |
* 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
|
1069 |
*/ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1070 |
if (!rreqHeader.GetUnknownSeqno () && (rreqHeader.GetDstSeqno () == m_seqNo + 1)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1071 |
m_seqNo++; |
5730
f530c4943146
time diagram + fixed hop count
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5729
diff
changeset
|
1072 |
RrepHeader rrepHeader ( /*prefixSize=*/0, /*hops=*/0, /*dst=*/rreqHeader.GetDst (), |
5699 | 1073 |
/*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
|
1074 |
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
|
1075 |
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
|
1076 |
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
|
1077 |
packet->AddHeader (tHeader); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1078 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1079 |
NS_ASSERT (socket); |
5677 | 1080 |
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
|
1081 |
} |
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
1082 |
|
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
1083 |
void |
5699 | 1084 |
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
|
1085 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
1086 |
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
|
1087 |
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
|
1088 |
/*origin=*/toOrigin.GetDestination (), /*lifetime=*/toDst.GetLifeTime ()); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
1089 |
/* 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
|
1090 |
* 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
|
1091 |
*/ |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
1092 |
if (toDst.GetHop () == 1) |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
1093 |
{ |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
1094 |
rrepHeader.SetAckRequired (true); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
1095 |
RoutingTableEntry toNextHop; |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
1096 |
m_routingTable.LookupRoute (toOrigin.GetNextHop (), toNextHop); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
1097 |
toNextHop.m_ackTimer.SetFunction (&RoutingProtocol::AckTimerExpire, this); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
1098 |
toNextHop.m_ackTimer.SetArguments (toNextHop.GetDestination (), BlackListTimeout); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
1099 |
toNextHop.m_ackTimer.SetDelay (NextHopWait); |
a50bf07ed462
heuristics of RREP_ACK needs added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5655
diff
changeset
|
1100 |
} |
5610
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
1101 |
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
|
1102 |
toOrigin.InsertPrecursor (toDst.GetNextHop ()); |
5627
3fb6bda728ad
unit test for routing table updated
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5626
diff
changeset
|
1103 |
m_routingTable.Update (toDst); |
3fb6bda728ad
unit test for routing table updated
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5626
diff
changeset
|
1104 |
m_routingTable.Update (toOrigin); |
5587 | 1105 |
|
5583 | 1106 |
Ptr<Packet> packet = Create<Packet> (); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1107 |
packet->AddHeader (rrepHeader); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1108 |
TypeHeader tHeader (AODVTYPE_RREP); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1109 |
packet->AddHeader (tHeader); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1110 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1111 |
NS_ASSERT (socket); |
5677 | 1112 |
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
|
1113 |
|
5610
88070a214cb7
Send aodv control traffic to the next hop rather then to the destination.
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5609
diff
changeset
|
1114 |
// 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
|
1115 |
if (gratRep) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1116 |
{ |
5699 | 1117 |
RrepHeader gratRepHeader (/*prefix size=*/0, /*hops=*/toOrigin.GetHop (), /*dst=*/toOrigin.GetDestination (), |
1118 |
/*dst seqno=*/toOrigin.GetSeqNo (), /*origin=*/toDst.GetDestination (), |
|
1119 |
/*lifetime=*/toOrigin.GetLifeTime ()); |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1120 |
Ptr<Packet> packetToDst = Create<Packet> (); |
5659
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1121 |
packetToDst->AddHeader (gratRepHeader); |
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1122 |
TypeHeader type (AODVTYPE_RREP); |
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1123 |
packetToDst->AddHeader (type); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1124 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toDst.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1125 |
NS_ASSERT (socket); |
5659
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1126 |
NS_LOG_LOGIC ("Send gratuitous RREP " << packet->GetUid()); |
5677 | 1127 |
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
|
1128 |
} |
5560 | 1129 |
} |
1130 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1131 |
void |
5699 | 1132 |
RoutingProtocol::SendReplyAck (Ipv4Address neighbor) |
5560 | 1133 |
{ |
5679 | 1134 |
NS_LOG_FUNCTION (this << " to " << neighbor); |
5611
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1135 |
RrepAckHeader h; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1136 |
TypeHeader typeHeader (AODVTYPE_RREP_ACK); |
5611
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1137 |
Ptr<Packet> packet = Create<Packet> (); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1138 |
packet->AddHeader (h); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1139 |
packet->AddHeader (typeHeader); |
5612 | 1140 |
RoutingTableEntry toNeighbor; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1141 |
m_routingTable.LookupRoute (neighbor, toNeighbor); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1142 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toNeighbor.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1143 |
NS_ASSERT (socket); |
5677 | 1144 |
socket->SendTo (packet, 0, InetSocketAddress (neighbor, AODV_PORT)); |
5611
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1145 |
} |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1146 |
|
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1147 |
void |
5677 | 1148 |
RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address sender) |
5611
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1149 |
{ |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1150 |
NS_LOG_FUNCTION(this << " src " << sender); |
5576 | 1151 |
RrepHeader rrepHeader; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1152 |
p->RemoveHeader (rrepHeader); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1153 |
Ipv4Address dst = rrepHeader.GetDst (); |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
1154 |
NS_LOG_LOGIC("RREP destination " << dst << " RREP origin " << rrepHeader.GetOrigin()); |
5576 | 1155 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1156 |
uint8_t hop = rrepHeader.GetHopCount () + 1; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1157 |
rrepHeader.SetHopCount (hop); |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1158 |
|
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1159 |
// If RREP is Hello message |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
1160 |
if (dst == rrepHeader.GetOrigin ()) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1161 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1162 |
ProcessHello (rrepHeader, receiver); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1163 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1164 |
} |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1165 |
|
5611
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1166 |
/* |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1167 |
* 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
|
1168 |
* - the route is marked as active, |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1169 |
* - the destination sequence number is marked as valid, |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1170 |
* - 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
|
1171 |
* 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
|
1172 |
* - 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
|
1173 |
* - 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
|
1174 |
* - 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
|
1175 |
*/ |
f051337ca99d
SendRouteReplyAck() added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5610
diff
changeset
|
1176 |
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
|
1177 |
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
|
1178 |
/*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
|
1179 |
/*nextHop=*/sender, /*lifeTime=*/rrepHeader.GetLifeTime ()); |
5609 | 1180 |
RoutingTableEntry toDst; |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
1181 |
if (m_routingTable.LookupRoute (dst, toDst)) |
5576 | 1182 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1183 |
/* |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1184 |
* 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
|
1185 |
* (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
|
1186 |
*/ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1187 |
if (!toDst.GetValidSeqNo ()) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1188 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1189 |
m_routingTable.Update (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1190 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1191 |
// (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
|
1192 |
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
|
1193 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1194 |
m_routingTable.Update (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1195 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1196 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1197 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1198 |
// (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
|
1199 |
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
|
1200 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1201 |
m_routingTable.Update (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1202 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1203 |
// (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
|
1204 |
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
|
1205 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1206 |
m_routingTable.Update (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1207 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1208 |
} |
5576 | 1209 |
} |
5601 | 1210 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1211 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1212 |
// The forward route for this destination is created if it does not already exist. |
5729
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1213 |
NS_LOG_LOGIC ("add new route"); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1214 |
m_routingTable.AddRoute (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1215 |
} |
5612 | 1216 |
// 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
|
1217 |
if (rrepHeader.GetAckRequired ()) |
5659
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1218 |
{ |
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1219 |
SendReplyAck (sender); |
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1220 |
rrepHeader.SetAckRequired (false); |
af1e766370c6
sending gratuitous RREP + AckRequired flag control corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5658
diff
changeset
|
1221 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1222 |
NS_LOG_LOGIC ("receiver " << receiver << " origin " << rrepHeader.GetOrigin ()); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1223 |
if (IsMyOwnAddress (rrepHeader.GetOrigin ())) |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
1224 |
{ |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
1225 |
if (toDst.GetFlag () == IN_SEARCH) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1226 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1227 |
m_routingTable.Update (newEntry); |
5697
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
1228 |
m_addressReqTimer[dst].Remove (); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1229 |
m_addressReqTimer.erase (dst); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1230 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1231 |
SendPacketFromQueue (rrepHeader.GetDst (), newEntry.GetRoute ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1232 |
return; |
5623
8c5b97aff720
expanding ring search added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5622
diff
changeset
|
1233 |
} |
5576 | 1234 |
|
5609 | 1235 |
RoutingTableEntry toOrigin; |
6090 | 1236 |
if (! m_routingTable.LookupRoute (rrepHeader.GetOrigin (), toOrigin) || toOrigin.GetFlag () == IN_SEARCH) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1237 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1238 |
return; // Impossible! drop. |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1239 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1240 |
toOrigin.SetLifeTime (std::max (ActiveRouteTimeout, toOrigin.GetLifeTime ())); |
5627
3fb6bda728ad
unit test for routing table updated
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5626
diff
changeset
|
1241 |
m_routingTable.Update (toOrigin); |
5622
aa34a270824c
route lifetime management fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5621
diff
changeset
|
1242 |
|
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1243 |
// Update information about precursors |
6090 | 1244 |
if (m_routingTable.LookupValidRoute (rrepHeader.GetDst (), toDst)) |
1245 |
{ |
|
1246 |
toDst.InsertPrecursor (toOrigin.GetNextHop ()); |
|
1247 |
m_routingTable.Update (toDst); |
|
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1248 |
|
6090 | 1249 |
RoutingTableEntry toNextHopToDst; |
1250 |
m_routingTable.LookupRoute (toDst.GetNextHop (), toNextHopToDst); |
|
1251 |
toNextHopToDst.InsertPrecursor (toOrigin.GetNextHop ()); |
|
1252 |
m_routingTable.Update (toNextHopToDst); |
|
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
1253 |
|
6090 | 1254 |
toOrigin.InsertPrecursor (toDst.GetNextHop ()); |
1255 |
m_routingTable.Update (toOrigin); |
|
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1256 |
|
6090 | 1257 |
RoutingTableEntry toNextHopToOrigin; |
1258 |
m_routingTable.LookupRoute (toOrigin.GetNextHop (), toNextHopToOrigin); |
|
1259 |
toNextHopToOrigin.InsertPrecursor (toDst.GetNextHop ()); |
|
1260 |
m_routingTable.Update (toNextHopToOrigin); |
|
1261 |
} |
|
1262 |
||
5592
b74806ad2935
Ptr<Ipv4Route> added in routing table
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5590
diff
changeset
|
1263 |
Ptr<Packet> packet = Create<Packet> (); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1264 |
packet->AddHeader (rrepHeader); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1265 |
TypeHeader tHeader (AODVTYPE_RREP); |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1266 |
packet->AddHeader (tHeader); |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1267 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1268 |
NS_ASSERT (socket); |
5677 | 1269 |
socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1270 |
} |
5586 | 1271 |
|
5612 | 1272 |
void |
5677 | 1273 |
RoutingProtocol::RecvReplyAck (Ipv4Address neighbor) |
5612 | 1274 |
{ |
5679 | 1275 |
NS_LOG_FUNCTION (this); |
1276 |
RoutingTableEntry rt; |
|
1277 |
if(m_routingTable.LookupRoute(neighbor, rt)) |
|
1278 |
{ |
|
1279 |
rt.m_ackTimer.Cancel (); |
|
1280 |
rt.SetFlag (VALID); |
|
1281 |
m_routingTable.Update(rt); |
|
1282 |
} |
|
5612 | 1283 |
} |
1284 |
||
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1285 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1286 |
RoutingProtocol::ProcessHello (RrepHeader const & rrepHeader, Ipv4Address receiver ) |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1287 |
{ |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
1288 |
NS_LOG_FUNCTION(this << "from " << rrepHeader.GetDst ()); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1289 |
/* |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1290 |
* 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
|
1291 |
* 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
|
1292 |
* create one if necessary. |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1293 |
*/ |
5609 | 1294 |
RoutingTableEntry toNeighbor; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1295 |
if (!m_routingTable.LookupRoute (rrepHeader.GetDst (), toNeighbor)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1296 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1297 |
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
|
1298 |
RoutingTableEntry newEntry (/*device=*/dev, /*dst=*/rrepHeader.GetDst (), /*validSeqNo=*/true, /*seqno=*/rrepHeader.GetDstSeqno (), |
5653 | 1299 |
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0), |
1300 |
/*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
|
1301 |
m_routingTable.AddRoute (newEntry); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1302 |
} |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1303 |
else |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1304 |
{ |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
1305 |
toNeighbor.SetLifeTime (std::max (Time (AllowedHelloLoss * HelloInterval), toNeighbor.GetLifeTime ())); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1306 |
toNeighbor.SetSeqNo (rrepHeader.GetDstSeqno ()); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1307 |
toNeighbor.SetValidSeqNo (true); |
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
1308 |
toNeighbor.SetFlag (VALID); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1309 |
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
|
1310 |
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
|
1311 |
m_routingTable.Update (toNeighbor); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1312 |
} |
5658 | 1313 |
if (EnableHello) |
1314 |
{ |
|
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
1315 |
m_nb.Update (rrepHeader.GetDst (), Time (AllowedHelloLoss * HelloInterval)); |
5658 | 1316 |
} |
5560 | 1317 |
} |
1318 |
||
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1319 |
void |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1320 |
RoutingProtocol::RecvError (Ptr<Packet> p, Ipv4Address src ) |
5560 | 1321 |
{ |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1322 |
NS_LOG_FUNCTION (this << " from " << src); |
5607 | 1323 |
RerrHeader rerrHeader; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1324 |
p->RemoveHeader (rerrHeader); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1325 |
std::map<Ipv4Address, uint32_t> dstWithNextHopSrc; |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1326 |
std::map<Ipv4Address, uint32_t> unreachable; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1327 |
m_routingTable.GetListOfDestinationWithNextHop (src, dstWithNextHopSrc); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1328 |
std::pair<Ipv4Address, uint32_t> un; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1329 |
while (rerrHeader.RemoveUnDestination (un)) |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1330 |
{ |
5638
1b5112aa7de4
neighbors moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5635
diff
changeset
|
1331 |
if (m_nb.IsNeighbor (un.first)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1332 |
SendRerrWhenBreaksLinkToNextHop (un.first); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1333 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1334 |
{ |
5699 | 1335 |
for (std::map<Ipv4Address, uint32_t>::const_iterator i = |
1336 |
dstWithNextHopSrc.begin (); i != dstWithNextHopSrc.end (); ++i) |
|
5729
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1337 |
{ |
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1338 |
if (i->first == un.first) |
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1339 |
{ |
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1340 |
Ipv4Address dst = un.first; |
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1341 |
unreachable.insert (un); |
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1342 |
} |
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1343 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1344 |
} |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1345 |
} |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1346 |
|
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1347 |
std::vector<Ipv4Address> precursors; |
5699 | 1348 |
for (std::map<Ipv4Address, uint32_t>::const_iterator i = unreachable.begin (); |
1349 |
i != unreachable.end ();) |
|
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1350 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1351 |
if (!rerrHeader.AddUnDestination (i->first, i->second)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1352 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1353 |
TypeHeader typeHeader (AODVTYPE_RERR); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1354 |
Ptr<Packet> packet = Create<Packet> (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1355 |
packet->AddHeader (rerrHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1356 |
packet->AddHeader (typeHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1357 |
SendRerrMessage (packet, precursors); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1358 |
rerrHeader.Clear (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1359 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1360 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1361 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1362 |
RoutingTableEntry toDst; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1363 |
m_routingTable.LookupRoute (i->first, toDst); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1364 |
toDst.GetPrecursors (precursors); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1365 |
++i; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1366 |
} |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1367 |
} |
5673
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1368 |
if (rerrHeader.GetDestCount () != 0) |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1369 |
{ |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1370 |
TypeHeader typeHeader (AODVTYPE_RERR); |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1371 |
Ptr<Packet> packet = Create<Packet> (); |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1372 |
packet->AddHeader (rerrHeader); |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1373 |
packet->AddHeader (typeHeader); |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1374 |
SendRerrMessage (packet, precursors); |
7288363ba82f
forwarding RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5672
diff
changeset
|
1375 |
} |
5677 | 1376 |
m_routingTable.InvalidateRoutesWithDst (unreachable); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1377 |
} |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1378 |
|
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1379 |
void |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
1380 |
RoutingProtocol::RouteRequestTimerExpire (Ipv4Address dst) |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1381 |
{ |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1382 |
NS_LOG_LOGIC(this); |
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1383 |
RoutingTableEntry toDst; |
6090 | 1384 |
if (m_routingTable.LookupValidRoute (dst, toDst)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1385 |
{ |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1386 |
SendPacketFromQueue (dst, toDst.GetRoute ()); |
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1387 |
NS_LOG_LOGIC ("route to " << dst << " found"); |
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 |
} |
5699 | 1390 |
/* |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1391 |
* 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
|
1392 |
* 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
|
1393 |
* 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
|
1394 |
*/ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1395 |
if (toDst.GetRreqCnt () == RreqRetries) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1396 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1397 |
NS_LOG_LOGIC("route discovery to " << dst << " has been attempted RreqRetries times"); |
5699 | 1398 |
m_addressReqTimer.erase (dst); |
1399 |
m_routingTable.DeleteRoute (dst); |
|
1400 |
NS_LOG_DEBUG ("Route not found. Drop packet with dst " << dst); |
|
1401 |
m_queue.DropPacketWithDst (dst); |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1402 |
return; |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1403 |
} |
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1404 |
|
5664
90aae51a4227
local repair in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5662
diff
changeset
|
1405 |
if (toDst.GetFlag () == IN_SEARCH) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1406 |
{ |
5675
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
1407 |
NS_LOG_LOGIC ("Send new RREQ to " << dst << " ttl " << NetDiameter); |
d323064dd02f
expanding ring search killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5674
diff
changeset
|
1408 |
SendRequest (dst); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1409 |
} |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1410 |
else |
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1411 |
{ |
5699 | 1412 |
NS_LOG_DEBUG ("Route down. Stop search. Drop packet with destination " << dst); |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1413 |
m_addressReqTimer.erase(dst); |
5654 | 1414 |
m_routingTable.DeleteRoute(dst); |
5660
ed22e758b5f5
RoutingProtocol::DropFromQueue killed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5659
diff
changeset
|
1415 |
m_queue.DropPacketWithDst(dst); |
5635
41c9c1b2008d
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5634
diff
changeset
|
1416 |
} |
5561
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1417 |
} |
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1418 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1419 |
void |
5561
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1420 |
RoutingProtocol::HelloTimerExpire () |
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1421 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
1422 |
NS_LOG_FUNCTION (this); |
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1423 |
SendHello (); |
5720
92594e167a58
[aodv] Code style fixes proposed by Faker in his review
Pavel Boyko <boyko@iitp.ru>
parents:
5719
diff
changeset
|
1424 |
m_htimer.Cancel (); |
7040
444bb5c76bff
get rid of Scalar and co.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
6547
diff
changeset
|
1425 |
int rng = UniformVariable().GetInteger (0, 100); |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
1426 |
Time t = Time (0.01 * MilliSeconds(rng)); |
5720
92594e167a58
[aodv] Code style fixes proposed by Faker in his review
Pavel Boyko <boyko@iitp.ru>
parents:
5719
diff
changeset
|
1427 |
m_htimer.Schedule (HelloInterval - t); |
5561
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1428 |
} |
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1429 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1430 |
void |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1431 |
RoutingProtocol::RreqRateLimitTimerExpire () |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1432 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
1433 |
NS_LOG_FUNCTION (this); |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1434 |
m_rreqCount = 0; |
5699 | 1435 |
m_rreqRateLimitTimer.Schedule (Seconds (1)); |
5688
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1436 |
} |
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1437 |
|
d30f52fc3aa5
RREQ rate limit added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5687
diff
changeset
|
1438 |
void |
5699 | 1439 |
RoutingProtocol::AckTimerExpire (Ipv4Address neighbor, Time blacklistTimeout) |
5612 | 1440 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
1441 |
NS_LOG_FUNCTION (this); |
5729
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1442 |
m_routingTable.MarkLinkAsUnidirectional (neighbor, blacklistTimeout); |
5612 | 1443 |
} |
1444 |
||
1445 |
void |
|
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1446 |
RoutingProtocol::SendHello () |
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1447 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
1448 |
NS_LOG_FUNCTION (this); |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1449 |
/* 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
|
1450 |
* Destination IP Address The node's IP address. |
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1451 |
* Destination Sequence Number The node's latest sequence number. |
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1452 |
* Hop Count 0 |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1453 |
* Lifetime AllowedHelloLoss * HelloInterval |
5600
0a591bcae2b3
hello messeges added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5599
diff
changeset
|
1454 |
*/ |
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
1455 |
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
|
1456 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1457 |
Ptr<Socket> socket = j->first; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1458 |
Ipv4InterfaceAddress iface = j->second; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1459 |
RrepHeader helloHeader (/*prefix size=*/0, /*hops=*/0, /*dst=*/iface.GetLocal (), /*dst seqno=*/m_seqNo, |
7044
f94b264549d1
introduce implicit conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
7040
diff
changeset
|
1460 |
/*origin=*/iface.GetLocal (),/*lifetime=*/Time (AllowedHelloLoss * HelloInterval)); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1461 |
Ptr<Packet> packet = Create<Packet> (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1462 |
packet->AddHeader (helloHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1463 |
TypeHeader tHeader (AODVTYPE_RREP); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1464 |
packet->AddHeader (tHeader); |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1465 |
// Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1466 |
Ipv4Address destination; |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1467 |
if (iface.GetMask () == Ipv4Mask::GetOnes ()) |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1468 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1469 |
destination = Ipv4Address ("255.255.255.255"); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1470 |
} |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1471 |
else |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1472 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1473 |
destination = iface.GetBroadcast (); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1474 |
} |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1475 |
socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT)); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1476 |
} |
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1477 |
} |
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1478 |
|
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1479 |
void |
5699 | 1480 |
RoutingProtocol::SendPacketFromQueue (Ipv4Address dst, Ptr<Ipv4Route> route) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1481 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
1482 |
NS_LOG_FUNCTION (this); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1483 |
QueueEntry queueEntry; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1484 |
while (m_queue.Dequeue (dst, queueEntry)) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1485 |
{ |
6088 | 1486 |
DeferredRouteOutputTag tag; |
1487 |
Ptr<Packet> p = ConstCast<Packet> (queueEntry.GetPacket ()); |
|
1488 |
if (p->RemovePacketTag (tag) && |
|
1489 |
tag.oif != -1 && |
|
1490 |
tag.oif != m_ipv4->GetInterfaceForDevice (route->GetOutputDevice ())) |
|
1491 |
{ |
|
1492 |
NS_LOG_DEBUG ("Output device doesn't match. Dropped."); |
|
1493 |
return; |
|
1494 |
} |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1495 |
UnicastForwardCallback ucb = queueEntry.GetUnicastForwardCallback (); |
6088 | 1496 |
Ipv4Header header = queueEntry.GetIpv4Header (); |
1497 |
header.SetSource (route->GetSource ()); |
|
1498 |
header.SetTtl (header.GetTtl() + 1); // compensate extra TTL decrement by fake loopback routing |
|
1499 |
ucb (route, p, header); |
|
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1500 |
} |
5561
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1501 |
} |
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1502 |
|
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1503 |
void |
5699 | 1504 |
RoutingProtocol::SendRerrWhenBreaksLinkToNextHop (Ipv4Address nextHop) |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1505 |
{ |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1506 |
NS_LOG_FUNCTION (this << nextHop); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1507 |
RerrHeader rerrHeader; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1508 |
std::vector<Ipv4Address> precursors; |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1509 |
std::map<Ipv4Address, uint32_t> unreachable; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1510 |
|
5609 | 1511 |
RoutingTableEntry toNextHop; |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1512 |
if (!m_routingTable.LookupRoute (nextHop, toNextHop)) |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1513 |
return; |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1514 |
toNextHop.GetPrecursors (precursors); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1515 |
rerrHeader.AddUnDestination (nextHop, toNextHop.GetSeqNo ()); |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1516 |
m_routingTable.GetListOfDestinationWithNextHop (nextHop, unreachable); |
5699 | 1517 |
for (std::map<Ipv4Address, uint32_t>::const_iterator i = unreachable.begin (); i |
1518 |
!= unreachable.end ();) |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1519 |
{ |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1520 |
if (!rerrHeader.AddUnDestination (i->first, i->second)) |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1521 |
{ |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1522 |
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
|
1523 |
TypeHeader typeHeader (AODVTYPE_RERR); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1524 |
Ptr<Packet> packet = Create<Packet> (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1525 |
packet->AddHeader (rerrHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1526 |
packet->AddHeader (typeHeader); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1527 |
SendRerrMessage (packet, precursors); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1528 |
rerrHeader.Clear (); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1529 |
} |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1530 |
else |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1531 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1532 |
RoutingTableEntry toDst; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1533 |
m_routingTable.LookupRoute (i->first, toDst); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1534 |
toDst.GetPrecursors (precursors); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1535 |
++i; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1536 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1537 |
} |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1538 |
if (rerrHeader.GetDestCount () != 0) |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1539 |
{ |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1540 |
TypeHeader typeHeader (AODVTYPE_RERR); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1541 |
Ptr<Packet> packet = Create<Packet> (); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1542 |
packet->AddHeader (rerrHeader); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1543 |
packet->AddHeader (typeHeader); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1544 |
SendRerrMessage (packet, precursors); |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1545 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1546 |
unreachable.insert (std::make_pair (nextHop, toNextHop.GetSeqNo ())); |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1547 |
m_routingTable.InvalidateRoutesWithDst (unreachable); |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1548 |
} |
5607 | 1549 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1550 |
void |
5699 | 1551 |
RoutingProtocol::SendRerrWhenNoRouteToForward (Ipv4Address dst, |
1552 |
uint32_t dstSeqNo, Ipv4Address origin) |
|
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1553 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1554 |
NS_LOG_FUNCTION (this); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1555 |
RerrHeader rerrHeader; |
5699 | 1556 |
rerrHeader.AddUnDestination (dst, dstSeqNo); |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1557 |
RoutingTableEntry toOrigin; |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1558 |
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
|
1559 |
packet->AddHeader (rerrHeader); |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1560 |
packet->AddHeader (TypeHeader (AODVTYPE_RERR)); |
6090 | 1561 |
if (m_routingTable.LookupValidRoute (origin, toOrigin)) |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1562 |
{ |
6090 | 1563 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress ( |
1564 |
toOrigin.GetInterface ()); |
|
1565 |
NS_ASSERT (socket); |
|
1566 |
NS_LOG_LOGIC ("Unicast RERR to the source of the data transmission"); |
|
1567 |
socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); |
|
1568 |
} |
|
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1569 |
else |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1570 |
{ |
5699 | 1571 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator i = |
1572 |
m_socketAddresses.begin (); i != m_socketAddresses.end (); ++i) |
|
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1573 |
{ |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1574 |
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
|
1575 |
Ipv4InterfaceAddress iface = i->second; |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1576 |
NS_ASSERT (socket); |
5699 | 1577 |
NS_LOG_LOGIC ("Broadcast RERR message from interface " << iface.GetLocal()); |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1578 |
// Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1579 |
Ipv4Address destination; |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1580 |
if (iface.GetMask () == Ipv4Mask::GetOnes ()) |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1581 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1582 |
destination = Ipv4Address ("255.255.255.255"); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1583 |
} |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1584 |
else |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1585 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1586 |
destination = iface.GetBroadcast (); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1587 |
} |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1588 |
socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT)); |
5672
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1589 |
} |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1590 |
} |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1591 |
} |
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1592 |
|
3c1ac1338476
Send RERR message when no active route to forward packet
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5669
diff
changeset
|
1593 |
void |
5699 | 1594 |
RoutingProtocol::SendRerrMessage (Ptr<Packet> packet, std::vector<Ipv4Address> precursors) |
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1595 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
1596 |
NS_LOG_FUNCTION (this); |
5653 | 1597 |
|
5605
cc68f3766bcd
control of duplicated packet added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5604
diff
changeset
|
1598 |
if (precursors.empty ()) |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1599 |
{ |
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1600 |
NS_LOG_LOGIC ("No precursors"); |
5699 | 1601 |
return; |
5665
787190c03dd0
sending RERR corrected
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5664
diff
changeset
|
1602 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1603 |
// 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
|
1604 |
if (precursors.size () == 1) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1605 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1606 |
RoutingTableEntry toPrecursor; |
6090 | 1607 |
if (m_routingTable.LookupValidRoute (precursors.front (), toPrecursor)) |
5697
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
1608 |
{ |
6090 | 1609 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toPrecursor.GetInterface ()); |
1610 |
NS_ASSERT (socket); |
|
5697
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
1611 |
NS_LOG_LOGIC ("one precursor => unicast RERR to " << toPrecursor.GetDestination() << " from " << toPrecursor.GetInterface ().GetLocal ()); |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
1612 |
socket->SendTo (packet, 0, InetSocketAddress (precursors.front (), AODV_PORT)); |
acf61aefb10f
forwarding broadcast fixed + sending RERR fixed
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5696
diff
changeset
|
1613 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1614 |
return; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1615 |
} |
5608
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1616 |
|
d88d191ec33b
logic checking in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5607
diff
changeset
|
1617 |
// 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
|
1618 |
std::vector<Ipv4InterfaceAddress> ifaces; |
5609 | 1619 |
RoutingTableEntry toPrecursor; |
6090 | 1620 |
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
|
1621 |
{ |
6090 | 1622 |
if (m_routingTable.LookupValidRoute (*i, toPrecursor) && |
1623 |
std::find (ifaces.begin (), ifaces.end (), toPrecursor.GetInterface ()) == ifaces.end ()) |
|
5729
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1624 |
{ |
6090 | 1625 |
ifaces.push_back (toPrecursor.GetInterface ()); |
5729
3fe43de9a826
[aodv] braces for loops added
Elena Buchatskaia <borovkovaes@iitp.ru>
parents:
5722
diff
changeset
|
1626 |
} |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1627 |
} |
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1628 |
|
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1629 |
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
|
1630 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1631 |
Ptr<Socket> socket = FindSocketWithInterfaceAddress (*i); |
5649
4915054ebfb2
SendPacketFromRawSocket = BuildPacket + socket->SendTo()
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5648
diff
changeset
|
1632 |
NS_ASSERT (socket); |
5699 | 1633 |
NS_LOG_LOGIC ("Broadcast RERR message from interface " << i->GetLocal()); |
6484
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1634 |
// Send to all-hosts broadcast if on /32 addr, subnet-directed otherwise |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1635 |
Ipv4Address destination; |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1636 |
if (i->GetMask () == Ipv4Mask::GetOnes ()) |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1637 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1638 |
destination = Ipv4Address ("255.255.255.255"); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1639 |
} |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1640 |
else |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1641 |
{ |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1642 |
destination = i->GetBroadcast (); |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1643 |
} |
48625d668186
Bug 964 - AODV does not work with host addressed interfaces
Elena Buchatskaya <sunnmy@iitp.ru>
parents:
6483
diff
changeset
|
1644 |
socket->SendTo (packet, 0, InetSocketAddress (destination, AODV_PORT)); |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1645 |
} |
5603
46f56ea8e7b9
buffering data packets added
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5602
diff
changeset
|
1646 |
} |
5576 | 1647 |
|
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1648 |
Ptr<Socket> |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1649 |
RoutingProtocol::FindSocketWithInterfaceAddress (Ipv4InterfaceAddress addr ) const |
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1650 |
{ |
6354
c9357870bd3c
Add some function logging to aodv-routing-protocol.cc
Tom Henderson <tomh@tomh.org>
parents:
6090
diff
changeset
|
1651 |
NS_LOG_FUNCTION (this << addr); |
5699 | 1652 |
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = |
1653 |
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
|
1654 |
{ |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1655 |
Ptr<Socket> socket = j->first; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1656 |
Ipv4InterfaceAddress iface = j->second; |
5650
0379b99f18f4
change functions for convenience
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5649
diff
changeset
|
1657 |
if (iface == addr) |
5629
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1658 |
return socket; |
782756bbd870
id cache moved in separate class
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5628
diff
changeset
|
1659 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1660 |
Ptr<Socket> socket; |
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1661 |
return socket; |
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1662 |
} |
5561
f74c7723afd3
AODV protocol copy-paste in progress
Pavel Boyko <boyko@iitp.ru>
parents:
5560
diff
changeset
|
1663 |
|
5562
2fc3138b5622
AODV RoutingProtocol stub finished
Pavel Boyko <boyko@iitp.ru>
parents:
5561
diff
changeset
|
1664 |
} |
5604
a7febbd71e42
send RERR message in progress
Borovkova Elena <borovkovaes@iitp.ru>
parents:
5603
diff
changeset
|
1665 |
} |