00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "ns3/assert.h"
00020 #include "ns3/log.h"
00021 #include "ns3/ptr.h"
00022 #include "ns3/node.h"
00023 #include "ns3/net-device.h"
00024 #include "ns3/ipv4.h"
00025 #include "ns3/ipv4-address-generator.h"
00026 #include "ipv4-address-helper.h"
00027
00028 NS_LOG_COMPONENT_DEFINE("Ipv4AddressHelper");
00029
00030 namespace ns3 {
00031
00032 Ipv4AddressHelper::Ipv4AddressHelper ()
00033 {
00034 NS_LOG_FUNCTION_NOARGS ();
00035
00036
00037
00038
00039
00040
00041 m_network = 0xffffffff;
00042 m_mask = 0;
00043 m_address = 0xffffffff;
00044 m_base = 0xffffffff;
00045 m_shift = 0xffffffff;
00046 m_max = 0xffffffff;
00047 }
00048
00049 void
00050 Ipv4AddressHelper::SetBase (
00051 const Ipv4Address network,
00052 const Ipv4Mask mask,
00053 const Ipv4Address address)
00054 {
00055 NS_LOG_FUNCTION_NOARGS ();
00056
00057 m_network = network.Get ();
00058 m_mask = mask.Get ();
00059 m_base = m_address = address.Get ();
00060
00061
00062
00063
00064 NS_ASSERT_MSG((m_network & ~m_mask) == 0,
00065 "Ipv4AddressHelper::SetBase(): Inconsistent network and mask");
00066
00067
00068
00069
00070
00071 m_shift = NumAddressBits (m_mask);
00072 m_max = (1 << m_shift) - 2;
00073
00074 NS_ASSERT_MSG(m_shift <= 32,
00075 "Ipv4AddressHelper::SetBase(): Unreasonable address length");
00076
00077
00078
00079
00080 m_network >>= m_shift;
00081
00082 NS_LOG_LOGIC ("m_network == " << m_network);
00083 NS_LOG_LOGIC ("m_mask == " << m_mask);
00084 NS_LOG_LOGIC ("m_address == " << m_address);
00085 }
00086
00087 Ipv4Address
00088 Ipv4AddressHelper::NewAddress (void)
00089 {
00090
00091
00092
00093
00094
00095
00096
00097 NS_ASSERT_MSG (m_address <= m_max,
00098 "Ipv4AddressHelper::NewAddress(): Address overflow");
00099
00100 Ipv4Address addr ((m_network << m_shift) | m_address);
00101 ++m_address;
00102
00103
00104
00105
00106
00107 Ipv4AddressGenerator::AddAllocated (addr);
00108 return addr;
00109 }
00110
00111 Ipv4Address
00112 Ipv4AddressHelper::NewNetwork (void)
00113 {
00114 NS_LOG_FUNCTION_NOARGS ();
00115 ++m_network;
00116 m_address = m_base;
00117 return Ipv4Address (m_network << m_shift);
00118 }
00119
00120 Ipv4InterfaceContainer
00121 Ipv4AddressHelper::Assign (const NetDeviceContainer &c)
00122 {
00123 NS_LOG_FUNCTION_NOARGS ();
00124 Ipv4InterfaceContainer retval;
00125 for (uint32_t i = 0; i < c.GetN (); ++i) {
00126 Ptr<NetDevice> device = c.Get (i);
00127
00128 Ptr<Node> node = device->GetNode ();
00129 NS_ASSERT_MSG (node, "Ipv4AddressHelper::Allocate(): Bad node");
00130
00131 Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
00132 NS_ASSERT_MSG (ipv4, "Ipv4AddressHelper::Allocate(): Bad ipv4");
00133
00134 int32_t ifIndex = ipv4->FindInterfaceForDevice (device);
00135 if (ifIndex == -1)
00136 {
00137 ifIndex = ipv4->AddInterface (device);
00138 }
00139 NS_ASSERT_MSG (ifIndex >= 0, "Ipv4AddressHelper::Allocate(): "
00140 "Interface index not found");
00141
00142 ipv4->SetAddress (ifIndex, NewAddress ());
00143 ipv4->SetNetworkMask (ifIndex, m_mask);
00144 ipv4->SetMetric (ifIndex, 1);
00145 ipv4->SetUp (ifIndex);
00146 retval.Add (ipv4, ifIndex);
00147 }
00148 return retval;
00149 }
00150
00151 const uint32_t N_BITS = 32;
00152
00153 uint32_t
00154 Ipv4AddressHelper::NumAddressBits (uint32_t maskbits) const
00155 {
00156 NS_LOG_FUNCTION_NOARGS ();
00157 for (uint32_t i = 0; i < N_BITS; ++i)
00158 {
00159 if (maskbits & 1)
00160 {
00161 NS_LOG_LOGIC ("NumAddressBits -> " << i);
00162 return i;
00163 }
00164 maskbits >>= 1;
00165 }
00166
00167 NS_ASSERT_MSG(false, "Ipv4AddressHelper::NumAddressBits(): Bad Mask");
00168 return 0;
00169 }
00170
00171 };
00172
00173 #ifdef RUN_SELF_TESTS
00174
00175 #include "ns3/test.h"
00176
00177 namespace ns3 {
00178
00179 class AddressHelperTest : public Test
00180 {
00181 public:
00182 AddressHelperTest ();
00183 virtual bool RunTests (void);
00184 };
00185
00186 static AddressHelperTest g_addressHelperTest;
00187
00188 AddressHelperTest::AddressHelperTest ()
00189 : Test ("AddressHelper")
00190 {
00191 }
00192
00193 bool
00194 AddressHelperTest::RunTests (void)
00195 {
00196 bool result = true;
00197 Ipv4Address network;
00198 Ipv4Address address;
00199
00200
00201
00202
00203
00204 Ipv4AddressHelper h;
00205
00206 h.SetBase ("1.0.0.0", "255.0.0.0");
00207 network = h.NewNetwork();
00208 NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("2.0.0.0"));
00209 address = h.NewAddress();
00210 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("2.0.0.1"));
00211
00212 h.SetBase ("0.1.0.0", "255.255.0.0");
00213 network = h.NewNetwork();
00214 NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.2.0.0"));
00215 address = h.NewAddress();
00216 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.2.0.1"));
00217
00218 h.SetBase ("0.0.1.0", "255.255.255.0");
00219 network = h.NewNetwork();
00220 NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.0.2.0"));
00221 address = h.NewAddress();
00222 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.2.1"));
00223
00224
00225
00226
00227 h.SetBase ("1.0.0.0", "255.0.0.0", "0.0.0.3");
00228 address = h.NewAddress();
00229 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("1.0.0.3"));
00230 address = h.NewAddress();
00231 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("1.0.0.4"));
00232
00233 h.SetBase ("0.1.0.0", "255.255.0.0", "0.0.0.3");
00234 address = h.NewAddress();
00235 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.1.0.3"));
00236 address = h.NewAddress();
00237 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.1.0.4"));
00238
00239 h.SetBase ("0.0.1.0", "255.255.255.0", "0.0.0.3");
00240 address = h.NewAddress();
00241 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.1.3"));
00242 address = h.NewAddress();
00243 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.1.4"));
00244
00245
00246
00247
00248
00249
00250 Ipv4AddressGenerator::Reset ();
00251
00252 h.SetBase ("1.0.0.0", "255.0.0.0", "0.0.0.3");
00253 address = h.NewAddress();
00254 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("1.0.0.3"));
00255 address = h.NewAddress();
00256 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("1.0.0.4"));
00257 network = h.NewNetwork();
00258 NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("2.0.0.0"));
00259 address = h.NewAddress();
00260 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("2.0.0.3"));
00261
00262 h.SetBase ("0.1.0.0", "255.255.0.0", "0.0.0.3");
00263 address = h.NewAddress();
00264 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.1.0.3"));
00265 address = h.NewAddress();
00266 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.1.0.4"));
00267 network = h.NewNetwork();
00268 NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.2.0.0"));
00269 address = h.NewAddress();
00270 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.2.0.3"));
00271
00272 h.SetBase ("0.0.1.0", "255.255.255.0", "0.0.0.3");
00273 address = h.NewAddress();
00274 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.1.3"));
00275 address = h.NewAddress();
00276 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.1.4"));
00277 network = h.NewNetwork();
00278 NS_TEST_ASSERT_EQUAL (network, Ipv4Address ("0.0.2.0"));
00279 address = h.NewAddress();
00280 NS_TEST_ASSERT_EQUAL (address, Ipv4Address ("0.0.2.3"));
00281
00282 return true;
00283 }
00284
00285 }
00286
00287 #endif