--- 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)
{