src/dsr/model/dsr-options.cc
author Peter D. Barnes, Jr. <barnes26@llnl.gov>
Wed, 15 May 2013 14:45:28 -0400
changeset 9782 ed82eb2702d0
parent 9293 854e085e1a01
child 9802 5dea58a3b261
permissions -rw-r--r--
[Coverity] Structurally dead code (UNREACHABLE)
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    39
#include "ns3/ptr.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    40
#include "ns3/log.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    41
#include "ns3/assert.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    42
#include "ns3/fatal-error.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    43
#include "ns3/node.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    44
#include "ns3/uinteger.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    45
#include "ns3/trace-source-accessor.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    46
#include "ns3/udp-header.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    47
#include "ns3/pointer.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    48
#include "ns3/node-list.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    49
#include "ns3/uinteger.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    50
#include "ns3/object-vector.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    51
#include "ns3/ipv4-l3-protocol.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    52
#include "ns3/ipv4-interface.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    53
#include "ns3/ipv4-header.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-route.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    56
#include "ns3/icmpv4-l4-protocol.h"
8753
8d84b96e26bf Update DSR code to ns-3-dev
Tom Henderson <tomh@tomh.org>
parents: 8752
diff changeset
    57
#include "ns3/ip-l4-protocol.h"
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    58
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    59
#include "dsr-option-header.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    60
#include "dsr-options.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    61
#include "dsr-rcache.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    62
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    63
NS_LOG_COMPONENT_DEFINE ("DsrOptions");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    64
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    65
namespace ns3 {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    66
namespace dsr {
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
NS_OBJECT_ENSURE_REGISTERED (DsrOptions);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    69
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    70
TypeId DsrOptions::GetTypeId ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    71
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    72
  static TypeId tid = TypeId ("ns3::dsr::DsrOptions")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    73
    .SetParent<Object> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    74
    .AddAttribute ("OptionNumber", "The Dsr option number.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    75
                   UintegerValue (0),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    76
                   MakeUintegerAccessor (&DsrOptions::GetOptionNumber),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    77
                   MakeUintegerChecker<uint8_t> ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    78
    .AddTraceSource ("Rx", "Receive DSR packet.",
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    79
                     MakeTraceSourceAccessor (&DsrOptions::m_rxPacketTrace))
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
  return tid;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    82
}
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
DsrOptions::DsrOptions ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    85
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    86
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    87
}
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
DsrOptions::~DsrOptions ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    90
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    91
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    92
}
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
void DsrOptions::SetNode (Ptr<Node> node)
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
  NS_LOG_FUNCTION (this << node);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    97
  m_node = node;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    98
}
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
Ptr<Node> DsrOptions::GetNode () const
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
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   103
  return m_node;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   104
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   105
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   106
bool DsrOptions::ContainAddressAfter (Ipv4Address ipv4Address, Ipv4Address destAddress, std::vector<Ipv4Address> &nodeList)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   107
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   108
  NS_LOG_FUNCTION (this << ipv4Address << destAddress);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   109
  std::vector<Ipv4Address>::iterator it = find (nodeList.begin (), nodeList.end (), destAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   110
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   111
  for (std::vector<Ipv4Address>::iterator i = it; i != nodeList.end (); ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   112
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   113
      if ((ipv4Address == (*i)) && ((*i) != nodeList.back ()))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   114
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   115
          return true;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   116
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   117
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   118
  return false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   119
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   120
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   121
std::vector<Ipv4Address>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   122
DsrOptions::CutRoute (Ipv4Address ipv4Address, std::vector<Ipv4Address> &nodeList)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   123
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   124
  NS_LOG_FUNCTION (this << ipv4Address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   125
  std::vector<Ipv4Address>::iterator it = find (nodeList.begin (), nodeList.end (), ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   126
  std::vector<Ipv4Address> cutRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   127
  for (std::vector<Ipv4Address>::iterator i = it; i != nodeList.end (); ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   128
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   129
      cutRoute.push_back (*i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   130
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   131
  return cutRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   132
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   133
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   134
Ptr<Ipv4Route> DsrOptions::SetRoute (Ipv4Address nextHop, Ipv4Address srcAddress)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   135
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   136
  NS_LOG_FUNCTION (this << nextHop << srcAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   137
  m_ipv4Route = Create<Ipv4Route> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   138
  m_ipv4Route->SetDestination (nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   139
  m_ipv4Route->SetGateway (nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   140
  m_ipv4Route->SetSource (srcAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   141
  return m_ipv4Route;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   142
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   143
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   144
bool DsrOptions::ReverseRoutes (std::vector<Ipv4Address> & vec)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   145
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   146
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   147
  std::vector<Ipv4Address> vec2 (vec);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   148
  vec.clear ();    // To ensure vec is empty before start
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   149
  for (std::vector<Ipv4Address>::reverse_iterator ri = vec2.rbegin (); ri
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   150
       != vec2.rend (); ++ri)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   151
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   152
      vec.push_back (*ri);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   153
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   154
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   155
  if ((vec.size () == vec2.size ()) && (vec.front () == vec2.back ()))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   156
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   157
      return true;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   158
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   159
  return false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   160
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   161
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   162
Ipv4Address DsrOptions::SearchNextHop (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   163
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   164
  NS_LOG_FUNCTION (this << ipv4Address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   165
  Ipv4Address nextHop;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   166
  NS_LOG_DEBUG ("the vector size " << vec.size ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   167
  if (vec.size () == 2)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   168
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   169
      NS_LOG_DEBUG ("The two nodes are neighbors");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   170
      nextHop = vec[1];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   171
      return nextHop;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   172
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   173
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   174
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   175
      if (ipv4Address == vec.back ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   176
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   177
          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
   178
          return ipv4Address;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   179
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   180
      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
   181
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   182
          if (ipv4Address == (*i))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   183
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   184
              nextHop = *(++i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   185
              return nextHop;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   186
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   187
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   188
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   189
  NS_LOG_DEBUG ("next hop address not found, route corrupted");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   190
  Ipv4Address none = "0.0.0.0";
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   191
  return none;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   192
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   193
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   194
Ipv4Address DsrOptions::ReverseSearchNextHop (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   195
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   196
  NS_LOG_FUNCTION (this << ipv4Address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   197
  Ipv4Address nextHop;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   198
  if (vec.size () == 2)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   199
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   200
      NS_LOG_DEBUG ("The two nodes are neighbors");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   201
      nextHop = vec[0];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   202
      return nextHop;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   203
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   204
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   205
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   206
      for (std::vector<Ipv4Address>::reverse_iterator ri = vec.rbegin (); ri != vec.rend (); ++ri)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   207
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   208
          if (ipv4Address == (*ri))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   209
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   210
              nextHop = *(++ri);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   211
              return nextHop;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   212
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   213
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   214
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   215
  NS_LOG_DEBUG ("next hop address not found, route corrupted");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   216
  Ipv4Address none = "0.0.0.0";
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   217
  return none;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   218
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   219
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   220
Ipv4Address DsrOptions::ReverseSearchNextTwoHop  (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec)
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   221
{
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   222
  NS_LOG_FUNCTION (this << ipv4Address);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   223
  Ipv4Address nextTwoHop;
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   224
  NS_LOG_DEBUG ("The vector size " << vec.size ());
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   225
  NS_ASSERT (vec.size () > 2);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   226
  for (std::vector<Ipv4Address>::reverse_iterator ri = vec.rbegin (); ri != vec.rend (); ++ri)
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   227
    {
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   228
      if (ipv4Address == (*ri))
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   229
        {
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   230
          nextTwoHop = *(ri + 2);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   231
          return nextTwoHop;
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   232
        }
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   233
    }
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   234
  NS_FATAL_ERROR ("next hop address not found, route corrupted");
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   235
  Ipv4Address none = "0.0.0.0";
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   236
  return none;
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   237
}
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   238
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   239
void DsrOptions::PrintVector (std::vector<Ipv4Address>& vec)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   240
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   241
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   242
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   243
   * Check elements in a route vector
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   244
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   245
  if (!vec.size ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   246
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   247
      NS_LOG_DEBUG ("The vector is empty");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   248
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   249
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   250
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   251
      NS_LOG_DEBUG ("Print all the elements in a vector");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   252
      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
   253
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   254
          NS_LOG_DEBUG ("The ip address " << *i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   255
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   256
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   257
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   258
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   259
bool DsrOptions::IfDuplicates (std::vector<Ipv4Address>& vec, std::vector<Ipv4Address>& vec2)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   260
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   261
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   262
  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
   263
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   264
      for (std::vector<Ipv4Address>::const_iterator j = vec2.begin (); j != vec2.end (); ++j)
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
          if ((*i) == (*j))
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
              return true;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   269
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   270
          else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   271
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   272
              continue;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   273
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   274
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   275
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   276
  return false;
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   279
bool DsrOptions::CheckDuplicates (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   280
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   281
  NS_LOG_FUNCTION (this << ipv4Address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   282
  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
   283
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   284
      if ((*i) == ipv4Address)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   285
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   286
          return true;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   287
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   288
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   289
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   290
          continue;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   291
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   292
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   293
  return false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   294
}
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
void DsrOptions::RemoveDuplicates (std::vector<Ipv4Address>& vec)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   297
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   298
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   299
  //Remove duplicate ip address from the route if any, should not happen with normal behavior nodes
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   300
  std::vector<Ipv4Address> vec2 (vec); // declare vec2 as a copy of the vec
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   301
  PrintVector (vec2); // Print all the ip address in the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   302
  vec.clear (); // clear vec
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   303
  for (std::vector<Ipv4Address>::const_iterator i = vec2.begin (); i != vec2.end (); ++i)
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
      if (vec.empty ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   306
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   307
          vec.push_back (*i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   308
          continue;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   309
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   310
      else
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
          for (std::vector<Ipv4Address>::iterator j = vec.begin (); j != vec.end (); ++j)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   313
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   314
              if ((*i) == (*j))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   315
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   316
                  if ((j + 1) != vec.end ())
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
                      vec.erase (j + 1, vec.end ());   // Automatic shorten the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   319
                      break;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   320
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   321
                  else
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
                      break;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   324
                    }
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
              else if (j == (vec.end () - 1))
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
                  vec.push_back (*i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   329
                  break;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   330
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   331
              else
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
                  continue;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   334
                }
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
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   337
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   338
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   339
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   340
uint32_t
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   341
DsrOptions::GetIDfromIP (Ipv4Address address)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   342
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   343
  NS_LOG_FUNCTION (this << address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   344
  int32_t nNodes = NodeList::GetNNodes ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   345
  for (int32_t i = 0; i < nNodes; ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   346
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   347
      Ptr<Node> node = NodeList::GetNode (i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   348
      Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   349
      if (ipv4->GetAddress (1, 0).GetLocal () == address)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   350
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   351
          return i;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   352
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   353
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   354
  return 255;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   355
}
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
Ptr<Node> DsrOptions::GetNodeWithAddress (Ipv4Address ipv4Address)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   358
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   359
  NS_LOG_FUNCTION (this << ipv4Address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   360
  int32_t nNodes = NodeList::GetNNodes ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   361
  for (int32_t i = 0; i < nNodes; ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   362
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   363
      Ptr<Node> node = NodeList::GetNode (i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   364
      Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   365
      int32_t ifIndex = ipv4->GetInterfaceForAddress (ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   366
      if (ifIndex != -1)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   367
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   368
          return node;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   369
        }
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
  return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   372
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   373
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   374
NS_OBJECT_ENSURE_REGISTERED (DsrOptionPad1);
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
TypeId DsrOptionPad1::GetTypeId ()
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
  static TypeId tid = TypeId ("ns3::dsr::DsrOptionPad1")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   379
    .SetParent<DsrOptions> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   380
    .AddConstructor<DsrOptionPad1> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   381
  ;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   382
  return tid;
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   385
DsrOptionPad1::DsrOptionPad1 ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   386
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   387
  NS_LOG_FUNCTION_NOARGS ();
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   390
DsrOptionPad1::~DsrOptionPad1 ()
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
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   393
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   394
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   395
uint8_t DsrOptionPad1::GetOptionNumber () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   396
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   397
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   398
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   399
  return OPT_NUMBER;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   400
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   401
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   402
uint8_t DsrOptionPad1::Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   403
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   404
  NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   405
  Ptr<Packet> p = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   406
  DsrOptionPad1Header pad1Header;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   407
  p->RemoveHeader (pad1Header);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   408
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   409
  isPromisc = false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   410
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   411
  return pad1Header.GetSerializedSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   412
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   413
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   414
NS_OBJECT_ENSURE_REGISTERED (DsrOptionPadn);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   415
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   416
TypeId DsrOptionPadn::GetTypeId ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   417
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   418
  static TypeId tid = TypeId ("ns3::dsr::DsrOptionPadn")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   419
    .SetParent<DsrOptions> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   420
    .AddConstructor<DsrOptionPadn> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   421
  ;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   422
  return tid;
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   425
DsrOptionPadn::DsrOptionPadn ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   426
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   427
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   428
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   429
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   430
DsrOptionPadn::~DsrOptionPadn ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   431
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   432
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   433
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   434
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   435
uint8_t DsrOptionPadn::GetOptionNumber () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   436
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   437
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   438
  return OPT_NUMBER;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   439
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   440
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   441
uint8_t DsrOptionPadn::Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   442
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   443
  NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   444
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   445
  Ptr<Packet> p = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   446
  DsrOptionPadnHeader padnHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   447
  p->RemoveHeader (padnHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   448
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   449
  isPromisc = false;
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
  return padnHeader.GetSerializedSize ();
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
NS_OBJECT_ENSURE_REGISTERED (DsrOptionRreq);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   455
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   456
TypeId DsrOptionRreq::GetTypeId ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   457
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   458
  static TypeId tid = TypeId ("ns3::dsr::DsrOptionRreq")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   459
    .SetParent<DsrOptions> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   460
    .AddConstructor<DsrOptionRreq> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   461
  ;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   462
  return tid;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   463
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   464
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   465
TypeId DsrOptionRreq::GetInstanceTypeId () const
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
  return GetTypeId ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   468
}
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
DsrOptionRreq::DsrOptionRreq ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   471
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   472
  NS_LOG_FUNCTION_NOARGS ();
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   475
DsrOptionRreq::~DsrOptionRreq ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   476
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   477
  NS_LOG_FUNCTION_NOARGS ();
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
uint8_t DsrOptionRreq::GetOptionNumber () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   481
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   482
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   483
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   484
  return OPT_NUMBER;
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
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   487
uint8_t DsrOptionRreq::Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   488
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   489
  NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   490
  // Fields from IP header
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   491
  Ipv4Address srcAddress = ipv4Header.GetSource ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   492
  /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   493
   * \ when the ip source address is equal to the address of our own, this is request packet originated
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   494
   * \ by the node itself, discard it
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
  if (srcAddress == ipv4Address)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   497
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   498
      NS_LOG_DEBUG ("Discard the packet");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   499
      m_dropTrace (packet); // call the drop trace to show in the tracing
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   500
      return 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   501
    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   502
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   503
   * Get the node associated with the ipv4 address and get several objects from the node and leave for further use
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   504
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   505
  Ptr<Node> node = GetNodeWithAddress (ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   506
  Ptr<dsr::DsrRouting> dsr = node->GetObject<dsr::DsrRouting> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   507
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   508
  Ptr<Packet> p = packet->Copy (); // Note: The packet here doesn't contain the fixed size dsr header
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   509
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   510
   * \brief Get the number of routers' address field before removing the header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   511
   * \peek the packet and get the value
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   512
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   513
  uint8_t buf[2];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   514
  p->CopyData (buf, sizeof(buf));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   515
  uint8_t numberAddress = (buf[1] - 6) / 4;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   516
  NS_LOG_DEBUG ("The number of Ip addresses " << (uint32_t)numberAddress);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   517
  if (numberAddress >= 255)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   518
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   519
      NS_LOG_DEBUG ("Discard the packet, malformed header since two many ip addresses in route");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   520
      m_dropTrace (packet); // call the drop trace to show in the tracing
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   521
      return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   522
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   523
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   524
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   525
   * Create the dsr rreq header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   526
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   527
  DsrOptionRreqHeader rreq;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   528
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   529
   * Set the number of addresses with the value from peek data and remove the rreq header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   530
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   531
  rreq.SetNumberAddress (numberAddress);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   532
  // Remove the route request header
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   533
  p->RemoveHeader (rreq);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   534
  // Verify the option length
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   535
  uint8_t length = rreq.GetLength ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   536
  if (length % 2 != 0)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   537
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   538
      NS_LOG_LOGIC ("Malformed header. Drop!");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   539
      m_dropTrace (packet); // call drop trace
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   540
      return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   541
    }
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   542
  // Check the rreq id for verifying the request id
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   543
  uint16_t requestId = rreq.GetId ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   544
  // The target address is where we want to send the data packets
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   545
  Ipv4Address targetAddress = rreq.GetTarget ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   546
  // Get the node list and source address from the route request header
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   547
  std::vector<Ipv4Address> mainVector = rreq.GetNodesAddresses ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   548
  std::vector<Ipv4Address> nodeList (mainVector);
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   549
  // Get the real source address of this request, it will be used when checking if we have received the save
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   550
  // route request before or not
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   551
  Ipv4Address sourceAddress = nodeList.front ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   552
  PrintVector (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   553
  /*
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   554
   * Construct the dsr routing header for later use
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   555
   */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   556
  DsrRoutingHeader dsrRoutingHeader;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   557
  dsrRoutingHeader.SetNextHeader (protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   558
  dsrRoutingHeader.SetMessageType (1);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   559
  dsrRoutingHeader.SetSourceId (GetIDfromIP (source));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   560
  dsrRoutingHeader.SetDestId (255);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   561
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   562
  // check whether we have received this request or not, if not, it will save the request in the table for
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   563
  // later use, if not found, return false, and push the newly received source request entry in the cache
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   564
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   565
  bool dupRequest = dsr->FindSourceEntry (sourceAddress, targetAddress, requestId);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   566
  /*
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   567
   * Before processing the route request, we need to check two things
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   568
   * 1. if this is the exact same request we have just received, ignore it
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   569
   * 2. if our address is already in the path list, ignore it
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   570
   * 3. otherwise process further
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   571
   */
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   572
  if (dupRequest)
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   573
    {
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   574
      NS_LOG_DEBUG ("We have received duplicate request");
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   575
      // We have received this same route reqeust before, not forwarding it now
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   576
      NS_LOG_LOGIC ("Duplicate request. Drop!");
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   577
      m_dropTrace (packet); // call drop trace
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   578
      return 0;
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   579
    }
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   580
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   581
  else if (CheckDuplicates (ipv4Address, nodeList))
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   582
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   583
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   584
       * if the route contains the node address already, drop the request packet
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
      m_dropTrace (packet);    // call drop trace
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   587
      NS_LOG_DEBUG ("Our node address is already seen in the route, drop the request");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   588
      return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   589
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   590
  else
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
      // A node ignores all RREQs received from any node in its blacklist
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   593
      RouteCacheEntry toPrev;
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   594
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   595
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   596
       *  When the reverse route is created or updated, the following actions on the route are also carried out:
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   597
       *  3. the next hop in the routing table becomes the node from which the  RREQ was received
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   598
       *  4. the hop count is copied from the Hop Count in the RREQ message;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   599
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   600
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   601
      //  A node generates a RREP if either:
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   602
      //  (i)  it is itself the destination,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   603
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   604
       * The target address equal to our own ip address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   605
       */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   606
      NS_LOG_DEBUG ("The target address over here " << targetAddress << " and the ip address " << ipv4Address << " and the source address " << mainVector[0]);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   607
      if (targetAddress == ipv4Address)
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
          Ipv4Address nextHop; // Declare the next hop address to use
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   610
          if (nodeList.size () == 1)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   611
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   612
              NS_LOG_DEBUG ("These two nodes are neighbors");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   613
              m_finalRoute.clear ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   614
              m_finalRoute.push_back (srcAddress);     // push back the request originator's address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   615
              m_finalRoute.push_back (ipv4Address);    // push back our own address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   616
              nextHop = srcAddress;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   617
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   618
          else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   619
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   620
              std::vector<Ipv4Address> changeRoute (nodeList);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   621
              changeRoute.push_back (ipv4Address);    // push back our own address
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   622
              m_finalRoute.clear ();              // get a clear route vector
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   623
              for (std::vector<Ipv4Address>::iterator i = changeRoute.begin (); i != changeRoute.end (); ++i)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   624
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   625
                  m_finalRoute.push_back (*i);  // Get the full route from source to destination
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   626
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   627
              PrintVector (m_finalRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   628
              nextHop = ReverseSearchNextHop (ipv4Address, m_finalRoute); // get the next hop
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   629
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   630
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   631
          DsrOptionRrepHeader rrep;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   632
          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
   633
          NS_LOG_DEBUG ("The nextHop address " << nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   634
          Ipv4Address replyDst = m_finalRoute.front ();
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
           * This part add dsr header to the packet and send route reply packet
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
          DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   639
          dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   640
          dsrRoutingHeader.SetMessageType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   641
          dsrRoutingHeader.SetSourceId (GetIDfromIP (ipv4Address));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   642
          dsrRoutingHeader.SetDestId (GetIDfromIP (replyDst));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   643
          // Set the route for route reply
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   644
          SetRoute (nextHop, ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   645
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   646
          uint8_t length = rrep.GetLength ();  // Get the length of the rrep header excluding the type header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   647
          dsrRoutingHeader.SetPayloadLength (length + 2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   648
          dsrRoutingHeader.AddDsrOption (rrep);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   649
          Ptr<Packet> newPacket = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   650
          newPacket->AddHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   651
          dsr->ScheduleInitialReply (newPacket, ipv4Address, nextHop, m_ipv4Route);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   652
          /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   653
           * Create the route entry to the rreq originator and save it to route cache, also need to reverse the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   654
           */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   655
          PrintVector (m_finalRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   656
          if (ReverseRoutes (m_finalRoute))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   657
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   658
              PrintVector (m_finalRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   659
              Ipv4Address dst = m_finalRoute.back ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   660
              bool addRoute = false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   661
              if (numberAddress > 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   662
                {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8753
diff changeset
   663
                  RouteCacheEntry toSource (/*IP_VECTOR=*/ m_finalRoute, /*dst=*/
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8753
diff changeset
   664
                                                           dst, /*expire time=*/ ActiveRouteTimeout);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   665
                  if (dsr->IsLinkCache ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   666
                    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   667
                      addRoute = dsr->AddRoute_Link (m_finalRoute, ipv4Address);
8751
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
                  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   670
                    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   671
                      addRoute = dsr->AddRoute (toSource);
8751
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
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   674
              else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   675
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   676
                  NS_LOG_DEBUG ("Abnormal RouteRequest");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   677
                  return 0;
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   680
              if (addRoute)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   681
                {
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
                   * Found a route to the dst, construct the source route option header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   684
                   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   685
                  DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   686
                  NS_LOG_DEBUG ("The route length " << m_finalRoute.size ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   687
                  sourceRoute.SetNodesAddress (m_finalRoute);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   688
                  if (dsr->IsLinkCache ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   689
                    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   690
                      dsr->UseExtends (m_finalRoute);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   691
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   692
                  sourceRoute.SetSegmentsLeft ((m_finalRoute.size () - 2));
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   693
                  // The salvage value here is 0
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   694
                  sourceRoute.SetSalvage (0);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   695
                  Ipv4Address nextHop = SearchNextHop (ipv4Address, m_finalRoute); // Get the next hop address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   696
                  NS_LOG_DEBUG ("The nextHop address " << nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   697
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   698
                  if (nextHop == "0.0.0.0")
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
                      dsr->PacketNewRoute (dsrP, ipv4Address, dst, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   701
                      return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   702
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   703
                  SetRoute (nextHop, ipv4Address);
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
                   * Send the data packet from the send buffer
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   706
                   */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   707
                  dsr->SendPacketFromBuffer (sourceRoute, nextHop, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   708
                  // Cancel the route request timer for destination after sending the data packet
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   709
                  dsr->CancelRreqTimer (dst, true);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   710
                }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   711
              else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   712
                {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   713
                  NS_LOG_DEBUG ("The route is failed to add in cache");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   714
                  return 0;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   715
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   716
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   717
          else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   718
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   719
              NS_LOG_DEBUG ("Unable to reverse route");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   720
              return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   721
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   722
          isPromisc = false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   723
          return rreq.GetSerializedSize ();
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   726
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   727
       * (ii) or it has an active route to the destination, send reply based on request header and route cache,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   728
       *      need to delay based on a random value from d = H * (h - 1 + r), which can avoid possible route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   729
       *      reply storm.
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   730
       */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   731
      else if (dsr->LookupRoute (targetAddress, toPrev))
8751
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
          RouteCacheEntry::IP_VECTOR ip = toPrev.GetVector (); // The route from our own route cache to dst
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   734
          PrintVector (ip);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   735
          std::vector<Ipv4Address> saveRoute (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   736
          PrintVector (saveRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   737
          // Verify if the two vector contains duplicates, if so, do not use
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   738
          // the route found and forward the route request
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   739
          if (!(IfDuplicates (ip, saveRoute)))
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   740
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   741
              m_finalRoute.clear ();            // Clear the final route vector
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   742
              /**
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   743
               * push back the intermediate node address from the source to this node
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   744
               */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   745
              for (std::vector<Ipv4Address>::iterator i = saveRoute.begin (); i != saveRoute.end (); ++i)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   746
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   747
                  m_finalRoute.push_back (*i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   748
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   749
              /**
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   750
               * push back the route vector we found in our route cache to destination, including this node's address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   751
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   752
              for (std::vector<Ipv4Address>::iterator j = ip.begin (); j != ip.end (); ++j)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   753
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   754
                  m_finalRoute.push_back (*j);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   755
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   756
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   757
               * Create the route entry to the rreq originator and save it to route cache, also need to reverse the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   758
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   759
              bool addRoute = false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   760
              std::vector<Ipv4Address> reverseRoute (m_finalRoute);
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
              if (ReverseRoutes (reverseRoute))
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
                  saveRoute.push_back (ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   765
                  ReverseRoutes (saveRoute);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   766
                  Ipv4Address dst = saveRoute.back ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   767
                  NS_LOG_DEBUG ("This is the route save in route cache");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   768
                  PrintVector (saveRoute);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   769
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   770
                  RouteCacheEntry toSource (/*IP_VECTOR=*/ saveRoute, /*dst=*/ dst, /*expire time=*/ ActiveRouteTimeout);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   771
                  NS_ASSERT (saveRoute.front () == ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   772
                  // Add the route entry in the route cache
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   773
                  if (dsr->IsLinkCache ())
8751
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
                      addRoute = dsr->AddRoute_Link (saveRoute, ipv4Address);
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
                      addRoute = dsr->AddRoute (toSource);
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
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   782
                  if (addRoute)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   783
                    {
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   784
                      NS_LOG_LOGIC ("We have added the route and search send buffer for packet with destination " << dst);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   785
                      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   786
                       * 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
   787
                       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   788
                      DsrOptionSRHeader sourceRoute;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   789
                      PrintVector (saveRoute);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   790
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   791
                      sourceRoute.SetNodesAddress (saveRoute);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   792
                      if (dsr->IsLinkCache ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   793
                        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   794
                          dsr->UseExtends (saveRoute);
8751
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
                      sourceRoute.SetSegmentsLeft ((saveRoute.size () - 2));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   797
                      uint8_t salvage = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   798
                      sourceRoute.SetSalvage (salvage);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   799
                      Ipv4Address nextHop = SearchNextHop (ipv4Address, saveRoute); // Get the next hop address
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   800
                      NS_LOG_DEBUG ("The nextHop address " << nextHop);
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
                      if (nextHop == "0.0.0.0")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   803
                        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   804
                          dsr->PacketNewRoute (dsrP, ipv4Address, dst, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   805
                          return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   806
                        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   807
                      SetRoute (nextHop, ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   808
                      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   809
                       * Schedule the packet retry
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   810
                       */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   811
                      dsr->SendPacketFromBuffer (sourceRoute, nextHop, protocol);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   812
                      // Cancel the route request timer for destination
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   813
                      dsr->CancelRreqTimer (dst, true);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   814
                    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   815
                  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   816
                    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   817
                      NS_LOG_DEBUG ("The route is failed to add in cache");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   818
                      return 0;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   819
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   820
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   821
              else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   822
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   823
                  NS_LOG_DEBUG ("Unable to reverse the route");
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   824
                  return 0;
8751
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   827
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   828
               * Need to first pin down the next hop address before removing duplicates
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   829
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   830
              Ipv4Address nextHop = ReverseSearchNextHop (ipv4Address, m_finalRoute);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   831
              NS_LOG_DEBUG ("The nextHop address " << nextHop);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   832
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   833
               * First remove the duplicate ip address to automatically shorten the route, and then reversely
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   834
               * search the next hop address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   835
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   836
              // Set the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   837
              SetRoute (nextHop, ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   838
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   839
              uint16_t hops = m_finalRoute.size ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   840
              DsrOptionRrepHeader rrep;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   841
              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
   842
              // Get the real source of the reply
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   843
              Ipv4Address realSource = m_finalRoute.back ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   844
              PrintVector (m_finalRoute);
8792
8f15de62d18e fix some logging code for optimized builds
Tom Henderson <tomh@tomh.org>
parents: 8756
diff changeset
   845
              NS_LOG_DEBUG ("This is the full route from " << realSource << " to " << m_finalRoute.front ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   846
              /*
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   847
               * This part add dsr header to the packet and send route reply packet
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   848
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   849
              DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   850
              dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   851
              dsrRoutingHeader.SetMessageType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   852
              dsrRoutingHeader.SetSourceId (GetIDfromIP (realSource));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   853
              dsrRoutingHeader.SetDestId (255);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   854
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   855
              uint8_t length = rrep.GetLength ();  // Get the length of the rrep header excluding the type header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   856
              dsrRoutingHeader.SetPayloadLength (length + 2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   857
              dsrRoutingHeader.AddDsrOption (rrep);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   858
              Ptr<Packet> newPacket = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   859
              newPacket->AddHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   860
              dsr->ScheduleCachedReply (newPacket, ipv4Address, nextHop, m_ipv4Route, hops);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   861
              isPromisc = false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   862
            }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   863
          else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   864
            {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   865
              NS_LOG_DEBUG ("There is duplicate ip addresses in the two route parts");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   866
            }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   867
          return rreq.GetSerializedSize ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   868
        }
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
       * (iii) no route in any type has been found
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   871
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   872
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   873
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   874
          mainVector.push_back (ipv4Address);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   875
          NS_ASSERT (mainVector.front () == source);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   876
          NS_LOG_DEBUG ("Print out the main vector");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   877
          PrintVector (mainVector);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   878
          rreq.SetNodesAddress (mainVector);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   879
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   880
          Ptr<Packet> errP = p->Copy ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   881
          if (errP->GetSize ())
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   882
            {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   883
              NS_LOG_DEBUG ("Error header included");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   884
              DsrOptionRerrUnreachHeader rerr;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   885
              p->RemoveHeader (rerr);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   886
              Ipv4Address errorSrc = rerr.GetErrorSrc ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   887
              Ipv4Address unreachNode = rerr.GetUnreachNode ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   888
              Ipv4Address errorDst = rerr.GetErrorDst ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   889
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   890
              if ((errorSrc == srcAddress) && (unreachNode == ipv4Address))
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   891
                {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   892
                  NS_LOG_DEBUG ("The error link back to work again");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   893
                  uint16_t length = rreq.GetLength ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   894
                  NS_LOG_DEBUG ("The RREQ header length " <<  length);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   895
                  dsrRoutingHeader.AddDsrOption (rreq);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   896
                  dsrRoutingHeader.SetPayloadLength (length + 2);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   897
                }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   898
              else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   899
                {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   900
                  dsr->DeleteAllRoutesIncludeLink (errorSrc, unreachNode, ipv4Address);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   901
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   902
                  DsrOptionRerrUnreachHeader newUnreach;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   903
                  newUnreach.SetErrorType (1);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   904
                  newUnreach.SetErrorSrc (errorSrc);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   905
                  newUnreach.SetUnreachNode (unreachNode);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   906
                  newUnreach.SetErrorDst (errorDst);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   907
                  newUnreach.SetSalvage (rerr.GetSalvage ()); // Set the value about whether to salvage a packet or not
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   908
                  uint16_t length = rreq.GetLength () + newUnreach.GetLength ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   909
                  NS_LOG_DEBUG ("The RREQ and newUnreach header length " <<  length);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   910
                  dsrRoutingHeader.SetPayloadLength (length + 4);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   911
                  dsrRoutingHeader.AddDsrOption (rreq);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   912
                  dsrRoutingHeader.AddDsrOption (newUnreach);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   913
                }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   914
            }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   915
          else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   916
            {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   917
              uint16_t length = rreq.GetLength ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   918
              NS_LOG_DEBUG ("The RREQ header length " <<  length);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   919
              dsrRoutingHeader.AddDsrOption (rreq);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   920
              dsrRoutingHeader.SetPayloadLength (length + 2);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   921
            }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   922
          // Get the TTL value
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   923
          uint8_t ttl = ipv4Header.GetTtl ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   924
          /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   925
          * Decrease the TTL value in the packet tag by one, this tag will go to ip layer 3 send function
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   926
          * and drop packet when TTL value equals to 0
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   927
          */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   928
          NS_LOG_DEBUG ("The ttl value here " << (uint32_t)ttl);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   929
          if (ttl)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   930
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   931
              Ptr<Packet> interP = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   932
              SocketIpTtlTag tag;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   933
              tag.SetTtl (ttl - 1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   934
              interP->AddPacketTag (tag);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   935
              interP->AddHeader (dsrRoutingHeader);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   936
              dsr->ScheduleInterRequest (interP);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   937
              isPromisc = false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   938
            }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   939
          return rreq.GetSerializedSize ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   940
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   941
    }
9782
ed82eb2702d0 [Coverity] Structurally dead code (UNREACHABLE)
Peter D. Barnes, Jr. <barnes26@llnl.gov>
parents: 9293
diff changeset
   942
  //unreachable:  return rreq.GetSerializedSize ();
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   943
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   944
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   945
NS_OBJECT_ENSURE_REGISTERED (DsrOptionRrep);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   946
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   947
TypeId DsrOptionRrep::GetTypeId ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   948
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   949
  static TypeId tid = TypeId ("ns3::dsr::DsrOptionRrep")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   950
    .SetParent<DsrOptions> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   951
    .AddConstructor<DsrOptionRrep> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   952
  ;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   953
  return tid;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   954
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   955
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   956
DsrOptionRrep::DsrOptionRrep ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   957
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   958
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   959
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   960
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   961
DsrOptionRrep::~DsrOptionRrep ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   962
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   963
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   964
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   965
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   966
TypeId DsrOptionRrep::GetInstanceTypeId () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   967
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   968
  return GetTypeId ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   969
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   970
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   971
uint8_t DsrOptionRrep::GetOptionNumber () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   972
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   973
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   974
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   975
  return OPT_NUMBER;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   976
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   977
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
   978
uint8_t DsrOptionRrep::Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   979
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   980
  NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc);
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
  Ptr<Packet> p = packet->Copy ();
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
  // Get the number of routers' address field
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   985
  uint8_t buf[2];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   986
  p->CopyData (buf, sizeof(buf));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   987
  uint8_t numberAddress = (buf[1] - 2) / 4;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   988
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   989
  DsrOptionRrepHeader rrep;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   990
  rrep.SetNumberAddress (numberAddress);  // Set the number of ip address in the header to reserver space for deserialize header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   991
  p->RemoveHeader (rrep);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   992
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   993
  Ptr<Node> node = GetNodeWithAddress (ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   994
  Ptr<dsr::DsrRouting> dsr = node->GetObject<dsr::DsrRouting> ();
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
  NS_LOG_DEBUG ("The next header value " << (uint32_t)protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   997
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   998
  std::vector<Ipv4Address> nodeList = rrep.GetNodesAddress ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   999
  /**
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1000
   * Get the destination address, which is the last element in the nodeList
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
  Ipv4Address targetAddress = nodeList.front ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1003
  // If the RREP option has reached to the destination
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1004
  if (targetAddress == ipv4Address)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1005
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1006
      RemoveDuplicates (nodeList); // This is for the route reply from intermediate node since we didn't remove
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1007
                                   // duplicate there
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1008
      if (nodeList.size () == 0)
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
          NS_LOG_DEBUG ("The route we have contains 0 entries");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1011
          return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1012
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1013
      /**
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1014
       * Get the destination address for the data packet, which is the last element in the nodeList
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1015
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1016
      Ipv4Address dst = nodeList.back ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1017
      /**
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1018
       * Add the newly found route to the route cache
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1019
       * The route looks like:
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1020
       * \\ "srcAddress" + "intermediate node address" + "targetAddress"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1021
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1022
      RouteCacheEntry toDestination (/*IP_VECTOR=*/ nodeList, /*dst=*/ dst, /*expire time=*/ ActiveRouteTimeout);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1023
      NS_ASSERT (nodeList.front () == ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1024
      bool addRoute = false;
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8753
diff changeset
  1025
      if (dsr->IsLinkCache ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1026
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1027
          addRoute = dsr->AddRoute_Link (nodeList, ipv4Address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1028
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1029
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1030
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1031
          addRoute = dsr->AddRoute (toDestination);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1032
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1033
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1034
      if (addRoute)
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
          NS_LOG_DEBUG ("We have added the route and search send buffer for packet with destination " << dst);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1037
          /**
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1038
           * 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
  1039
           */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1040
          DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1041
          NS_LOG_DEBUG ("The route length " << nodeList.size ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1042
          sourceRoute.SetNodesAddress (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1043
          sourceRoute.SetSegmentsLeft ((nodeList.size () - 2));
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1044
          sourceRoute.SetSalvage (0);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1045
          Ipv4Address nextHop = SearchNextHop (ipv4Address, nodeList); // Get the next hop address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1046
          NS_LOG_DEBUG ("The nextHop address " << nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1047
          if (nextHop == "0.0.0.0")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1048
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1049
              dsr->PacketNewRoute (dsrP, ipv4Address, dst, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1050
              return 0;
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
          PrintVector (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1053
          SetRoute (nextHop, ipv4Address);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1054
          // Cancel the route request timer for destination
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1055
          dsr->CancelRreqTimer (dst, true);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1056
          /**
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1057
           * Schedule the packet retry
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1058
           */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1059
          dsr->SendPacketFromBuffer (sourceRoute, nextHop, protocol);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1060
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1061
      else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1062
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1063
          NS_LOG_DEBUG ("Failed to add the route");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1064
          return 0;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1065
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1066
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1067
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1068
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1069
      uint8_t length = rrep.GetLength () - 2; // The get length - 2 is to get aligned for the malformed header check
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1070
      NS_LOG_DEBUG ("The length of rrep option " << (uint32_t)length);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1071
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1072
      if (length % 2 != 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1073
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1074
          NS_LOG_LOGIC ("Malformed header. Drop!");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1075
          m_dropTrace (packet);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1076
          return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1077
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1078
      PrintVector (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1079
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1080
       * This node is only an intermediate node, but it needs to save the possible route to the destination when cutting the route
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
      std::vector<Ipv4Address> routeCopy = nodeList;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1083
      std::vector<Ipv4Address> cutRoute = CutRoute (ipv4Address, nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1084
      PrintVector (cutRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1085
      if (cutRoute.size () >= 2)
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
          Ipv4Address dst = cutRoute.back ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1088
          NS_LOG_DEBUG ("The route destination after cut " << dst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1089
          RouteCacheEntry toDestination (/*IP_VECTOR=*/ cutRoute, /*dst=*/ dst, /*expire time=*/ ActiveRouteTimeout);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1090
          NS_ASSERT (cutRoute.front () == ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1091
          bool addRoute = false;
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8753
diff changeset
  1092
          if (dsr->IsLinkCache ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1093
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1094
              addRoute = dsr->AddRoute_Link (nodeList, ipv4Address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1095
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1096
          else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1097
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1098
              addRoute = dsr->AddRoute (toDestination);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1099
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1100
          if (addRoute)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1101
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1102
              dsr->CancelRreqTimer (dst, true);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1103
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1104
          else
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
              NS_LOG_DEBUG ("The route not added");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1107
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1108
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1109
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1110
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1111
          NS_LOG_DEBUG ("The route is corrupted");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1112
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1113
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1114
       * Reverse search the vector for next hop address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1115
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1116
      Ipv4Address nextHop = ReverseSearchNextHop (ipv4Address, routeCopy);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1117
      NS_ASSERT (routeCopy.back () == source);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1118
      PrintVector (routeCopy);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1119
      NS_LOG_DEBUG ("The nextHop address " << nextHop << " and the source in the route reply " << source);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1120
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1121
       * Set the route entry we will use to send reply
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1122
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1123
      SetRoute (nextHop, ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1124
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1125
       * This part add dsr routing header to the packet and send reply
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1126
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1127
      DsrRoutingHeader dsrRoutingHeader;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1128
      dsrRoutingHeader.SetNextHeader (protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1129
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1130
      length = rrep.GetLength ();    // Get the length of the rrep header excluding the type header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1131
      NS_LOG_DEBUG ("The reply header length " << (uint32_t)length);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1132
      dsrRoutingHeader.SetPayloadLength (length + 2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1133
      dsrRoutingHeader.SetMessageType (1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1134
      dsrRoutingHeader.SetSourceId (GetIDfromIP (source));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1135
      dsrRoutingHeader.SetDestId (GetIDfromIP (targetAddress));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1136
      dsrRoutingHeader.AddDsrOption (rrep);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1137
      Ptr<Packet> newPacket = Create<Packet> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1138
      newPacket->AddHeader (dsrRoutingHeader);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1139
      dsr->SendReply (newPacket, ipv4Address, nextHop, m_ipv4Route);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1140
      isPromisc = false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1141
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1142
  return rrep.GetSerializedSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1143
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1144
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1145
NS_OBJECT_ENSURE_REGISTERED (DsrOptionSR);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1146
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1147
TypeId DsrOptionSR::GetTypeId ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1148
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1149
  static TypeId tid = TypeId ("ns3::dsr::DsrOptionSR")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1150
    .SetParent<DsrOptions> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1151
    .AddConstructor<DsrOptionSR> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1152
  ;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1153
  return tid;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1154
}
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
DsrOptionSR::DsrOptionSR ()
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
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1159
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1160
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1161
DsrOptionSR::~DsrOptionSR ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1162
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1163
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1164
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1165
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1166
TypeId DsrOptionSR::GetInstanceTypeId () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1167
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1168
  return GetTypeId ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1169
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1170
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1171
uint8_t DsrOptionSR::GetOptionNumber () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1172
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1173
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1174
  return OPT_NUMBER;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1175
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1176
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1177
uint8_t DsrOptionSR::Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1178
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1179
  NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Address << ipv4Header << (uint32_t)protocol << isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1180
  Ptr<Packet> p = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1181
  // Get the number of routers' address field
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1182
  uint8_t buf[2];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1183
  p->CopyData (buf, sizeof(buf));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1184
  uint8_t numberAddress = (buf[1] - 2) / 4;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1185
  DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1186
  sourceRoute.SetNumberAddress (numberAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1187
  p->RemoveHeader (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1188
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1189
  // The route size saved in the source route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1190
  std::vector<Ipv4Address> nodeList = sourceRoute.GetNodesAddress ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1191
  uint8_t segsLeft = sourceRoute.GetSegmentsLeft ();
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1192
  /// TODO remove this one later
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1193
  NS_LOG_DEBUG ("The segment left here " <<  (uint32_t) segsLeft);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1194
  uint8_t salvage = sourceRoute.GetSalvage ();
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
   * Get the node from IP address and get the DSR extension object
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1197
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1198
  Ptr<Node> node = GetNodeWithAddress (ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1199
  Ptr<dsr::DsrRouting> dsr = node->GetObject<dsr::DsrRouting> ();
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
   * Get the source and destination address from ipv4 header
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
  Ipv4Address srcAddress = ipv4Header.GetSource ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1204
  Ipv4Address destAddress = ipv4Header.GetDestination ();
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1205
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1206
  // Get the node list destination
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1207
  Ipv4Address destination = nodeList.back ();
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
   * If it's a promiscuous receive data packet,
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1210
   * 1. see if automatic route shortening possible or not
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1211
   * 2. see if it is a passive acknowledgment
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1212
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1213
  if (isPromisc)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1214
    {
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1215
      NS_LOG_LOGIC ("We process promiscuous receipt data packet");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1216
      if (ContainAddressAfter (ipv4Address, destAddress, nodeList))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1217
        {
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1218
          NS_LOG_LOGIC ("Send back the gratuitous reply");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1219
          dsr->SendGratuitousReply (source, srcAddress, nodeList, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1220
        }
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1221
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1222
      uint16_t fragmentOffset = ipv4Header.GetFragmentOffset ();
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1223
      uint16_t identification = ipv4Header.GetIdentification ();
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1224
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1225
      /// TODO add the link ack over here
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1226
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1227
      if (destAddress != destination)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1228
        {
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1229
          NS_LOG_DEBUG ("Process the promiscuously received packet");
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1230
          bool findPassive = false;
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1231
          int32_t nNodes = NodeList::GetNNodes ();
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1232
          for (int32_t i = 0; i < nNodes; ++i)
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1233
            {
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1234
              NS_LOG_DEBUG ("Working with node " << i);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1235
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1236
              Ptr<Node> node = NodeList::GetNode (i);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1237
              Ptr<dsr::DsrRouting> dsrNode = node->GetObject<dsr::DsrRouting> ();
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1238
              // The source and destination addresses here are the real source and destination for the packet
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1239
              findPassive = dsrNode->PassiveEntryCheck (packet, source, destination, segsLeft, fragmentOffset, identification, false);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1240
              if (findPassive)
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1241
                {
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1242
                  break;
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1243
                }
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1244
            }
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1245
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1246
          if (findPassive)
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1247
            {
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1248
              NS_LOG_DEBUG ("We find one previously received passive entry");
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1249
              /*
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1250
               * Get the node from IP address and get the DSR extension object
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1251
               * the srcAddress would be the source address from ip header
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1252
               */
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1253
              PrintVector (nodeList);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1254
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1255
              NS_LOG_DEBUG ("promisc source " << promiscSource);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1256
              Ptr<Node> node = GetNodeWithAddress (promiscSource);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1257
              Ptr<dsr::DsrRouting> dsrSrc = node->GetObject<dsr::DsrRouting> ();
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1258
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1259
              /// TODO need to think about this part
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1260
              /// TODO this is temporarily disabled to enable other
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1261
              dsrSrc->CancelPassiveTimer (packet, source, destination, segsLeft);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1262
            }
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1263
          else
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1264
            {
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1265
              NS_LOG_DEBUG ("Saved the entry for further use");
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1266
              dsr->PassiveEntryCheck (packet, source, destination, segsLeft, fragmentOffset, identification, true);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1267
            }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1268
        }
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1269
      /// Safely terminate promiscuously received packet
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1270
      return 0;
8751
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
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1273
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1274
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1275
       * Get the number of address from the source route header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1276
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1277
      uint8_t length = sourceRoute.GetLength ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1278
      uint8_t nextAddressIndex;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1279
      Ipv4Address nextAddress;
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
      // Get the option type value
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1282
      uint32_t size = p->GetSize ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1283
      uint8_t *data = new uint8_t[size];
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1284
      p->CopyData (data, size);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1285
      uint8_t optionType = 0;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1286
      optionType = *(data);
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1287
      /// When the option type is 160, means there is ACK request header after the source route, we need
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1288
      /// to send back acknowledgment
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1289
      if (optionType == 160)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1290
        {
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1291
          NS_LOG_LOGIC ("Remove the ack request header and add ack header to the packet");
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1292
          // Here we remove the ack packet to the previous hop
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1293
          DsrOptionAckReqHeader ackReq;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1294
          p->RemoveHeader (ackReq);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1295
          uint16_t ackId = ackReq.GetAckId ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1296
          /*
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1297
           * Send back acknowledgment packet to the earlier hop
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1298
           * If the node list is not empty, find the previous hop from the node list,
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1299
           * otherwise, use srcAddress
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1300
           */
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1301
          Ipv4Address ackAddress = srcAddress;
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1302
          if (!nodeList.empty ())
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1303
            {
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1304
                if (segsLeft > numberAddress) // The segmentsLeft field should not be larger than the total number of ip addresses
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1305
                  {
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1306
                    NS_LOG_LOGIC ("Malformed header. Drop!");
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1307
                    m_dropTrace (packet);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1308
                    return 0;
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1309
                  }
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1310
                if (numberAddress - segsLeft - 2 < 0) // The index is invalid
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1311
                   {
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1312
                      NS_LOG_LOGIC ("Malformed header. Drop!");
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1313
                      m_dropTrace (packet);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1314
                      return 0;
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1315
                   }
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1316
                   ackAddress = nodeList[numberAddress - segsLeft - 2];
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1317
            }
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1318
           m_ipv4Route = SetRoute (ackAddress, ipv4Address);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1319
           NS_LOG_DEBUG ("Send back ACK to the earlier hop " << ackAddress << " from us " << ipv4Address);
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1320
           dsr->SendAck (ackId, ackAddress, source, destination, protocol, m_ipv4Route);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1321
        }
8751
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
       * After send back ACK, check if the segments left value has turned to 0 or not, if yes, update the route entry
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1324
       * and return header length
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1325
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1326
      if (segsLeft == 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1327
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1328
          NS_LOG_DEBUG ("This is the final destination");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1329
          isPromisc = false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1330
          return sourceRoute.GetSerializedSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1331
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1332
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1333
      if (length % 2 != 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1334
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1335
          NS_LOG_LOGIC ("Malformed header. Drop!");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1336
          m_dropTrace (packet);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1337
          return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1338
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1339
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1340
      if (segsLeft > numberAddress) // The segmentsLeft field should not be larger than the total number of ip addresses
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1341
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1342
          NS_LOG_LOGIC ("Malformed header. Drop!");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1343
          m_dropTrace (packet);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1344
          return 0;
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1347
      DsrOptionSRHeader newSourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1348
      newSourceRoute.SetSegmentsLeft (segsLeft - 1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1349
      newSourceRoute.SetSalvage (salvage);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1350
      newSourceRoute.SetNodesAddress (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1351
      nextAddressIndex = numberAddress - segsLeft;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1352
      nextAddress = newSourceRoute.GetNodeAddress (nextAddressIndex);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1353
      NS_LOG_DEBUG ("The next address of source route option " << nextAddress << " and the nextAddressIndex: " << (uint32_t)nextAddressIndex << " and the segments left : " << (uint32_t)segsLeft);
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
       * Get the target Address in the node list
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1356
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1357
      Ipv4Address targetAddress = nodeList.back ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1358
      Ipv4Address realSource = nodeList.front ();
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
       * Search the vector for next hop address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1361
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1362
      Ipv4Address nextHop = SearchNextHop (ipv4Address, nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1363
      PrintVector (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1364
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1365
      if (nextHop == "0.0.0.0")
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
          NS_LOG_DEBUG ("Before new packet " << *dsrP);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1368
          dsr->PacketNewRoute (dsrP, realSource, targetAddress, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1369
          return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1370
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1371
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1372
      if (ipv4Address == nextHop)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1373
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1374
          NS_LOG_DEBUG ("We have reached the destination");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1375
          newSourceRoute.SetSegmentsLeft (0);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1376
          return newSourceRoute.GetSerializedSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1377
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1378
      // Verify the multicast address, leave it here for now
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1379
      if (nextAddress.IsMulticast () || destAddress.IsMulticast ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1380
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1381
          m_dropTrace (packet);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1382
          return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1383
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1384
      // Set the route and forward the data packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1385
      SetRoute (nextAddress, ipv4Address);
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8753
diff changeset
  1386
      NS_LOG_DEBUG ("dsr packet size " << dsrP->GetSize ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1387
      dsr->ForwardPacket (dsrP, newSourceRoute, ipv4Header, realSource, nextAddress, targetAddress, protocol, m_ipv4Route);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1388
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1389
  return sourceRoute.GetSerializedSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1390
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1391
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1392
NS_OBJECT_ENSURE_REGISTERED (DsrOptionRerr);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1393
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1394
TypeId DsrOptionRerr::GetTypeId ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1395
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1396
  static TypeId tid = TypeId ("ns3::dsr::DsrOptionRerr")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1397
    .SetParent<DsrOptions> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1398
    .AddConstructor<DsrOptionRerr> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1399
  ;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1400
  return tid;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1401
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1402
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1403
DsrOptionRerr::DsrOptionRerr ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1404
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1405
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1406
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1407
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1408
DsrOptionRerr::~DsrOptionRerr ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1409
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1410
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1411
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1412
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1413
TypeId DsrOptionRerr::GetInstanceTypeId () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1414
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1415
  return GetTypeId ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1416
}
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
uint8_t DsrOptionRerr::GetOptionNumber () const
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
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1421
  return OPT_NUMBER;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1422
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1423
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1424
uint8_t DsrOptionRerr::Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1425
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1426
  NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1427
  Ptr<Packet> p = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1428
  uint32_t size = p->GetSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1429
  uint8_t *data = new uint8_t[size];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1430
  p->CopyData (data, size);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1431
  uint8_t errorType = *(data + 2);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1432
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1433
   * Get the node from Ip address and get the dsr extension object
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1434
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1435
  Ptr<Node> node = GetNodeWithAddress (ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1436
  Ptr<dsr::DsrRouting> dsr = node->GetObject<dsr::DsrRouting> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1437
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1438
   * The error serialized size
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1439
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1440
  uint32_t rerrSize;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1441
  NS_LOG_DEBUG ("The error type value here " << (uint32_t)errorType);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1442
  if (errorType == 1) // unreachable ip address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1443
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1444
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1445
       * Remove the route error header from the packet, and get the error type
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1446
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1447
      DsrOptionRerrUnreachHeader rerrUnreach;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1448
      p->RemoveHeader (rerrUnreach);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1449
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1450
       * Get the error destination address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1451
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1452
      Ipv4Address unreachAddress = rerrUnreach.GetUnreachNode ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1453
      Ipv4Address errorSource = rerrUnreach.GetErrorSrc ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1454
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1455
      NS_LOG_DEBUG ("The error source is " <<  rerrUnreach.GetErrorDst () << "and the unreachable node is " << unreachAddress);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1456
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1457
       * Get the serialized size of the rerr header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1458
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1459
      rerrSize = rerrUnreach.GetSerializedSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1460
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1461
       * Delete all the routes including the unreachable node address from the route cache
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1462
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1463
      Ptr<Node> node = GetNodeWithAddress (ipv4Address);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1464
      dsr->DeleteAllRoutesIncludeLink (errorSource, unreachAddress, ipv4Address);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1465
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1466
      Ptr<Packet> newP = p->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1467
      uint32_t serialized = DoSendError (newP, rerrUnreach, rerrSize, ipv4Address, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1468
      return serialized;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1469
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1470
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1471
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1472
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1473
       * Two other type of error headers:
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1474
       * 1. flow state not supported type-specific information
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1475
       * 2. unsupported option with option number
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1476
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1477
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1478
       * Remove the route error header from the packet, and get the error type
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1479
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1480
      DsrOptionRerrUnsupportHeader rerrUnsupport;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1481
      p->RemoveHeader (rerrUnsupport);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1482
      rerrSize = rerrUnsupport.GetSerializedSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1483
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1484
      // This is for the other two error options, not supporting for now TODO
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1485
//      uint32_t serialized = DoSendError (p, rerrUnsupport, rerrSize, ipv4Address, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1486
      uint32_t serialized = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1487
      return serialized;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1488
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1489
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1490
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1491
uint8_t DsrOptionRerr::DoSendError (Ptr<Packet> p, DsrOptionRerrUnreachHeader &rerr, uint32_t rerrSize, Ipv4Address ipv4Address, uint8_t protocol)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1492
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1493
  // Get the number of routers' address field
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1494
  uint8_t buf[2];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1495
  p->CopyData (buf, sizeof(buf));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1496
  uint8_t numberAddress = (buf[1] - 2) / 4;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1497
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1498
  // Here remove the source route header and schedule next hop error transmission
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1499
  NS_LOG_DEBUG ("The number of addresses " << (uint32_t)numberAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1500
  DsrOptionSRHeader sourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1501
  sourceRoute.SetNumberAddress (numberAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1502
  p->RemoveHeader (sourceRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1503
  NS_ASSERT (p->GetSize () == 0);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1504
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1505
   * Get the node from ip address and the dsr extension object
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1506
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1507
  Ptr<Node> node = GetNodeWithAddress (ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1508
  Ptr<dsr::DsrRouting> dsr = node->GetObject<dsr::DsrRouting> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1509
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1510
   * Get the segments left field and the next address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1511
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1512
  uint8_t segmentsLeft = sourceRoute.GetSegmentsLeft ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1513
  uint8_t length = sourceRoute.GetLength ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1514
  uint8_t nextAddressIndex;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1515
  Ipv4Address nextAddress;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1516
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1517
   * Get the route size and the error target address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1518
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1519
  std::vector<Ipv4Address> nodeList = sourceRoute.GetNodesAddress ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1520
  Ipv4Address targetAddress = nodeList.back ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1521
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1522
   * The total serialized size for both the rerr and source route headers
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1523
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1524
  uint32_t serializedSize = rerrSize + sourceRoute.GetSerializedSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1525
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1526
  if (length % 2 != 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1527
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1528
      NS_LOG_LOGIC ("Malformed header. Drop!");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1529
      m_dropTrace (p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1530
      return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1531
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1532
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1533
  if (segmentsLeft > numberAddress)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1534
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1535
      NS_LOG_LOGIC ("Malformed header. Drop!");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1536
      m_dropTrace (p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1537
      return 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1538
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1539
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1540
   * When the error packet has reached to the destination
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1541
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1542
  if (segmentsLeft == 0 && targetAddress == ipv4Address)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1543
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1544
      NS_LOG_INFO ("This is the destination of the error, send error request");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1545
      dsr->SendErrorRequest (rerr, protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1546
      return serializedSize;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1547
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1548
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1549
  // Get the next Router Address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1550
  DsrOptionSRHeader newSourceRoute;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1551
  newSourceRoute.SetSegmentsLeft (segmentsLeft - 1);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1552
  nextAddressIndex = numberAddress - segmentsLeft;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1553
  nextAddress = sourceRoute.GetNodeAddress (nextAddressIndex);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1554
  newSourceRoute.SetSalvage (sourceRoute.GetSalvage ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1555
  newSourceRoute.SetNodesAddress (nodeList);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1556
  nextAddress = newSourceRoute.GetNodeAddress (nextAddressIndex);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1557
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1558
  // / to test if the next address is multicast or not
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1559
  if (nextAddress.IsMulticast () || targetAddress.IsMulticast ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1560
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1561
      m_dropTrace (p);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1562
      return serializedSize;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1563
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1564
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1565
  // Set the route entry
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1566
  SetRoute (nextAddress, ipv4Address);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1567
  dsr->ForwardErrPacket (rerr, newSourceRoute, nextAddress, protocol, m_ipv4Route);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1568
  return serializedSize;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1569
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1570
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1571
NS_OBJECT_ENSURE_REGISTERED (DsrOptionAckReq);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1572
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1573
TypeId DsrOptionAckReq::GetTypeId ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1574
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1575
  static TypeId tid = TypeId ("ns3::dsr::DsrOptionAckReq")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1576
    .SetParent<DsrOptions> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1577
    .AddConstructor<DsrOptionAckReq> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1578
  ;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1579
  return tid;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1580
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1581
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1582
DsrOptionAckReq::DsrOptionAckReq ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1583
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1584
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1585
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1586
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1587
DsrOptionAckReq::~DsrOptionAckReq ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1588
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1589
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1590
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1591
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1592
TypeId DsrOptionAckReq::GetInstanceTypeId () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1593
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1594
  return GetTypeId ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1595
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1596
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1597
uint8_t DsrOptionAckReq::GetOptionNumber () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1598
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1599
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1600
  return OPT_NUMBER;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1601
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1602
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1603
uint8_t DsrOptionAckReq::Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1604
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1605
  NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1606
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1607
   * Current implementation of the ack request header processing is coded in source route header processing
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1608
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1609
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1610
   * Remove the ack request header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1611
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1612
  Ptr<Packet> p = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1613
  DsrOptionAckReqHeader ackReq;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1614
  p->RemoveHeader (ackReq);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1615
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1616
   * Get the node with ip address and get the dsr extension and reoute cache objects
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
  Ptr<Node> node = GetNodeWithAddress (ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1619
  Ptr<dsr::DsrRouting> dsr = node->GetObject<dsr::DsrRouting> ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1620
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1621
  NS_LOG_DEBUG ("The next header value " << (uint32_t)protocol);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1622
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1623
  return ackReq.GetSerializedSize ();
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1626
NS_OBJECT_ENSURE_REGISTERED (DsrOptionAck);
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
TypeId DsrOptionAck::GetTypeId ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1629
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1630
  static TypeId tid = TypeId ("ns3::dsr::DsrOptionAck")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1631
    .SetParent<DsrOptions> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1632
    .AddConstructor<DsrOptionAck> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1633
  ;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1634
  return tid;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1635
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1636
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1637
DsrOptionAck::DsrOptionAck ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1638
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1639
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1640
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1641
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1642
DsrOptionAck::~DsrOptionAck ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1643
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1644
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1645
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1646
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1647
TypeId DsrOptionAck::GetInstanceTypeId () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1648
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1649
  return GetTypeId ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1650
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1651
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1652
uint8_t DsrOptionAck::GetOptionNumber () const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1653
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1654
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1655
  return OPT_NUMBER;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1656
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1657
9293
854e085e1a01 bug 1608: DSR network ack and bug 1609: DSR route request table
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8976
diff changeset
  1658
uint8_t DsrOptionAck::Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1659
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1660
  NS_LOG_FUNCTION (this << packet << dsrP << ipv4Address << source << ipv4Header << (uint32_t)protocol << isPromisc);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1661
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1662
   * Remove the ACK header
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1663
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1664
  Ptr<Packet> p = packet->Copy ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1665
  DsrOptionAckHeader ack;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1666
  p->RemoveHeader (ack);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1667
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1668
   * Get the ACK source and destination address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1669
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1670
  Ipv4Address realSrc = ack.GetRealSrc ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1671
  Ipv4Address realDst = ack.GetRealDst ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1672
  uint16_t ackId = ack.GetAckId ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1673
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1674
   * Get the node with ip address and get the dsr extension and route cache objects
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1675
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1676
  Ptr<Node> node = GetNodeWithAddress (ipv4Address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1677
  Ptr<dsr::DsrRouting> dsr = node->GetObject<dsr::DsrRouting> ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1678
  dsr->UpdateRouteEntry (realDst);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1679
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1680
   * Cancel the packet retransmit timer when receiving the ack packet
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1681
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1682
  dsr->CallCancelPacketTimer (ackId, ipv4Header, realSrc, realDst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1683
  return ack.GetSerializedSize ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1684
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1685
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1686
} // namespace dsr
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1687
} // namespace ns3