2424#include " ns3/socket.h"
2525
2626#include < algorithm>
27+ #include < limits>
2728
2829namespace ns3
2930{
@@ -133,7 +134,8 @@ DhcpServer::StartApplication()
133134 // set infinite GRANTED_LEASED_TIME for my address
134135
135136 myOwnAddress = ipv4->GetAddress (ifIndex, addrIndex).GetLocal ();
136- m_leasedAddresses[Address ()] = std::make_pair (myOwnAddress, 0xffffffff );
137+ DhcpChaddr null = {};
138+ m_leasedAddresses[null] = std::make_pair (myOwnAddress, PERMANENT_LEASE);
137139 break ;
138140 }
139141 }
@@ -181,19 +183,18 @@ DhcpServer::TimerHandler()
181183 NS_LOG_FUNCTION (this );
182184
183185 // Set up timeout events and release of unsolicited addresses from the list
184- LeasedAddressIter i;
185- for (i = m_leasedAddresses.begin (); i != m_leasedAddresses.end (); i++)
186+ for (auto [k, v] : m_leasedAddresses)
186187 {
187188 // update the address state
188- if (i-> second .second != 0xffffffff && i-> second .second != 0 )
189+ if (v .second != PERMANENT_LEASE && v .second != 0 )
189190 {
190- i-> second .second --;
191- if (i-> second .second == 0 )
191+ v .second --;
192+ if (v .second == 0 )
192193 {
193194 NS_LOG_INFO (" Address leased state expired, address removed - "
194- << " chaddr: " << i->first << " IP address " << i->second .first);
195- i-> second .second = 0 ;
196- m_expiredAddresses.push_front (i-> first );
195+ << " chaddr: " << DhcpChaddrToString(k) << " IP address " << v .first);
196+ v .second = 0 ;
197+ m_expiredAddresses.push_front (k );
197198 }
198199 }
199200 }
@@ -241,7 +242,7 @@ DhcpServer::SendOffer(Ptr<NetDevice> iDev, DhcpHeader header, InetSocketAddress
241242 NS_LOG_FUNCTION (this << iDev << header << from);
242243
243244 DhcpHeader newDhcpHeader;
244- Address sourceChaddr = header.GetChaddr ();
245+ DhcpChaddr sourceChaddr = header.GetChaddr ();
245246 uint32_t tran = header.GetTran ();
246247 Ptr<Packet> packet = nullptr ;
247248 Ipv4Address offeredAddress;
@@ -253,11 +254,11 @@ DhcpServer::SendOffer(Ptr<NetDevice> iDev, DhcpHeader header, InetSocketAddress
253254 {
254255 // We know this client from some time ago
255256 if (m_leasedAddresses[sourceChaddr].second != 0 &&
256- m_leasedAddresses[sourceChaddr].second != 0xffffffff )
257+ m_leasedAddresses[sourceChaddr].second != PERMANENT_LEASE )
257258 {
258259 NS_LOG_LOGIC (" This client is sending a DISCOVER but it has still a lease active - "
259260 " perhaps it didn't shut down gracefully: "
260- << sourceChaddr);
261+ << DhcpChaddrToString( sourceChaddr) );
261262 }
262263
263264 m_expiredAddresses.remove (sourceChaddr);
@@ -277,7 +278,7 @@ DhcpServer::SendOffer(Ptr<NetDevice> iDev, DhcpHeader header, InetSocketAddress
277278 // there's still hope: reuse the old ones.
278279 if (!m_expiredAddresses.empty ())
279280 {
280- Address oldestChaddr = m_expiredAddresses.back ();
281+ DhcpChaddr oldestChaddr = m_expiredAddresses.back ();
281282 m_expiredAddresses.pop_back ();
282283 offeredAddress = m_leasedAddresses[oldestChaddr].first ;
283284 m_leasedAddresses.erase (oldestChaddr);
@@ -334,16 +335,15 @@ DhcpServer::SendAck(Ptr<NetDevice> iDev, DhcpHeader header, InetSocketAddress fr
334335 NS_LOG_FUNCTION (this << iDev << header << from);
335336
336337 DhcpHeader newDhcpHeader;
337- Address sourceChaddr = header.GetChaddr ();
338+ DhcpChaddr sourceChaddr = header.GetChaddr ();
338339 uint32_t tran = header.GetTran ();
339340 Ptr<Packet> packet = nullptr ;
340341 Ipv4Address address = header.GetReq ();
341342
342343 NS_LOG_INFO (" DHCP REQUEST from: " << from.GetIpv4() << " source port: " << from.GetPort()
343344 << " - refreshed addr: " << address);
344345
345- LeasedAddressIter iter;
346- iter = m_leasedAddresses.find (sourceChaddr);
346+ auto iter = m_leasedAddresses.find (sourceChaddr);
347347 if (iter != m_leasedAddresses.end ())
348348 {
349349 // update the lease time of this address - send ACK
@@ -393,33 +393,29 @@ DhcpServer::SendAck(Ptr<NetDevice> iDev, DhcpHeader header, InetSocketAddress fr
393393}
394394
395395void
396- DhcpServer::AddStaticDhcpEntry (Address chaddr , Ipv4Address addr)
396+ DhcpServer::AddStaticDhcpEntry (Address macAddr , Ipv4Address addr)
397397{
398- NS_LOG_FUNCTION (this << chaddr << addr);
399- Address cleanedCaddr ;
398+ NS_LOG_FUNCTION (this << macAddr << addr);
399+ DhcpChaddr chAddr{} ;
400400
401401 NS_ASSERT_MSG (addr.Get() >= m_minAddress.Get() && addr.Get() <= m_maxAddress.Get(),
402402 "Required address is not in the pool " << addr << " is not in [" << m_minAddress
403403 << ", " << m_maxAddress << "]");
404+ NS_ASSERT_MSG (macAddr.GetLength() <= 16,
405+ "DHCP server can not handle a chaddr larger than 16 bytes");
406+ macAddr.CopyTo (chAddr.begin ());
404407
405- // We need to cleanup the type from the stored chaddr, or later we'll fail to compare it.
406- // Moreover, the length is always 16, because chaddr is 16 bytes.
407- uint8_t buffer[Address::MAX_SIZE];
408- std::memset (buffer, 0 , Address::MAX_SIZE);
409- uint32_t len = chaddr.CopyTo (buffer);
410- NS_ASSERT_MSG (len <= 16 , " DHCP server can not handle a chaddr larger than 16 bytes" );
411- cleanedCaddr.CopyFrom (buffer, 16 );
412-
413- NS_ASSERT_MSG (m_leasedAddresses.find(cleanedCaddr) == m_leasedAddresses.end(),
414- "Client has already an active lease: " << m_leasedAddresses[cleanedCaddr].first);
408+ NS_ASSERT_MSG (m_leasedAddresses.find(chAddr) == m_leasedAddresses.end(),
409+ "Client has already an active lease: " << m_leasedAddresses[chAddr].first);
415410
416411 auto it = find (m_availableAddresses.begin (), m_availableAddresses.end (), addr);
417412 NS_ASSERT_MSG (
418413 it == m_availableAddresses.end(),
419414 "Required address is not available (perhaps it has been already assigned): " << addr);
420415
421416 m_availableAddresses.remove (addr);
422- m_leasedAddresses[cleanedCaddr] = std::make_pair (addr, 0xffffffff );
417+ NS_LOG_INFO (" Added a static lease for " << DhcpChaddrToString(chAddr) << " -> " << addr);
418+ m_leasedAddresses[chAddr] = std::make_pair (addr, PERMANENT_LEASE);
423419}
424420
425421} // Namespace ns3
0 commit comments