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