diff --git a/tutorial/ipv4-address-extended.cc b/tutorial/ipv4-address-extended.cc index 0fd18994d..b25d5b6e6 100644 --- a/tutorial/ipv4-address-extended.cc +++ b/tutorial/ipv4-address-extended.cc @@ -32,6 +32,7 @@ public: 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 @@ Ipv4NetworkManager::~Ipv4NetworkManager () 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 @@ Ipv4NetworkManager::Allocate (const Ipv4Mask mask) { 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 @@ public: 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 @@ Ipv4AddressManager::~Ipv4AddressManager () 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 @@ Ipv4AddressManager::Allocate (const Ipv4Mask mask, const Ipv4Address network) { 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 @@ Ipv4AddressManager::Allocate (const Ipv4Mask mask, const Ipv4Address network) return Ipv4Address (bits); } +void +Ipv4AddressEx::SeedAddress (const Ipv4Mask mask, const Ipv4Address address) +{ + NS_LOG_FUNCTION; + + SimulationSingleton::Get ()->Seed (mask, address); +} + Ipv4Address Ipv4AddressEx::AllocateAddress (const Ipv4Mask mask, const Ipv4Address network) { @@ -165,6 +223,14 @@ Ipv4AddressEx::AllocateAddress (const Ipv4Mask mask, const Ipv4Address network) Allocate (mask, network); } +void +Ipv4AddressEx::SeedNetwork (const Ipv4Mask mask, const Ipv4Address address) +{ + NS_LOG_FUNCTION; + + SimulationSingleton::Get ()->Seed (mask, address); +} + Ipv4Address Ipv4AddressEx::AllocateNetwork (const Ipv4Mask mask) { diff --git a/tutorial/ipv4-address-extended.h b/tutorial/ipv4-address-extended.h index fb1626204..0bdfc24e9 100644 --- a/tutorial/ipv4-address-extended.h +++ b/tutorial/ipv4-address-extended.h @@ -28,9 +28,15 @@ namespace ns3 { 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); }; diff --git a/tutorial/testipv4.cc b/tutorial/testipv4.cc index 706d046ed..588580319 100644 --- a/tutorial/testipv4.cc +++ b/tutorial/testipv4.cc @@ -38,6 +38,7 @@ main (int argc, char *argv[]) } Ipv4Mask mask2 ("255.255.0.0"); + Ipv4AddressEx::SeedNetwork (mask2, "192.168.0.0"); for (uint32_t i = 0; i < 10; ++i) {