src/dsr/model/dsr-routing.cc
author Tom Henderson <tomh@tomh.org>
Sun, 06 May 2012 22:29:56 -0700
changeset 8753 8d84b96e26bf
parent 8752 2da1fab73114
child 8756 9a34e618f40b
permissions -rw-r--r--
Update DSR code to ns-3-dev
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
     2
/*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
     3
 * Copyright (c) 2011 Yufei Cheng
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
     4
 *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
     8
 *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    12
 * GNU General Public License for more details.
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    13
 *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    17
 *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    18
 * Author: Yufei Cheng   <yfcheng@ittc.ku.edu>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    19
 *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    20
 * James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    21
 * ResiliNets Research Group  http://wiki.ittc.ku.edu/resilinets
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    22
 * Information and Telecommunication Technology Center (ITTC)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    23
 * and Department of Electrical Engineering and Computer Science
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    24
 * The University of Kansas Lawrence, KS USA.
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    25
 *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    26
 * Work supported in part by NSF FIND (Future Internet Design) Program
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    27
 * under grant CNS-0626918 (Postmodern Internet Architecture),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    28
 * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    29
 * US Department of Defense (DoD), and ITTC at The University of Kansas.
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    30
 */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    31
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    32
#define NS_LOG_APPEND_CONTEXT                                   \
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    33
  if (GetObject<Node> ()) { std::clog << "[node " << GetObject<Node> ()->GetId () << "] "; }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    34
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    35
#include <list>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    36
#include <ctime>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    37
#include <map>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    38
#include <limits>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    39
#include <algorithm>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    40
#include <iostream>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    41
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    42
#include "ns3/enum.h"
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    43
#include "ns3/string.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    44
#include "ns3/ptr.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    45
#include "ns3/log.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    46
#include "ns3/assert.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    47
#include "ns3/uinteger.h"
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    48
#include "ns3/packet.h"
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    49
#include "ns3/boolean.h"
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    50
#include "ns3/node-list.h"
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    51
#include "ns3/double.h"
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    52
#include "ns3/pointer.h"
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    53
#include "ns3/object-vector.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    54
#include "ns3/ipv4-address.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    55
#include "ns3/ipv4-header.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    56
#include "ns3/ipv4-l3-protocol.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    57
#include "ns3/ipv4-route.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    58
#include "ns3/trace-source-accessor.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    59
#include "ns3/random-variable.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    60
#include "ns3/icmpv4-l4-protocol.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    61
#include "ns3/adhoc-wifi-mac.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    62
#include "ns3/wifi-net-device.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    63
#include "ns3/inet-socket-address.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    64
#include "ns3/udp-l4-protocol.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    65
#include "ns3/udp-socket-factory.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    66
#include "ns3/tcp-socket-factory.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    67
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    68
#include "dsr-rreq-table.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    69
#include "dsr-rcache.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    70
#include "dsr-routing.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    71
#include "dsr-fs-header.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    72
#include "dsr-options.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    73
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    74
NS_LOG_COMPONENT_DEFINE ("DsrRouting");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    75
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    76
namespace ns3 {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    77
namespace dsr {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    78
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    79
NS_OBJECT_ENSURE_REGISTERED (DsrRouting);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    80
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    81
/* see http://www.iana.org/assignments/protocol-numbers */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    82
const uint8_t DsrRouting::PROT_NUMBER = 48;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    83
/*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    84
 * The extension header is the fixed size dsr header, it is response for recognizing DSR option types
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    85
 * and demux to right options to process the packet.
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    86
 *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    87
 * The header format with neighboring layers is as follows:
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    88
 *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    89
 +-+-+-+-+-+-+-+-+-+-+-
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    90
 |  Application Header |
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    91
 +-+-+-+-+-+-+-+-+-+-+-+
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    92
 |   Transport Header  |
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    93
 +-+-+-+-+-+-+-+-+-+-+-+
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    94
 |   Fixed DSR Header  |
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    95
 +---------------------+
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    96
 |     DSR Options     |
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    97
 +-+-+-+-+-+-+-+-+-+-+-+
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    98
 |      IP Header      |
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    99
 +-+-+-+-+-+-+-+-+-+-+-+
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   100
 */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   101
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   102
TypeId DsrRouting::GetTypeId ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   103
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   104
  static TypeId tid = TypeId ("ns3::dsr::DsrRouting")
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
   105
    .SetParent<IpL4Protocol> ()
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   106
    .AddConstructor<DsrRouting> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   107
    .AddAttribute ("RouteCache", "The route cache for saving routes from route discovery process.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   108
                   PointerValue (0),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   109
                   MakePointerAccessor (&DsrRouting::SetRouteCache,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   110
                                        &DsrRouting::GetRouteCache),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   111
                   MakePointerChecker<RouteCache> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   112
    .AddAttribute ("RreqTable", "The request table to manage route requests.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   113
                   PointerValue (0),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   114
                   MakePointerAccessor (&DsrRouting::SetRequestTable,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   115
                                        &DsrRouting::GetRequestTable),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   116
                   MakePointerChecker<RreqTable> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   117
    .AddAttribute ("MaxSendBuffLen","Maximum number of packets that can be stored in send buffer.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   118
                   UintegerValue (64),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   119
                   MakeUintegerAccessor (&DsrRouting::m_maxSendBuffLen),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   120
                   MakeUintegerChecker<uint32_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   121
    .AddAttribute ("MaxSendBuffTime","Maximum time packets can be queued in the send buffer .",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   122
                   TimeValue (Seconds (30)),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   123
                   MakeTimeAccessor (&DsrRouting::m_sendBufferTimeout),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   124
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   125
    .AddAttribute ("MaxMaintLen","Maximum number of packets that can be stored in maintenance buffer.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   126
                   UintegerValue (50),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   127
                   MakeUintegerAccessor (&DsrRouting::m_maxMaintainLen),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   128
                   MakeUintegerChecker<uint32_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   129
    .AddAttribute ("MaxMaintTime","Maximum time packets can be queued in maintenance buffer.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   130
                   TimeValue (Seconds (30)),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   131
                   MakeTimeAccessor (&DsrRouting::m_maxMaintainTime),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   132
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   133
    .AddAttribute ("MaxCacheLen","Maximum number of route entries that can be stored in route cache.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   134
                   UintegerValue (64),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   135
                   MakeUintegerAccessor (&DsrRouting::m_maxCacheLen),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   136
                   MakeUintegerChecker<uint32_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   137
    .AddAttribute ("RouteCacheTimeout","Maximum time the route cache can be queued in route cache.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   138
                   TimeValue (Seconds (300)),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   139
                   MakeTimeAccessor (&DsrRouting::m_maxCacheTime),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   140
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   141
    .AddAttribute ("MaxEntriesEachDst","Maximum number of route entries for a single destination to respond.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   142
                   UintegerValue (20),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   143
                   MakeUintegerAccessor (&DsrRouting::m_maxEntriesEachDst),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   144
                   MakeUintegerChecker<uint32_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   145
    .AddAttribute ("SendBuffInterval","How often to check send buffer for packet with route.",
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   146
                   TimeValue (Seconds (500)),
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   147
                   MakeTimeAccessor (&DsrRouting::m_sendBuffInterval),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   148
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   149
    .AddAttribute ("NodeTraversalTime","The time it takes to traverse two neighboring nodes.",
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   150
                   TimeValue (MilliSeconds (40)),
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   151
                   MakeTimeAccessor (&DsrRouting::m_nodeTraversalTime),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   152
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   153
    .AddAttribute ("RreqRetries","Maximum number of retransmissions for request discovery of a route.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   154
                   UintegerValue (16),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   155
                   MakeUintegerAccessor (&DsrRouting::m_rreqRetries),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   156
                   MakeUintegerChecker<uint32_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   157
    .AddAttribute ("MaintenanceRetries","Maximum number of retransmissions for data packets from maintenance buffer.",
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   158
                   DoubleValue (2),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   159
                   MakeDoubleAccessor (&DsrRouting::m_maxMaintRexmt),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   160
                   MakeDoubleChecker<uint32_t> ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   161
    .AddAttribute ("RequestTableSize","Maximum number of request entries in the request table.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   162
                   UintegerValue (64),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   163
                   MakeUintegerAccessor (&DsrRouting::m_requestTableSize),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   164
                   MakeUintegerChecker<uint32_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   165
    .AddAttribute ("RequestIdSize","Maximum number of request source Ids in the request table.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   166
                   UintegerValue (16),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   167
                   MakeUintegerAccessor (&DsrRouting::m_requestTableIds),
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   168
                   MakeUintegerChecker<uint32_t> ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   169
    .AddAttribute ("UniqueRequestIdSize","Maximum number of request Ids in the request table for a single destination.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   170
                   UintegerValue (256),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   171
                   MakeUintegerAccessor (&DsrRouting::m_maxRreqId),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   172
                   MakeUintegerChecker<uint16_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   173
    .AddAttribute ("NonPropRequestTimeout","The timeout value for non-propagation request.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   174
                   TimeValue (MilliSeconds (30)),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   175
                   MakeTimeAccessor (&DsrRouting::m_nonpropRequestTimeout),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   176
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   177
    .AddAttribute ("DiscoveryHopLimit","The max discovery hop limit for route requests.",
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   178
                   DoubleValue (255),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   179
                   MakeDoubleAccessor (&DsrRouting::m_discoveryHopLimit),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   180
                   MakeDoubleChecker<uint32_t> ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   181
    .AddAttribute ("MaxSalvageCount","The max salvage count for a single data packet.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   182
                   UintegerValue (15),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   183
                   MakeUintegerAccessor (&DsrRouting::m_maxSalvageCount),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   184
                   MakeUintegerChecker<uint8_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   185
    .AddAttribute ("BlacklistTimeout","The time for a neighbor to stay in blacklist.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   186
                   TimeValue (Seconds (3)),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   187
                   MakeTimeAccessor (&DsrRouting::m_blacklistTimeout),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   188
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   189
    .AddAttribute ("GratReplyHoldoff","The time for gratuitous reply entry to expire.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   190
                   TimeValue (Seconds (1)),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   191
                   MakeTimeAccessor (&DsrRouting::m_gratReplyHoldoff),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   192
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   193
    .AddAttribute ("BroadcastJitter","The jitter time to avoid collision for broadcast packets.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   194
                   UintegerValue (10),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   195
                   MakeUintegerAccessor (&DsrRouting::m_broadcastJitter),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   196
                   MakeUintegerChecker<uint16_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   197
    .AddAttribute ("PassiveAckTimeout","The time a packet in maintenance buffer wait for passive acknowledgment.",
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   198
                   TimeValue (MilliSeconds (100)),
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   199
                   MakeTimeAccessor (&DsrRouting::m_passiveAckTimeout),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   200
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   201
    .AddAttribute ("TryPassiveAcks","The number of passive acknowledgment to use.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   202
                   UintegerValue (1),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   203
                   MakeUintegerAccessor (&DsrRouting::m_tryPassiveAcks),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   204
                   MakeUintegerChecker<uint32_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   205
    .AddAttribute ("RequestPeriod","The base time interval between route requests.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   206
                   TimeValue (MilliSeconds (500)),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   207
                   MakeTimeAccessor (&DsrRouting::m_requestPeriod),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   208
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   209
    .AddAttribute ("MaxRequestPeriod","The max time interval between route requests.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   210
                   TimeValue (Seconds (10)),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   211
                   MakeTimeAccessor (&DsrRouting::m_maxRequestPeriod),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   212
                   MakeTimeChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   213
    .AddAttribute ("GraReplyTableSize","The gratuitous reply table size.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   214
                   UintegerValue (64),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   215
                   MakeUintegerAccessor (&DsrRouting::m_graReplyTableSize),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   216
                   MakeUintegerChecker<uint32_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   217
    .AddAttribute ("CacheType","Use Link Cache or use Path Cache",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   218
                   StringValue ("LinkCache"),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   219
                   MakeStringAccessor (&DsrRouting::m_cacheType),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   220
                   MakeStringChecker ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   221
    .AddAttribute ("StabilityDecrFactor","The stability decrease factor for link cache",
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   222
                   UintegerValue (2),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   223
                   MakeUintegerAccessor (&DsrRouting::m_stabilityDecrFactor),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   224
                   MakeUintegerChecker<uint64_t> ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   225
    .AddAttribute ("StabilityIncrFactor","The stability increase factor for link cache",
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   226
                   UintegerValue (4),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   227
                   MakeUintegerAccessor (&DsrRouting::m_stabilityIncrFactor),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   228
                   MakeUintegerChecker<uint64_t> ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   229
    .AddAttribute ("InitStability","The initial stability factor for link cache",
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   230
                   TimeValue (Seconds (25)),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   231
                   MakeTimeAccessor (&DsrRouting::m_initStability),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   232
                   MakeTimeChecker ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   233
    .AddAttribute ("MinLifeTime","The minimal life time for link cache",
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   234
                   TimeValue (Seconds (1)),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   235
                   MakeTimeAccessor (&DsrRouting::m_minLifeTime),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   236
                   MakeTimeChecker ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   237
    .AddAttribute ("UseExtends","The extension time for link cache",
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   238
                   TimeValue (Seconds (120)),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   239
                   MakeTimeAccessor (&DsrRouting::m_useExtends),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   240
                   MakeTimeChecker ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   241
    .AddAttribute ("EnableSubRoute","Enables saving of sub route when receiving route error messages, only available when using path route cache",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   242
                   BooleanValue (true),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   243
                   MakeBooleanAccessor (&DsrRouting::m_subRoute),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   244
                   MakeBooleanChecker ())
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   245
    .AddAttribute ("RetransIncr","The increase time for retransmission timer when facing network congestion",
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   246
                   TimeValue (MilliSeconds (20)),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   247
                   MakeTimeAccessor (&DsrRouting::m_retransIncr),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   248
                   MakeTimeChecker ())
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   249
    .AddAttribute ("MaxNetworkQueueSize","The max number of packet to save in the network queue.",
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   250
                   UintegerValue (400),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   251
                   MakeUintegerAccessor (&DsrRouting::m_maxNetworkSize),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   252
                   MakeUintegerChecker<uint32_t> ())
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   253
    .AddAttribute ("MaxNetworkQueueDelay","The max time for a packet to stay in the network queue.",
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   254
                   TimeValue (Seconds (30.0)),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   255
                   MakeTimeAccessor (&DsrRouting::m_maxNetworkDelay),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   256
                   MakeTimeChecker ())
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   257
    .AddAttribute ("NumPriorityQueues","The max number of packet to save in the network queue.",
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   258
                   UintegerValue (2),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   259
                   MakeUintegerAccessor (&DsrRouting::m_numPriorityQueues),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   260
                   MakeUintegerChecker<uint32_t> ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   261
    .AddTraceSource ("Tx", "Send DSR packet.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   262
                     MakeTraceSourceAccessor (&DsrRouting::m_txPacketTrace))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   263
    .AddTraceSource ("Drop", "Drop DSR packet",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   264
                     MakeTraceSourceAccessor (&DsrRouting::m_dropTrace))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   265
  ;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   266
  return tid;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   267
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   268
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   269
DsrRouting::DsrRouting ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   270
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   271
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   272
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   273
   * The following Ptr statements created objects for all the options header for DSR, and each of them have
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   274
   * distinct option number assigned, when DSR Routing received a packet from higher layer, it will find
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   275
   * the following options based on the option number, and pass the packet to the appropriate option to
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   276
   * process it. After the option processing, it will pass the packet back to DSR Routing to send down layer.
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   277
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   278
  Ptr<dsr::DsrOptionPad1> pad1Option = CreateObject<dsr::DsrOptionPad1> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   279
  Ptr<dsr::DsrOptionPadn> padnOption = CreateObject<dsr::DsrOptionPadn> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   280
  Ptr<dsr::DsrOptionRreq> rreqOption = CreateObject<dsr::DsrOptionRreq> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   281
  Ptr<dsr::DsrOptionRrep> rrepOption = CreateObject<dsr::DsrOptionRrep> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   282
  Ptr<dsr::DsrOptionSR>   srOption = CreateObject<dsr::DsrOptionSR> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   283
  Ptr<dsr::DsrOptionRerr>   rerrOption = CreateObject<dsr::DsrOptionRerr> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   284
  Ptr<dsr::DsrOptionAckReq> ackReq = CreateObject<dsr::DsrOptionAckReq> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   285
  Ptr<dsr::DsrOptionAck> ack = CreateObject<dsr::DsrOptionAck> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   286
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   287
  Insert (pad1Option);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   288
  Insert (padnOption);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   289
  Insert (rreqOption);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   290
  Insert (rrepOption);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   291
  Insert (srOption);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   292
  Insert (rerrOption);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   293
  Insert (ackReq);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   294
  Insert (ack);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   295
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   296
  // Check the send buffer for sending packets
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   297
  m_sendBuffTimer.SetFunction (&DsrRouting::SendBuffTimerExpire, this);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   298
  m_sendBuffTimer.Schedule (Seconds (100));
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   299
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   300
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   301
DsrRouting::~DsrRouting ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   302
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   303
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   304
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   305
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   306
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   307
DsrRouting::NotifyNewAggregate ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   308
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   309
  NS_LOG_FUNCTION (this << "NotifyNewAggregate");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   310
  if (m_node == 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   311
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   312
      Ptr<Node> node = this->GetObject<Node> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   313
      if (node != 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   314
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   315
          m_ipv4 = this->GetObject<Ipv4L3Protocol> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   316
          if (m_ipv4 != 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   317
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   318
              this->SetNode (node);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   319
              m_ipv4->Insert (this);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   320
              this->SetDownTarget (MakeCallback (&Ipv4L3Protocol::Send, m_ipv4));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   321
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   322
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   323
          m_ip = node->GetObject<Ipv4> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   324
          if (m_ip != 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   325
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   326
              NS_LOG_DEBUG ("Ipv4 started");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   327
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   328
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   329
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   330
  Object::NotifyNewAggregate ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   331
  Simulator::ScheduleNow (&DsrRouting::Start, this);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   332
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   333
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   334
void DsrRouting::Start ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   335
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   336
  NS_LOG_FUNCTION (this << "Start DSR Routing protocol");
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   337
  Ptr<dsr::RouteCache> routeCache = CreateObject<dsr::RouteCache> ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   338
  // Configure the path cache parameters
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   339
  routeCache->SetCacheType (m_cacheType);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   340
  routeCache->SetSubRoute (m_subRoute);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   341
  routeCache->SetMaxCacheLen (m_maxCacheLen);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   342
  routeCache->SetCacheTimeout (m_maxCacheTime);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   343
  routeCache->SetMaxEntriesEachDst (m_maxEntriesEachDst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   344
  // Parameters for link cache
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   345
  routeCache->SetStabilityDecrFactor (m_stabilityDecrFactor);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   346
  routeCache->SetStabilityIncrFactor (m_stabilityIncrFactor);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   347
  routeCache->SetInitStability (m_initStability);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   348
  routeCache->SetMinLifeTime (m_minLifeTime);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   349
  routeCache->SetUseExtends (m_useExtends);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   350
  routeCache->ScheduleTimer ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   351
  // The call back to handle link error and send error message to appropriate nodes
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   352
  routeCache->SetCallback (MakeCallback (&DsrRouting::SendRerrWhenBreaksLinkToNextHop, this));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   353
  SetRouteCache (routeCache);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   354
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   355
  if (m_mainAddress == Ipv4Address ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   356
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   357
      Ipv4Address loopback ("127.0.0.1");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   358
      for (uint32_t i = 0; i < m_ipv4->GetNInterfaces (); i++)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   359
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   360
          // Use primary address, if multiple
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   361
          Ipv4Address addr = m_ipv4->GetAddress (i, 0).GetLocal ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   362
          m_broadcast = m_ipv4->GetAddress (i, 0).GetBroadcast();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   363
          NS_LOG_DEBUG ("The addr " << addr);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   364
          if (addr != loopback)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   365
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   366
              m_mainAddress = addr;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   367
              NS_LOG_DEBUG ("The node Address " << m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   368
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   369
              m_ipv4->GetNetDevice (1)->SetPromiscReceiveCallback (MakeCallback (&DsrRouting::PromiscReceive, this));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   370
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   371
              // Allow neighbor manager use this interface for layer 2 feedback if possible
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   372
              Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (addr));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   373
              Ptr<WifiNetDevice> wifi = dev->GetObject<WifiNetDevice> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   374
              if (wifi == 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   375
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   376
                  break;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   377
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   378
              Ptr<WifiMac> mac = wifi->GetMac ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   379
              if (mac == 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   380
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   381
                  break;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   382
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   383
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   384
              // trace back to link mac drop event to process tx error call back
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   385
              mac->TraceConnectWithoutContext ("TxErrHeader", routeCache->GetTxErrorCallback ());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   386
              routeCache->AddArpCache (m_ipv4->GetInterface (i)->GetArpCache ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   387
              break;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   388
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   389
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   390
      NS_ASSERT (m_mainAddress != Ipv4Address () && m_broadcast != Ipv4Address());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   391
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   392
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   393
  NS_LOG_DEBUG ("The number queues " << m_numPriorityQueues);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   394
  for (uint32_t i = 0; i < m_numPriorityQueues; i++)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   395
  {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   396
    // Set the network queue max size and the delay
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   397
    NS_LOG_DEBUG ("The network size " << m_maxNetworkSize << " and the network delay " << m_maxNetworkDelay.GetSeconds());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   398
    Ptr<dsr::DsrNetworkQueue> queue_i = CreateObject<dsr::DsrNetworkQueue> (m_maxNetworkSize,m_maxNetworkDelay);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   399
    std::pair<std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator, bool> result_i = m_priorityQueue.insert (std::make_pair (i, queue_i));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   400
    NS_ASSERT_MSG (result_i.second, "Error in creating queues");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   401
  }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   402
  Ptr<dsr::RreqTable> rreqTable = CreateObject<dsr::RreqTable> ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   403
  // Set the initial hop limit
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   404
  rreqTable->SetInitHopLimit (m_discoveryHopLimit);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   405
  // Configure the request table parameters
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   406
  rreqTable->SetRreqTableSize (m_requestTableSize);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   407
  rreqTable->SetRreqIdSize (m_requestTableIds);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   408
  rreqTable->SetUniqueRreqIdSize (m_maxRreqId);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   409
  SetRequestTable (rreqTable);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   410
  // Set the send buffer parameters
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   411
  m_sendBuffer.SetMaxQueueLen (m_maxSendBuffLen);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   412
  m_sendBuffer.SetSendBufferTimeout (m_sendBufferTimeout);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   413
  // Set the error buffer parameters using just the send buffer parameters
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   414
  m_errorBuffer.SetMaxQueueLen (m_maxSendBuffLen);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   415
  m_errorBuffer.SetErrorBufferTimeout (m_sendBufferTimeout);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   416
  // Set the maintenance buffer parameters
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   417
  m_maintainBuffer.SetMaxQueueLen (m_maxMaintainLen);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   418
  m_maintainBuffer.SetMaintainBufferTimeout (m_maxMaintainTime);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   419
  // Set the gratuitous reply table size
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   420
  m_graReply.SetGraTableSize (m_graReplyTableSize);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   421
  NS_LOG_DEBUG ("Starting DSR on node " << m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   422
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   423
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   424
void
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   425
DsrRouting::DoDispose (void)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   426
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   427
  NS_LOG_FUNCTION_NOARGS ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   428
  m_node = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   429
  for (uint32_t i = 0; i < m_ipv4->GetNInterfaces (); i++)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   430
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   431
      // Disable layer 2 link state monitoring (if possible)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   432
      Ptr<NetDevice> dev = m_ipv4->GetNetDevice (i);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   433
      Ptr<WifiNetDevice> wifi = dev->GetObject<WifiNetDevice> ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   434
      if (wifi != 0)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   435
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   436
          Ptr<WifiMac> mac = wifi->GetMac ()->GetObject<AdhocWifiMac> ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   437
          if (mac != 0)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   438
            {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   439
              mac->TraceDisconnectWithoutContext ("TxErrHeader",
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   440
                                                  m_routeCache->GetTxErrorCallback ());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   441
              m_routeCache->DelArpCache (m_ipv4->GetInterface (i)->GetArpCache ());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   442
            }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   443
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   444
    }
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
   445
  IpL4Protocol::DoDispose ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   446
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   447
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   448
void
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   449
DsrRouting::SetNode (Ptr<Node> node)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   450
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   451
  m_node = node;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   452
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   453
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   454
Ptr<Node>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   455
DsrRouting::GetNode () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   456
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   457
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   458
  return m_node;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   459
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   460
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   461
void DsrRouting::SetRouteCache (Ptr<dsr::RouteCache> r)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   462
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   463
  // / Set the route cache to use
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   464
  m_routeCache = r;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   465
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   466
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   467
Ptr<dsr::RouteCache>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   468
DsrRouting::GetRouteCache () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   469
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   470
  // / Get the route cache to use
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   471
  return m_routeCache;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   472
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   473
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   474
void DsrRouting::SetRequestTable (Ptr<dsr::RreqTable> q)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   475
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   476
  // / Set the request table to use
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   477
  m_rreqTable = q;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   478
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   479
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   480
Ptr<dsr::RreqTable>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   481
DsrRouting::GetRequestTable () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   482
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   483
  // / Get the request table to use
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   484
  return m_rreqTable;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   485
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   486
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   487
bool DsrRouting::IsLinkCache ()
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   488
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   489
  return m_routeCache->IsLinkCache ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   490
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   491
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   492
void DsrRouting::UseExtends (RouteCacheEntry::IP_VECTOR rt)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   493
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   494
  m_routeCache->UseExtends (rt);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   495
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   496
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   497
bool DsrRouting::LookupRoute (Ipv4Address id, RouteCacheEntry & rt)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   498
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   499
  return m_routeCache->LookupRoute (id, rt);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   500
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   501
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   502
bool DsrRouting::AddRoute_Link (RouteCacheEntry::IP_VECTOR nodelist, Ipv4Address source)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   503
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   504
  Ipv4Address nextHop = SearchNextHop (source, nodelist);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   505
  m_errorBuffer.DropPacketForErrLink (source, nextHop);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   506
  return m_routeCache->AddRoute_Link (nodelist, source);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   507
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   508
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   509
bool DsrRouting::AddRoute (RouteCacheEntry & rt)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   510
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   511
  std::vector<Ipv4Address> nodelist = rt.GetVector ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   512
  Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodelist);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   513
  m_errorBuffer.DropPacketForErrLink (m_mainAddress, nextHop);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   514
  return m_routeCache->AddRoute (rt);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   515
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   516
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   517
void DsrRouting::DeleteAllRoutesIncludeLink (Ipv4Address errorSrc, Ipv4Address unreachNode, Ipv4Address node)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   518
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   519
  m_routeCache->DeleteAllRoutesIncludeLink (errorSrc, unreachNode, node);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   520
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   521
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   522
bool DsrRouting::UpdateRouteEntry (Ipv4Address dst)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   523
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   524
  return m_routeCache->UpdateRouteEntry (dst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   525
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   526
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   527
Ipv4Address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   528
DsrRouting::GetIPfromMAC (Mac48Address address)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   529
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   530
  NS_LOG_FUNCTION (this << address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   531
  int32_t nNodes = NodeList::GetNNodes ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   532
  for (int32_t i = 0; i < nNodes; ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   533
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   534
      Ptr<Node> node = NodeList::GetNode (i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   535
      Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   536
      Ptr<NetDevice> netDevice = ipv4->GetNetDevice (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   537
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   538
      if (netDevice->GetAddress () == address)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   539
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   540
          return ipv4->GetAddress (1, 0).GetLocal ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   541
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   542
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   543
  return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   544
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   545
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   546
void DsrRouting::PrintVector (std::vector<Ipv4Address>& vec)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   547
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   548
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   549
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   550
   * Check elements in a route vector
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   551
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   552
  if (!vec.size ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   553
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   554
      NS_LOG_DEBUG ("The vector is empty");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   555
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   556
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   557
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   558
      NS_LOG_DEBUG ("Print all the elements in a vector");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   559
      for (std::vector<Ipv4Address>::const_iterator i = vec.begin (); i != vec.end (); ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   560
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   561
          NS_LOG_DEBUG ("The ip address " << *i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   562
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   563
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   564
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   565
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   566
Ipv4Address DsrRouting::SearchNextHop (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   567
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   568
  NS_LOG_FUNCTION (this << ipv4Address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   569
  Ipv4Address nextHop;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   570
  NS_LOG_DEBUG ("the vector size " << vec.size ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   571
  if (vec.size () == 2)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   572
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   573
      NS_LOG_DEBUG ("The two nodes are neighbors");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   574
      nextHop = vec[1];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   575
      return nextHop;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   576
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   577
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   578
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   579
      if (ipv4Address == vec.back ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   580
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   581
          NS_LOG_DEBUG ("We have reached to the final destination " << ipv4Address << " " << vec.back ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   582
          return ipv4Address;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   583
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   584
      for (std::vector<Ipv4Address>::const_iterator i = vec.begin (); i != vec.end (); ++i)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   585
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   586
          if (ipv4Address == (*i))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   587
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   588
              NS_LOG_DEBUG (ipv4Address << " and " << *i);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   589
              nextHop = *(++i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   590
              return nextHop;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   591
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   592
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   593
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   594
  NS_LOG_DEBUG ("Next hop address not found");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   595
  Ipv4Address none = "0.0.0.0";
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   596
  return none;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   597
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   598
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   599
Ptr<Ipv4Route>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   600
DsrRouting::SetRoute (Ipv4Address nextHop, Ipv4Address srcAddress)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   601
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   602
  NS_LOG_FUNCTION (this << nextHop << srcAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   603
  m_ipv4Route = Create<Ipv4Route> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   604
  m_ipv4Route->SetDestination (nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   605
  m_ipv4Route->SetGateway (nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   606
  m_ipv4Route->SetSource (srcAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   607
  return m_ipv4Route;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   608
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   609
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   610
int
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   611
DsrRouting::GetProtocolNumber (void) const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   612
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   613
  // / This is the protocol number for DSR which is 48
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   614
  return PROT_NUMBER;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   615
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   616
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   617
uint16_t
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   618
DsrRouting::GetIDfromIP (Ipv4Address address)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   619
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   620
  int32_t nNodes = NodeList::GetNNodes ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   621
  for (int32_t i = 0; i < nNodes; ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   622
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   623
      Ptr<Node> node = NodeList::GetNode (i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   624
      Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   625
      if (ipv4->GetAddress (1, 0).GetLocal () == address)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   626
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   627
          return uint16_t(i);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   628
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   629
    }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   630
  return 256;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   631
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   632
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   633
Ipv4Address
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   634
DsrRouting::GetIPfromID (uint16_t id)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   635
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   636
  if (id >= 256)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   637
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   638
      NS_LOG_DEBUG ("Exceed the node range");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   639
      return "0.0.0.0";
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   640
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   641
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   642
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   643
      Ptr<Node> node = NodeList::GetNode (uint32_t (id));
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   644
      Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   645
      return ipv4->GetAddress (1, 0).GetLocal ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   646
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   647
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   648
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   649
uint32_t
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   650
DsrRouting::GetPriority (DsrMessageType messageType)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   651
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   652
  if (messageType == DSR_CONTROL_PACKET)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   653
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   654
      return 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   655
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   656
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   657
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   658
      return 1;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   659
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   660
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   661
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   662
void DsrRouting::SendRerrWhenBreaksLinkToNextHop (Ipv4Address nextHop, uint8_t protocol)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   663
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   664
  NS_LOG_FUNCTION (this << nextHop << (uint32_t)protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   665
  MaintainBuffEntry entry;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   666
  // Find the packet in send buffer
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   667
  if (m_maintainBuffer.Find (nextHop))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   668
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   669
      NS_LOG_DEBUG ("Trying to dequeue");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   670
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   671
      if (m_maintainBuffer.Dequeue (nextHop, entry))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   672
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   673
          NS_LOG_DEBUG ("creating new packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   674
          /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   675
           * Copy the packet and save a copy to the send buffer.
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   676
           * if only queue the original packet to the buffer,
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   677
           * when dequeue the packet, it turns to be empty.
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   678
           */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   679
          Ptr<Packet> dequeP = ConstCast<Packet> (entry.GetPacket ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   680
          Ptr<Packet> newPacket = dequeP->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   681
          Ptr<Packet> p = dequeP->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   682
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   683
          Ipv4Address source = entry.GetSrc ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   684
          Ipv4Address destination = entry.GetDst ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   685
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   686
          // Send the data packet out before schedule the next packet transmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   687
          SendPacket (dequeP, source, nextHop, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   688
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   689
          DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   690
          p->RemoveHeader (dsrRoutingHeader);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   691
          Ptr<Packet> cleanP = p->Copy ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   692
          uint8_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   693
          newPacket->RemoveAtStart (offset);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   694
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   695
          // Get the number of routers' address field
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   696
          uint8_t buf[2];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   697
          newPacket->CopyData (buf, sizeof(buf));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   698
          uint8_t numberAddress = (buf[1] - 2) / 4;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   699
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   700
          DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   701
          sourceRoute.SetNumberAddress (numberAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   702
          newPacket->RemoveHeader (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   703
          uint8_t salvage = sourceRoute.GetSalvage ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   704
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   705
          // TODO
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   706
          DsrOptionAckReqHeader ackReq;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   707
          newPacket->RemoveHeader (ackReq);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   708
          /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   709
           * Get the node list address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   710
           */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   711
          std::vector<Ipv4Address> nodeList = sourceRoute.GetNodesAddress ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   712
          Ipv4Address address1 = nodeList[1];
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   713
          Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   714
          NS_LOG_DEBUG ("The next hop address" << nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   715
          if (nextHop == "0.0.0.0")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   716
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   717
              PacketNewRoute (cleanP, m_mainAddress, destination, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   718
              return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   719
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   720
          RouteCacheEntry salvageRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   721
          bool findRoute = m_routeCache->LookupRoute (destination, salvageRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   722
          // Check the salvage value in header, if salvage is needed, we should find alternative route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   723
          if (findRoute && (salvage < m_maxSalvageCount))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   724
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   725
              // Need to salvage the packet instead of discard it
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   726
              std::vector<Ipv4Address> nodeList = salvageRoute.GetVector ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   727
              DsrOptionSRHeader newSR;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   728
              newSR.SetNodesAddress (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   729
              newSR.SetSegmentsLeft ((nodeList.size () - 2));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   730
              newSR.SetSalvage (salvage + 1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   731
              if (m_routeCache->IsLinkCache ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   732
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   733
                  m_routeCache->UseExtends (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   734
                }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   735
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   736
              NetworkKey networkKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   737
              networkKey.m_ackId = entry.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   738
              networkKey.m_ourAdd = entry.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   739
              networkKey.m_nextHop = entry.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   740
              networkKey.m_source = entry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   741
              networkKey.m_destination = entry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   742
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   743
              PassiveKey passiveKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   744
              passiveKey.m_ackId = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   745
              passiveKey.m_source = entry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   746
              passiveKey.m_destination = entry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   747
              passiveKey.m_segsLeft = entry.GetSegsLeft ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   748
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   749
              m_addressForwardCnt[networkKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   750
              m_passiveCnt[passiveKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   751
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   752
              if (nextHop != destination)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   753
                {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   754
                  SchedulePassivePacketRetry (entry, false, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   755
                }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   756
              else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   757
                {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   758
                  // This is the first network retry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   759
                  ScheduleNetworkPacketRetry (entry, true, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   760
                }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   761
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   762
          else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   763
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   764
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   765
               * This code block create a packet and attach a route error option to it
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   766
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   767
              m_routeCache->DeleteAllRoutesIncludeLink (source, nextHop, m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   768
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   769
               * If the salvage is not 0, use the first address in the route as the error dst in error header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   770
               * otherwise use the source of packet as the error destination
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   771
               */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   772
              Ipv4Address errorDst;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   773
              if (salvage)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   774
                {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   775
                  errorDst = address1;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   776
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   777
              else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   778
                {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   779
                  errorDst = source;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   780
                }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   781
              SendUnreachError (nextHop, errorDst, destination, salvage, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   782
              /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   783
               * here we cancel the packet retransmission time for all the packets have next hop address
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   784
               * as nextHop
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   785
               */
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   786
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   787
          if (m_maintainBuffer.GetSize () != 0 && m_maintainBuffer.Find (nextHop))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   788
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   789
              Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0,100)),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   790
                                   &DsrRouting::SendRerrWhenBreaksLinkToNextHop,this,nextHop,protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   791
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   792
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   793
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   794
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   795
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   796
void DsrRouting::SendBuffTimerExpire ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   797
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   798
  if (m_sendBuffTimer.IsRunning ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   799
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   800
      m_sendBuffTimer.Cancel ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   801
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   802
  m_sendBuffTimer.Schedule (m_sendBuffInterval);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   803
  CheckSendBuffer ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   804
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   805
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   806
void DsrRouting::CheckSendBuffer ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   807
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   808
  NS_LOG_INFO (Simulator::Now ().GetSeconds ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   809
               << " Checking send buffer at " << m_mainAddress << " with size " << m_sendBuffer.GetSize ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   810
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   811
  for (std::vector<SendBuffEntry>::iterator i = m_sendBuffer.GetBuffer ().begin (); i != m_sendBuffer.GetBuffer ().end (); )
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   812
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   813
      NS_LOG_DEBUG ("Here we try to find the data packet in the send buffer");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   814
      Ipv4Address destination = i->GetDestination ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   815
      RouteCacheEntry toDst;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   816
      bool findRoute = m_routeCache->LookupRoute (destination, toDst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   817
      if (findRoute)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   818
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   819
          NS_LOG_INFO ("We have found a route for the packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   820
          Ptr<const Packet> packet = i->GetPacket ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   821
          Ptr<Packet> cleanP = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   822
          uint8_t protocol = i->GetProtocol ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   823
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   824
          m_sendBuffer.GetBuffer ().erase (i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   825
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   826
          DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   827
          Ptr<Packet> copyP = packet->Copy ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   828
          Ptr<Packet> dsrPacket = packet->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   829
          dsrPacket->RemoveHeader (dsrRoutingHeader);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   830
          uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   831
          copyP->RemoveAtStart (offset); // Here the processed size is 8 bytes, which is the fixed sized extension header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   832
          // The packet to get ipv4 header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   833
          Ptr<Packet> ipv4P = copyP->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   834
          /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   835
           * Peek data to get the option type as well as length and segmentsLeft field
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   836
           */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   837
          uint32_t size = copyP->GetSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   838
          uint8_t *data = new uint8_t[size];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   839
          copyP->CopyData (data, size);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   840
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   841
          uint8_t optionType = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   842
          optionType = *(data);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   843
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   844
          if (optionType == 3)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   845
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   846
              Ptr<dsr::DsrOptions> dsrOption;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   847
              DsrOptionHeader dsrOptionHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   848
              uint8_t errorType = *(data + 2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   849
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   850
              if (errorType == 1) // This is the Route Error Option
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   851
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   852
                  DsrOptionRerrUnreachHeader rerr;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   853
                  copyP->RemoveHeader (rerr);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   854
                  NS_ASSERT (copyP->GetSize () == 0);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   855
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   856
                  DsrOptionRerrUnreachHeader newUnreach;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   857
                  newUnreach.SetErrorType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   858
                  newUnreach.SetErrorSrc (rerr.GetErrorSrc ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   859
                  newUnreach.SetUnreachNode (rerr.GetUnreachNode ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   860
                  newUnreach.SetErrorDst (rerr.GetErrorDst ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   861
                  newUnreach.SetSalvage (rerr.GetSalvage ()); // Set the value about whether to salvage a packet or not
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   862
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   863
                  DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   864
                  std::vector<Ipv4Address> errorRoute = toDst.GetVector ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   865
                  sourceRoute.SetNodesAddress (errorRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   866
                  if (m_routeCache->IsLinkCache ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   867
                    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   868
                      m_routeCache->UseExtends (errorRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   869
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   870
                  sourceRoute.SetSegmentsLeft ((errorRoute.size () - 2));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   871
                  uint8_t salvage = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   872
                  sourceRoute.SetSalvage (salvage);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   873
                  Ipv4Address nextHop = SearchNextHop (m_mainAddress, errorRoute); // Get the next hop address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   874
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   875
                  if (nextHop == "0.0.0.0")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   876
                    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   877
                      PacketNewRoute (dsrPacket, m_mainAddress, destination, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   878
                      return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   879
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   880
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   881
                  SetRoute (nextHop, m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   882
                  uint8_t length = (sourceRoute.GetLength () + newUnreach.GetLength ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   883
                  dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   884
                  dsrRoutingHeader.SetMessageType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   885
                  dsrRoutingHeader.SetSourceId (GetIDfromIP (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   886
                  dsrRoutingHeader.SetDestId (255);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   887
                  dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 4);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   888
                  dsrRoutingHeader.AddDsrOption (newUnreach);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   889
                  dsrRoutingHeader.AddDsrOption (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   890
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   891
                  Ptr<Packet> newPacket = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   892
                  newPacket->AddHeader (dsrRoutingHeader); // Add the routing header with rerr and sourceRoute attached to it
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   893
                  Ptr<NetDevice> dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   894
                  m_ipv4Route->SetOutputDevice (dev);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   895
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   896
                  uint32_t priority = GetPriority (DSR_CONTROL_PACKET);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   897
                  std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = m_priorityQueue.find (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   898
                  Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = i->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   899
                  NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   900
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   901
                  DsrNetworkQueueEntry newEntry (newPacket, m_mainAddress, nextHop, Simulator::Now (), m_ipv4Route);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   902
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   903
                  if (dsrNetworkQueue->Enqueue (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   904
                    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   905
                      Scheduler (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   906
                    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   907
                  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   908
                    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   909
                      NS_LOG_INFO ("Packet dropped as dsr network queue is full");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   910
                    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   911
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   912
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   913
          else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   914
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   915
              dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   916
              dsrRoutingHeader.SetMessageType (2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   917
              dsrRoutingHeader.SetSourceId (GetIDfromIP (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   918
              dsrRoutingHeader.SetDestId (GetIDfromIP (destination));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   919
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   920
              DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   921
              std::vector<Ipv4Address> nodeList = toDst.GetVector (); // Get the route from the route entry we found
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   922
              Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodeList);  // Get the next hop address for the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   923
              if (nextHop == "0.0.0.0")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   924
                {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   925
                  PacketNewRoute (dsrPacket, m_mainAddress, destination, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   926
                  return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   927
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   928
              uint8_t salvage = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   929
              sourceRoute.SetNodesAddress (nodeList); // Save the whole route in the source route header of the packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   930
              sourceRoute.SetSegmentsLeft ((nodeList.size () - 2)); // The segmentsLeft field will indicate the hops to go
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   931
              sourceRoute.SetSalvage (salvage);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   932
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   933
              uint8_t length = sourceRoute.GetLength ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   934
              dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   935
              dsrRoutingHeader.AddDsrOption (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   936
              cleanP->AddHeader (dsrRoutingHeader);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   937
              // Send the data packet out before schedule the next packet transmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   938
              SendPacket (cleanP, m_mainAddress, nextHop, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   939
              Ptr<const Packet> mtP = cleanP->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   940
              // Put the data packet in the maintenance queue for data packet retransmission
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   941
              MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*Ipv4Address=*/ m_mainAddress, /*nextHop=*/ nextHop,
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   942
                                          /*source=*/ m_mainAddress, /*destination=*/ destination, /*ackId=*/ 0,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   943
                                          /*SegsLeft=*/nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   944
              bool result = m_maintainBuffer.Enqueue (newEntry); // Enqueue the packet the the maintenance buffer
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   945
              if (result)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   946
                {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   947
                  NetworkKey networkKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   948
                  networkKey.m_ackId = newEntry.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   949
                  networkKey.m_ourAdd = newEntry.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   950
                  networkKey.m_nextHop = newEntry.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   951
                  networkKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   952
                  networkKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   953
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   954
                  PassiveKey passiveKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   955
                  passiveKey.m_ackId = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   956
                  passiveKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   957
                  passiveKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   958
                  passiveKey.m_segsLeft = newEntry.GetSegsLeft ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   959
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   960
                  m_addressForwardCnt[networkKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   961
                  m_passiveCnt[passiveKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   962
                  if (nextHop != destination)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   963
                    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   964
                      SchedulePassivePacketRetry (newEntry, false, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   965
                    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   966
                  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   967
                    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   968
                      // This is the first network retry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   969
                      ScheduleNetworkPacketRetry (newEntry, true, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   970
                    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   971
                }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   972
              // we need to suspend the normal timer that checks the send buffer
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   973
              // until we are done sending packets
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   974
              if (!m_sendBuffTimer.IsSuspended ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   975
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   976
                  m_sendBuffTimer.Suspend ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   977
                }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   978
              Simulator::Schedule (m_sendBuffInterval, &DsrRouting::SendBuffTimerExpire, this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   979
              return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   980
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   981
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   982
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   983
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   984
          ++i;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   985
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   986
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   987
  //after going through the entire send buffer and send all packets found route,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   988
  //we need to resume the timer if it has been suspended
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   989
  if (m_sendBuffTimer.IsSuspended ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   990
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   991
      NS_LOG_DEBUG ("Resume the send buffer timer");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   992
      m_sendBuffTimer.Resume ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   993
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   994
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   995
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   996
bool DsrRouting::PromiscReceive (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol, const Address &from,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   997
                                 const Address &to, NetDevice::PacketType packetType)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   998
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   999
  // Receive only IP packets and packets destined for other hosts
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1000
  if (protocol == Ipv4L3Protocol::PROT_NUMBER && packetType == NetDevice::PACKET_OTHERHOST)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1001
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1002
      Ptr<Packet> p = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1003
      //pull off IP header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1004
      Ipv4Header ipv4Header;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1005
      p->RemoveHeader (ipv4Header);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1006
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1007
      // Process only data packets with DSR header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1008
      if (ipv4Header.GetProtocol () == DsrRouting::PROT_NUMBER)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1009
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1010
          //just to minimize debug output
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1011
          NS_LOG_INFO (this << from << to << packetType << *p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1012
          DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1013
          //pull of DSR header to check option type
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1014
          Ptr<Packet> dsrPacket = p->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1015
          dsrPacket->RemoveHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1016
          uint8_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();        // Get the offset for option header, 4 bytes in this case
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1017
          uint8_t nextHeader = dsrRoutingHeader.GetNextHeader ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1018
          uint32_t sourceId = dsrRoutingHeader.GetSourceId ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1019
          Ipv4Address source = GetIPfromID (sourceId);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1020
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1021
          // This packet is used to peek option type
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1022
          p->RemoveAtStart (offset);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1023
          /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1024
           * Peek data to get the option type as well as length and segmentsLeft field
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1025
           */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1026
          uint32_t size = p->GetSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1027
          uint8_t *data = new uint8_t[size];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1028
          p->CopyData (data, size);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1029
          uint8_t optionType = 0;
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  1030
          optionType = *(data);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1031
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1032
          Ptr<dsr::DsrOptions> dsrOption;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1033
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1034
          if (optionType == 96)        // This is the source route option
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1035
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1036
              dsrOption = GetOption (optionType);       // Get the relative DSR option and demux to the process function
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1037
              Ipv4Address fromAddr = GetIPfromMAC (Mac48Address::ConvertFrom (from));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1038
              Ipv4Address toAddr = GetIPfromMAC (Mac48Address::ConvertFrom (to));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1039
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1040
              NS_LOG_DEBUG (Simulator::Now ().GetSeconds ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1041
                            << " DSR node " << m_mainAddress <<
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1042
                            " overhearing packet PID: " << p->GetUid () << " from " << fromAddr << " to " << toAddr <<
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1043
                            " with source IP " << ipv4Header.GetSource () <<
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1044
                            " and destination IP " << ipv4Header.GetDestination () <<
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1045
                            " and packet : " << *dsrPacket);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1046
              bool isPromisc = true;                     // Set the boolean value isPromisc as true
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  1047
              dsrOption->Process (p, dsrPacket, m_mainAddress, source, ipv4Header, nextHeader, isPromisc);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1048
              return true;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1049
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1050
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1051
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1052
  return false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1053
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1054
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1055
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1056
DsrRouting::PacketNewRoute (Ptr<Packet> packet,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1057
                            Ipv4Address source,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1058
                            Ipv4Address destination,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1059
                            uint8_t protocol)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1060
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1061
  NS_LOG_FUNCTION (this << packet << source << destination << (uint32_t)protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1062
  // Look up routes for the specific destination
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1063
  RouteCacheEntry toDst;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1064
  bool findRoute = m_routeCache->LookupRoute (destination, toDst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1065
  // Queue the packet if there is no route pre-existing
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1066
  if (!findRoute)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1067
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1068
      NS_LOG_INFO (Simulator::Now ().GetSeconds ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1069
                   << "s " << m_mainAddress << " there is no route for this packet, queue the packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1070
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1071
      Ptr<Packet> p = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1072
      SendBuffEntry newEntry (p, destination, m_sendBufferTimeout, protocol);     // Create a new entry for send buffer
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1073
      bool result = m_sendBuffer.Enqueue (newEntry);     // Enqueue the packet in send buffer
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1074
      if (result)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1075
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1076
          NS_LOG_INFO (Simulator::Now ().GetSeconds ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1077
                       << "s Add packet PID: " << packet->GetUid () << " to queue. Packet: " << *packet);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1078
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1079
          NS_LOG_LOGIC ("Send RREQ to" << destination);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1080
          if ((m_addressReqTimer.find (destination) == m_addressReqTimer.end ()) && (m_nonPropReqTimer.find (destination) == m_nonPropReqTimer.end ()))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1081
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1082
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1083
               * Call the send request function, it will update the request table entry and ttl there
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1084
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1085
              SendInitialRequest (source, destination, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1086
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1087
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1088
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1089
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1090
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1091
      Ptr<Packet> cleanP = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1092
      DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1093
      dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1094
      dsrRoutingHeader.SetMessageType (2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1095
      dsrRoutingHeader.SetSourceId (GetIDfromIP (source));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1096
      dsrRoutingHeader.SetDestId (GetIDfromIP (destination));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1097
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1098
      DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1099
      std::vector<Ipv4Address> nodeList = toDst.GetVector ();     // Get the route from the route entry we found
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1100
      Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodeList);      // Get the next hop address for the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1101
      if (nextHop == "0.0.0.0")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1102
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1103
          PacketNewRoute (cleanP, source, destination, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1104
          return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1105
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1106
      uint8_t salvage = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1107
      sourceRoute.SetNodesAddress (nodeList);     // Save the whole route in the source route header of the packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1108
      if (m_routeCache->IsLinkCache ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1109
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1110
          m_routeCache->UseExtends (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1111
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1112
      sourceRoute.SetSegmentsLeft ((nodeList.size () - 2));     // The segmentsLeft field will indicate the hops to go
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1113
      sourceRoute.SetSalvage (salvage);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1114
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1115
      uint8_t length = sourceRoute.GetLength ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1116
      dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1117
      dsrRoutingHeader.AddDsrOption (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1118
      cleanP->AddHeader (dsrRoutingHeader);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1119
      // Send the data packet out before schedule the next packet transmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1120
      SendPacket (cleanP, source, nextHop, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1121
      Ptr<const Packet> mtP = cleanP->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1122
      SetRoute (nextHop, m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1123
      // Put the data packet in the maintenance queue for data packet retransmission
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1124
      MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*Ipv4Address=*/ m_mainAddress, /*nextHop=*/ nextHop,
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1125
                                              /*source=*/ source, /*destination=*/ destination, /*ackId=*/ 0,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1126
                                              /*SegsLeft=*/nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1127
      bool result = m_maintainBuffer.Enqueue (newEntry);     // Enqueue the packet the the maintenance buffer
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1128
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1129
      if (result)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1130
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1131
          NetworkKey networkKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1132
          networkKey.m_ackId = newEntry.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1133
          networkKey.m_ourAdd = newEntry.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1134
          networkKey.m_nextHop = newEntry.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1135
          networkKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1136
          networkKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1137
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1138
          PassiveKey passiveKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1139
          passiveKey.m_ackId = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1140
          passiveKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1141
          passiveKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1142
          passiveKey.m_segsLeft = newEntry.GetSegsLeft ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1143
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1144
          m_addressForwardCnt[networkKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1145
          m_passiveCnt[passiveKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1146
          if (nextHop != destination)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1147
            {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1148
              SchedulePassivePacketRetry (newEntry, false, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1149
            }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1150
          else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1151
            {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1152
              // This is the first network retry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1153
              ScheduleNetworkPacketRetry (newEntry, true, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1154
            }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1155
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1156
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1157
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1158
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1159
void
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1160
DsrRouting::SendUnreachError (Ipv4Address errorHop, Ipv4Address destination, Ipv4Address originalDst, uint8_t salvage, uint8_t protocol)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1161
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1162
  NS_LOG_FUNCTION (this << errorHop << destination << originalDst << (uint32_t)salvage << (uint32_t)protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1163
  DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1164
  dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1165
  dsrRoutingHeader.SetMessageType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1166
  dsrRoutingHeader.SetSourceId (GetIDfromIP (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1167
  dsrRoutingHeader.SetDestId (GetIDfromIP (destination));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1168
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1169
  DsrOptionRerrUnreachHeader rerrUnreachHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1170
  rerrUnreachHeader.SetErrorType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1171
  rerrUnreachHeader.SetErrorSrc (m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1172
  rerrUnreachHeader.SetUnreachNode (errorHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1173
  rerrUnreachHeader.SetErrorDst (destination);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1174
  rerrUnreachHeader.SetOriginalDst (originalDst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1175
  rerrUnreachHeader.SetSalvage (salvage);                       // Set the value about whether to salvage a packet or not
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1176
  uint8_t rerrLength = rerrUnreachHeader.GetLength ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1177
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1178
  RouteCacheEntry toDst;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1179
  bool findRoute = m_routeCache->LookupRoute (destination, toDst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1180
  // Queue the packet if there is no route pre-existing
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1181
  Ptr<Packet> newPacket = Create<Packet> ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1182
  if (!findRoute)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1183
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1184
      NS_LOG_INFO (Simulator::Now ().GetSeconds ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1185
                   << "s " << m_mainAddress << " there is no route for this packet, queue the packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1186
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1187
      dsrRoutingHeader.SetPayloadLength (rerrLength + 2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1188
      dsrRoutingHeader.AddDsrOption (rerrUnreachHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1189
      newPacket->AddHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1190
      Ptr<Packet> p = newPacket->Copy ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1191
      // Save the error packet in the error buffer
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1192
      ErrorBuffEntry newEntry (p, destination, m_mainAddress, errorHop, m_sendBufferTimeout, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1193
      bool result = m_errorBuffer.Enqueue (newEntry);                    // Enqueue the packet in send buffer
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1194
      if (result)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1195
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1196
          NS_LOG_INFO (Simulator::Now ().GetSeconds ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1197
                       << "s Add packet PID: " << p->GetUid () << " to queue. Packet: " << *p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1198
          NS_LOG_LOGIC ("Send RREQ to" << destination);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1199
          if ((m_addressReqTimer.find (destination) == m_addressReqTimer.end ()) && (m_nonPropReqTimer.find (destination) == m_nonPropReqTimer.end ()))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1200
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1201
              NS_LOG_DEBUG ("When there is no existing route request for " << destination << ", initialize one");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1202
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1203
               * Call the send request function, it will update the request table entry and ttl there
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1204
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1205
              SendInitialRequest (m_mainAddress, destination, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1206
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1207
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1208
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1209
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1210
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1211
      std::vector<Ipv4Address> nodeList = toDst.GetVector ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1212
      Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1213
      if (nextHop == "0.0.0.0")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1214
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1215
          NS_LOG_DEBUG ("The route is not right");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1216
          PacketNewRoute (newPacket, m_mainAddress, destination, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1217
          return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1218
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1219
      DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1220
      sourceRoute.SetNodesAddress (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1221
      if (m_routeCache->IsLinkCache ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1222
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1223
          m_routeCache->UseExtends (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1224
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1225
      sourceRoute.SetSegmentsLeft ((nodeList.size () - 2));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1226
      uint8_t srLength = sourceRoute.GetLength ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1227
      uint8_t length = (srLength + rerrLength);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1228
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1229
      dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 4);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1230
      dsrRoutingHeader.AddDsrOption (rerrUnreachHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1231
      dsrRoutingHeader.AddDsrOption (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1232
      newPacket->AddHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1233
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1234
      SetRoute (nextHop, m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1235
      Ptr<NetDevice> dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1236
      m_ipv4Route->SetOutputDevice (dev);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1237
      NS_LOG_INFO ("Send the packet to the next hop address " << nextHop << " from " << m_mainAddress << " with the size " << newPacket->GetSize());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1238
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1239
      uint32_t priority = GetPriority (DSR_CONTROL_PACKET);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1240
      std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = m_priorityQueue.find (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1241
      Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = i->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1242
      NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1243
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1244
      DsrNetworkQueueEntry newEntry (newPacket, m_mainAddress, nextHop, Simulator::Now (), m_ipv4Route);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1245
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1246
      if (dsrNetworkQueue->Enqueue (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1247
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1248
          Scheduler (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1249
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1250
      else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1251
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1252
          NS_LOG_INFO ("Packet dropped as dsr network queue is full");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1253
        }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1254
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1255
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1256
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1257
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1258
DsrRouting::ForwardErrPacket (DsrOptionRerrUnreachHeader &rerr,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1259
                              DsrOptionSRHeader &sourceRoute,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1260
                              Ipv4Address nextHop,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1261
                              uint8_t protocol,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1262
                              Ptr<Ipv4Route> route)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1263
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1264
  NS_LOG_FUNCTION (this << rerr << sourceRoute << nextHop << (uint32_t)protocol << route);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1265
  NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1266
  DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1267
  dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1268
  dsrRoutingHeader.SetMessageType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1269
  dsrRoutingHeader.SetSourceId (GetIDfromIP (rerr.GetErrorSrc ()));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1270
  dsrRoutingHeader.SetDestId (GetIDfromIP (rerr.GetErrorDst ()));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1271
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1272
  uint8_t length = (sourceRoute.GetLength () + rerr.GetLength ());
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1273
  dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 4);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1274
  dsrRoutingHeader.AddDsrOption (rerr);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1275
  dsrRoutingHeader.AddDsrOption (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1276
  Ptr<Packet> packet = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1277
  packet->AddHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1278
  Ptr<NetDevice> dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1279
  route->SetOutputDevice (dev);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1280
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1281
  uint32_t priority = GetPriority (DSR_CONTROL_PACKET);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1282
  std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = m_priorityQueue.find (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1283
  Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = i->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1284
  NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1285
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1286
   DsrNetworkQueueEntry newEntry (packet, m_mainAddress, nextHop, Simulator::Now (), route);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1287
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1288
  if (dsrNetworkQueue->Enqueue (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1289
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1290
      Scheduler (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1291
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1292
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1293
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1294
      NS_LOG_INFO ("Packet dropped as dsr network queue is full");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1295
    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1296
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1297
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1298
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1299
DsrRouting::Send (Ptr<Packet> packet,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1300
                  Ipv4Address source,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1301
                  Ipv4Address destination,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1302
                  uint8_t protocol,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1303
                  Ptr<Ipv4Route> route)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1304
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1305
  NS_LOG_FUNCTION (this << packet << source << destination << (uint32_t)protocol << route);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1306
  NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1307
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1308
  if (protocol == 1)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1309
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1310
      NS_LOG_INFO ("Drop packet. Not handling ICMP packet for now");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1311
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1312
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1313
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1314
      // Look up routes for the specific destination
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1315
      RouteCacheEntry toDst;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1316
      bool findRoute = m_routeCache->LookupRoute (destination, toDst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1317
      // Queue the packet if there is no route pre-existing
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1318
      if (!findRoute)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1319
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1320
          NS_LOG_INFO (Simulator::Now ().GetSeconds ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1321
                       << "s " << m_mainAddress << " there is no route for this packet, queue the packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1322
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1323
          Ptr<Packet> p = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1324
          SendBuffEntry newEntry (p, destination, m_sendBufferTimeout, protocol);     // Create a new entry for send buffer
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1325
          bool result = m_sendBuffer.Enqueue (newEntry);     // Enqueue the packet in send buffer
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1326
          if (result)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1327
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1328
              NS_LOG_INFO (Simulator::Now ().GetSeconds ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1329
                           << "s Add packet PID: " << packet->GetUid () << " to queue. Packet: " << *packet);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1330
              NS_LOG_LOGIC ("Send RREQ to " << destination);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1331
              // Only when there is no existing route request timer when new route request is scheduled
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1332
              if ((m_addressReqTimer.find (destination) == m_addressReqTimer.end ()) && (m_nonPropReqTimer.find (destination) == m_nonPropReqTimer.end ()))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1333
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1334
                  NS_LOG_DEBUG ("When there is no existing route request for " << destination << ", initialize one");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1335
                  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1336
                   * Call the send request function, it will update the request table entry and ttl there
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1337
                   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1338
                  SendInitialRequest (source, destination, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1339
                }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1340
              else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1341
                {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1342
                  NS_LOG_DEBUG ("There is existing route request timer and the request count here " << m_rreqTable->GetRreqCnt (destination));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1343
                }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1344
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1345
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1346
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1347
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1348
          Ptr<Packet> cleanP = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1349
          DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1350
          dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1351
          dsrRoutingHeader.SetMessageType (2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1352
          dsrRoutingHeader.SetSourceId (GetIDfromIP (source));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1353
          dsrRoutingHeader.SetDestId (GetIDfromIP (destination));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1354
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1355
          DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1356
          std::vector<Ipv4Address> nodeList = toDst.GetVector ();       // Get the route from the route entry we found
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1357
          Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodeList);        // Get the next hop address for the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1358
          if (nextHop == "0.0.0.0")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1359
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1360
              PacketNewRoute (cleanP, source, destination, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1361
              return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1362
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1363
          uint8_t salvage = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1364
          sourceRoute.SetNodesAddress (nodeList);       // Save the whole route in the source route header of the packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1365
          if (m_routeCache->IsLinkCache ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1366
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1367
              m_routeCache->UseExtends (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1368
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1369
          sourceRoute.SetSegmentsLeft ((nodeList.size () - 2));       // The segmentsLeft field will indicate the hops to go
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1370
          sourceRoute.SetSalvage (salvage);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1371
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1372
          uint8_t length = sourceRoute.GetLength ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1373
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1374
          dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1375
          dsrRoutingHeader.AddDsrOption (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1376
          cleanP->AddHeader (dsrRoutingHeader);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1377
          // Send the data packet out before schedule the next packet transmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1378
          SendPacket (cleanP, source, nextHop, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1379
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1380
          Ptr<const Packet> mtP = cleanP->Copy ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1381
          NS_LOG_DEBUG ("maintain packet size " << cleanP->GetSize());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1382
          // Put the data packet in the maintenance queue for data packet retransmission
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1383
          MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*ourAddress=*/ m_mainAddress, /*nextHop=*/ nextHop,
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1384
                                      /*source=*/ source, /*destination=*/ destination, /*ackId=*/ 0,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1385
                                      /*SegsLeft=*/nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1386
          bool result = m_maintainBuffer.Enqueue (newEntry);       // Enqueue the packet the the maintenance buffer
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1387
          if (result)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1388
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1389
              NetworkKey networkKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1390
              networkKey.m_ackId = newEntry.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1391
              networkKey.m_ourAdd = newEntry.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1392
              networkKey.m_nextHop = newEntry.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1393
              networkKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1394
              networkKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1395
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1396
              PassiveKey passiveKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1397
              passiveKey.m_ackId = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1398
              passiveKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1399
              passiveKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1400
              passiveKey.m_segsLeft = newEntry.GetSegsLeft ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1401
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1402
              m_addressForwardCnt[networkKey] = 0;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1403
              m_passiveCnt[passiveKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1404
              if (nextHop != destination)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1405
                {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1406
                  SchedulePassivePacketRetry (newEntry, false, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1407
                }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1408
              else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1409
                {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1410
                  // This is the first network retry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1411
                  ScheduleNetworkPacketRetry (newEntry, true, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1412
                }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1413
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1414
          // Try to send packet from *previously* queued entries from send buffer if any
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1415
          Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0,100)),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1416
                               &DsrRouting::SendPacketFromBuffer,this,sourceRoute,nextHop,protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1417
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1418
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1419
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1420
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1421
uint16_t
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1422
DsrRouting::AddAckReqHeader (Ptr<Packet>& packet, Ipv4Address nextHop)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1423
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1424
  NS_LOG_FUNCTION (this << packet << nextHop);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1425
  // This packet is used to peek option type
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1426
  Ptr<Packet> dsrP = packet->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1427
  Ptr<Packet> tmpP = packet->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1428
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1429
  DsrRoutingHeader dsrRoutingHeader;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1430
  dsrP->RemoveHeader (dsrRoutingHeader);          // Remove the DSR header in whole
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1431
  uint8_t protocol = dsrRoutingHeader.GetNextHeader ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1432
  uint32_t sourceId = dsrRoutingHeader.GetSourceId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1433
  uint32_t destinationId = dsrRoutingHeader.GetDestId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1434
  uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1435
  tmpP->RemoveAtStart (offset);       // Here the processed size is 8 bytes, which is the fixed sized extension header
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1436
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1437
  // Get the number of routers' address field
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1438
  uint8_t buf[2];
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1439
  tmpP->CopyData (buf, sizeof(buf));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1440
  uint8_t numberAddress = (buf[1] - 2) / 4;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1441
  DsrOptionSRHeader sourceRoute;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1442
  sourceRoute.SetNumberAddress (numberAddress);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1443
  tmpP->RemoveHeader (sourceRoute);               // this is a clean packet without any dsr involved headers
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1444
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1445
  DsrOptionAckReqHeader ackReq;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1446
  m_ackId = m_routeCache->CheckUniqueAckId (nextHop);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1447
  ackReq.SetAckId (m_ackId);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1448
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1449
  uint8_t length = (sourceRoute.GetLength () + ackReq.GetLength ());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1450
  DsrRoutingHeader newDsrRoutingHeader;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1451
  newDsrRoutingHeader.SetNextHeader (protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1452
  newDsrRoutingHeader.SetMessageType (2);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1453
  newDsrRoutingHeader.SetSourceId (sourceId);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1454
  newDsrRoutingHeader.SetDestId (destinationId);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1455
  newDsrRoutingHeader.SetPayloadLength (length + 4);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1456
  newDsrRoutingHeader.AddDsrOption (sourceRoute);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1457
  newDsrRoutingHeader.AddDsrOption (ackReq);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1458
  dsrP->AddHeader (newDsrRoutingHeader);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1459
  // give the dsrP value to packet and then return
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1460
  packet = dsrP;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1461
  return m_ackId;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1462
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1463
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1464
void
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1465
DsrRouting::SendPacket (Ptr<Packet> packet, Ipv4Address source, Ipv4Address nextHop, uint8_t protocol)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1466
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1467
  NS_LOG_FUNCTION (this << packet << source << nextHop << (uint32_t)protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1468
  // Send out the data packet
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1469
  m_ipv4Route = SetRoute (nextHop, m_mainAddress);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1470
  Ptr<NetDevice> dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1471
  m_ipv4Route->SetOutputDevice (dev);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1472
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1473
  uint32_t priority = GetPriority (DSR_DATA_PACKET);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1474
  std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = m_priorityQueue.find (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1475
  Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = i->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1476
  NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1477
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1478
  DsrNetworkQueueEntry newEntry (packet, source, nextHop, Simulator::Now (), m_ipv4Route);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1479
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1480
  if (dsrNetworkQueue->Enqueue (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1481
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1482
      Scheduler (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1483
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1484
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1485
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1486
      NS_LOG_INFO ("Packet dropped as dsr network queue is full");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1487
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1488
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1489
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1490
void
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1491
DsrRouting::Scheduler (uint32_t priority)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1492
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1493
  NS_LOG_FUNCTION (this);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1494
  PriorityScheduler (priority, true);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1495
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1496
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1497
void
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1498
DsrRouting::PriorityScheduler (uint32_t priority, bool continueWithFirst)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1499
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1500
  NS_LOG_FUNCTION (this << priority << continueWithFirst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1501
  NS_LOG_DEBUG ("Scheduler looking for packets in network queue");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1502
  uint32_t numPriorities;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1503
  if (continueWithFirst)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1504
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1505
      numPriorities = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1506
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1507
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1508
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1509
      numPriorities = priority;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1510
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1511
  // priorities range from 0 to m_numPriorityQueues, with 0 as the highest priority
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1512
  for (uint32_t i = priority; numPriorities < m_numPriorityQueues; numPriorities++)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1513
  {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1514
    std::map<uint32_t, Ptr<DsrNetworkQueue> >::iterator q = m_priorityQueue.find (i);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1515
    Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = q->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1516
    uint32_t queueSize = dsrNetworkQueue->GetSize ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1517
    if (queueSize == 0)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1518
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1519
      if ((i == (m_numPriorityQueues - 1)) && continueWithFirst)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1520
      {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1521
        i = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1522
      }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1523
      else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1524
      {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1525
        i++;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1526
      }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1527
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1528
    else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1529
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1530
      uint32_t totalQueueSize;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1531
      for (std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator j = m_priorityQueue.begin (); j != m_priorityQueue.end (); j++)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1532
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1533
          NS_LOG_DEBUG ("The size of the network queue for " << j->first << " is " << j->second->GetSize());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1534
          totalQueueSize += j->second->GetSize ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1535
          NS_LOG_DEBUG ("And the total size is " << totalQueueSize);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1536
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1537
      if (totalQueueSize > 5)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1538
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1539
          // Here the queue size is larger than 5, we need to increase the retransmission timer for each packet in the network queue
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1540
          IncreaseRetransTimer ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1541
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1542
      DsrNetworkQueueEntry newEntry;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1543
      dsrNetworkQueue->Dequeue (newEntry);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1544
      if (SendRealDown (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1545
      {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1546
        NS_LOG_DEBUG("Packet sent by Dsr. Calling PriorityScheduler after some time");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1547
        //packet was successfully sent down. call scheduler after some time
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1548
        Simulator::Schedule (MicroSeconds (UniformVariable ().GetInteger (0, 1000)),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1549
            &DsrRouting::PriorityScheduler,this, i, false);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1550
      }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1551
      else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1552
      {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1553
        // packet was dropped by Dsr. Call scheduler immediately so that we can
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1554
        // send another packet immediately.
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1555
        NS_LOG_DEBUG("Packet dropped by Dsr. Calling PriorityScheduler immediately");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1556
        Simulator::Schedule (Seconds (0), &DsrRouting::PriorityScheduler, this, i, false);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1557
      }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1558
      if ((i == (m_numPriorityQueues - 1)) && continueWithFirst)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1559
      {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1560
        i = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1561
      }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1562
      else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1563
      {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1564
        i++;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1565
      }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1566
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1567
  }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1568
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1569
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1570
void
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1571
DsrRouting::IncreaseRetransTimer ()
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1572
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1573
  NS_LOG_FUNCTION (this);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1574
  // We may want to get the queue first and then we need to save a vector of the entries here and then find
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1575
  uint32_t priority = GetPriority (DSR_DATA_PACKET);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1576
  std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = m_priorityQueue.find (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1577
  Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = i->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1578
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1579
  std::vector<DsrNetworkQueueEntry> newNetworkQueue = dsrNetworkQueue->GetQueue ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1580
  for (std::vector<DsrNetworkQueueEntry>::iterator i = newNetworkQueue.begin (); i != newNetworkQueue.end (); i++)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1581
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1582
      Ipv4Address nextHop = i->GetNextHopAddress ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1583
      for (std::map<NetworkKey, Timer>::iterator j = m_addressForwardTimer.begin (); j != m_addressForwardTimer.end (); j++)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1584
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1585
          if (nextHop == j->first.m_nextHop)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1586
            {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1587
              NS_LOG_DEBUG ("The network delay left is " << j->second.GetDelayLeft());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1588
              j->second.SetDelay (j->second.GetDelayLeft () + m_retransIncr);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1589
              NS_LOG_DEBUG ("The new network delay time is " << j->second.GetDelayLeft ());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1590
            }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1591
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1592
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1593
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1594
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1595
bool
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1596
DsrRouting::SendRealDown (DsrNetworkQueueEntry & newEntry)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1597
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1598
  NS_LOG_FUNCTION (this);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1599
  Ipv4Address source = newEntry.GetSourceAddress ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1600
  Ipv4Address nextHop = newEntry.GetNextHopAddress ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1601
  Ptr<Packet> packet = newEntry.GetPacket ()->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1602
  Ptr<Ipv4Route> route = newEntry.GetIpv4Route ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1603
  m_downTarget (packet, source, nextHop, GetProtocolNumber(), route);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1604
  return true;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1605
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1606
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1607
void
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1608
DsrRouting::SendPacketFromBuffer (DsrOptionSRHeader const &sourceRoute, Ipv4Address nextHop, uint8_t protocol)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1609
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1610
  NS_LOG_FUNCTION (this << nextHop << (uint32_t)protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1611
  NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1612
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1613
  // Reconstruct the route and Retransmit the data packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1614
  std::vector<Ipv4Address> nodeList = sourceRoute.GetNodesAddress ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1615
  Ipv4Address destination = nodeList.back ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1616
  Ipv4Address source = nodeList.front ();       // Get the source address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1617
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1618
  NS_LOG_INFO ("The nexthop address " << nextHop << " the source " << source << " the destination " << destination);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1619
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1620
  /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1621
   * Here we try to find data packet from send buffer, if packet with this destiantion found, send it out
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1622
   */
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1623
  if (m_sendBuffer.Find (destination))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1624
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1625
      SendBuffEntry entry;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1626
      if (m_sendBuffer.Dequeue (destination, entry))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1627
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1628
          Ptr<Packet> packet = entry.GetPacket ()->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1629
          NS_LOG_DEBUG ("The queued packet size " << packet->GetSize ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1630
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1631
          NS_LOG_DEBUG ("This is the data packet");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1632
          Ptr<Packet> p = packet->Copy ();      // get a copy of the packet
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1633
          // Set the source route option
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1634
          DsrRoutingHeader dsrRoutingHeader;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1635
          dsrRoutingHeader.SetNextHeader (protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1636
          dsrRoutingHeader.SetMessageType (2);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1637
          dsrRoutingHeader.SetSourceId (GetIDfromIP (source));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1638
          dsrRoutingHeader.SetDestId (GetIDfromIP (destination));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1639
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1640
          uint8_t length = sourceRoute.GetLength ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1641
          dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1642
          dsrRoutingHeader.AddDsrOption (sourceRoute);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1643
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1644
          p->AddHeader (dsrRoutingHeader);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1645
          // Send the data packet out before schedule the next packet transmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1646
          NS_LOG_DEBUG ("Send out the data packet");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1647
          SendPacket (p, source, nextHop, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1648
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1649
          Ptr<const Packet> mtP = p->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1650
          // Put the data packet in the maintenance queue for data packet retransmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1651
          MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*ourAddress=*/ m_mainAddress, /*nextHop=*/ nextHop,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1652
                                                  /*source=*/ source, /*destination=*/ destination, /*ackId=*/ 0,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1653
                                                  /*SegsLeft=*/nodeList.size () - 2, /*expire time=*/ m_maxMaintainTime);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1654
          bool result = m_maintainBuffer.Enqueue (newEntry);       // Enqueue the packet the the maintenance buffer
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1655
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1656
          if (result)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1657
            {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1658
              NetworkKey networkKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1659
              networkKey.m_ackId = newEntry.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1660
              networkKey.m_ourAdd = newEntry.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1661
              networkKey.m_nextHop = newEntry.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1662
              networkKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1663
              networkKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1664
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1665
              PassiveKey passiveKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1666
              passiveKey.m_ackId = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1667
              passiveKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1668
              passiveKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1669
              passiveKey.m_segsLeft = newEntry.GetSegsLeft ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1670
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1671
              m_addressForwardCnt[networkKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1672
              m_passiveCnt[passiveKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1673
              if (nextHop != destination)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1674
                {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1675
                  SchedulePassivePacketRetry (newEntry, false, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1676
                }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1677
              else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1678
                {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1679
                  // This is the first network retry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1680
                  ScheduleNetworkPacketRetry (newEntry, true, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1681
                }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1682
            }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1683
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1684
          if (m_sendBuffer.GetSize () != 0 && m_sendBuffer.Find (destination))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1685
            {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1686
              NS_LOG_DEBUG ("Schedule sending the next packet in send buffer");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1687
              Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0,100)),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1688
                                   &DsrRouting::SendPacketFromBuffer,this,sourceRoute,nextHop,protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1689
            }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1690
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1691
      else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1692
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1693
          NS_LOG_DEBUG ("All queued packets are out-dated for the destination in send buffer");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1694
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1695
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1696
  /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1697
   * Here we try to find data packet from send buffer, if packet with this destiantion found, send it out
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1698
   */
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1699
  else if (m_errorBuffer.Find (destination))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1700
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1701
      ErrorBuffEntry entry;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1702
      if (m_errorBuffer.Dequeue (destination, entry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1703
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1704
          Ptr<Packet> packet = entry.GetPacket ()->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1705
          NS_LOG_DEBUG ("The queued packet size " << packet->GetSize ());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1706
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1707
          DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1708
          Ptr<Packet> copyP = packet->Copy ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1709
          Ptr<Packet> dsrPacket = packet->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1710
          dsrPacket->RemoveHeader (dsrRoutingHeader);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1711
          uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1712
          copyP->RemoveAtStart (offset);       // Here the processed size is 8 bytes, which is the fixed sized extension header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1713
          /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1714
           * Peek data to get the option type as well as length and segmentsLeft field
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1715
           */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1716
          uint32_t size = copyP->GetSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1717
          uint8_t *data = new uint8_t[size];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1718
          copyP->CopyData (data, size);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1719
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1720
          uint8_t optionType = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1721
          optionType = *(data);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1722
          NS_LOG_DEBUG ("The option type value in send packet " << (uint32_t)optionType);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1723
          if (optionType == 3)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1724
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1725
              NS_LOG_DEBUG ("The packet is error packet");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1726
              Ptr<dsr::DsrOptions> dsrOption;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1727
              DsrOptionHeader dsrOptionHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1728
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1729
              uint8_t errorType = *(data + 2);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1730
              NS_LOG_DEBUG ("The error type");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1731
              if (errorType == 1)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1732
                {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1733
                  NS_LOG_DEBUG ("The packet is route error unreach packet");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1734
                  DsrOptionRerrUnreachHeader rerr;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1735
                  copyP->RemoveHeader (rerr);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1736
                  NS_ASSERT (copyP->GetSize () == 0);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1737
                  uint8_t length = (sourceRoute.GetLength () + rerr.GetLength ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1738
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1739
                  DsrOptionRerrUnreachHeader newUnreach;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1740
                  newUnreach.SetErrorType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1741
                  newUnreach.SetErrorSrc (rerr.GetErrorSrc ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1742
                  newUnreach.SetUnreachNode (rerr.GetUnreachNode ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1743
                  newUnreach.SetErrorDst (rerr.GetErrorDst ());
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1744
                  newUnreach.SetOriginalDst (rerr.GetOriginalDst ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1745
                  newUnreach.SetSalvage (rerr.GetSalvage ());       // Set the value about whether to salvage a packet or not
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1746
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1747
                  std::vector<Ipv4Address> nodeList = sourceRoute.GetNodesAddress ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1748
                  DsrRoutingHeader newRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1749
                  newRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1750
                  newRoutingHeader.SetMessageType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1751
                  newRoutingHeader.SetSourceId (GetIDfromIP (rerr.GetErrorSrc ()));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1752
                  newRoutingHeader.SetDestId (GetIDfromIP (rerr.GetErrorDst ()));
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1753
                  newRoutingHeader.SetPayloadLength (uint16_t(length) + 4);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1754
                  newRoutingHeader.AddDsrOption (newUnreach);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1755
                  newRoutingHeader.AddDsrOption (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1756
                  if (m_routeCache->IsLinkCache ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1757
                    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1758
                      m_routeCache->UseExtends (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1759
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1760
                  SetRoute (nextHop, m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1761
                  Ptr<Packet> newPacket = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1762
                  newPacket->AddHeader (newRoutingHeader);       // Add the extension header with rerr and sourceRoute attached to it
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1763
                  Ptr<NetDevice> dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1764
                  m_ipv4Route->SetOutputDevice (dev);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1765
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1766
                  uint32_t priority = GetPriority (DSR_CONTROL_PACKET);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1767
                  std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = m_priorityQueue.find (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1768
                  Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = i->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1769
                  NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1770
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1771
                  DsrNetworkQueueEntry newEntry (newPacket, m_mainAddress, nextHop, Simulator::Now (), m_ipv4Route);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1772
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1773
                  if (dsrNetworkQueue->Enqueue (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1774
                    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1775
                      Scheduler (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1776
                    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1777
                  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1778
                    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1779
                      NS_LOG_INFO ("Packet dropped as dsr network queue is full");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1780
                    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1781
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1782
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1783
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1784
        if (m_errorBuffer.GetSize () != 0 && m_errorBuffer.Find (destination))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1785
          {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1786
            NS_LOG_DEBUG ("Schedule sending the next packet in send buffer");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1787
            Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0,100)),
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1788
                                 &DsrRouting::SendPacketFromBuffer,this,sourceRoute,nextHop,protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1789
          }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1790
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1791
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1792
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1793
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1794
      NS_LOG_DEBUG ("Packet not found in either the send or error buffer");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1795
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1796
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1797
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1798
bool
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1799
DsrRouting::FindSamePackets (Ptr<Packet> packet, Ipv4Address source, Ipv4Address destination,
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1800
                             uint8_t segsLeft)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1801
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1802
  NS_LOG_FUNCTION (this << packet << source << destination << (uint32_t)segsLeft);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1803
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1804
  Ptr<Packet> p = packet->Copy ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1805
  // Here the segments left value need to plus one to check the earlier hop maintain buffer entry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1806
  MaintainBuffEntry newEntry;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1807
  newEntry.SetPacket (p);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1808
  newEntry.SetSrc (source);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1809
  newEntry.SetDst (destination);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1810
  newEntry.SetAckId (0);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1811
  newEntry.SetSegsLeft (segsLeft + 1);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1812
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1813
  if (m_maintainBuffer.PromiscEqual (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1814
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1815
      // The PromiscEqual function will remove the maintain buffer entry if equal value found
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1816
      // It only compares the source and destination address, ackId, and the segments left value
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1817
      CancelPassivePacketTimer (newEntry);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1818
      return true;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1819
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1820
  return false;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1821
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1822
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1823
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1824
DsrRouting::CallCancelPacketTimer (uint16_t ackId, Ipv4Header const& ipv4Header, Ipv4Address realSrc, Ipv4Address realDst)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1825
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1826
  NS_LOG_FUNCTION (this << (uint32_t)ackId << ipv4Header << realSrc << realDst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1827
  Ipv4Address sender = ipv4Header.GetDestination ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1828
  Ipv4Address receiver = ipv4Header.GetSource ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1829
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1830
   * Create a packet to fill maintenance buffer, not used to compare
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1831
   * The reason is ack header doesn't have the original packet copy
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1832
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1833
  Ptr<Packet> mainP = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1834
  MaintainBuffEntry newEntry (/*Packet=*/ mainP, /*ourAddress=*/ sender, /*nextHop=*/ receiver,
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1835
                              /*source=*/ realSrc, /*destination=*/ realDst, /*ackId=*/ ackId,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1836
                              /*SegsLeft=*/0, /*expire time=*/ Simulator::Now ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1837
  CancelNetworkPacketTimer (newEntry);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1838
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1839
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1840
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1841
DsrRouting::CancelNetworkPacketTimer (MaintainBuffEntry & mb)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1842
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1843
  NS_LOG_FUNCTION (this);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1844
  NetworkKey networkKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1845
  networkKey.m_ackId = mb.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1846
  networkKey.m_ourAdd = mb.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1847
  networkKey.m_nextHop = mb.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1848
  networkKey.m_source = mb.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1849
  networkKey.m_destination = mb.GetDst ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1850
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1851
   * Here we have found the entry for send retries, so we get the value and increase it by one
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1852
   */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1853
  m_addressForwardCnt[networkKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1854
  m_addressForwardCnt.erase (networkKey);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1855
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1856
  NS_LOG_INFO ("ackId " << mb.GetAckId () << " ourAdd " << mb.GetOurAdd () << " nextHop " << mb.GetNextHop ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1857
                        << " source " << mb.GetSrc () << " destination " << mb.GetDst ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1858
                        << " segsLeft " << (uint32_t)mb.GetSegsLeft ()
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1859
                        );
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1860
  // Find the network acknowledgment timer
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1861
  std::map<NetworkKey, Timer>::const_iterator i =
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1862
      m_addressForwardTimer.find (networkKey);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1863
  if (i == m_addressForwardTimer.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1864
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1865
      NS_LOG_INFO ("did not find the packet timer");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1866
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1867
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1868
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1869
      NS_LOG_INFO ("did find the packet timer");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1870
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1871
       * Schedule the packet retry
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1872
       * Push back the nextHop, source, destination address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1873
       */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1874
      m_addressForwardTimer[networkKey].Cancel ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1875
      m_addressForwardTimer[networkKey].Remove ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1876
      if (m_addressForwardTimer[networkKey].IsRunning ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1877
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1878
          NS_LOG_INFO ("Timer not canceled");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1879
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1880
      m_addressForwardTimer.erase (networkKey);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1881
    }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1882
    // Erase the maintenance entry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1883
    // yet this does not check the segments left value here
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1884
    if (m_maintainBuffer.NetworkEqual (mb))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1885
      {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1886
        NS_LOG_INFO ("Remove same maintenance buffer entry based on network acknowledgment");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1887
      }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1888
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1889
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1890
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1891
DsrRouting::CancelPassivePacketTimer (MaintainBuffEntry & mb)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1892
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1893
  NS_LOG_FUNCTION (this);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1894
  PassiveKey passiveKey;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1895
  passiveKey.m_ackId = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1896
  passiveKey.m_source = mb.GetSrc ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1897
  passiveKey.m_destination = mb.GetDst ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1898
  passiveKey.m_segsLeft = mb.GetSegsLeft ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1899
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1900
  m_passiveCnt[passiveKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1901
  m_passiveCnt.erase (passiveKey);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1902
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1903
  // Find the passive acknowledgment timer
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1904
  std::map<PassiveKey, Timer>::const_iterator j =
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1905
      m_passiveAckTimer.find (passiveKey);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1906
  if (j == m_passiveAckTimer.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1907
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1908
      NS_LOG_INFO ("did not find the passive timer");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1909
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1910
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1911
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1912
      NS_LOG_INFO ("find the passive timer");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1913
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1914
       * Cancel passive acknowledgment timer
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1915
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1916
      m_passiveAckTimer[passiveKey].Cancel ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1917
      m_passiveAckTimer[passiveKey].Remove ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1918
      if (m_passiveAckTimer[passiveKey].IsRunning ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1919
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1920
          NS_LOG_INFO ("Timer not canceled");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1921
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1922
      m_passiveAckTimer.erase (passiveKey);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1923
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1924
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1925
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1926
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1927
DsrRouting::CancelPacketTimerNextHop (Ipv4Address nextHop, uint8_t protocol)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1928
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1929
  NS_LOG_FUNCTION (this << nextHop << (uint32_t)protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1930
  MaintainBuffEntry entry;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1931
  if (m_maintainBuffer.Dequeue (nextHop, entry))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1932
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1933
      Ptr<const Packet> packet = entry.GetPacket ()->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1934
      Ipv4Address source = entry.GetSrc ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1935
      Ipv4Address destination = entry.GetDst ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1936
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1937
       * Cancel the packet timer and then salvage the data packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1938
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1939
      CancelNetworkPacketTimer (entry);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1940
      SalvagePacket (packet, source, destination, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1941
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1942
      if (m_maintainBuffer.GetSize () && m_maintainBuffer.Find (nextHop))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1943
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1944
          NS_LOG_INFO ("Cancel the packet timer for next maintenance entry");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1945
          Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0,100)),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1946
                               &DsrRouting::CancelPacketTimerNextHop,this,nextHop,protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1947
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1948
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1949
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1950
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1951
      NS_LOG_INFO ("Maintenance buffer entry not found");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1952
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1953
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1954
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1955
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1956
DsrRouting::SalvagePacket (Ptr<const Packet> packet, Ipv4Address source, Ipv4Address dst, uint8_t protocol)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1957
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1958
  NS_LOG_FUNCTION (this << packet << source << dst << (uint32_t)protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1959
  // Create two copies of packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1960
  Ptr<Packet> p = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1961
  Ptr<Packet> newPacket = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1962
  // Remove the routing header in a whole to get a clean packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1963
  DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1964
  p->RemoveHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1965
  // Remove offset of dsr routing header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1966
  uint8_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1967
  newPacket->RemoveAtStart (offset);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1968
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1969
  // Get the number of routers' address field
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1970
  uint8_t buf[2];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1971
  newPacket->CopyData (buf, sizeof(buf));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1972
  uint8_t numberAddress = (buf[1] - 2) / 4;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1973
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1974
  DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1975
  sourceRoute.SetNumberAddress (numberAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1976
  newPacket->RemoveHeader (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1977
  uint8_t salvage = sourceRoute.GetSalvage ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1978
  /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1979
   * Look in the route cache for other routes for this destination
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1980
   */
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1981
  RouteCacheEntry toDst;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1982
  bool findRoute = m_routeCache->LookupRoute (dst, toDst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1983
  if (findRoute && (salvage < m_maxSalvageCount))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1984
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1985
      NS_LOG_DEBUG ("We have found a route for the packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1986
      DsrRoutingHeader newDsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1987
      newDsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1988
      newDsrRoutingHeader.SetMessageType (2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1989
      newDsrRoutingHeader.SetSourceId (GetIDfromIP (source));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1990
      newDsrRoutingHeader.SetDestId (GetIDfromIP (dst));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1991
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1992
      std::vector<Ipv4Address> nodeList = toDst.GetVector ();     // Get the route from the route entry we found
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1993
      Ipv4Address nextHop = SearchNextHop (m_mainAddress, nodeList);      // Get the next hop address for the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1994
      if (nextHop == "0.0.0.0")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1995
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1996
          PacketNewRoute (p, source, dst, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1997
          return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1998
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1999
      // Increase the salvage count by 1
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2000
      salvage++;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2001
      DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2002
      sourceRoute.SetSalvage (salvage);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2003
      sourceRoute.SetNodesAddress (nodeList);     // Save the whole route in the source route header of the packet
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2004
      sourceRoute.SetSegmentsLeft ((nodeList.size () - 2));     // The segmentsLeft field will indicate the hops to go
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2005
      DsrOptionAckReqHeader ackReq;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2006
      m_ackId = m_routeCache->CheckUniqueAckId (nextHop);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2007
      ackReq.SetAckId (m_ackId);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2008
      if (m_routeCache->IsLinkCache ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2009
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2010
          m_routeCache->UseExtends (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2011
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2012
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2013
      uint8_t length = (sourceRoute.GetLength () + ackReq.GetLength ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2014
      NS_LOG_INFO ("length of source route header " << (uint32_t)(sourceRoute.GetLength ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2015
                                                    << " length of ack request header " << (uint32_t)(ackReq.GetLength ()));
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2016
      newDsrRoutingHeader.SetPayloadLength (uint16_t(length) + 4);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2017
      newDsrRoutingHeader.AddDsrOption (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2018
      newDsrRoutingHeader.AddDsrOption (ackReq);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2019
      p->AddHeader (newDsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2020
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2021
      SetRoute (nextHop, m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2022
      Ptr<NetDevice> dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2023
      m_ipv4Route->SetOutputDevice (dev);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2024
      // Send out the data packet
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2025
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2026
      uint32_t priority = GetPriority (DSR_DATA_PACKET);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2027
      std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = m_priorityQueue.find (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2028
      Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = i->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2029
      NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2030
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2031
      DsrNetworkQueueEntry newEntry (p, m_mainAddress, nextHop, Simulator::Now (), m_ipv4Route);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2032
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2033
      if (dsrNetworkQueue->Enqueue (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2034
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2035
          Scheduler (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2036
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2037
      else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2038
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2039
          NS_LOG_INFO ("Packet dropped as dsr network queue is full");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2040
        }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2041
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2042
       * Mark the next hop address in blacklist
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2043
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2044
//      NS_LOG_DEBUG ("Save the next hop node in blacklist");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2045
//      m_rreqTable->MarkLinkAsUnidirectional (nextHop, m_blacklistTimeout);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2046
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2047
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2048
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2049
      NS_LOG_DEBUG ("Will not salvage this packet, silently drop");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2050
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2051
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2052
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2053
void
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2054
DsrRouting::SchedulePassivePacketRetry (MaintainBuffEntry & mb,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2055
                                        bool onlyPassive,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2056
                                        uint8_t protocol)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2057
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2058
  NS_LOG_FUNCTION (this << onlyPassive << (uint32_t)protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2059
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2060
  PassiveKey passiveKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2061
  passiveKey.m_ackId = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2062
  passiveKey.m_source = mb.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2063
  passiveKey.m_destination = mb.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2064
  passiveKey.m_segsLeft = mb.GetSegsLeft ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2065
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2066
  if (m_passiveAckTimer.find (passiveKey) == m_passiveAckTimer.end ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2067
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2068
      Timer timer (Timer::CANCEL_ON_DESTROY);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2069
      m_passiveAckTimer[passiveKey] = timer;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2070
    }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2071
  NS_LOG_DEBUG ("The passive acknowledgment option for data packet");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2072
  m_passiveAckTimer[passiveKey].SetFunction (&DsrRouting::PassiveScheduleTimerExpire, this);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2073
  m_passiveAckTimer[passiveKey].Remove ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2074
  m_passiveAckTimer[passiveKey].SetArguments (mb, onlyPassive, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2075
  m_passiveAckTimer[passiveKey].Schedule (m_passiveAckTimeout);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2076
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2077
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2078
void
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2079
DsrRouting::ScheduleNetworkPacketRetry (MaintainBuffEntry & mb,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2080
                                        bool isFirst,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2081
                                        uint8_t protocol)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2082
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2083
  Ptr<Packet> p = Create<Packet> ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2084
  Ptr<Packet> dsrP = Create<Packet> ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2085
  // The new entry will be used for retransmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2086
  NetworkKey networkKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2087
  Ipv4Address nextHop = mb.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2088
  NS_LOG_DEBUG ("is the first retry or not " << isFirst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2089
  if (isFirst)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2090
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2091
      // This is the very first network packet retry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2092
      p = mb.GetPacket ()->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2093
      // Here we add the ack request header to the data packet for network acknowledgement
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2094
      uint16_t ackId = AddAckReqHeader (p, nextHop);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2095
      dsrP = p->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2096
      MaintainBuffEntry newEntry = mb;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2097
      // The function AllEqual will find the exact entry and delete it if found
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2098
      m_maintainBuffer.AllEqual (mb);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2099
      newEntry.SetPacket (dsrP);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2100
      newEntry.SetAckId (ackId);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2101
      newEntry.SetExpireTime (m_maxMaintainTime);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2102
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2103
      networkKey.m_ackId = newEntry.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2104
      networkKey.m_ourAdd = newEntry.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2105
      networkKey.m_nextHop = newEntry.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2106
      networkKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2107
      networkKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2108
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2109
      m_addressForwardCnt[networkKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2110
      m_maintainBuffer.Enqueue (newEntry);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2111
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2112
      if (m_addressForwardTimer.find (networkKey) == m_addressForwardTimer.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2113
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2114
          Timer timer (Timer::CANCEL_ON_DESTROY);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2115
          m_addressForwardTimer[networkKey] = timer;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2116
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2117
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2118
      // After m_tryPassiveAcks, schedule the packet retransmission using network acknowledgment option
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2119
      m_addressForwardTimer[networkKey].SetFunction (&DsrRouting::NetworkScheduleTimerExpire, this);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2120
      m_addressForwardTimer[networkKey].Remove ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2121
      m_addressForwardTimer[networkKey].SetArguments (newEntry, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2122
      NS_LOG_DEBUG ("The packet retries time for " << newEntry.GetAckId() << " is " << m_sendRetries
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2123
          << " and the delay time is " << Time (2 * m_nodeTraversalTime));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2124
      // Back-off mechanism
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2125
      m_addressForwardTimer[networkKey].Schedule (Time (2 * m_nodeTraversalTime));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2126
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2127
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2128
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2129
      networkKey.m_ackId = mb.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2130
      networkKey.m_ourAdd = mb.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2131
      networkKey.m_nextHop = mb.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2132
      networkKey.m_source = mb.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2133
      networkKey.m_destination = mb.GetDst ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2134
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2135
       * Here we have found the entry for send retries, so we get the value and increase it by one
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2136
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2137
      m_sendRetries = m_addressForwardCnt[networkKey];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2138
      NS_LOG_DEBUG ("The packet retry we have done " << m_sendRetries);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2139
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2140
      p = mb.GetPacket ()->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2141
      dsrP = mb.GetPacket ()->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2142
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2143
      NS_LOG_DEBUG ("The packet with dsr header " << dsrP->GetSize());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2144
      networkKey.m_ackId = mb.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2145
      networkKey.m_ourAdd = mb.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2146
      networkKey.m_nextHop = mb.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2147
      networkKey.m_source = mb.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2148
      networkKey.m_destination = mb.GetDst ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2149
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2150
       *  If a data packet has been attempted SendRetries times at the maximum TTL without
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2151
       *  receiving any ACK, all data packets destined for the corresponding destination SHOULD be
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2152
       *  dropped from the send buffer
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2153
       *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2154
       *  The maxMaintRexmt also needs to decrease one for the passive ack packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2155
       */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2156
      /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2157
       * Check if the send retry time for a certain packet has already passed max maintenance retransmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2158
       * time or not
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2159
       */
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2160
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2161
      // After m_tryPassiveAcks, schedule the packet retransmission using network acknowledgment option
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2162
      m_addressForwardTimer[networkKey].SetFunction (&DsrRouting::NetworkScheduleTimerExpire, this);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2163
      m_addressForwardTimer[networkKey].Remove ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2164
      m_addressForwardTimer[networkKey].SetArguments (mb, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2165
      NS_LOG_DEBUG ("The packet retries time for " << mb.GetAckId() << " is " << m_sendRetries
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2166
          << " and the delay time is " << Time (2 * m_sendRetries *  m_nodeTraversalTime));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2167
      // Back-off mechanism
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2168
      m_addressForwardTimer[networkKey].Schedule (Time (2 * m_sendRetries * m_nodeTraversalTime));
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2169
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2170
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2171
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2172
void
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2173
DsrRouting::PassiveScheduleTimerExpire  (MaintainBuffEntry & mb,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2174
                                         bool onlyPassive,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2175
                                         uint8_t protocol)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2176
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2177
  NS_LOG_FUNCTION (this << onlyPassive << (uint32_t)protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2178
  Ipv4Address nextHop = mb.GetNextHop ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2179
  Ipv4Address source = mb.GetSrc ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2180
  Ptr<const Packet> packet = mb.GetPacket ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2181
  SetRoute (nextHop, m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2182
  Ptr<Packet> p = packet->Copy ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2183
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2184
  PassiveKey pk;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2185
  pk.m_ackId = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2186
  pk.m_source = mb.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2187
  pk.m_destination = mb.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2188
  pk.m_segsLeft = mb.GetSegsLeft ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2189
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2190
  // Cancel passive ack timer
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2191
  m_passiveAckTimer[pk].Cancel ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2192
  m_passiveAckTimer[pk].Remove ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2193
  if (m_passiveAckTimer[pk].IsRunning ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2194
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2195
      NS_LOG_DEBUG ("Timer not canceled");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2196
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2197
  m_passiveAckTimer.erase (pk);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2198
  // Send the data packet out before schedule the next packet transmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2199
  SendPacket (p, source, nextHop, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2200
  // Increase the send retry times
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2201
  m_passiveRetries = m_passiveCnt[pk];
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2202
  if (m_passiveRetries < m_tryPassiveAcks)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2203
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2204
      m_passiveCnt[pk] = ++m_passiveRetries;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2205
      SchedulePassivePacketRetry (mb, onlyPassive, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2206
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2207
  else if (!onlyPassive)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2208
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2209
      // This is the first network acknowledgement retry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2210
      // Cancel the passive packet timer now and remove maintenance buffer entry for it
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2211
      CancelPassivePacketTimer (mb);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2212
      ScheduleNetworkPacketRetry (mb, true, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2213
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2214
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2215
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2216
      // This is the end of the data retransmission retries
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2217
      CancelPassivePacketTimer (mb);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2218
      // The function AllEqual will find the exact entry and delete it if found
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2219
      m_maintainBuffer.AllEqual (mb);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2220
    }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2221
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2222
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2223
void
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2224
DsrRouting::NetworkScheduleTimerExpire  (MaintainBuffEntry & mb,
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2225
                                         uint8_t protocol)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2226
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2227
  Ptr<Packet> p = mb.GetPacket ()->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2228
  Ipv4Address source = mb.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2229
  Ipv4Address nextHop = mb.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2230
  Ipv4Address dst = mb.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2231
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2232
  NetworkKey networkKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2233
  networkKey.m_ackId = mb.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2234
  networkKey.m_ourAdd = mb.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2235
  networkKey.m_nextHop = nextHop;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2236
  networkKey.m_source = source;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2237
  networkKey.m_destination = dst;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2238
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2239
  // Send the data packet out before schedule the next packet transmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2240
  SendPacket (p, source, nextHop, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2241
  // Increase the send retry times
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2242
  m_sendRetries = m_addressForwardCnt[networkKey];
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2243
  NS_LOG_DEBUG ("The send retry time is " << m_sendRetries);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2244
  if (m_sendRetries >= m_maxMaintRexmt)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2245
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2246
      Ptr<Packet> dsrP = mb.GetPacket ()->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2247
      // The packet retries time has exceed the max maintenance retransmission times
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2248
      NS_LOG_LOGIC ("Packet transmissions to " << nextHop << " has been attempted SendRetries times for " << networkKey.m_ackId);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2249
      DsrRoutingHeader dsrRoutingHeader;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2250
      dsrP->RemoveHeader (dsrRoutingHeader);          // Remove the dsr header in whole
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2251
      uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2252
      p->RemoveAtStart (offset);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2253
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2254
      // Get the number of routers' address field
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2255
      uint8_t buf[2];
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2256
      p->CopyData (buf, sizeof(buf));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2257
      uint8_t numberAddress = (buf[1] - 2) / 4;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2258
      NS_LOG_DEBUG ("The number of addresses " << (uint32_t)numberAddress);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2259
      DsrOptionSRHeader sourceRoute;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2260
      sourceRoute.SetNumberAddress (numberAddress);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2261
      p->RemoveHeader (sourceRoute);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2262
      std::vector<Ipv4Address> nodeList = sourceRoute.GetNodesAddress ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2263
      uint8_t salvage = sourceRoute.GetSalvage ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2264
      Ipv4Address address1 = nodeList[1];
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2265
      NS_LOG_DEBUG ("address1 " << address1);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2266
      PrintVector (nodeList);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2267
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2268
      // Delete all the routes including the links
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2269
      m_routeCache->DeleteAllRoutesIncludeLink (m_mainAddress, nextHop, m_mainAddress);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2270
      /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2271
       * If the salvage is not 0, use the first address in the route as the error dst in error header
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2272
       * otherwise use the source of packet as the error destination
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2273
       */
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2274
      Ipv4Address errorDst;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2275
      if (salvage)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2276
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2277
          errorDst = address1;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2278
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2279
      else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2280
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2281
          errorDst = source;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2282
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2283
      SendUnreachError (nextHop, errorDst, dst, salvage, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2284
      /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2285
       * here we cancel the packet retransmission time for all the packets have next hop address as nextHop
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2286
       * Also salvage the packet for the all the packet destined for the nextHop address
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2287
       */
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2288
      CancelPacketTimerNextHop (nextHop, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2289
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2290
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2291
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2292
      m_addressForwardCnt[networkKey] = ++m_sendRetries;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2293
      ScheduleNetworkPacketRetry (mb, false, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2294
    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2295
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2296
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2297
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2298
DsrRouting::ForwardPacket (Ptr<const Packet> packet,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2299
                           DsrOptionSRHeader &sourceRoute,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2300
                           Ipv4Header const& ipv4Header,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2301
                           Ipv4Address source,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2302
                           Ipv4Address nextHop,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2303
                           Ipv4Address targetAddress,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2304
                           uint8_t protocol,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2305
                           Ptr<Ipv4Route> route)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2306
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2307
  NS_LOG_FUNCTION (this << packet << sourceRoute << source << nextHop << targetAddress << (uint32_t)protocol << route);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2308
  NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2309
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2310
  DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2311
  dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2312
  dsrRoutingHeader.SetMessageType (2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2313
  dsrRoutingHeader.SetSourceId (GetIDfromIP (source));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2314
  dsrRoutingHeader.SetDestId (GetIDfromIP (targetAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2315
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2316
  // We get the salvage value in sourceRoute header and set it to route error header if triggered error
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2317
  Ptr<Packet> p = packet->Copy ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2318
  uint8_t length = sourceRoute.GetLength ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2319
  dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2320
  dsrRoutingHeader.AddDsrOption (sourceRoute);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2321
  p->AddHeader (dsrRoutingHeader);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2322
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2323
  // Send the data packet out before schedule the next packet transmission
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2324
  SendPacket (p, source, nextHop, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2325
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2326
  Ptr<const Packet> mtP = p->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2327
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2328
  MaintainBuffEntry newEntry (/*Packet=*/ mtP, /*ourAddress=*/ m_mainAddress, /*nextHop=*/ nextHop,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2329
                                          /*source=*/ source, /*destination=*/ targetAddress,
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2330
                                          /*ackId=*/ m_ackId, /*SegsLeft=*/sourceRoute.GetSegmentsLeft(), /*expire time=*/ m_maxMaintainTime);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2331
  bool result = m_maintainBuffer.Enqueue (newEntry);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2332
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2333
  if (result)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2334
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2335
      NetworkKey networkKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2336
      networkKey.m_ackId = newEntry.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2337
      networkKey.m_ourAdd = newEntry.GetOurAdd ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2338
      networkKey.m_nextHop = newEntry.GetNextHop ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2339
      networkKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2340
      networkKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2341
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2342
      PassiveKey passiveKey;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2343
      passiveKey.m_ackId = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2344
      passiveKey.m_source = newEntry.GetSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2345
      passiveKey.m_destination = newEntry.GetDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2346
      passiveKey.m_segsLeft = newEntry.GetSegsLeft ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2347
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2348
      m_addressForwardCnt[networkKey] = 0;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2349
      m_passiveCnt[passiveKey] = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2350
      if (nextHop != targetAddress)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2351
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2352
          SchedulePassivePacketRetry (newEntry, false, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2353
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2354
      else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2355
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2356
          // This is the first network retry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2357
          ScheduleNetworkPacketRetry (newEntry, true, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2358
        }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2359
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2360
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2361
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2362
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2363
DsrRouting::SendInitialRequest (Ipv4Address source,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2364
                                Ipv4Address destination,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2365
                                uint8_t protocol)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2366
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2367
  NS_LOG_FUNCTION (this << source << destination << (uint32_t)protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2368
  NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2369
  Ptr<Packet> packet = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2370
  // Create an empty Ipv4 route ptr
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2371
  Ptr<Ipv4Route> route;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2372
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2373
   * Construct the route request option header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2374
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2375
  DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2376
  dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2377
  dsrRoutingHeader.SetMessageType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2378
  dsrRoutingHeader.SetSourceId (GetIDfromIP (source));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2379
  dsrRoutingHeader.SetDestId (255);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2380
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2381
  DsrOptionRreqHeader rreqHeader;                                  // has an alignment of 4n+0
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2382
  rreqHeader.AddNodeAddress (m_mainAddress);                       // Add our own address in the header
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2383
  rreqHeader.SetTarget (destination);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2384
  m_requestId = m_rreqTable->CheckUniqueRreqId (destination);      // Check the Id cache for duplicate ones
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2385
  rreqHeader.SetId (m_requestId);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2386
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2387
  dsrRoutingHeader.AddDsrOption (rreqHeader);                      // Add the rreqHeader to the dsr extension header
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2388
  uint8_t length = rreqHeader.GetLength ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2389
  dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2390
  packet->AddHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2391
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2392
  // Schedule the route requests retry with non-propagation set true
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2393
  bool nonProp = true;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2394
  std::vector<Ipv4Address> address;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2395
  address.push_back (source);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2396
  address.push_back (destination);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2397
  /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2398
   * Add the socket ip ttl tag to the packet to limit the scope of route requests
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2399
   */
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2400
  SocketIpTtlTag tag;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2401
  tag.SetTtl (0);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2402
  Ptr<Packet> nonPropPacket = packet->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2403
  nonPropPacket->AddPacketTag (tag);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2404
  SendRequest (nonPropPacket, source);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2405
  // Schedule the next route request
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2406
  ScheduleRreqRetry (packet, address, nonProp, m_requestId, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2407
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2408
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2409
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2410
DsrRouting::SendErrorRequest (DsrOptionRerrUnreachHeader &rerr, uint8_t protocol)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2411
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2412
  NS_LOG_FUNCTION (this << (uint32_t)protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2413
  NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward");
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2414
  uint8_t salvage = rerr.GetSalvage ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2415
  Ipv4Address dst = rerr.GetOriginalDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2416
  NS_LOG_DEBUG ("our own address here " << m_mainAddress << " error source " << rerr.GetErrorSrc () << " error destination " << rerr.GetErrorDst ()
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2417
      << " error next hop " << rerr.GetUnreachNode () << " original dst " << rerr.GetOriginalDst ()
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2418
     );
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2419
  RouteCacheEntry toDst;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2420
  if (m_routeCache->LookupRoute (dst, toDst))
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2421
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2422
      /*
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2423
       * Found a route the dst, construct the source route option header
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2424
       */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2425
      DsrOptionSRHeader sourceRoute;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2426
      std::vector<Ipv4Address> ip = toDst.GetVector ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2427
      sourceRoute.SetNodesAddress (ip);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2428
      if (m_routeCache->IsLinkCache ())
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2429
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2430
          m_routeCache->UseExtends (ip);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2431
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2432
      sourceRoute.SetSegmentsLeft ((ip.size () - 2));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2433
      sourceRoute.SetSalvage (salvage);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2434
      Ipv4Address nextHop = SearchNextHop (m_mainAddress, ip);       // Get the next hop address
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2435
      NS_LOG_DEBUG ("The nextHop address " << nextHop);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2436
      Ptr<Packet> packet = Create<Packet> ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2437
      if (nextHop == "0.0.0.0")
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2438
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2439
          NS_LOG_DEBUG ("Error next hop address");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2440
          PacketNewRoute (packet, m_mainAddress, dst, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2441
          return;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2442
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2443
      SetRoute (nextHop, m_mainAddress);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2444
      CancelRreqTimer (dst, true);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2445
      SendPacketFromBuffer (sourceRoute, nextHop, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2446
      NS_LOG_LOGIC ("Route to " << dst << " found");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2447
      return;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2448
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2449
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2450
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2451
      NS_LOG_INFO ("No route found, initiate route error request");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2452
      Ptr<Packet> packet = Create<Packet> ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2453
      Ipv4Address originalDst = rerr.GetOriginalDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2454
      // Create an empty route ptr
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2455
      Ptr<Ipv4Route> route = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2456
      /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2457
       * Construct the route request option header
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2458
       */
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2459
      DsrRoutingHeader dsrRoutingHeader;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2460
      dsrRoutingHeader.SetNextHeader (protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2461
      dsrRoutingHeader.SetMessageType (1);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2462
      dsrRoutingHeader.SetSourceId (GetIDfromIP (m_mainAddress));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2463
      dsrRoutingHeader.SetDestId (255);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2464
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2465
      Ptr<Packet> dstP = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2466
      DsrOptionRreqHeader rreqHeader;                                // has an alignment of 4n+0
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2467
      rreqHeader.AddNodeAddress (m_mainAddress);                     // Add our own address in the header
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2468
      rreqHeader.SetTarget (originalDst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2469
      m_requestId = m_rreqTable->CheckUniqueRreqId (originalDst);       // Check the Id cache for duplicate ones
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2470
      rreqHeader.SetId (m_requestId);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2471
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2472
      dsrRoutingHeader.AddDsrOption (rreqHeader);         // Add the rreqHeader to the dsr extension header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2473
      dsrRoutingHeader.AddDsrOption (rerr);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2474
      uint8_t length = rreqHeader.GetLength () + rerr.GetLength ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2475
      dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 4);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2476
      dstP->AddHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2477
      // Schedule the route requests retry, propagate the route request message as it contains error
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2478
      bool nonProp = false;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2479
      std::vector<Ipv4Address> address;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2480
      address.push_back (m_mainAddress);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2481
      address.push_back (originalDst);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2482
      /*
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2483
       * Add the socket ip ttl tag to the packet to limit the scope of route requests
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2484
       */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2485
      SocketIpTtlTag tag;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2486
      tag.SetTtl ((uint8_t)m_discoveryHopLimit);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2487
      Ptr<Packet> propPacket = dstP->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2488
      propPacket->AddPacketTag (tag);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2489
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2490
      if ((m_addressReqTimer.find (originalDst) == m_addressReqTimer.end ()) && (m_nonPropReqTimer.find (originalDst) == m_nonPropReqTimer.end ()))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2491
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2492
          NS_LOG_INFO ("Only when there is no existing route request time when the initial route request is scheduled");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2493
          SendRequest (propPacket, m_mainAddress);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2494
          ScheduleRreqRetry (dstP, address, nonProp, m_requestId, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2495
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2496
      else
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2497
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2498
          NS_LOG_INFO ("There is existing route request, find the existing route request entry");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2499
          /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2500
           * Cancel the route request timer first before scheduling the route request
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2501
           * in this case, we do not want to remove the route request entry, so the isRemove value is false
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2502
           */
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2503
          CancelRreqTimer (originalDst, false);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2504
          ScheduleRreqRetry (dstP, address, nonProp, m_requestId, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2505
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2506
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2507
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2508
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2509
void
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2510
DsrRouting::CancelRreqTimer (Ipv4Address dst, bool isRemove)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2511
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2512
  NS_LOG_FUNCTION (this << dst << isRemove);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2513
  // Cancel the non propagation request timer if found
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2514
  if (m_nonPropReqTimer.find (dst) == m_nonPropReqTimer.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2515
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2516
      NS_LOG_DEBUG ("Did not find the non-propagation timer");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2517
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2518
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2519
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2520
      NS_LOG_DEBUG ("did find the non-propagation timer");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2521
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2522
  m_nonPropReqTimer[dst].Cancel ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2523
  m_nonPropReqTimer[dst].Remove ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2524
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2525
  if (m_nonPropReqTimer[dst].IsRunning ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2526
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2527
      NS_LOG_DEBUG ("Timer not canceled");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2528
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2529
  m_nonPropReqTimer.erase (dst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2530
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2531
  // Cancel the address request timer if found
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2532
  if (m_addressReqTimer.find (dst) == m_addressReqTimer.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2533
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2534
      NS_LOG_DEBUG ("Did not find the propagation timer");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2535
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2536
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2537
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2538
      NS_LOG_DEBUG ("did find the propagation timer");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2539
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2540
  m_addressReqTimer[dst].Cancel ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2541
  m_addressReqTimer[dst].Remove ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2542
  if (m_addressReqTimer[dst].IsRunning ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2543
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2544
      NS_LOG_DEBUG ("Timer not canceled");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2545
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2546
  m_addressReqTimer.erase (dst);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2547
  /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2548
   * If the route request is scheduled to remove the route request entry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2549
   * Remove the route request entry with the route retry times done for certain destination
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2550
   */
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2551
  if (isRemove)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2552
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2553
      // remove the route request entry from route request table
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2554
      m_rreqTable->RemoveRreqEntry (dst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2555
    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2556
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2557
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2558
void
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2559
DsrRouting::ScheduleRreqRetry (Ptr<Packet> packet, std::vector<Ipv4Address> address, bool nonProp, uint32_t requestId, uint8_t protocol)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2560
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2561
  NS_LOG_FUNCTION (this << packet << nonProp << requestId << (uint32_t)protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2562
  Ipv4Address source = address[0];
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2563
  Ipv4Address dst = address[1];
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2564
  if (nonProp)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2565
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2566
      // The nonProp route request is only sent out only and is already used
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2567
      if (m_nonPropReqTimer.find (dst) == m_nonPropReqTimer.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2568
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2569
          Timer timer (Timer::CANCEL_ON_DESTROY);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2570
          m_nonPropReqTimer[dst] = timer;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2571
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2572
      std::vector<Ipv4Address> address;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2573
      address.push_back (source);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2574
      address.push_back (dst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2575
      m_nonPropReqTimer[dst].SetFunction (&DsrRouting::RouteRequestTimerExpire, this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2576
      m_nonPropReqTimer[dst].Remove ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2577
      m_nonPropReqTimer[dst].SetArguments (packet, address, requestId, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2578
      m_nonPropReqTimer[dst].Schedule (m_nonpropRequestTimeout);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2579
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2580
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2581
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2582
      // Cancel the non propagation request timer if found
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2583
      m_nonPropReqTimer[dst].Cancel ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2584
      m_nonPropReqTimer[dst].Remove ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2585
      if (m_nonPropReqTimer[dst].IsRunning ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2586
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2587
          NS_LOG_DEBUG ("Timer not canceled");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2588
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2589
      m_nonPropReqTimer.erase (dst);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2590
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2591
      if (m_addressReqTimer.find (dst) == m_addressReqTimer.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2592
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2593
          Timer timer (Timer::CANCEL_ON_DESTROY);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2594
          m_addressReqTimer[dst] = timer;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2595
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2596
      std::vector<Ipv4Address> address;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2597
      address.push_back (source);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2598
      address.push_back (dst);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2599
      m_addressReqTimer[dst].SetFunction (&DsrRouting::RouteRequestTimerExpire, this);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2600
      m_addressReqTimer[dst].Remove ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2601
      m_addressReqTimer[dst].SetArguments (packet, address, requestId, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2602
      Time rreqDelay;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2603
      // back off mechanism for sending route requests
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2604
      if (m_rreqTable->GetRreqCnt (dst))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2605
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2606
          // When the route request count is larger than 0
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2607
          rreqDelay = Time (pow (m_rreqTable->GetRreqCnt (dst), 2) * m_requestPeriod);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2608
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2609
      else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2610
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2611
          // This is the first route request retry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2612
          rreqDelay = m_requestPeriod;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2613
        }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2614
      NS_LOG_DEBUG ("The request count for the destination " << dst << " " << m_rreqTable->GetRreqCnt (dst) << " with time value " << rreqDelay);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2615
      if (rreqDelay > m_maxRequestPeriod)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2616
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2617
          // use the max request period
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2618
          NS_LOG_DEBUG ("The max request delay time " << m_maxRequestPeriod.GetSeconds());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2619
          m_addressReqTimer[dst].Schedule (m_maxRequestPeriod);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2620
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2621
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2622
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2623
          NS_LOG_DEBUG ("The request delay time " << rreqDelay.GetSeconds());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2624
          m_addressReqTimer[dst].Schedule (rreqDelay);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2625
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2626
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2627
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2628
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2629
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2630
void
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2631
DsrRouting::RouteRequestTimerExpire (Ptr<Packet> packet, std::vector<Ipv4Address> address, uint32_t requestId, uint8_t protocol)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2632
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2633
  NS_LOG_FUNCTION (this << packet << requestId << (uint32_t)protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2634
  // Get a clean packet without dsr header
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2635
  Ptr<Packet> dsrP = packet->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2636
  DsrRoutingHeader dsrRoutingHeader;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2637
  dsrP->RemoveHeader (dsrRoutingHeader);          // Remove the dsr header in whole
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2638
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2639
  Ipv4Address source = address[0];
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2640
  Ipv4Address dst = address[1];
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2641
  RouteCacheEntry toDst;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2642
  if (m_routeCache->LookupRoute (dst, toDst))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2643
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2644
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2645
       * Found a route the dst, construct the source route option header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2646
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2647
      DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2648
      std::vector<Ipv4Address> ip = toDst.GetVector ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2649
      sourceRoute.SetNodesAddress (ip);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2650
      if (m_routeCache->IsLinkCache ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2651
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2652
          m_routeCache->UseExtends (ip);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2653
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2654
      sourceRoute.SetSegmentsLeft ((ip.size () - 2));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2655
      uint8_t salvage = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2656
      sourceRoute.SetSalvage (salvage);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2657
      Ipv4Address nextHop = SearchNextHop (m_mainAddress, ip);       // Get the next hop address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2658
      NS_LOG_DEBUG ("The nextHop address " << nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2659
      if (nextHop == "0.0.0.0")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2660
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2661
          NS_LOG_DEBUG ("Error next hop address");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2662
          PacketNewRoute (dsrP, source, dst, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2663
          return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2664
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2665
      SetRoute (nextHop, m_mainAddress);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2666
      CancelRreqTimer (dst, true);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2667
      SendPacketFromBuffer (sourceRoute, nextHop, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2668
      NS_LOG_LOGIC ("Route to " << dst << " found");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2669
      return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2670
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2671
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2672
   *  If a route discovery has been attempted m_rreqRetries times at the maximum TTL without
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2673
   *  receiving any RREP, all data packets destined for the corresponding destination SHOULD be
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2674
   *  dropped from the buffer and a Destination Unreachable message SHOULD be delivered to the application.
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2675
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2676
  NS_LOG_DEBUG ("The new request count for " << dst << " is " << m_rreqTable->GetRreqCnt (dst) << " the max " << m_rreqRetries);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2677
  if (m_rreqTable->GetRreqCnt (dst) >= m_rreqRetries)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2678
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2679
      NS_LOG_LOGIC ("Route discovery to " << dst << " has been attempted " << m_rreqRetries << " times");
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2680
      CancelRreqTimer (dst, true);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2681
      NS_LOG_DEBUG ("Route not found. Drop packet with dst " << dst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2682
      m_sendBuffer.DropPacketWithDst (dst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2683
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2684
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2685
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2686
      SocketIpTtlTag tag;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2687
      tag.SetTtl ((uint8_t)m_discoveryHopLimit);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2688
      Ptr<Packet> propPacket = packet->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2689
      propPacket->AddPacketTag (tag);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2690
      // Increase the request count
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2691
      m_rreqTable->FindAndUpdate (dst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2692
      SendRequest (propPacket, source);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2693
      NS_LOG_DEBUG ("Check the route request entry " << source << " " << dst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2694
      ScheduleRreqRetry (packet, address, false, requestId, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2695
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2696
  return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2697
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2698
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2699
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2700
DsrRouting::SendRequest (Ptr<Packet> packet,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2701
                         Ipv4Address source)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2702
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2703
  NS_LOG_FUNCTION (this << packet << source);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2704
  NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2705
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2706
   * The destination address here is directed broadcast address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2707
   */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2708
  uint32_t priority = GetPriority (DSR_CONTROL_PACKET);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2709
  std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = m_priorityQueue.find (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2710
  Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = i->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2711
  NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2712
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2713
  DsrNetworkQueueEntry newEntry (packet, source, m_broadcast, Simulator::Now (), 0);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2714
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2715
  if (dsrNetworkQueue->Enqueue (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2716
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2717
      Scheduler (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2718
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2719
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2720
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2721
      NS_LOG_INFO ("Packet dropped as dsr network queue is full");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2722
    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2723
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2724
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2725
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2726
DsrRouting::ScheduleInterRequest (Ptr<Packet> packet)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2727
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2728
  NS_LOG_FUNCTION (this << packet);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2729
  /*
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2730
   * This is a forwarding case when sending route requests, a random delay time [0, m_broadcastJitter]
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2731
   * used before forwarding as link-layer broadcast
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2732
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2733
  Simulator::Schedule (MilliSeconds (UniformVariable ().GetInteger (0, m_broadcastJitter)), &DsrRouting::SendRequest, this,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2734
                       packet, m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2735
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2736
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2737
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2738
DsrRouting::SendGratuitousReply (Ipv4Address source, Ipv4Address srcAddress, std::vector<Ipv4Address> &nodeList, uint8_t protocol)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2739
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2740
  NS_LOG_FUNCTION (this << source << srcAddress << (uint32_t)protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2741
  if (!(m_graReply.FindAndUpdate (source, srcAddress, m_gratReplyHoldoff)))     // Find the gratuitous reply entry
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2742
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2743
      NS_LOG_LOGIC ("Update gratuitous reply " << source);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2744
      GraReplyEntry graReplyEntry (source, srcAddress, m_gratReplyHoldoff + Simulator::Now ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2745
      m_graReply.AddEntry (graReplyEntry);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2746
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2747
       * Automatic route shortening
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2748
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2749
      m_finalRoute.clear ();      // Clear the final route vector
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2750
      /**
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2751
       * Push back the node addresses other than those between srcAddress and our own ip address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2752
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2753
      std::vector<Ipv4Address>::iterator before = find (nodeList.begin (), nodeList.end (), srcAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2754
      for (std::vector<Ipv4Address>::iterator i = nodeList.begin (); i != before; ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2755
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2756
          m_finalRoute.push_back (*i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2757
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2758
      m_finalRoute.push_back (srcAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2759
      std::vector<Ipv4Address>::iterator after = find (nodeList.begin (), nodeList.end (), m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2760
      for (std::vector<Ipv4Address>::iterator j = after; j != nodeList.end (); ++j)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2761
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2762
          m_finalRoute.push_back (*j);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2763
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2764
      DsrOptionRrepHeader rrep;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2765
      rrep.SetNodesAddress (m_finalRoute);           // Set the node addresses in the route reply header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2766
      // Get the real reply source and destination
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2767
      Ipv4Address replySrc = m_finalRoute.back ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2768
      Ipv4Address replyDst = m_finalRoute.front ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2769
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2770
       * Set the route and use it in send back route reply
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2771
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2772
      m_ipv4Route = SetRoute (srcAddress, m_mainAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2773
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2774
       * This part adds DSR header to the packet and send reply
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2775
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2776
      DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2777
      dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2778
      dsrRoutingHeader.SetMessageType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2779
      dsrRoutingHeader.SetSourceId (GetIDfromIP (replySrc));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2780
      dsrRoutingHeader.SetDestId (GetIDfromIP (replyDst));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2781
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2782
      uint8_t length = rrep.GetLength ();        // Get the length of the rrep header excluding the type header
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2783
      dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2784
      dsrRoutingHeader.AddDsrOption (rrep);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2785
      Ptr<Packet> newPacket = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2786
      newPacket->AddHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2787
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2788
       * Send gratuitous reply
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2789
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2790
      NS_LOG_INFO ("Send back gratuitous route reply");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2791
      SendReply (newPacket, m_mainAddress, srcAddress, m_ipv4Route);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2792
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2793
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2794
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2795
      NS_LOG_INFO ("The same gratuitous route reply has already sent");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2796
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2797
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2798
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2799
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2800
DsrRouting::SendReply (Ptr<Packet> packet,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2801
                       Ipv4Address source,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2802
                       Ipv4Address nextHop,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2803
                       Ptr<Ipv4Route> route)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2804
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2805
  NS_LOG_FUNCTION (this << packet << source << nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2806
  NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2807
  Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2808
  route->SetOutputDevice (dev);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2809
  NS_LOG_INFO ("The output device " << dev << " packet is: " << *packet);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2810
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2811
  uint32_t priority = GetPriority (DSR_CONTROL_PACKET);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2812
  std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = m_priorityQueue.find (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2813
  Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = i->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2814
  NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2815
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2816
  DsrNetworkQueueEntry newEntry (packet, source, nextHop, Simulator::Now (), route);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2817
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2818
  if (dsrNetworkQueue->Enqueue (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2819
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2820
      Scheduler (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2821
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2822
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2823
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2824
      NS_LOG_INFO ("Packet dropped as dsr network queue is full");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2825
    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2826
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2827
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2828
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2829
DsrRouting::ScheduleInitialReply (Ptr<Packet> packet,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2830
                                  Ipv4Address source,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2831
                                  Ipv4Address nextHop,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2832
                                  Ptr<Ipv4Route> route)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2833
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2834
  NS_LOG_FUNCTION (this << packet << source << nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2835
  Simulator::ScheduleNow (&DsrRouting::SendReply, this,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2836
                          packet, source, nextHop, route);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2837
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2838
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2839
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2840
DsrRouting::ScheduleCachedReply (Ptr<Packet> packet,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2841
                                 Ipv4Address source,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2842
                                 Ipv4Address destination,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2843
                                 Ptr<Ipv4Route> route,
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2844
                                 double hops)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2845
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2846
  NS_LOG_FUNCTION (this << packet << source << destination);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2847
  Simulator::Schedule (Time (2 * m_nodeTraversalTime * (hops - 1 + UniformVariable ().GetValue (0,1))), &DsrRouting::SendReply, this, packet, source, destination, route);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2848
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2849
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2850
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2851
DsrRouting::SendAck   (uint16_t ackId,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2852
                       Ipv4Address destination,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2853
                       Ipv4Address realSrc,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2854
                       Ipv4Address realDst,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2855
                       uint8_t protocol,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2856
                       Ptr<Ipv4Route> route)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2857
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2858
  NS_LOG_FUNCTION (this << ackId << destination << realSrc << realDst << (uint32_t)protocol << route);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2859
  NS_ASSERT_MSG (!m_downTarget.IsNull (), "Error, DsrRouting cannot send downward");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2860
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2861
  // This is a route reply option header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2862
  DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2863
  dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2864
  dsrRoutingHeader.SetMessageType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2865
  dsrRoutingHeader.SetSourceId (GetIDfromIP (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2866
  dsrRoutingHeader.SetDestId (GetIDfromIP (destination));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2867
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2868
  DsrOptionAckHeader ack;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2869
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2870
   * Set the ack Id and set the ack source address and destination address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2871
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2872
  ack.SetAckId (ackId);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2873
  ack.SetRealSrc (realSrc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2874
  ack.SetRealDst (realDst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2875
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2876
  uint8_t length = ack.GetLength ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2877
  dsrRoutingHeader.SetPayloadLength (uint16_t(length) + 2);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2878
  dsrRoutingHeader.AddDsrOption (ack);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2879
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2880
  Ptr<Packet> packet = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2881
  packet->AddHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2882
  Ptr<NetDevice> dev = m_ip->GetNetDevice (m_ip->GetInterfaceForAddress (m_mainAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2883
  route->SetOutputDevice (dev);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2884
  NS_LOG_DEBUG ("Send out the ACK");
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2885
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2886
  uint32_t priority = GetPriority (DSR_CONTROL_PACKET);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2887
  std::map<uint32_t, Ptr<dsr::DsrNetworkQueue> >::iterator i = m_priorityQueue.find (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2888
  Ptr<dsr::DsrNetworkQueue> dsrNetworkQueue = i->second;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2889
  NS_LOG_DEBUG("Will be inserting into priority queue " << dsrNetworkQueue << " number: " << priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2890
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2891
  DsrNetworkQueueEntry newEntry (packet, m_mainAddress, destination, Simulator::Now (), route);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2892
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2893
  if (dsrNetworkQueue->Enqueue (newEntry))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2894
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2895
      Scheduler (priority);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2896
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2897
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2898
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2899
      NS_LOG_INFO ("Packet dropped as dsr network queue is full");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2900
    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2901
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2902
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  2903
enum IpL4Protocol::RxStatus
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2904
DsrRouting::Receive (Ptr<Packet> p,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2905
                     Ipv4Header const &ip,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2906
                     Ptr<Ipv4Interface> incomingInterface)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2907
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2908
  NS_LOG_FUNCTION (this << p << ip << incomingInterface);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2909
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2910
  NS_LOG_INFO ("Our own IP address " << m_mainAddress << " The incoming interface address " << incomingInterface);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2911
  m_node = GetNode ();                        // Get the node
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2912
  Ptr<Packet> packet = p->Copy ();            // Save a copy of the received packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2913
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2914
   * When forwarding or local deliver packets, this one should be used always!!
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2915
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2916
  DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2917
  packet->RemoveHeader (dsrRoutingHeader);          // Remove the DSR header in whole
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2918
  Ptr<Packet> copy = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2919
  uint8_t protocol = dsrRoutingHeader.GetNextHeader ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2920
  uint32_t sourceId = dsrRoutingHeader.GetSourceId ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2921
  Ipv4Address source = GetIPfromID (sourceId);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2922
  NS_LOG_DEBUG ("The source address " << source << " with source id " << sourceId);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2923
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2924
   * Get the IP source and destination address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2925
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2926
  Ipv4Address src = ip.GetSource ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2927
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2928
  bool isPromisc = false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2929
  uint32_t offset = dsrRoutingHeader.GetDsrOptionsOffset ();        // Get the offset for option header, 8 bytes in this case
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2930
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2931
  // This packet is used to peek option type
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2932
  p->RemoveAtStart (offset);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2933
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2934
  Ptr<dsr::DsrOptions> dsrOption;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2935
  DsrOptionHeader dsrOptionHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2936
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2937
   * Peek data to get the option type as well as length and segmentsLeft field
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2938
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2939
  uint32_t size = p->GetSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2940
  uint8_t *data = new uint8_t[size];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2941
  p->CopyData (data, size);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2942
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2943
  uint8_t optionType = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2944
  uint8_t optionLength = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2945
  uint8_t segmentsLeft = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2946
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2947
  optionType = *(data);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  2948
  NS_LOG_LOGIC ("The option type value " << (uint32_t)optionType << " with packet size " << p->GetSize());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2949
  dsrOption = GetOption (optionType);       // Get the relative dsr option and demux to the process function
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2950
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2951
  if (optionType == 1)        // This is the request option
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2952
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2953
      BlackList *blackList = m_rreqTable->FindUnidirectional (src);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2954
      if (blackList)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2955
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2956
          NS_LOG_DEBUG ("Discard this packet due to unidirectional link");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2957
          m_dropTrace (p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2958
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2959
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2960
      dsrOption = GetOption (optionType);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2961
      optionLength = dsrOption->Process (p, packet, m_mainAddress, source, ip, protocol, isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2962
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2963
      if (optionLength == 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2964
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2965
          NS_LOG_DEBUG ("Discard this packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2966
          m_dropTrace (p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2967
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2968
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2969
  else if (optionType == 2)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2970
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2971
      dsrOption = GetOption (optionType);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2972
      optionLength = dsrOption->Process (p, packet, m_mainAddress, source, ip, protocol, isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2973
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2974
      if (optionLength == 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2975
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2976
          NS_LOG_DEBUG ("Discard this packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2977
          m_dropTrace (p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2978
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2979
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2980
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2981
  else if (optionType == 32)       // This is the ACK option
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2982
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2983
      NS_LOG_DEBUG ("This is the ack option");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2984
      dsrOption = GetOption (optionType);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2985
      optionLength = dsrOption->Process (p, packet, m_mainAddress, source, ip, protocol, isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2986
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2987
      if (optionLength == 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2988
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2989
          NS_LOG_DEBUG ("Discard this packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2990
          m_dropTrace (p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2991
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2992
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2993
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2994
  else if (optionType == 3)       // This is a route error header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2995
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2996
      // populate this route error
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2997
      NS_LOG_DEBUG ("The option type value " << (uint32_t)optionType);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2998
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  2999
      dsrOption = GetOption (optionType);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3000
      optionLength = dsrOption->Process (p, packet, m_mainAddress, source, ip, protocol, isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3001
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3002
      if (optionLength == 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3003
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3004
          NS_LOG_DEBUG ("Discard this packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3005
          m_dropTrace (p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3006
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3007
      NS_LOG_DEBUG ("The option Length " << (uint32_t)optionLength);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3008
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3009
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3010
  else if (optionType == 96)       // This is the source route option
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3011
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3012
      NS_LOG_DEBUG ("This is the source route option " << (uint32_t)optionType);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3013
      dsrOption = GetOption (optionType);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3014
      optionLength = dsrOption->Process (p, packet, m_mainAddress, source, ip, protocol, isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3015
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3016
      segmentsLeft = *(data + 3);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3017
      NS_LOG_DEBUG ("The segments left in source route header " << (uint32_t)segmentsLeft);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3018
      if (optionLength == 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3019
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3020
          NS_LOG_DEBUG ("Discard this packet");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3021
          m_dropTrace (p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3022
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3023
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3024
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3025
          if (segmentsLeft == 0)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3026
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3027
              // / Get the next header
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3028
              uint8_t nextHeader = dsrRoutingHeader.GetNextHeader ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3029
              Ptr<Ipv4L3Protocol> l3proto = m_node->GetObject<Ipv4L3Protocol> ();
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3030
              Ptr<IpL4Protocol> nextProto = l3proto->GetProtocol (nextHeader);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3031
              if (nextProto != 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3032
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3033
                  // we need to make a copy in the unlikely event we hit the
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3034
                  // RX_ENDPOINT_UNREACH code path
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3035
                  // Here we can use the packet that has been get off whole DSR header
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3036
                  NS_LOG_DEBUG ("The packet size here " << copy->GetSize());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3037
                  NS_LOG_DEBUG ("The packet received " << *copy);
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3038
                  enum IpL4Protocol::RxStatus status =
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3039
                    nextProto->Receive (copy, ip, incomingInterface);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3040
                  NS_LOG_DEBUG ("The receive status " << status);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3041
                  switch (status)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3042
                    {
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3043
                      case IpL4Protocol::RX_OK:
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3044
                      // fall through
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3045
                      case IpL4Protocol::RX_ENDPOINT_CLOSED:
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3046
                      // fall through
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3047
                      case IpL4Protocol::RX_CSUM_FAILED:
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3048
                        break;
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3049
                      case IpL4Protocol::RX_ENDPOINT_UNREACH:
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3050
                      if (ip.GetDestination ().IsBroadcast () == true
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3051
                          || ip.GetDestination ().IsMulticast () == true)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3052
                        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3053
                          break;       // Do not reply to broadcast or multicast
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3054
                        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3055
                      // Another case to suppress ICMP is a subnet-directed broadcast
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3056
                    }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3057
                  return status;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3058
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3059
            }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3060
          else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3061
            {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3062
              NS_LOG_INFO ("This is not the final destination, the packet has already been forward to next hop");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  3063
            }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3064
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3065
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3066
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3067
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3068
      NS_LOG_LOGIC ("Unknown Option. Drop!");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3069
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3070
       * Initialize the salvage value to 0
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3071
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3072
      uint8_t salvage = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3073
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3074
      DsrOptionRerrUnsupportHeader rerrUnsupportHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3075
      rerrUnsupportHeader.SetErrorType (3);               // The error type 3 means Option not supported
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3076
      rerrUnsupportHeader.SetErrorSrc (m_mainAddress);       // The error source address is our own address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3077
      rerrUnsupportHeader.SetUnsupported (optionType);       // The unsupported option type number
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3078
      rerrUnsupportHeader.SetErrorDst (src);              // Error destination address is the destination of the data packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3079
      rerrUnsupportHeader.SetSalvage (salvage);           // Set the value about whether to salvage a packet or not
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3080
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3081
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3082
       * The unknow option error is not supported currently in this implementation, and it's also not likely to
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3083
       * happen in simulations
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3084
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3085
//            SendError (rerrUnsupportHeader, 0, protocol); // Send the error packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3086
    }
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3087
  return IpL4Protocol::RX_OK;
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3088
}
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3089
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3090
enum IpL4Protocol::RxStatus
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3091
DsrRouting::Receive (Ptr<Packet> p,
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3092
                     Ipv6Address &src,
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3093
                     Ipv6Address &dst,
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3094
                     Ptr<Ipv6Interface> incomingInterface)
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3095
{
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3096
  NS_LOG_FUNCTION (this << p << src << dst << incomingInterface);
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3097
  return IpL4Protocol::RX_ENDPOINT_UNREACH;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3098
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3099
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3100
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3101
DsrRouting::SetDownTarget (DownTargetCallback callback)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3102
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3103
  m_downTarget = callback;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3104
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3105
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3106
void
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3107
DsrRouting::SetDownTarget6 (DownTargetCallback6 callback)
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3108
{
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3109
  NS_FATAL_ERROR ("Unimplemented");
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3110
}
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3111
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3112
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3113
IpL4Protocol::DownTargetCallback
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3114
DsrRouting::GetDownTarget (void) const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3115
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3116
  return m_downTarget;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3117
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3118
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3119
IpL4Protocol::DownTargetCallback6
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3120
DsrRouting::GetDownTarget6 (void) const
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3121
{
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3122
  NS_FATAL_ERROR ("Unimplemented");
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3123
  return MakeNullCallback<void,Ptr<Packet>, Ipv6Address, Ipv6Address, uint8_t, Ptr<Ipv6Route> > ();
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3124
}
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
  3125
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3126
void DsrRouting::Insert (Ptr<dsr::DsrOptions> option)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3127
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3128
  m_options.push_back (option);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3129
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3130
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3131
Ptr<dsr::DsrOptions> DsrRouting::GetOption (int optionNumber)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3132
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3133
  for (DsrOptionList_t::iterator i = m_options.begin (); i != m_options.end (); ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3134
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3135
      if ((*i)->GetOptionNumber () == optionNumber)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3136
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3137
          return *i;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3138
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3139
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3140
  return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3141
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3142
}  /* namespace dsr */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  3143
}  /* namespace ns3 */