src/network/model/nix-vector.cc
author Tom Henderson <tomh@tomh.org>
Sun, 22 May 2011 22:28:15 -0700
changeset 7252 c8200621e252
parent 7182 5ecfee5d17de
child 7256 b04ba6772f8c
permissions -rw-r--r--
rerun check-style.py with uncrustify-0.58
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     2
/*
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     3
 * Copyright (c) 2009 The Georgia Institute of Technology 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     4
 *
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     8
 *
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    12
 * GNU General Public License for more details.
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    13
 *
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    17
 *
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    18
 * Authors: Josh Pelkey <jpelkey@gatech.edu>
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    19
 */
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    20
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    21
#include "ns3/log.h"
6458
8ca3abfb3590 missed include for nix-vector
Josh Pelkey <jpelkey@gatech.edu>
parents: 6457
diff changeset
    22
#include "ns3/fatal-error.h"
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    23
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    24
#include "nix-vector.h"
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    25
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    26
NS_LOG_COMPONENT_DEFINE ("NixVector");
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    27
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    28
namespace ns3 {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    29
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    30
typedef std::vector<uint32_t> NixBits_t;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    31
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    32
NixVector::NixVector ()
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    33
  : m_nixVector (0),
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    34
    m_used (0),
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    35
    m_currentVectorBitSize (0),
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    36
    m_totalBitSize (0)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    37
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    38
  NS_LOG_FUNCTION_NOARGS ();
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    39
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    40
  m_nixVector.push_back (0);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    41
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    42
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    43
NixVector::~NixVector ()
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    44
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    45
  NS_LOG_FUNCTION_NOARGS ();
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    46
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    47
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    48
NixVector::NixVector (const NixVector &o)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    49
  : m_nixVector (o.m_nixVector),
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    50
    m_used (o.m_used),
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    51
    m_currentVectorBitSize (o.m_currentVectorBitSize),
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    52
    m_totalBitSize (o.m_totalBitSize)
7182
5ecfee5d17de network coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6823
diff changeset
    53
{
5ecfee5d17de network coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6823
diff changeset
    54
}
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    55
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    56
NixVector &
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    57
NixVector::operator = (const NixVector &o)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    58
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    59
  if (this == &o)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    60
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    61
      return *this;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    62
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    63
  m_nixVector = o.m_nixVector;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    64
  m_used = o.m_used;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    65
  m_currentVectorBitSize = o.m_currentVectorBitSize;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    66
  m_totalBitSize = o.m_totalBitSize;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    67
  return *this;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    68
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    69
6457
9dd21e4198f8 undelete copy method in nix-vector
Josh Pelkey <jpelkey@gatech.edu>
parents: 6455
diff changeset
    70
Ptr<NixVector>
9dd21e4198f8 undelete copy method in nix-vector
Josh Pelkey <jpelkey@gatech.edu>
parents: 6455
diff changeset
    71
NixVector::Copy (void) const
9dd21e4198f8 undelete copy method in nix-vector
Josh Pelkey <jpelkey@gatech.edu>
parents: 6455
diff changeset
    72
{
9dd21e4198f8 undelete copy method in nix-vector
Josh Pelkey <jpelkey@gatech.edu>
parents: 6455
diff changeset
    73
  // we need to invoke the copy constructor directly
9dd21e4198f8 undelete copy method in nix-vector
Josh Pelkey <jpelkey@gatech.edu>
parents: 6455
diff changeset
    74
  // rather than calling Create because the copy constructor
9dd21e4198f8 undelete copy method in nix-vector
Josh Pelkey <jpelkey@gatech.edu>
parents: 6455
diff changeset
    75
  // is private.
9dd21e4198f8 undelete copy method in nix-vector
Josh Pelkey <jpelkey@gatech.edu>
parents: 6455
diff changeset
    76
  return Ptr<NixVector> (new NixVector (*this), false);
9dd21e4198f8 undelete copy method in nix-vector
Josh Pelkey <jpelkey@gatech.edu>
parents: 6455
diff changeset
    77
}
9dd21e4198f8 undelete copy method in nix-vector
Josh Pelkey <jpelkey@gatech.edu>
parents: 6455
diff changeset
    78
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    79
std::ostream & operator << (std::ostream &os, const NixVector &nix)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    80
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    81
  nix.DumpNixVector (os); 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    82
  return os;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    83
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    84
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    85
void
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    86
NixVector::AddNeighborIndex (uint32_t newBits, uint32_t numberOfBits)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    87
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    88
  NS_LOG_FUNCTION_NOARGS ();
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    89
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    90
  if (numberOfBits > 32)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    91
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    92
      NS_FATAL_ERROR ("Can't add more than 32 bits to a nix-vector at one time");
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    93
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    94
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    95
  // Check to see if the number
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    96
  // of new bits forces the creation of 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    97
  // a new entry into the NixVector vector
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    98
  // i.e., we will overflow int o.w.
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
    99
  if (m_currentVectorBitSize + numberOfBits > 32) 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   100
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   101
      if (m_currentVectorBitSize == 32)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   102
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   103
          // can't add any more to this vector, so 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   104
          // start a new one
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   105
          m_nixVector.push_back(newBits);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   106
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   107
          // also reset number of bits in
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   108
          // m_currentVectorBitSize
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   109
          // because we are working with a new 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   110
          // entry in the vector
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   111
          m_currentVectorBitSize = numberOfBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   112
          m_totalBitSize += numberOfBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   113
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   114
      else
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   115
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   116
          // Put what we can in the remaining portion of the 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   117
          // vector entry
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   118
          uint32_t tempBits = newBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   119
          tempBits = newBits << m_currentVectorBitSize;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   120
          tempBits |= m_nixVector.back ();
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   121
          m_nixVector.back () = tempBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   122
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   123
          // Now start a new vector entry
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   124
          // and push the remaining bits 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   125
          // there
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   126
          newBits = newBits >> (32 - m_currentVectorBitSize);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   127
          m_nixVector.push_back (newBits);
7182
5ecfee5d17de network coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6823
diff changeset
   128
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   129
          // also reset number of bits in
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   130
          // m_currentVectorBitSize
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   131
          // because we are working with a new 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   132
          // entry in the vector
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   133
          m_currentVectorBitSize = (numberOfBits - (32 - m_currentVectorBitSize));
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   134
          m_totalBitSize += numberOfBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   135
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   136
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   137
  else
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   138
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   139
      // Shift over the newbits by the
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   140
      // number of current bits.  This allows 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   141
      // us to logically OR with the present 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   142
      // NixVector, resulting in the new 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   143
      // NixVector
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   144
      newBits = newBits << m_currentVectorBitSize;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   145
      newBits |= m_nixVector.back ();
7182
5ecfee5d17de network coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6823
diff changeset
   146
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   147
      // Now insert the new NixVector and 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   148
      // increment number of bits for
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   149
      // m_currentVectorBitSize and m_totalBitSize
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   150
      // accordingly 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   151
      m_nixVector.back () = newBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   152
      m_currentVectorBitSize += numberOfBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   153
      m_totalBitSize += numberOfBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   154
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   155
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   156
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   157
uint32_t
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   158
NixVector::ExtractNeighborIndex (uint32_t numberOfBits)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   159
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   160
  NS_LOG_FUNCTION_NOARGS ();
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   161
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   162
  if (numberOfBits > 32)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   163
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   164
      NS_FATAL_ERROR ("Can't extract more than 32 bits to a nix-vector at one time");
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   165
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   166
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   167
  uint32_t vectorIndex = 0;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   168
  uint32_t extractedBits = 0;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   169
  uint32_t totalRemainingBits = GetRemainingBits ();
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   170
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   171
  if (numberOfBits > totalRemainingBits)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   172
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   173
      NS_FATAL_ERROR ("You've tried to extract too many bits of the Nix-vector, " << this << ". NumberBits: " 
7252
c8200621e252 rerun check-style.py with uncrustify-0.58
Tom Henderson <tomh@tomh.org>
parents: 7182
diff changeset
   174
                      << numberOfBits << " Remaining: " << totalRemainingBits);
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   175
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   176
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   177
  if (numberOfBits <= 0)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   178
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   179
      NS_FATAL_ERROR ("You've specified a number of bits for Nix-vector <= 0!");
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   180
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   181
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   182
  // First determine where in the NixVector 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   183
  // vector we need to extract which depends
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   184
  // on the number of used bits and the total
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   185
  // number of bits
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   186
  vectorIndex = ((totalRemainingBits-1) / 32);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   187
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   188
  // Next, determine if this extraction will
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   189
  // span multiple vector entries
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   190
  if (vectorIndex > 0) // we could span more than one
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   191
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   192
      if ((numberOfBits-1) > ((totalRemainingBits-1) % 32)) // we do span more than one
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   193
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   194
          extractedBits = m_nixVector.at (vectorIndex) << (32 - (totalRemainingBits % 32));
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   195
          extractedBits = extractedBits >> ((32 - (totalRemainingBits % 32)) 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   196
                                            - (numberOfBits - (totalRemainingBits % 32)));
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   197
          extractedBits |= (m_nixVector.at (vectorIndex-1) 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   198
                            >> (32 - (numberOfBits - (totalRemainingBits % 32))));
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   199
          m_used += numberOfBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   200
          return extractedBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   201
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   202
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   203
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   204
  // we don't span more than one
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   205
  extractedBits = m_nixVector.at (vectorIndex) << (32 - (totalRemainingBits % 32));
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   206
  extractedBits = extractedBits >> (32 - (numberOfBits));
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   207
  m_used += numberOfBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   208
  return extractedBits;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   209
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   210
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   211
uint32_t
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   212
NixVector::GetSerializedSize (void) const
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   213
{
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   214
  uint32_t totalSizeInBytes = 0;
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   215
  totalSizeInBytes = sizeof (m_used) + sizeof (m_currentVectorBitSize) + 
7182
5ecfee5d17de network coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6823
diff changeset
   216
    sizeof (m_totalBitSize) + (4 * m_nixVector.size ());
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   217
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   218
  return totalSizeInBytes;
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   219
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   220
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   221
uint32_t
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   222
NixVector::Serialize (uint32_t* buffer, uint32_t maxSize) const
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   223
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   224
  NS_LOG_FUNCTION (this);
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   225
  uint32_t* p = buffer;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   226
  uint32_t size = 0;
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   227
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   228
  if (size + 4 <= maxSize)
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   229
    {
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   230
      size += 4;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   231
      // grab number of used bits
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   232
      *p++ = m_used;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   233
    }
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   234
  else
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   235
    {
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   236
      return 0;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   237
    }
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   238
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   239
  if (size + 4 <= maxSize)
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   240
    {
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   241
      size += 4;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   242
      // grab number of current used bits
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   243
      // for the front vector
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   244
      *p++ = m_currentVectorBitSize;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   245
    }
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   246
  else
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   247
    {
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   248
      return 0;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   249
    }
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   250
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   251
  if (size + 4 <= maxSize)
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   252
    {
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   253
      size += 4;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   254
      // grab total bit size
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   255
      *p++ = m_totalBitSize;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   256
    }
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   257
  else 
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   258
    {
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   259
      return 0;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   260
    }
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   261
  for (uint32_t j = 0; j < m_nixVector.size (); j++)
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   262
    {
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   263
      if (size + 4 <= maxSize)
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   264
        {
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   265
          size += 4;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   266
          *p++ = m_nixVector.at(j);
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   267
        }
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   268
      else
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   269
        {
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   270
          return 0;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   271
        }
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   272
    }
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   273
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   274
  // Serialized successfully
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   275
  return 1;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   276
}
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   277
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   278
uint32_t
6291
8b3cd8b4d560 change casts to c++ style
Josh Pelkey <jpelkey@gatech.edu>
parents: 6113
diff changeset
   279
NixVector::Deserialize (const uint32_t* buffer, uint32_t size)
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   280
{
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   281
  NS_LOG_FUNCTION (this);
6291
8b3cd8b4d560 change casts to c++ style
Josh Pelkey <jpelkey@gatech.edu>
parents: 6113
diff changeset
   282
  const uint32_t* p = buffer;
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   283
  uint32_t sizeCheck = size - 4;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   284
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   285
  NS_ASSERT (sizeCheck >= 4);
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   286
  m_used = *p++;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   287
  sizeCheck -= 4;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   288
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   289
  NS_ASSERT (sizeCheck >= 4);
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   290
  m_currentVectorBitSize = *p++;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   291
  sizeCheck -= 4;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   292
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   293
  NS_ASSERT (sizeCheck >= 4);
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   294
  m_totalBitSize = *p++;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   295
  sizeCheck -= 4;
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   296
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   297
  // make sure the nix-vector
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   298
  // is empty
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   299
  m_nixVector.clear ();
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   300
  while (sizeCheck > 0)
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   301
    {
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   302
      NS_ASSERT (sizeCheck >= 4);
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   303
      uint32_t nix = *p++;
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   304
      m_nixVector.push_back (nix);
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   305
      sizeCheck -= 4;
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   306
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   307
6113
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   308
  NS_ASSERT (sizeCheck == 0);
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   309
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   310
  // return zero if an entire nix-vector was 
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   311
  // not deserialized
0ce37bf4f1c1 Merge distributed simulation code
Josh Pelkey <jpelkey@gatech.edu>
parents: 5224
diff changeset
   312
  return (sizeCheck != 0) ? 0 : 1;
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   313
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   314
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   315
void
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   316
NixVector::DumpNixVector (std::ostream &os) const
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   317
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   318
  NS_LOG_FUNCTION_NOARGS ();
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   319
  uint32_t i = m_nixVector.size ();
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   320
  std::vector<uint32_t>::const_reverse_iterator rIter;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   321
  for (rIter = m_nixVector.rbegin (); rIter != m_nixVector.rend (); rIter++)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   322
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   323
      uint32_t numBits = BitCount (*rIter);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   324
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   325
      // all this work just to get the nix 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   326
      // vector to print out neat
7182
5ecfee5d17de network coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6823
diff changeset
   327
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   328
      // if it's not the first entry in the vector, 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   329
      // we may have to add some zeros and fill 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   330
      // out the vector
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   331
      if (m_totalBitSize > ((sizeof (uint32_t)*8) * i))
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   332
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   333
          PrintDec2BinNixFill (*rIter,numBits,os);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   334
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   335
      else if (m_totalBitSize%32 == 0)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   336
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   337
          PrintDec2BinNix (*rIter,32,os);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   338
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   339
      else
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   340
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   341
          PrintDec2BinNix (*rIter,m_totalBitSize%32,os);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   342
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   343
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   344
      i--;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   345
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   346
      if (i > 0)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   347
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   348
          os << "--";
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   349
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   350
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   351
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   352
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   353
uint32_t 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   354
NixVector::GetRemainingBits (void)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   355
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   356
  NS_LOG_FUNCTION_NOARGS ();
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   357
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   358
  return (m_totalBitSize - m_used);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   359
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   360
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   361
uint32_t
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   362
NixVector::BitCount (uint32_t numberOfNeighbors) const
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   363
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   364
  NS_LOG_FUNCTION_NOARGS ();
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   365
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   366
  // Given the numberOfNeighbors, return the number 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   367
  // of bits needed (essentially, log2(numberOfNeighbors-1)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   368
  uint32_t bitCount = 0;
7182
5ecfee5d17de network coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6823
diff changeset
   369
5224
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   370
  if (numberOfNeighbors < 2) 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   371
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   372
      return 1;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   373
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   374
  else
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   375
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   376
      for (numberOfNeighbors -= 1; numberOfNeighbors != 0; numberOfNeighbors >>= 1)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   377
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   378
          bitCount++;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   379
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   380
      return bitCount;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   381
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   382
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   383
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   384
void
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   385
NixVector::PrintDec2BinNix (uint32_t decimalNum, uint32_t bitCount, std::ostream &os) const
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   386
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   387
  if(decimalNum == 0)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   388
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   389
      for (; bitCount > 0; bitCount--)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   390
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   391
          os << 0;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   392
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   393
      return;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   394
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   395
  if(decimalNum == 1)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   396
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   397
      for (; bitCount > 1; bitCount--)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   398
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   399
          os << 0;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   400
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   401
      os << 1;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   402
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   403
  else
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   404
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   405
      PrintDec2BinNix (decimalNum / 2,bitCount-1, os);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   406
      os << decimalNum % 2;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   407
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   408
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   409
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   410
void
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   411
NixVector::PrintDec2BinNixFill (uint32_t decimalNum, uint32_t bitCount, std::ostream &os) const
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   412
{
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   413
  if(decimalNum == 0)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   414
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   415
      os << 0;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   416
      return;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   417
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   418
  if(decimalNum == 1)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   419
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   420
      // check to see if we need to 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   421
      // print out some zeros at the 
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   422
      // beginning of the nix vector
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   423
      if ((uint32_t)(sizeof (uint32_t)*8) > bitCount)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   424
        {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   425
          for (uint32_t i = ((sizeof (uint32_t)*8)-bitCount); i > 0; i--)
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   426
            {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   427
              os << 0;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   428
            }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   429
        }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   430
      os << 1;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   431
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   432
  else
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   433
    {
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   434
      PrintDec2BinNixFill (decimalNum / 2, bitCount, os);
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   435
      os << decimalNum % 2;
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   436
    }
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   437
}
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   438
06f639d05b8f Merge NixVector Routing code
Josh Pelkey <jpelkey@gatech.edu>
parents:
diff changeset
   439
} // namespace ns3