src/node/ipv4-address-generator.cc
author Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
Fri, 11 Jul 2008 18:39:19 +0100
changeset 3416 926ccb845111
parent 3179 1763f7ac8e80
child 4184 e7a525be7dc2
permissions -rw-r--r--
Rescan APIs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     2
/*
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     3
 * Copyright (c) 2008 University of Washington
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     4
 *
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     8
 *
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    12
 * GNU General Public License for more details.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    13
 *
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    17
 */
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    18
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    19
#include <list>
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    20
#include "ns3/assert.h"
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    21
#include "ns3/log.h"
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    22
#include "ns3/simulation-singleton.h"
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    23
#include "ipv4-address-generator.h"
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    24
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    25
NS_LOG_COMPONENT_DEFINE("Ipv4AddressGenerator");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    26
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    27
namespace ns3 {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    28
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    29
class Ipv4AddressGeneratorImpl
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    30
{
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    31
public:
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    32
  Ipv4AddressGeneratorImpl ();
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    33
  virtual ~Ipv4AddressGeneratorImpl ();
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    34
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    35
  void Init (const Ipv4Address net, const Ipv4Mask mask, 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    36
    const Ipv4Address addr);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    37
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    38
  Ipv4Address GetNetwork (const Ipv4Mask mask) const;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    39
  Ipv4Address NextNetwork (const Ipv4Mask mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    40
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    41
  void InitAddress (const Ipv4Address addr, const Ipv4Mask mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    42
  Ipv4Address GetAddress (const Ipv4Mask mask) const;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    43
  Ipv4Address NextAddress (const Ipv4Mask mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    44
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    45
  void Reset (void);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    46
  bool AddAllocated (const Ipv4Address addr);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    47
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    48
  void TestMode (void);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    49
private:
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    50
  static const uint32_t N_BITS = 32;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    51
  static const uint32_t MOST_SIGNIFICANT_BIT = 0x80000000;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    52
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    53
  uint32_t MaskToIndex (Ipv4Mask mask) const;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    54
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    55
  class NetworkState
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    56
  {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    57
  public:
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    58
    uint32_t mask;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    59
    uint32_t shift;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    60
    uint32_t network;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    61
    uint32_t addr;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    62
    uint32_t addrMax;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    63
  };
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    64
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    65
  NetworkState m_netTable[N_BITS];
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    66
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    67
  class Entry
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    68
  {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    69
  public:
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    70
    uint32_t addrLow;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    71
    uint32_t addrHigh;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    72
  };
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    73
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    74
  std::list<Entry> m_entries;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    75
  bool m_test;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    76
};
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    77
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    78
Ipv4AddressGeneratorImpl::Ipv4AddressGeneratorImpl () 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    79
  : m_entries (), m_test (false)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    80
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
    81
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    82
  Reset ();
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    83
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    84
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    85
  void
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    86
Ipv4AddressGeneratorImpl::Reset (void)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    87
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
    88
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    89
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    90
  uint32_t mask = 0;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    91
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    92
// There are 32 possible masks in a 32-bit integer.  Two of these are illegal
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    93
// for a network mask (0x00000000 and 0xffffffff).  Valid network masks
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    94
// correspond to some nonzero number of high order bits set to one followed by 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    95
// some nonzero number of lower order bits set to zero.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    96
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    97
// We look at a network number as an n-bit number where n is defined as the 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    98
// number of bits in each mask.  Allocating a new network number is simply 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    99
// incrementing this number.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   100
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   101
// In order to combine an allocated network number with an IP address, we have
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   102
// to shift the network into the correct alignment with respect to its mask.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   103
// For example, a network mask of 0xff000000 admits the possibility of 256
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   104
// different network numbers since there are eight bits available.  To create
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   105
// IP addresses, we need to shift the network number counter left by 24 bits
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   106
// to put it in correct alignment.  This leaves 24 bits left for addresses.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   107
// We make sure we don't overflow by saving a maximum address number which is
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   108
// just the inverse of the mask (~mask).
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   109
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   110
  for (uint32_t i = 0; i < N_BITS; ++i)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   111
    {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   112
      m_netTable[i].mask = mask;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   113
      mask >>= 1;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   114
      mask |= MOST_SIGNIFICANT_BIT;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   115
      m_netTable[i].network = 1;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   116
      m_netTable[i].addr = 1;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   117
      m_netTable[i].addrMax = ~mask;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   118
      m_netTable[i].shift = N_BITS - i;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   119
    }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   120
  m_entries.clear ();
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   121
  m_test = false;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   122
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   123
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   124
Ipv4AddressGeneratorImpl::~Ipv4AddressGeneratorImpl ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   125
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   126
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   127
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   128
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   129
  void
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   130
Ipv4AddressGeneratorImpl::Init (
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   131
  const Ipv4Address net,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   132
  const Ipv4Mask mask,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   133
  const Ipv4Address addr)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   134
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   135
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   136
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   137
// We're going to be playing with the actual bits in the network and mask so
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   138
// pull them out into ints.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   139
//
3179
1763f7ac8e80 bug 146: s/HostOrder//
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3007
diff changeset
   140
  uint32_t maskBits __attribute__((unused)) = mask.Get ();
1763f7ac8e80 bug 146: s/HostOrder//
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3007
diff changeset
   141
  uint32_t netBits = net.Get ();
1763f7ac8e80 bug 146: s/HostOrder//
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3007
diff changeset
   142
  uint32_t addrBits = addr.Get ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   143
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   144
// Some quick reasonableness testing.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   145
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   146
  NS_ASSERT_MSG((netBits & ~maskBits) == 0,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   147
    "Ipv4AddressGeneratorImpl::Init (): Inconsistent network and mask");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   148
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   149
  NS_ASSERT_MSG((addrBits & maskBits) == 0,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   150
    "Ipv4AddressGeneratorImpl::Init (): Inconsistent address and mask");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   151
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   152
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   153
// Convert the network mask into an index into the network number table.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   154
// The network number comes in to us properly aligned for the mask and so
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   155
// needs to be shifted right into the normalized position (lowest bit of the
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   156
// network number at bit zero of the int that holds it).
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   157
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   158
  uint32_t index = MaskToIndex (mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   159
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   160
  m_netTable[index].network = netBits >> m_netTable[index].shift;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   161
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   162
  NS_ASSERT_MSG (addrBits <= m_netTable[index].addrMax,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   163
    "Ipv4AddressGeneratorImpl::Init(): Address overflow");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   164
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   165
  m_netTable[index].addr = addrBits;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   166
  return;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   167
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   168
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   169
  Ipv4Address
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   170
Ipv4AddressGeneratorImpl::GetNetwork (
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   171
  const Ipv4Mask mask) const
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   172
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   173
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   174
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   175
  uint32_t index = MaskToIndex (mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   176
  return Ipv4Address (m_netTable[index].network << m_netTable[index].shift);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   177
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   178
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   179
  Ipv4Address
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   180
Ipv4AddressGeneratorImpl::NextNetwork (
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   181
  const Ipv4Mask mask)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   182
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   183
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   184
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   185
// The way this is expected to be used is that an address and network prefix
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   186
// are initialized, and then NextAddress() is called repeatedly to set the
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   187
// addresses on a given subnet.  The client will expect that the first 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   188
// addresses will use the network prefix she used to initialize the generator
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   189
// with.  After a subnet is assigned, the client will call NextNetwork to 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   190
// get the network number of the next subnet.  This implies that that this
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   191
// operation is a pre-increment.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   192
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   193
  uint32_t index = MaskToIndex (mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   194
  ++m_netTable[index].network;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   195
  return Ipv4Address (m_netTable[index].network << m_netTable[index].shift);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   196
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   197
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   198
  void
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   199
Ipv4AddressGeneratorImpl::InitAddress (
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   200
  const Ipv4Address addr,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   201
  const Ipv4Mask mask)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   202
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   203
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   204
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   205
  uint32_t index = MaskToIndex (mask);
3179
1763f7ac8e80 bug 146: s/HostOrder//
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3007
diff changeset
   206
  uint32_t addrBits = addr.Get ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   207
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   208
  NS_ASSERT_MSG (addrBits <= m_netTable[index].addrMax,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   209
    "Ipv4AddressGeneratorImpl::InitAddress(): Address overflow");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   210
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   211
  m_netTable[index].addr = addrBits;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   212
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   213
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   214
  Ipv4Address
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   215
Ipv4AddressGeneratorImpl::GetAddress (
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   216
  const Ipv4Mask mask) const
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   217
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   218
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   219
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   220
  uint32_t index = MaskToIndex (mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   221
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   222
  return Ipv4Address (
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   223
    (m_netTable[index].network << m_netTable[index].shift) |
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   224
    m_netTable[index].addr);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   225
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   226
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   227
  Ipv4Address
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   228
Ipv4AddressGeneratorImpl::NextAddress (const Ipv4Mask mask)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   229
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   230
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   231
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   232
// The way this is expected to be used is that an address and network prefix
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   233
// are initialized, and then NextAddress() is called repeatedly to set the
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   234
// addresses on a given subnet.  The client will expect that the first address
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   235
// she gets back is the one she used to initialize the generator with.  This
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   236
// implies that this operation is a post-increment.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   237
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   238
  uint32_t index = MaskToIndex (mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   239
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   240
  NS_ASSERT_MSG (m_netTable[index].addr <= m_netTable[index].addrMax,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   241
    "Ipv4AddressGeneratorImpl::NextAddress(): Address overflow");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   242
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   243
  Ipv4Address addr = Ipv4Address (
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   244
    (m_netTable[index].network << m_netTable[index].shift) |
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   245
    m_netTable[index].addr);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   246
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   247
  ++m_netTable[index].addr;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   248
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   249
// Make a note that we've allocated this address -- used for address collision
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   250
// detection.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   251
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   252
  AddAllocated (addr);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   253
  return addr;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   254
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   255
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   256
  bool
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   257
Ipv4AddressGeneratorImpl::AddAllocated (const Ipv4Address address)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   258
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   259
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   260
3179
1763f7ac8e80 bug 146: s/HostOrder//
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3007
diff changeset
   261
  uint32_t addr = address.Get ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   262
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   263
  NS_ASSERT_MSG (addr, "Ipv4AddressGeneratorImpl::Add(): "
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   264
    "Allocating the broadcast address is not a good idea"); 
3007
364e3943c8f0 fix optimized build, bug 169
Craig Dowell <craigdo@ee.washington.edu>
parents: 2983
diff changeset
   265
 
364e3943c8f0 fix optimized build, bug 169
Craig Dowell <craigdo@ee.washington.edu>
parents: 2983
diff changeset
   266
  std::list<Entry>::iterator i;
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   267
3007
364e3943c8f0 fix optimized build, bug 169
Craig Dowell <craigdo@ee.washington.edu>
parents: 2983
diff changeset
   268
  for (i = m_entries.begin (); i != m_entries.end (); ++i)
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   269
    {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   270
      NS_LOG_LOGIC ("examine entry: " << Ipv4Address ((*i).addrLow) << 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   271
        " to " << Ipv4Address ((*i).addrHigh));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   272
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   273
// First things first.  Is there an address collision -- that is, does the
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   274
// new address fall in a previously allocated block of addresses.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   275
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   276
      if (addr >= (*i).addrLow && addr <= (*i).addrHigh)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   277
        {
3007
364e3943c8f0 fix optimized build, bug 169
Craig Dowell <craigdo@ee.washington.edu>
parents: 2983
diff changeset
   278
          NS_LOG_LOGIC ("Ipv4AddressGeneratorImpl::Add(): "
364e3943c8f0 fix optimized build, bug 169
Craig Dowell <craigdo@ee.washington.edu>
parents: 2983
diff changeset
   279
            "Address Collision: " << Ipv4Address (addr)); 
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   280
          if (!m_test) 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   281
            {
3007
364e3943c8f0 fix optimized build, bug 169
Craig Dowell <craigdo@ee.washington.edu>
parents: 2983
diff changeset
   282
              NS_ASSERT_MSG (0, "Ipv4AddressGeneratorImpl::Add(): "
364e3943c8f0 fix optimized build, bug 169
Craig Dowell <craigdo@ee.washington.edu>
parents: 2983
diff changeset
   283
                "Address Collision: " << Ipv4Address (addr)); 
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   284
            }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   285
          return false;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   286
       }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   287
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   288
// If the new address is less than the lowest address in the current block,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   289
// and can't be merged into to the current block, then insert it as a new
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   290
// block before the current block.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   291
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   292
      if (addr < (*i).addrLow - 1)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   293
        {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   294
          break;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   295
        }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   296
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   297
// If the new address fits at the end of the block, look ahead to the next 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   298
// block and make sure it's not a collision there.  If we won't overlap, then
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   299
// just extend the current block by one address.  We expect that completely
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   300
// filled network ranges will be a fairly rare occurrence, so we don't worry
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   301
// about collapsing address range blocks.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   302
// 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   303
      if (addr == (*i).addrHigh + 1)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   304
        {
3007
364e3943c8f0 fix optimized build, bug 169
Craig Dowell <craigdo@ee.washington.edu>
parents: 2983
diff changeset
   305
          std::list<Entry>::iterator j = i;
364e3943c8f0 fix optimized build, bug 169
Craig Dowell <craigdo@ee.washington.edu>
parents: 2983
diff changeset
   306
          ++j;
364e3943c8f0 fix optimized build, bug 169
Craig Dowell <craigdo@ee.washington.edu>
parents: 2983
diff changeset
   307
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   308
          if (j != m_entries.end ())
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   309
            {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   310
              if (addr == (*j).addrLow)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   311
                {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   312
                  NS_LOG_LOGIC ("Ipv4AddressGeneratorImpl::Add(): "
2894
a65404754cb7 some additional debugging for addressing conflicts
Tom Henderson <tomh@tomh.org>
parents: 2723
diff changeset
   313
                    "Address Collision: " << Ipv4Address (addr)); 
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   314
                  if (!m_test)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   315
                    {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   316
                      NS_ASSERT_MSG (0, 
2894
a65404754cb7 some additional debugging for addressing conflicts
Tom Henderson <tomh@tomh.org>
parents: 2723
diff changeset
   317
                        "Ipv4AddressGeneratorImpl::Add(): "
a65404754cb7 some additional debugging for addressing conflicts
Tom Henderson <tomh@tomh.org>
parents: 2723
diff changeset
   318
                     "Address Collision: " << Ipv4Address (addr));
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   319
                    }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   320
                  return false;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   321
                }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   322
            }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   323
          
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   324
          NS_LOG_LOGIC ("New addrHigh = " << Ipv4Address (addr));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   325
          (*i).addrHigh = addr;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   326
          return true;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   327
        }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   328
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   329
// If we get here, we know that the next lower block of addresses couldn't 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   330
// have been extended to include this new address since the code immediately 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   331
// above would have been executed and that next lower block extended upward.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   332
// So we know it's safe to extend the current block down to includ the new
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   333
// address.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   334
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   335
      if (addr == (*i).addrLow - 1)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   336
        {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   337
          NS_LOG_LOGIC ("New addrLow = " << Ipv4Address (addr));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   338
          (*i).addrLow = addr;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   339
          return true;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   340
        }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   341
    }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   342
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   343
  Entry entry;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   344
  entry.addrLow = entry.addrHigh = addr;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   345
  m_entries.insert(i, entry);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   346
  return true;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   347
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   348
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   349
  void
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   350
Ipv4AddressGeneratorImpl::TestMode (void)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   351
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   352
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   353
  m_test = true;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   354
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   355
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   356
  uint32_t
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   357
Ipv4AddressGeneratorImpl::MaskToIndex (Ipv4Mask mask) const
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   358
{
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   359
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   360
// We've been given a mask that has a higher order bit set for each bit of the
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   361
// network number.  In order to translate this mask into an index, we just need
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   362
// to count the number of zero bits in the mask.  We do this in a loop in which
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   363
// we shift the mask right until we find the first nonzero bit.  This tells us
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   364
// the number of zero bits, and from this we infer the number of nonzero bits
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   365
// which is the number of bits in the mask.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   366
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   367
// We use the number of bits in the mask as the number of bits in the network
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   368
// number and as the index into the network number state table.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   369
//
3179
1763f7ac8e80 bug 146: s/HostOrder//
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3007
diff changeset
   370
  uint32_t maskBits = mask.Get ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   371
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   372
  for (uint32_t i = 0; i < N_BITS; ++i)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   373
    {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   374
      if (maskBits & 1)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   375
        {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   376
          uint32_t index = N_BITS - i;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   377
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   378
          NS_ASSERT_MSG (index > 0 && index < N_BITS,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   379
            "Ipv4AddressGenerator::MaskToIndex(): Illegal Mask");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   380
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   381
          return index;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   382
        }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   383
      maskBits >>= 1;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   384
    }
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   385
  NS_ASSERT_MSG(false, "Ipv4AddressGenerator::MaskToIndex(): Impossible");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   386
  return 0;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   387
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   388
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   389
  void
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   390
Ipv4AddressGenerator::Init (
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   391
  const Ipv4Address net,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   392
  const Ipv4Mask mask,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   393
  const Ipv4Address addr)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   394
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   395
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   396
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   397
  SimulationSingleton<Ipv4AddressGeneratorImpl>::Get ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   398
    ->Init (net, mask, addr);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   399
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   400
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   401
  Ipv4Address
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   402
Ipv4AddressGenerator::NextNetwork (const Ipv4Mask mask)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   403
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   404
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   405
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   406
  return SimulationSingleton<Ipv4AddressGeneratorImpl>::Get ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   407
    ->NextNetwork (mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   408
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   409
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   410
  Ipv4Address
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   411
Ipv4AddressGenerator::GetNetwork (const Ipv4Mask mask)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   412
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   413
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   414
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   415
  return SimulationSingleton<Ipv4AddressGeneratorImpl>::Get ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   416
    ->GetNetwork (mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   417
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   418
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   419
  void
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   420
Ipv4AddressGenerator::InitAddress (
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   421
  const Ipv4Address addr,
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   422
  const Ipv4Mask mask)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   423
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   424
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   425
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   426
  SimulationSingleton<Ipv4AddressGeneratorImpl>::Get ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   427
    ->InitAddress (addr, mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   428
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   429
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   430
  Ipv4Address
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   431
Ipv4AddressGenerator::GetAddress (const Ipv4Mask mask)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   432
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   433
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   434
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   435
  return SimulationSingleton<Ipv4AddressGeneratorImpl>::Get ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   436
    ->GetAddress (mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   437
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   438
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   439
  Ipv4Address
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   440
Ipv4AddressGenerator::NextAddress (const Ipv4Mask mask)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   441
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   442
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   443
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   444
  return SimulationSingleton<Ipv4AddressGeneratorImpl>::Get ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   445
    ->NextAddress (mask);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   446
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   447
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   448
  void
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   449
Ipv4AddressGenerator::Reset (void)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   450
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   451
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   452
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   453
  return SimulationSingleton<Ipv4AddressGeneratorImpl>::Get ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   454
    ->Reset ();
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   455
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   456
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   457
  bool
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   458
Ipv4AddressGenerator::AddAllocated (const Ipv4Address addr)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   459
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   460
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   461
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   462
  return SimulationSingleton<Ipv4AddressGeneratorImpl>::Get ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   463
    ->AddAllocated (addr);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   464
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   465
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   466
  void
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   467
  Ipv4AddressGenerator::TestMode (void)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   468
{
2983
e3a416fe9dd5 NS_LOG_FUNCTION -> NS_LOG_FUNCTION_NOARGS and NS_LOG_PARAMS -> NS_LOG_FUNCTION
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2894
diff changeset
   469
  NS_LOG_FUNCTION_NOARGS ();
2722
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   470
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   471
  SimulationSingleton<Ipv4AddressGeneratorImpl>::Get ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   472
    ->TestMode ();
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   473
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   474
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   475
}; // namespace ns3
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   476
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   477
#ifdef RUN_SELF_TESTS
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   478
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   479
#include "ns3/test.h"
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   480
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   481
namespace ns3 {
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   482
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   483
class Ipv4AddressGeneratorTest : public Test
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   484
{
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   485
public:
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   486
  Ipv4AddressGeneratorTest ();
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   487
  virtual bool RunTests (void);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   488
};
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   489
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   490
Ipv4AddressGeneratorTest::Ipv4AddressGeneratorTest ()
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   491
  : Test ("Ipv4AddressGenerator")
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   492
{
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   493
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   494
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   495
  bool
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   496
Ipv4AddressGeneratorTest::RunTests (void)
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   497
{
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   498
  bool result = true;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   499
  Ipv4Address network;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   500
  Ipv4Address address;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   501
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   502
// Make sure the network number allocator is working on some of the network
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   503
// prefixes.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   504
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   505
  Ipv4AddressGenerator::Init (Ipv4Address ("1.0.0.0"), Ipv4Mask ("255.0.0.0"),
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   506
    Ipv4Address ("0.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   507
  network = Ipv4AddressGenerator::GetNetwork (Ipv4Mask ("255.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   508
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("1.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   509
  network = Ipv4AddressGenerator::NextNetwork (Ipv4Mask ("255.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   510
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("2.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   511
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   512
  Ipv4AddressGenerator::Init (Ipv4Address ("0.1.0.0"), 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   513
    Ipv4Mask ("255.255.0.0"), Ipv4Address ("0.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   514
  network = Ipv4AddressGenerator::GetNetwork (Ipv4Mask ("255.255.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   515
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.1.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   516
  network = Ipv4AddressGenerator::NextNetwork (Ipv4Mask ("255.255.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   517
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.2.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   518
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   519
  Ipv4AddressGenerator::Init (Ipv4Address ("0.0.1.0"),
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   520
    Ipv4Mask ("255.255.255.0"), Ipv4Address ("0.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   521
  network = Ipv4AddressGenerator::GetNetwork (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   522
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.0.1.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   523
  network = Ipv4AddressGenerator::NextNetwork (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   524
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.0.2.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   525
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   526
  network = Ipv4AddressGenerator::NextNetwork (Ipv4Mask ("255.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   527
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("3.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   528
  network = Ipv4AddressGenerator::NextNetwork (Ipv4Mask ("255.255.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   529
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.3.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   530
  network = Ipv4AddressGenerator::NextNetwork (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   531
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.0.3.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   532
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   533
// Make sure the address allocator is working.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   534
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   535
  Ipv4AddressGenerator::Init (Ipv4Address ("1.0.0.0"), Ipv4Mask ("255.0.0.0"),
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   536
    Ipv4Address ("0.0.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   537
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   538
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("1.0.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   539
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   540
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("1.0.0.4"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   541
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   542
  Ipv4AddressGenerator::Init (Ipv4Address ("0.1.0.0"),
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   543
    Ipv4Mask ("255.255.0.0"), Ipv4Address ("0.0.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   544
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   545
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.1.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   546
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   547
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.1.0.4"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   548
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   549
  Ipv4AddressGenerator::Init (Ipv4Address ("0.0.1.0"),
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   550
    Ipv4Mask ("255.255.255.0"), Ipv4Address ("0.0.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   551
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   552
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.1.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   553
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   554
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.1.4"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   555
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   556
// Make sure they both play together.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   557
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   558
  Ipv4AddressGenerator::Init (Ipv4Address ("3.0.0.0"), Ipv4Mask ("255.0.0.0"),
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   559
    Ipv4Address ("0.0.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   560
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   561
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("3.0.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   562
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   563
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("3.0.0.4"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   564
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   565
  network = Ipv4AddressGenerator::NextNetwork (Ipv4Mask ("255.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   566
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("4.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   567
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.0.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   568
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("4.0.0.5"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   569
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   570
  Ipv4AddressGenerator::Init (Ipv4Address ("0.3.0.0"), 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   571
    Ipv4Mask ("255.255.0.0"), Ipv4Address ("0.0.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   572
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   573
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.3.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   574
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   575
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.3.0.4"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   576
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   577
  network = Ipv4AddressGenerator::NextNetwork (Ipv4Mask ("255.255.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   578
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.4.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   579
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.0.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   580
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.4.0.5"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   581
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   582
  Ipv4AddressGenerator::Init (Ipv4Address ("0.0.3.0"),
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   583
    Ipv4Mask ("255.255.255.0"), Ipv4Address ("0.0.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   584
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   585
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.3.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   586
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   587
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.3.4"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   588
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   589
  network = Ipv4AddressGenerator::NextNetwork (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   590
  NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.0.4.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   591
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   592
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.4.5"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   593
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   594
// A quick kindof-semi-almost-real example.  First, initialize our /24 network
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   595
// to 192.168.0.0 and begin allocating with ip address 0.0.0.3 out of that
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   596
// prefix.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   597
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   598
  Ipv4AddressGenerator::Init (Ipv4Address ("192.168.0.0"),
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   599
    Ipv4Mask ("255.255.255.0"), Ipv4Address ("0.0.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   600
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   601
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("192.168.0.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   602
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   603
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("192.168.0.4"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   604
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   605
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("192.168.0.5"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   606
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   607
// Allocate the next network out of our /24 network (this should be 
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   608
// 192.168.1.0) and begin allocating with IP address 0.0.0.3 out of that
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   609
// prefix.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   610
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   611
  Ipv4AddressGenerator::NextNetwork (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   612
  Ipv4AddressGenerator::InitAddress (Ipv4Address ("0.0.0.3"),
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   613
    Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   614
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   615
// The first address we should get is the previous numbers ORed together, which
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   616
// is 192.168.1.3, of course.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   617
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   618
  address = Ipv4AddressGenerator::NextAddress (Ipv4Mask ("255.255.255.0"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   619
  NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("192.168.1.3"));
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   620
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   621
// Make sure that the address collision logic works.
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   622
//
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   623
  Ipv4AddressGenerator::Reset ();
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   624
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   625
  Ipv4AddressGenerator::AddAllocated ("0.0.0.5");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   626
  Ipv4AddressGenerator::AddAllocated ("0.0.0.10");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   627
  Ipv4AddressGenerator::AddAllocated ("0.0.0.15");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   628
  Ipv4AddressGenerator::AddAllocated ("0.0.0.20");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   629
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   630
  Ipv4AddressGenerator::AddAllocated ("0.0.0.4");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   631
  Ipv4AddressGenerator::AddAllocated ("0.0.0.3");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   632
  Ipv4AddressGenerator::AddAllocated ("0.0.0.2");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   633
  Ipv4AddressGenerator::AddAllocated ("0.0.0.1");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   634
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   635
  Ipv4AddressGenerator::AddAllocated ("0.0.0.6");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   636
  Ipv4AddressGenerator::AddAllocated ("0.0.0.7");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   637
  Ipv4AddressGenerator::AddAllocated ("0.0.0.8");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   638
  Ipv4AddressGenerator::AddAllocated ("0.0.0.9");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   639
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   640
  Ipv4AddressGenerator::AddAllocated ("0.0.0.11");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   641
  Ipv4AddressGenerator::AddAllocated ("0.0.0.12");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   642
  Ipv4AddressGenerator::AddAllocated ("0.0.0.13");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   643
  Ipv4AddressGenerator::AddAllocated ("0.0.0.14");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   644
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   645
  Ipv4AddressGenerator::AddAllocated ("0.0.0.19");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   646
  Ipv4AddressGenerator::AddAllocated ("0.0.0.18");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   647
  Ipv4AddressGenerator::AddAllocated ("0.0.0.17");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   648
  Ipv4AddressGenerator::AddAllocated ("0.0.0.16");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   649
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   650
  Ipv4AddressGenerator::TestMode ();
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   651
  bool added = Ipv4AddressGenerator::AddAllocated ("0.0.0.21");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   652
  NS_TEST_ASSERT_EQUAL (added, true);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   653
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   654
  added = Ipv4AddressGenerator::AddAllocated ("0.0.0.4");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   655
  NS_TEST_ASSERT_EQUAL (added, false);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   656
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   657
  added = Ipv4AddressGenerator::AddAllocated ("0.0.0.9");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   658
  NS_TEST_ASSERT_EQUAL (added, false);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   659
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   660
  added = Ipv4AddressGenerator::AddAllocated ("0.0.0.16");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   661
  NS_TEST_ASSERT_EQUAL (added, false);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   662
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   663
  added = Ipv4AddressGenerator::AddAllocated ("0.0.0.21");
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   664
  NS_TEST_ASSERT_EQUAL (added, false);
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   665
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   666
  Ipv4AddressGenerator::Reset ();
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   667
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   668
  return result;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   669
}
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   670
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   671
static Ipv4AddressGeneratorTest g_addressGeneratorTest;
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   672
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   673
} // namespace ns3
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   674
f59635c9c679 address generator, address collision checker
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   675
#endif /* RUN_SELF_TEST */