add seed calls
authorCraig Dowell <craigdo@ee.washington.edu>
Fri, 05 Oct 2007 18:17:18 -0700
changeset 1836 618a749157e3
parent 1835 ccd0fc4d9bf8
child 1837 da66dfdf3120
add seed calls
tutorial/ipv4-address-extended.cc
tutorial/ipv4-address-extended.h
tutorial/testipv4.cc
--- a/tutorial/ipv4-address-extended.cc	Fri Oct 05 16:00:04 2007 -0700
+++ b/tutorial/ipv4-address-extended.cc	Fri Oct 05 18:17:18 2007 -0700
@@ -32,6 +32,7 @@
   virtual ~Ipv4NetworkManager ();
 
   Ipv4Address Allocate (const Ipv4Mask mask);
+  void Seed (const Ipv4Mask mask, const Ipv4Address network);
 
 private:
   static const uint32_t N_BITS = 32;
@@ -67,6 +68,29 @@
   NS_LOG_FUNCTION;
 }
 
+void
+Ipv4NetworkManager::Seed (const Ipv4Mask mask, const Ipv4Address network)
+{
+  NS_LOG_FUNCTION;
+
+  uint32_t maskBits = mask.GetHostOrder ();
+  uint32_t networkBits = network.GetHostOrder ();
+
+  for (uint32_t i = 0; i < N_BITS; ++i)
+    {
+      if (maskBits & 1)
+        {
+          uint32_t nMaskBits = N_BITS - i;
+          NS_ASSERT(nMaskBits >= 0 && nMaskBits < N_BITS);
+          m_state[nMaskBits].network = networkBits >> (N_BITS - i);
+          return;
+        }
+      maskBits >>= 1;
+    }
+  NS_ASSERT_MSG(false, "Impossible");
+  return;
+}
+
 Ipv4Address
 Ipv4NetworkManager::Allocate (const Ipv4Mask mask)
 {
@@ -80,8 +104,9 @@
         {
           uint32_t nBits = N_BITS - i;
           NS_ASSERT(nBits >= 0 && nBits < N_BITS);
+          Ipv4Address addr (m_state[nBits].network << i);
           ++m_state[nBits].network;
-          return Ipv4Address (m_state[nBits].network << i);
+          return addr;
         }
       bits >>= 1;
     }
@@ -96,6 +121,7 @@
   virtual ~Ipv4AddressManager ();
 
   Ipv4Address Allocate (const Ipv4Mask mask, const Ipv4Address network);
+  void Seed (const Ipv4Mask mask, const Ipv4Address address);
 
 private:
   static const uint32_t N_BITS = 32;
@@ -131,6 +157,29 @@
   NS_LOG_FUNCTION;
 }
 
+void
+Ipv4AddressManager::Seed (const Ipv4Mask mask, const Ipv4Address address)
+{
+  NS_LOG_FUNCTION;
+
+  uint32_t maskBits = mask.GetHostOrder ();
+  uint32_t addressBits = address.GetHostOrder ();
+
+  for (uint32_t i = 0; i < N_BITS; ++i)
+    {
+      if (maskBits & 1)
+        {
+          uint32_t nMaskBits = N_BITS - i;
+          NS_ASSERT(nMaskBits >= 0 && nMaskBits < N_BITS);
+          m_state[nMaskBits].address = addressBits;
+          return;
+        }
+      maskBits >>= 1;
+    }
+  NS_ASSERT_MSG(false, "Impossible");
+  return;
+}
+
 Ipv4Address
 Ipv4AddressManager::Allocate (const Ipv4Mask mask, const Ipv4Address network)
 {
@@ -145,10 +194,11 @@
         {
           uint32_t nBits = N_BITS - i;
           NS_ASSERT(nBits >= 0 && nBits < N_BITS);
+          Ipv4Address addr (net | m_state[nBits].address);
           ++m_state[nBits].address;
           NS_ASSERT_MSG((m_state[nBits].mask & m_state[nBits].address) == 0, 
             "Ipv4AddressManager::Allocate(): Overflow");
-          return Ipv4Address (net | m_state[nBits].address);
+          return addr;
         }
       bits >>= 1;
     }
@@ -156,6 +206,14 @@
   return Ipv4Address (bits);
 }
 
+void
+Ipv4AddressEx::SeedAddress (const Ipv4Mask mask, const Ipv4Address address)
+{
+  NS_LOG_FUNCTION;
+
+  SimulationSingleton<Ipv4AddressManager>::Get ()->Seed (mask, address);
+}
+
 Ipv4Address
 Ipv4AddressEx::AllocateAddress (const Ipv4Mask mask, const Ipv4Address network)
 {
@@ -165,6 +223,14 @@
     Allocate (mask, network);
 }
 
+void
+Ipv4AddressEx::SeedNetwork (const Ipv4Mask mask, const Ipv4Address address)
+{
+  NS_LOG_FUNCTION;
+
+  SimulationSingleton<Ipv4NetworkManager>::Get ()->Seed (mask, address);
+}
+
 Ipv4Address
 Ipv4AddressEx::AllocateNetwork (const Ipv4Mask mask)
 {
--- a/tutorial/ipv4-address-extended.h	Fri Oct 05 16:00:04 2007 -0700
+++ b/tutorial/ipv4-address-extended.h	Fri Oct 05 18:17:18 2007 -0700
@@ -28,9 +28,15 @@
 
 class Ipv4AddressEx : public Ipv4Address {
 public:
+  static void SeedAddress (const Ipv4Mask mask, 
+    const Ipv4Address address);
+
   static Ipv4Address AllocateAddress (const Ipv4Mask mask, 
     const Ipv4Address network);
 
+  static void SeedNetwork (const Ipv4Mask mask, 
+    const Ipv4Address address);
+
   static Ipv4Address AllocateNetwork (const Ipv4Mask mask);
 };
 
--- a/tutorial/testipv4.cc	Fri Oct 05 16:00:04 2007 -0700
+++ b/tutorial/testipv4.cc	Fri Oct 05 18:17:18 2007 -0700
@@ -38,6 +38,7 @@
     }
 
   Ipv4Mask mask2 ("255.255.0.0");
+  Ipv4AddressEx::SeedNetwork (mask2, "192.168.0.0");
 
   for (uint32_t i = 0; i < 10; ++i)
     {