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