src/dsr/model/dsr-rcache.cc
author Tom Henderson <tomh@tomh.org>
Sun, 13 May 2012 10:47:11 -0700
changeset 8756 9a34e618f40b
parent 8755 78bf735a3d5e
child 9719 4031f7fdce5c
permissions -rw-r--r--
check-style.py run on src/dsr
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
 *              Song Luan <lsuper@mail.ustc.edu.cn> (Implemented Link Cache using Dijsktra algorithm)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    20
 *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    21
 * James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    22
 * ResiliNets Research Group  http://wiki.ittc.ku.edu/resilinets
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    23
 * Information and Telecommunication Technology Center (ITTC)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    24
 * and Department of Electrical Engineering and Computer Science
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    25
 * The University of Kansas Lawrence, KS USA.
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    26
 *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    27
 * 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
    28
 * under grant CNS-0626918 (Postmodern Internet Architecture),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    29
 * 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
    30
 * 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
    31
 */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    32
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    33
#include "dsr-rcache.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    34
#include <map>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    35
#include <cmath>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    36
#include <algorithm>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    37
#include <iostream>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    38
#include <list>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    39
#include <vector>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    40
#include <functional>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    41
#include <iomanip>
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    42
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    43
#include "ns3/simulator.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    44
#include "ns3/ipv4-route.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    45
#include "ns3/socket.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    46
#include "ns3/log.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    47
#include "ns3/address-utils.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    48
#include "ns3/packet.h"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    49
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    50
NS_LOG_COMPONENT_DEFINE ("RouteCache");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    51
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    52
namespace ns3 {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    53
namespace dsr {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    54
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    55
bool CompareRoutesBoth (const RouteCacheEntry &a, const RouteCacheEntry &b)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    56
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    57
  // compare based on both with hop count considered priority
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
    58
  return (a.GetVector ().size () < b.GetVector ().size ())
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
    59
         || ((a.GetVector ().size () == b.GetVector ().size ()) && (a.GetExpireTime () > b.GetExpireTime ()))
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
    60
  ;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    61
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    62
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    63
bool CompareRoutesHops (const RouteCacheEntry &a, const RouteCacheEntry &b)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    64
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    65
  // compare based on hops
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    66
  return a.GetVector ().size () < b.GetVector ().size ();
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    67
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    68
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    69
bool CompareRoutesExpire (const RouteCacheEntry &a, const RouteCacheEntry &b)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    70
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    71
  // compare based on expire time
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
    72
  return a.GetExpireTime () > b.GetExpireTime ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    73
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    74
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
    75
void Link::Print () const
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    76
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    77
  NS_LOG_DEBUG (m_low << "----" << m_high);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    78
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    79
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    80
NodeStab::NodeStab (Time nodeStab)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    81
  : m_nodeStability (nodeStab + Simulator::Now ())
8751
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    85
NodeStab::~NodeStab ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    86
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    87
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    88
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    89
LinkStab::LinkStab (Time linkStab)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
    90
  : m_linkStability (linkStab + Simulator::Now ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    91
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    92
}
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
LinkStab::~LinkStab ()
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
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    97
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
    98
void LinkStab::Print ( ) const
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
  NS_LOG_DEBUG ("LifeTime: " << GetLinkStability ().GetSeconds ());
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   103
typedef std::list<RouteCacheEntry>::value_type route_pair;
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
RouteCacheEntry::RouteCacheEntry (IP_VECTOR const  & ip, Ipv4Address dst, Time exp)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   106
  : m_ackTimer (Timer::CANCEL_ON_DESTROY),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   107
    m_dst (dst),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   108
    m_path (ip),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   109
    m_expire (exp + Simulator::Now ()),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   110
    m_reqCount (0),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   111
    m_blackListState (false),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   112
    m_blackListTimeout (Simulator::Now ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   113
{
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   116
RouteCacheEntry::~RouteCacheEntry ()
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
}
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
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   121
RouteCacheEntry::Invalidate (Time badLinkLifetime)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   122
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   123
  m_reqCount = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   124
  m_expire = badLinkLifetime + Simulator::Now ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   125
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   126
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   127
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   128
RouteCacheEntry::Print (std::ostream & os) const
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   129
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   130
  os << m_dst << "\t" << (m_expire - Simulator::Now ()).GetSeconds ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   131
     << "\t";
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
NS_OBJECT_ENSURE_REGISTERED (RouteCache);
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
TypeId RouteCache::GetTypeId ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   137
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   138
  static TypeId tid = TypeId ("ns3::dsr::RouteCache")
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   139
    .SetParent<Object> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   140
    .AddConstructor<RouteCache> ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   141
  ;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   142
  return tid;
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   145
RouteCache::RouteCache ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   146
  : m_vector (0),
8755
78bf735a3d5e initialize variables before use
Tom Henderson <tomh@tomh.org>
parents: 8753
diff changeset
   147
    m_maxEntriesEachDst (3),
78bf735a3d5e initialize variables before use
Tom Henderson <tomh@tomh.org>
parents: 8753
diff changeset
   148
    m_isLinkCache (false),
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   149
    m_ntimer (Timer::CANCEL_ON_DESTROY),
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   150
    m_delay (MilliSeconds (100))
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
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   153
   * The timer to set layer 2 notification, not fully supported by ns3 yet
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
  m_ntimer.SetDelay (m_delay);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   156
  m_ntimer.SetFunction (&RouteCache::PurgeMac, this);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   157
  m_txErrorCallback = MakeCallback (&RouteCache::ProcessTxError, this);
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   160
RouteCache::~RouteCache ()
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
  NS_LOG_FUNCTION_NOARGS ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   163
  // clear the route cache when done
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   164
  m_sortedRoutes.clear ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   165
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   166
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   167
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   168
RouteCache::RemoveLastEntry (std::list<RouteCacheEntry> & rtVector)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   169
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   170
  NS_LOG_FUNCTION (this);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   171
  // release the last entry of route list
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   172
  rtVector.pop_back ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   173
}
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
bool
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   176
RouteCache::UpdateRouteEntry (Ipv4Address dst)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   177
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   178
  NS_LOG_FUNCTION (this << dst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   179
  std::map<Ipv4Address, std::list<RouteCacheEntry> >::const_iterator i =
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   180
    m_sortedRoutes.find (dst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   181
  if (i == m_sortedRoutes.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   182
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   183
      NS_LOG_DEBUG ("Failed to find the route entry for the destination " << dst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   184
      return false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   185
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   186
  else
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
      std::list<RouteCacheEntry> rtVector = i->second;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   189
      RouteCacheEntry successEntry = rtVector.front ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   190
      successEntry.SetExpireTime (RouteCacheTimeout);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   191
      rtVector.pop_front ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   192
      rtVector.push_back (successEntry);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   193
      rtVector.sort (CompareRoutesExpire);  // sort the route vector first
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   194
      m_sortedRoutes.erase (dst);  // erase the entry first
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   195
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   196
       * Save the new route cache along with the destination address in map
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   197
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   198
      std::pair<std::map<Ipv4Address, std::list<RouteCacheEntry> >::iterator, bool> result =
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   199
        m_sortedRoutes.insert (std::make_pair (dst, rtVector));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   200
      return result.second;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   201
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   202
  return false;
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   205
bool
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   206
RouteCache::LookupRoute (Ipv4Address id, RouteCacheEntry & rt)
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
  NS_LOG_FUNCTION (this << id);
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   209
  if (IsLinkCache ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   210
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   211
      return LookupRoute_Link (id, rt);
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
  else
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
      Purge ();  // Purge first to remove expired entries
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   216
      if (m_sortedRoutes.empty ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   217
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   218
          NS_LOG_LOGIC ("Route to " << id << " not found; m_sortedRoutes is empty");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   219
          return false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   220
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   221
      std::map<Ipv4Address, std::list<RouteCacheEntry> >::const_iterator i = m_sortedRoutes.find (id);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   222
      if (i == m_sortedRoutes.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   223
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   224
          NS_LOG_LOGIC ("No Direct Route to " << id << " found");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   225
          for (std::map<Ipv4Address, std::list<RouteCacheEntry> >::const_iterator j =
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   226
                 m_sortedRoutes.begin (); j != m_sortedRoutes.end (); ++j)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   227
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   228
              std::list<RouteCacheEntry> rtVector = j->second; // The route cache vector linked with destination address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   229
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   230
               * Loop through the possibly multiple routes within the route vector
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   231
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   232
              for (std::list<RouteCacheEntry>::const_iterator k = rtVector.begin (); k != rtVector.end (); ++k)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   233
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   234
                  // return the first route in the route vector
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   235
                  RouteCacheEntry::IP_VECTOR routeVector = k->GetVector ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   236
                  RouteCacheEntry::IP_VECTOR changeVector;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   237
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   238
                  for (RouteCacheEntry::IP_VECTOR::iterator l = routeVector.begin (); l != routeVector.end (); ++l)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   239
                    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   240
                      if (*l != id)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   241
                        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   242
                          changeVector.push_back (*l);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   243
                        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   244
                      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   245
                        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   246
                          changeVector.push_back (*l);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   247
                          break;
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
                    }
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
                   * When the changed vector is smaller in size and larger than 1, which means we have found a route with the destination
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   252
                   * address we are looking for
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
                  if ((changeVector.size () < routeVector.size ())  && (changeVector.size () > 1))
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
                      RouteCacheEntry changeEntry; // Create the route entry
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   257
                      changeEntry.SetVector (changeVector);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   258
                      changeEntry.SetDestination (id);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   259
                      // Use the expire time from original route entry
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   260
                      changeEntry.SetExpireTime (k->GetExpireTime ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   261
                      // We need to add new route entry here
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   262
                      std::list<RouteCacheEntry> newVector;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   263
                      newVector.push_back (changeEntry);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   264
                      newVector.sort (CompareRoutesExpire);  // sort the route vector first
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   265
                      m_sortedRoutes[id] = newVector;   // Only get the first sub route and add it in route cache
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   266
                      NS_LOG_INFO ("We have a sub-route to " << id << " add it in route cache");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   267
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   268
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   269
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   270
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   271
      NS_LOG_INFO ("Here we check the route cache again after updated the sub routes");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   272
      std::map<Ipv4Address, std::list<RouteCacheEntry> >::const_iterator m = m_sortedRoutes.find (id);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   273
      if (m == m_sortedRoutes.end ())
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
          NS_LOG_DEBUG ("No updated route till last time");
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
       * We have a direct route to the destination address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   280
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   281
      std::list<RouteCacheEntry> rtVector = m->second;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   282
      rt = rtVector.front ();  // use the first entry in the route vector
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   283
      NS_LOG_DEBUG ("Route to " << id << " with route size " << rtVector.size ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   284
      return true;
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
}
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
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   289
RouteCache::SetCacheType (std::string type)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   290
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   291
  NS_LOG_FUNCTION (this << type);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   292
  if (type == std::string ("LinkCache"))
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   293
    {
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   294
      m_isLinkCache = true;
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   295
    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   296
  else if (type == std::string ("PathCache"))
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   297
    {
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   298
      m_isLinkCache = false;
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   299
    }
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   300
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   301
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   302
      m_isLinkCache = false;             // use path cache as default
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   303
      NS_LOG_INFO ("Error Cache Type");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   304
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   305
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   306
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   307
bool
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   308
RouteCache::IsLinkCache ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   309
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   310
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   311
  return m_isLinkCache;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   312
}
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
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   315
RouteCache::RebuildBestRouteTable (Ipv4Address source)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   316
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   317
  NS_LOG_FUNCTION (this << source);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   318
  /**
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   319
   * \brief The followings are initialize-single-source
8751
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
  // @d shortest-path estimate
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   322
  std::map<Ipv4Address, uint32_t> d;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   323
  // @pre preceeding node
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   324
  std::map<Ipv4Address, Ipv4Address> pre;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   325
  for (std::map<Ipv4Address, std::map<Ipv4Address, uint32_t> >::iterator i = m_netGraph.begin (); i != m_netGraph.end (); ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   326
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   327
      if (i->second.find (source) != i->second.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   328
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   329
          d[i->first] = i->second[source];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   330
          pre[i->first] = source;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   331
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   332
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   333
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   334
          d[i->first] = MAXWEIGHT;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   335
          pre[i->first] = Ipv4Address ("255.255.255.255");
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
  d[source] = 0;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   339
  /**
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   340
   * \brief The followings are core of dijskra algorithm
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   341
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   342
  // the node set which shortest distance has been calculated, if true calculated
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   343
  std::map<Ipv4Address, bool> s;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   344
  double temp = MAXWEIGHT;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   345
  Ipv4Address tempip = Ipv4Address ("255.255.255.255");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   346
  for (uint32_t i = 0; i < m_netGraph.size (); i++)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   347
    {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   348
      temp = MAXWEIGHT;
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   349
      for (std::map<Ipv4Address,uint32_t>::const_iterator j = d.begin (); j != d.end (); ++j)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   350
        {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   351
          Ipv4Address ip = j->first;
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   352
          if (s.find (ip) == s.end ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   353
            {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   354
              /**
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   355
               * \brief The followings are for comparison
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   356
               */
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   357
              if (j->second <= temp)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   358
                {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   359
                  temp = j->second;
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   360
                  tempip = ip;
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   361
                }
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   362
            }
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   363
        }
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   364
      if (!tempip.IsBroadcast ())
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   365
        {
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   366
          s[tempip] = true;
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   367
          for (std::map<Ipv4Address, uint32_t>::const_iterator k = m_netGraph[tempip].begin (); k != m_netGraph[tempip].end (); ++k)
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   368
            {
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   369
              if (s.find (k->first) == s.end () && d[k->first] > d[tempip] + k->second)
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   370
                {
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   371
                  d[k->first] = d[tempip] + k->second;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   372
                  pre[k->first] = tempip;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   373
                }
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   374
              /**
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   375
               *  Selects the shortest-length route that has the longest expected lifetime
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   376
               *  (highest minimum timeout of any link in the route)
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   377
               *  For the computation overhead and complexity
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   378
               *  Here I just implement kind of greedy strategy to select link with the longest expected lifetime when there is two options
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   379
               */
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   380
              else if (d[k->first] == d[tempip] + k->second)
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   381
                {
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   382
                  std::map<Link, LinkStab>::iterator oldlink = m_linkCache.find (Link (k->first, pre[k->first]));
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   383
                  std::map<Link, LinkStab>::iterator newlink = m_linkCache.find (Link (k->first, tempip));
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   384
                  if (oldlink != m_linkCache.end () && newlink != m_linkCache.end ())
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   385
                    {
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   386
                      if (oldlink->second.GetLinkStability () < newlink->second.GetLinkStability ())
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   387
                        {
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   388
                          NS_LOG_INFO ("Select the link with longest expected lifetime");
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   389
                          d[k->first] = d[tempip] + k->second;
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   390
                          pre[k->first] = tempip;
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   391
                        }
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   392
                    }
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   393
                  else
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   394
                    {
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   395
                      NS_LOG_INFO ("Link Stability Info Corrupt");
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   396
                    }
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   397
                }
8751
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
        }
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
  // clean the best route table
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   402
  m_bestRoutesTable_link.clear ();
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   403
  for (std::map<Ipv4Address, Ipv4Address>::iterator i = pre.begin (); i != pre.end (); ++i)
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   404
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   405
      // loop for all vertexes
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   406
      RouteCacheEntry::IP_VECTOR route;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   407
      Ipv4Address iptemp = i->first;
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
      if (!i->second.IsBroadcast () && iptemp != source)
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
          while (iptemp != source)
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
              route.push_back (iptemp);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   414
              iptemp = pre[iptemp];
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
          route.push_back (source);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   417
          /**
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   418
           * \brief Reverse the route
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   419
           */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   420
          RouteCacheEntry::IP_VECTOR reverseroute;
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   421
          for (RouteCacheEntry::IP_VECTOR::reverse_iterator j = route.rbegin (); j != route.rend (); ++j)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   422
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   423
              reverseroute.push_back (*j);
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
          NS_LOG_DEBUG ("Add Route: ");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   426
          PrintVector (reverseroute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   427
          m_bestRoutesTable_link[i->first] = reverseroute;
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
}
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
bool
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   433
RouteCache::LookupRoute_Link (Ipv4Address id, RouteCacheEntry & rt)
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
  NS_LOG_FUNCTION (this << id);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   436
  std::map<Ipv4Address, RouteCacheEntry::IP_VECTOR>::const_iterator i = m_bestRoutesTable_link.find (id);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   437
  if (i == m_bestRoutesTable_link.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   438
    {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   439
      NS_LOG_INFO ("No Route To " << id);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   440
      return false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   441
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   442
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   443
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   444
      if (i->second.size () < 2)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   445
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   446
          NS_LOG_DEBUG ("Route To " << id << " error");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   447
          return false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   448
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   449
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   450
      RouteCacheEntry newEntry; // Create the route entry
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   451
      newEntry.SetVector (i->second);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   452
      newEntry.SetDestination (id);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   453
      newEntry.SetExpireTime (RouteCacheTimeout);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   454
      NS_LOG_INFO ("Route to " << id << " found with the route length " << i->second.size ());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   455
      rt = newEntry;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   456
      std::vector<Ipv4Address> path = rt.GetVector ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   457
      PrintVector (path);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   458
      return true;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   459
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   460
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   461
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   462
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   463
RouteCache::PurgeLinkNode ()
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
  NS_LOG_FUNCTION (this);
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   466
  NS_LOG_DEBUG ("The size of the link cache before " << m_linkCache.size ());
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   467
  for (std::map<Link, LinkStab>::iterator i = m_linkCache.begin (); i != m_linkCache.end (); )
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   468
    {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   469
      NS_LOG_DEBUG ("The link stability " << i->second.GetLinkStability ());
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   470
      std::map<Link, LinkStab>::iterator itmp = i;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   471
      if (i->second.GetLinkStability () <= Seconds (0))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   472
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   473
          ++i;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   474
          m_linkCache.erase (itmp);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   475
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   476
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   477
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   478
          ++i;
8751
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
    }
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   481
  NS_LOG_DEBUG ("The size of the node cache before " << m_nodeCache.size ());
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   482
  for (std::map<Ipv4Address, NodeStab>::iterator i = m_nodeCache.begin (); i != m_nodeCache.end (); )
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   483
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   484
      NS_LOG_DEBUG ("The node stability " << i->second.GetNodeStability ());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   485
      std::map<Ipv4Address, NodeStab>::iterator itmp = i;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   486
      if (i->second.GetNodeStability () <= Seconds (0))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   487
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   488
          ++i;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   489
          m_nodeCache.erase (itmp);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   490
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   491
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   492
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   493
          ++i;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   494
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   495
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   496
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   497
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   498
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   499
RouteCache::UpdateNetGraph ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   500
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   501
  NS_LOG_FUNCTION (this);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   502
  m_netGraph.clear ();
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   503
  for (std::map<Link, LinkStab>::iterator i = m_linkCache.begin (); i != m_linkCache.end (); ++i)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   504
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   505
      // Here the weight is set as 1
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   506
      uint32_t weight = 1;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   507
      m_netGraph[i->first.m_low][i->first.m_high] = weight;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   508
      m_netGraph[i->first.m_high][i->first.m_low] = weight;
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
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   511
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   512
bool
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   513
RouteCache::IncStability (Ipv4Address node)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   514
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   515
  NS_LOG_FUNCTION (this << node);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   516
  std::map<Ipv4Address, NodeStab>::const_iterator i = m_nodeCache.find (node);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   517
  if (i == m_nodeCache.end ())
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   518
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   519
      NS_LOG_INFO ("The initial stability " << m_initStability.GetSeconds ());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   520
      NodeStab ns (m_initStability);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   521
      m_nodeCache[node] = ns;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   522
      return false;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   523
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   524
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   525
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   526
      NodeStab ns (Time (i->second.GetNodeStability () * m_stabilityIncrFactor));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   527
      m_nodeCache[node] = ns;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   528
      return true;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   529
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   530
  return false;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   531
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   532
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   533
bool
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   534
RouteCache::DecStability (Ipv4Address node)
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   535
{
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   536
  NS_LOG_FUNCTION (this << node);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   537
  std::map<Ipv4Address, NodeStab>::const_iterator i = m_nodeCache.find (node);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   538
  if (i == m_nodeCache.end ())
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   539
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   540
      NodeStab ns (m_initStability);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   541
      m_nodeCache[node] = ns;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   542
      return false;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   543
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   544
  else
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   545
    {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   546
      NodeStab ns (Time (i->second.GetNodeStability () / m_stabilityDecrFactor));
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   547
      m_nodeCache[node] = ns;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   548
      return true;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   549
    }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   550
  return false;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   551
}
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   552
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   553
bool
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   554
RouteCache::AddRoute_Link (RouteCacheEntry::IP_VECTOR nodelist, Ipv4Address source)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   555
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   556
  NS_LOG_FUNCTION (this << source);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   557
  NS_LOG_DEBUG ("Use Link Cache");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   558
  for (uint32_t i = 0; i < nodelist.size () - 1; i++)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   559
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   560
      NodeStab ns;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   561
      ns.SetNodeStability (m_initStability);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   562
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   563
      if (m_nodeCache.find (nodelist[i]) == m_nodeCache.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   564
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   565
          m_nodeCache[nodelist[i]] = ns;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   566
        }
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   567
      if (m_nodeCache.find (nodelist[i + 1]) == m_nodeCache.end ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   568
        {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   569
          m_nodeCache[nodelist[i + 1]] = ns;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   570
        }
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   571
      Link link (nodelist[i], nodelist[i + 1]);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   572
      LinkStab stab;
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   573
      stab.SetLinkStability (m_initStability);
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   574
      if (m_nodeCache[nodelist[i]].GetNodeStability () < m_nodeCache[nodelist[i + 1]].GetNodeStability ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   575
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   576
          stab.SetLinkStability (m_nodeCache[nodelist[i]].GetNodeStability ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   577
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   578
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   579
        {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   580
          stab.SetLinkStability (m_nodeCache[nodelist[i + 1]].GetNodeStability ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   581
        }
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   582
      if (stab.GetLinkStability () < m_minLifeTime)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   583
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   584
          NS_LOG_DEBUG ("Stability: " << stab.GetLinkStability ().GetSeconds ());
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   585
          stab.SetLinkStability (m_minLifeTime);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   586
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   587
      m_linkCache[link] = stab;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   588
      NS_LOG_DEBUG ("Add a new link");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   589
      link.Print ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   590
      NS_LOG_DEBUG ("Link Info");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   591
      stab.Print ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   592
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   593
  PurgeLinkNode ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   594
  UpdateNetGraph ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   595
  RebuildBestRouteTable (source);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   596
  return true;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   597
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   598
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   599
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   600
RouteCache::UseExtends (RouteCacheEntry::IP_VECTOR rt)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   601
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   602
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   603
  if (rt.size () < 2)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   604
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   605
      NS_LOG_INFO ("The route is too short");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   606
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   607
  for (RouteCacheEntry::IP_VECTOR::iterator i = rt.begin (); i != rt.end () - 1; ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   608
    {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   609
      Link link (*i, *(i + 1));
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   610
      if (m_linkCache.find (link) != m_linkCache.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   611
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   612
          if (m_linkCache[link].GetLinkStability () < m_useExtends)
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   613
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   614
              m_linkCache[link].SetLinkStability (m_useExtends);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   615
              NS_LOG_DEBUG ("The time of the link " << m_linkCache[link].GetLinkStability ().GetSeconds ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   616
            }
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
          NS_LOG_INFO ("we cannot find a link in cache");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   621
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   622
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   623
  // Increase the stability of the node cache
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   624
  for (RouteCacheEntry::IP_VECTOR::iterator i = rt.begin (); i != rt.end (); ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   625
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   626
      if (m_nodeCache.find (*i) != m_nodeCache.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   627
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   628
          NS_LOG_DEBUG ("Increase the stability");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   629
          if (m_nodeCache[*i].GetNodeStability () <= m_initStability)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   630
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   631
              IncStability (*i);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   632
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   633
          else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   634
            {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   635
              NS_LOG_INFO ("The node stability has already been increased");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   636
            }
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
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   639
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   640
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   641
bool
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   642
RouteCache::AddRoute (RouteCacheEntry & rt)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   643
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   644
  NS_LOG_FUNCTION (this);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   645
  Purge ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   646
  std::list<RouteCacheEntry> rtVector;   // Declare the route cache entry vector
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   647
  Ipv4Address dst = rt.GetDestination ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   648
  std::vector<Ipv4Address> route = rt.GetVector ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   649
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   650
  NS_LOG_DEBUG ("The route destination we have " << dst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   651
  std::map<Ipv4Address, std::list<RouteCacheEntry> >::const_iterator i =
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   652
    m_sortedRoutes.find (dst);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   653
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   654
  if (i == m_sortedRoutes.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   655
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   656
      rtVector.push_back (rt);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   657
      m_sortedRoutes.erase (dst);   // Erase the route entries for dst first
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   658
      /**
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   659
       * Save the new route cache along with the destination address in map
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   660
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   661
      std::pair<std::map<Ipv4Address, std::list<RouteCacheEntry> >::iterator, bool> result =
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   662
        m_sortedRoutes.insert (std::make_pair (dst, rtVector));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   663
      return result.second;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   664
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   665
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   666
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   667
      rtVector = i->second;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   668
      NS_LOG_DEBUG ("The existing route size " << rtVector.size () << " for destination address " << dst);
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   669
      /**
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   670
       * \brief Drop the most aged packet when buffer reaches to max
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   671
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   672
      if (rtVector.size () >= m_maxEntriesEachDst)
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
          RemoveLastEntry (rtVector);         // Drop the last entry for the sorted route cache, the route has already been sorted
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   677
      if (FindSameRoute (rt, rtVector))
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
          NS_LOG_DEBUG ("Find same vector, the FindSameRoute function will update the route expire time");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   680
          return true;
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
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   683
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   684
          // Check if the expire time for the new route has expired or not
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   685
          if (rt.GetExpireTime () > 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   686
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   687
              rtVector.push_back (rt);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   688
              // This sort function will sort the route cache entries based on the size of route in each of the
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   689
              // route entries
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   690
              rtVector.sort (CompareRoutesExpire);
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   691
              NS_LOG_DEBUG ("The first time" << rtVector.front ().GetExpireTime ().GetSeconds () << " The second time "
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   692
                                             << rtVector.back ().GetExpireTime ().GetSeconds ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   693
              NS_LOG_DEBUG ("The first hop" << rtVector.front ().GetVector ().size () << " The second hop "
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   694
                                            << rtVector.back ().GetVector ().size ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   695
              m_sortedRoutes.erase (dst);               // erase the route entries for dst first
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   696
              /**
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   697
               * Save the new route cache along with the destination address in map
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   698
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   699
              std::pair<std::map<Ipv4Address, std::list<RouteCacheEntry> >::iterator, bool> result =
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   700
                m_sortedRoutes.insert (std::make_pair (dst, rtVector));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   701
              return result.second;
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
          else
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
              NS_LOG_INFO ("The newly found route is already expired");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   706
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   707
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   708
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   709
  return false;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   710
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   711
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   712
bool RouteCache::FindSameRoute (RouteCacheEntry & rt, std::list<RouteCacheEntry> & rtVector)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   713
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   714
  NS_LOG_FUNCTION (this);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   715
  for (std::list<RouteCacheEntry>::iterator i = rtVector.begin (); i != rtVector.end (); ++i)
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
      // return the first route in the route vector
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   718
      RouteCacheEntry::IP_VECTOR routeVector = i->GetVector ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   719
      RouteCacheEntry::IP_VECTOR newVector = rt.GetVector ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   720
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   721
      if (routeVector == newVector)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   722
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   723
          NS_LOG_DEBUG ("Found same routes in the route cache with the vector size "
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   724
                        << rt.GetDestination () << " " << rtVector.size ());
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   725
          NS_LOG_DEBUG ("The new route expire time " << rt.GetExpireTime ().GetSeconds ()
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   726
                                                     << " the original expire time " << i->GetExpireTime ().GetSeconds ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   727
          if (rt.GetExpireTime () > i->GetExpireTime ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   728
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   729
              i->SetExpireTime (rt.GetExpireTime ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   730
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   731
          m_sortedRoutes.erase (rt.GetDestination ()); // erase the entry first
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   732
          rtVector.sort (CompareRoutesExpire);  // sort the route vector first
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   733
          /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   734
           * Save the new route cache along with the destination address in map
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   735
           */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   736
          std::pair<std::map<Ipv4Address, std::list<RouteCacheEntry> >::iterator, bool> result =
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   737
            m_sortedRoutes.insert (std::make_pair (rt.GetDestination (), rtVector));
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   738
          return result.second;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   739
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   740
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   741
  return false;
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   744
bool
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   745
RouteCache::DeleteRoute (Ipv4Address dst)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   746
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   747
  NS_LOG_FUNCTION (this << dst);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   748
  Purge (); // purge the route cache first to remove timeout entries
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   749
  if (m_sortedRoutes.erase (dst) != 0)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   750
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   751
      NS_LOG_LOGIC ("Route deletion to " << dst << " successful");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   752
      return true;
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
  NS_LOG_LOGIC ("Route deletion to " << dst << " not successful");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   755
  return false;
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   758
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   759
RouteCache::DeleteAllRoutesIncludeLink (Ipv4Address errorSrc, Ipv4Address unreachNode, Ipv4Address node)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   760
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   761
  NS_LOG_FUNCTION (this << errorSrc << unreachNode << node);
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   762
  if (IsLinkCache ())
8751
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
      /*
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   765
       * The followings are for cleaning the broken link in linkcache
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   766
       *
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   767
       */
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   768
      Link link1 (errorSrc, unreachNode);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   769
      Link link2 (unreachNode, errorSrc);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   770
      // erase the two kind of links to make sure the link is removed from the link cache
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   771
      NS_LOG_DEBUG ("Erase the route ");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   772
      m_linkCache.erase (link1);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   773
      m_linkCache.erase (link2);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   774
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   775
      std::map<Ipv4Address, NodeStab>::iterator i = m_nodeCache.find (errorSrc);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   776
      if (i == m_nodeCache.end ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   777
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   778
          NS_LOG_LOGIC ("Update the node stability unsuccessfully");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   779
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   780
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   781
        {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   782
          DecStability (i->first);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   783
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   784
      i = m_nodeCache.find (unreachNode);
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   785
      if (i == m_nodeCache.end ())
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   786
        {
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   787
          NS_LOG_LOGIC ("Update the node stability unsuccessfully");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   788
        }
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   789
      else
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
          DecStability (i->first);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   792
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   793
      PurgeLinkNode ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   794
      UpdateNetGraph ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   795
      RebuildBestRouteTable (node);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   796
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   797
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   798
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   799
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   800
       * the followings are for cleaning the broken link in pathcache
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
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   803
      Purge ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   804
      if (m_sortedRoutes.empty ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   805
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   806
          return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   807
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   808
      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   809
       * Loop all the routes saved in the route cache
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   810
       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   811
      for (std::map<Ipv4Address, std::list<RouteCacheEntry> >::iterator j =
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   812
             m_sortedRoutes.begin (); j != m_sortedRoutes.end (); )
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   813
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   814
          std::map<Ipv4Address, std::list<RouteCacheEntry> >::iterator jtmp = j;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   815
          Ipv4Address address = j->first;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   816
          std::list<RouteCacheEntry> rtVector = j->second;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   817
          /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   818
           * Loop all the routes for a single destination
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
          for (std::list<RouteCacheEntry>::iterator k = rtVector.begin (); k != rtVector.end (); )
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   821
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   822
              // return the first route in the route vector
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   823
              RouteCacheEntry::IP_VECTOR routeVector = k->GetVector ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   824
              RouteCacheEntry::IP_VECTOR changeVector;
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
               * Loop the ip addresses within a single route entry
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
              for (RouteCacheEntry::IP_VECTOR::iterator i = routeVector.begin (); i != routeVector.end (); ++i)
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
                  if (*i != errorSrc)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   831
                    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   832
                      changeVector.push_back (*i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   833
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   834
                  else
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
                      if (*(i + 1) == unreachNode)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   837
                        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   838
                          changeVector.push_back (*i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   839
                          break;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   840
                        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   841
                      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   842
                        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   843
                          changeVector.push_back (*i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   844
                        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   845
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   846
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   847
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   848
               * Verify if need to remove some affected links
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   849
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   850
              if (changeVector.size () == routeVector.size ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   851
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   852
                  NS_LOG_DEBUG ("The route does not contain the broken link");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   853
                  ++k;
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
              else if ((changeVector.size () < routeVector.size ()) && (changeVector.size () > 1))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   856
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   857
                  NS_LOG_DEBUG ("sub route " << m_subRoute);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   858
                  if (m_subRoute)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   859
                    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   860
                      Time expire = k->GetExpireTime ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   861
                      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   862
                       * Remove the route first
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   863
                       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   864
                      k = rtVector.erase (k);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   865
                      RouteCacheEntry changeEntry;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   866
                      changeEntry.SetVector (changeVector);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   867
                      Ipv4Address destination = changeVector.back ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   868
                      NS_LOG_DEBUG ("The destination of the newly formed route " << destination << " and the size of the route " << changeVector.size ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   869
                      changeEntry.SetDestination (destination);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   870
                      changeEntry.SetExpireTime (expire); // Initialize the timeout value to the one it has
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   871
                      rtVector.push_back (changeEntry);  // Add the route entry to the route list
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   872
                      NS_LOG_DEBUG ("We have a sub-route to " << destination);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   873
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   874
                  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   875
                    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   876
                      /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   877
                       * Remove the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   878
                       */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   879
                      k = rtVector.erase (k);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   880
                    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   881
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   882
              else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   883
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   884
                  NS_LOG_LOGIC ("Cut route unsuccessful and erase the route");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   885
                  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   886
                   * Remove the route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   887
                   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   888
                  k = rtVector.erase (k);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   889
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   890
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   891
          ++j;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   892
          if (!IsLinkCache ())
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   893
            {
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   894
              m_sortedRoutes.erase (jtmp);
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   895
            }
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   896
          if (rtVector.size ())
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   897
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   898
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   899
               * Save the new route cache along with the destination address in map
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   900
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   901
              rtVector.sort (CompareRoutesExpire);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   902
              m_sortedRoutes[address] = rtVector;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   903
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   904
          else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   905
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   906
              NS_LOG_DEBUG ("There is no route left for that destination " << address);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   907
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   908
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   909
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   910
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   911
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   912
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   913
RouteCache::PrintVector (std::vector<Ipv4Address>& vec)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   914
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   915
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   916
  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   917
   * Check elements in a route vector, used when one wants to check the IP addresses saved in
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   918
   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   919
  if (!vec.size ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   920
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   921
      NS_LOG_DEBUG ("The vector is empty");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   922
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   923
  else
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
      NS_LOG_DEBUG ("Print all the elements in a vector");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   926
      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
   927
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   928
          NS_LOG_DEBUG ("The ip address " << *i);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   929
        }
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
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   932
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   933
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   934
RouteCache::PrintRouteVector (std::list<RouteCacheEntry> route)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   935
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   936
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   937
  for (std::list<RouteCacheEntry>::iterator i = route.begin (); i != route.end (); i++)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   938
    {
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   939
      std::vector<Ipv4Address> path = i->GetVector ();
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   940
      NS_LOG_INFO ("Route NO. ");
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   941
      PrintVector (path);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   942
    }
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
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   946
RouteCache::Purge ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   947
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
   948
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   949
  //Trying to purge the route cache
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   950
  if (m_sortedRoutes.empty ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   951
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   952
      NS_LOG_DEBUG ("The route cache is empty");
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   953
      return;
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
  for (std::map<Ipv4Address, std::list<RouteCacheEntry> >::iterator i =
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   956
         m_sortedRoutes.begin (); i != m_sortedRoutes.end (); )
8751
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
      // Loop of route cache entry with the route size
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   959
      std::map<Ipv4Address, std::list<RouteCacheEntry> >::iterator itmp = i;
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
       * The route cache entry vector
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
      Ipv4Address dst = i->first;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   964
      std::list<RouteCacheEntry> rtVector = i->second;
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   965
      NS_LOG_DEBUG ("The route vector size of 1 " << dst << " " << rtVector.size ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   966
      if (rtVector.size ())
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
          for (std::list<RouteCacheEntry>::iterator j = rtVector.begin (); j != rtVector.end (); )
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
              NS_LOG_DEBUG ("The expire time of every entry with expire time " << j->GetExpireTime ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   971
              /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   972
               * First verify if the route has expired or not
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   973
               */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   974
              if (j->GetExpireTime () <= Seconds (0))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   975
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   976
                  /*
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   977
                   * When the expire time has passed, erase the certain route
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   978
                   */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   979
                  NS_LOG_DEBUG ("Erase the expired route for " << dst << " with expire time " << j->GetExpireTime ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   980
                  j = rtVector.erase (j);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   981
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   982
              else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   983
                {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   984
                  ++j;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   985
                }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   986
            }
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   987
          NS_LOG_DEBUG ("The route vector size of 2 " << dst << " " << rtVector.size ());
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   988
          if (rtVector.size ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   989
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   990
              ++i;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   991
              m_sortedRoutes.erase (itmp); // erase the entry first
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
               * Save the new route cache along with the destination address in map
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   994
               */
8756
9a34e618f40b check-style.py run on src/dsr
Tom Henderson <tomh@tomh.org>
parents: 8755
diff changeset
   995
              m_sortedRoutes.insert (std::make_pair (dst, rtVector));
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   996
            }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   997
          else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   998
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
   999
              ++i;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1000
              m_sortedRoutes.erase (itmp);
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
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1003
      else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1004
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1005
          ++i;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1006
          m_sortedRoutes.erase (itmp);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1007
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1008
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1009
  return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1010
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1011
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1012
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1013
RouteCache::Print (std::ostream &os)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1014
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1015
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1016
  Purge ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1017
  os << "\nDSR Route Cache\n"
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1018
     << "Destination\tGateway\t\tInterface\tFlag\tExpire\tHops\n";
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1019
  for (std::list<RouteCacheEntry>::const_iterator i =
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1020
         m_routeEntryVector.begin (); i != m_routeEntryVector.end (); ++i)
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
      i->Print (os);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1023
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1024
  os << "\n";
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1025
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1026
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1027
// ----------------------------------------------------------------------------------------------------------
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
 * This part of code maintains an Acknowledgment id cache for next hop and remove duplicate ids
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1030
 */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1031
uint16_t
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1032
RouteCache::CheckUniqueAckId (Ipv4Address nextHop)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1033
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1034
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1035
  std::map<Ipv4Address, uint16_t>::const_iterator i =
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1036
    m_ackIdCache.find (nextHop);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1037
  if (i == m_ackIdCache.end ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1038
    {
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1039
      NS_LOG_LOGIC ("No Ack id for " << nextHop << " found and use id 1 for the first network ack id");
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1040
      m_ackIdCache[nextHop] = 1;
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1041
      return 1;
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1042
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1043
  else
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1044
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1045
      uint16_t ackId = m_ackIdCache[nextHop];
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1046
      NS_LOG_LOGIC ("Ack id for " << nextHop << " found in the cache has value " << ackId);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1047
      ackId++;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1048
      m_ackIdCache[nextHop] = ackId;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1049
      return ackId;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1050
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1051
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1052
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1053
uint16_t
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1054
RouteCache::GetAckSize ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1055
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1056
  return m_ackIdCache.size ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1057
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1058
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1059
// ----------------------------------------------------------------------------------------------------------
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1060
/**
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1061
 * This part maintains a neighbor list to handle unidirectional links and link-layer acks
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1062
 */
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1063
bool
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1064
RouteCache::IsNeighbor (Ipv4Address addr)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1065
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1066
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1067
  PurgeMac ();  // purge the mac cache
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1068
  for (std::vector<Neighbor>::const_iterator i = m_nb.begin ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1069
       i != m_nb.end (); ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1070
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1071
      if (i->m_neighborAddress == addr)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1072
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1073
          return true;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1074
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1075
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1076
  return false;
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
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1079
Time
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1080
RouteCache::GetExpireTime (Ipv4Address addr)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1081
{
8752
2da1fab73114 Update DSR model
Yufei Cheng <yfcheng@ittc.ku.edu>
parents: 8751
diff changeset
  1082
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1083
  PurgeMac ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1084
  for (std::vector<Neighbor>::const_iterator i = m_nb.begin (); i
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1085
       != m_nb.end (); ++i)
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
      if (i->m_neighborAddress == addr)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1088
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1089
          return (i->m_expireTime - Simulator::Now ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1090
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1091
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1092
  return Seconds (0);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1093
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1094
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1095
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1096
RouteCache::UpdateNeighbor (std::vector<Ipv4Address> nodeList, Time expire)
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
  NS_LOG_FUNCTION (this);
8751
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1099
  for (std::vector<Neighbor>::iterator i = m_nb.begin (); i != m_nb.end (); ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1100
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1101
      for (std::vector<Ipv4Address>::iterator j = nodeList.begin (); j != nodeList.end (); ++j)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1102
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1103
          if (i->m_neighborAddress == (*j))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1104
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1105
              i->m_expireTime
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1106
                = std::max (expire + Simulator::Now (), i->m_expireTime);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1107
              if (i->m_hardwareAddress == Mac48Address ())
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
                  i->m_hardwareAddress = LookupMacAddress (i->m_neighborAddress);
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
              return;
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
    }
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 addr;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1117
  NS_LOG_LOGIC ("Open link to " << addr);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1118
  Neighbor neighbor (addr, LookupMacAddress (addr), expire + Simulator::Now ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1119
  m_nb.push_back (neighbor);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1120
  PurgeMac ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1121
}
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
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1124
RouteCache::AddNeighbor (std::vector<Ipv4Address> nodeList, Ipv4Address ownAddress, Time expire)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1125
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1126
  NS_LOG_LOGIC ("Add neighbor number " << nodeList.size ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1127
  for (std::vector<Ipv4Address>::iterator j = nodeList.begin (); j != nodeList.end (); ++j)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1128
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1129
      Ipv4Address addr = *j;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1130
      if (addr == ownAddress)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1131
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1132
          nodeList.erase (j);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1133
          NS_LOG_DEBUG ("The node list size " << nodeList.size ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1134
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1135
      Neighbor neighbor (addr, LookupMacAddress (addr), expire + Simulator::Now ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1136
      m_nb.push_back (neighbor);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1137
      PurgeMac ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1138
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1139
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1140
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1141
struct CloseNeighbor
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1142
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1143
  bool operator() (const RouteCache::Neighbor & nb) const
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
    return ((nb.m_expireTime < Simulator::Now ()) || nb.close);
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
};
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
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1150
RouteCache::PurgeMac ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1151
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1152
  if (m_nb.empty ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1153
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1154
      return;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1155
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1156
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1157
  CloseNeighbor pred;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1158
  if (!m_handleLinkFailure.IsNull ())
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
      for (std::vector<Neighbor>::iterator j = m_nb.begin (); j != m_nb.end (); ++j)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1161
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1162
          if (pred (*j))
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1163
            {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1164
              NS_LOG_LOGIC ("Close link to " << j->m_neighborAddress);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1165
              // disable temporarily TODO
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1166
//              m_handleLinkFailure (j->m_neighborAddress);
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
        }
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
  m_nb.erase (std::remove_if (m_nb.begin (), m_nb.end (), pred), m_nb.end ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1171
  m_ntimer.Cancel ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1172
  m_ntimer.Schedule ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1173
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1174
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1175
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1176
RouteCache::ScheduleTimer ()
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1177
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1178
  m_ntimer.Cancel ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1179
  m_ntimer.Schedule ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1180
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1181
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1182
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1183
RouteCache::AddArpCache (Ptr<ArpCache> a)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1184
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1185
  m_arp.push_back (a);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1186
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1187
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1188
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1189
RouteCache::DelArpCache (Ptr<ArpCache> a)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1190
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1191
  m_arp.erase (std::remove (m_arp.begin (), m_arp.end (), a), m_arp.end ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1192
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1193
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1194
Mac48Address
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1195
RouteCache::LookupMacAddress (Ipv4Address addr)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1196
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1197
  Mac48Address hwaddr;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1198
  for (std::vector<Ptr<ArpCache> >::const_iterator i = m_arp.begin ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1199
       i != m_arp.end (); ++i)
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
      ArpCache::Entry * entry = (*i)->Lookup (addr);
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1202
      if (entry != 0 && entry->IsAlive () && !entry->IsExpired ())
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1203
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1204
          hwaddr = Mac48Address::ConvertFrom (entry->GetMacAddress ());
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1205
          break;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1206
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1207
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1208
  return hwaddr;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1209
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1210
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1211
void
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1212
RouteCache::ProcessTxError (WifiMacHeader const & hdr)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1213
{
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1214
  Mac48Address addr = hdr.GetAddr1 ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1215
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1216
  for (std::vector<Neighbor>::iterator i = m_nb.begin (); i != m_nb.end (); ++i)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1217
    {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1218
      if (i->m_hardwareAddress == addr)
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1219
        {
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1220
          i->close = true;
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1221
        }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1222
    }
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1223
  PurgeMac ();
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1224
}
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1225
} // namespace dsr
efad81f3cb47 Add IPv4 DSR routing
Yufei Cheng <yfcheng@ittc.ku.edu>
parents:
diff changeset
  1226
} // namespace ns3