1515#include " ns3/assert.h"
1616#include " ns3/log.h"
1717
18+ #include < algorithm>
1819#include < iomanip>
1920#include < memory>
2021
@@ -135,30 +136,13 @@ extern "C"
135136}
136137#endif
137138
138- Ipv6Address::Ipv6Address ()
139- {
140- NS_LOG_FUNCTION (this );
141- memset (m_address, 0x00 , 16 );
142- }
143-
144- Ipv6Address::Ipv6Address (const Ipv6Address& addr)
145- {
146- // Do not add function logging here, to avoid stack overflow
147- memcpy (m_address, addr.m_address , 16 );
148- }
149-
150- Ipv6Address::Ipv6Address (const Ipv6Address* addr)
151- {
152- // Do not add function logging here, to avoid stack overflow
153- memcpy (m_address, addr->m_address , 16 );
154- }
155-
156139Ipv6Address::Ipv6Address (const char * address)
157140{
158141 NS_LOG_FUNCTION (this << address);
159142
160- if (inet_pton (AF_INET6, address, m_address) <= 0 )
143+ if (inet_pton (AF_INET6, address, m_address. data () ) <= 0 )
161144 {
145+ m_address.fill (0x00 );
162146 NS_ABORT_MSG (" Error, can not build an IPv6 address from an invalid string: " << address);
163147 return ;
164148 }
@@ -182,23 +166,16 @@ Ipv6Address::CheckCompatible(const std::string& addressStr)
182166Ipv6Address::Ipv6Address (uint8_t address[16 ])
183167{
184168 NS_LOG_FUNCTION (this << &address);
185- /* 128 bit => 16 bytes */
186- memcpy (m_address, address, 16 );
187- }
188-
189- Ipv6Address::~Ipv6Address ()
190- {
191- /* do nothing */
192- NS_LOG_FUNCTION (this );
169+ std::copy (address, address + 16 , m_address.begin ());
193170}
194171
195172void
196173Ipv6Address::Set (const char * address)
197174{
198175 NS_LOG_FUNCTION (this << address);
199- if (inet_pton (AF_INET6, address, m_address) <= 0 )
176+ if (inet_pton (AF_INET6, address, m_address. data () ) <= 0 )
200177 {
201- memset ( m_address, 0x00 , 16 );
178+ m_address. fill ( 0x00 );
202179 NS_ABORT_MSG (" Error, can not set an IPv6 address from an invalid string: " << address);
203180 return ;
204181 }
@@ -207,16 +184,15 @@ Ipv6Address::Set(const char* address)
207184void
208185Ipv6Address::Set (uint8_t address[16 ])
209186{
210- /* 128 bit => 16 bytes */
211187 NS_LOG_FUNCTION (this << &address);
212- memcpy (m_address , address, 16 );
188+ std::copy (address , address + 16 , m_address. begin () );
213189}
214190
215191void
216192Ipv6Address::Serialize (uint8_t buf[16 ]) const
217193{
218194 NS_LOG_FUNCTION (this << &buf);
219- memcpy (buf , m_address, 16 );
195+ std::copy (m_address. begin () , m_address. end (), buf );
220196}
221197
222198Ipv6Address
@@ -524,7 +500,7 @@ Ipv6Address::Print(std::ostream& os) const
524500
525501 char str[INET6_ADDRSTRLEN];
526502
527- if (inet_ntop (AF_INET6, m_address, str, INET6_ADDRSTRLEN))
503+ if (inet_ntop (AF_INET6, m_address. data () , str, INET6_ADDRSTRLEN))
528504 {
529505 os << str;
530506 }
556532Ipv6Address::IsIpv4MappedAddress () const
557533{
558534 NS_LOG_FUNCTION (this );
559- static uint8_t v4MappedPrefix[ 12 ] =
535+ static std::array< uint8_t , 12 > v4MappedPrefix =
560536 {0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xff , 0xff };
561- return memcmp (m_address , v4MappedPrefix, sizeof (v4MappedPrefix)) == 0 ;
537+ return std::equal (v4MappedPrefix. begin () , v4MappedPrefix. end (), m_address. begin ()) ;
562538}
563539
564540Ipv6Address
@@ -570,10 +546,9 @@ Ipv6Address::CombinePrefix(const Ipv6Prefix& prefix) const
570546 uint8_t pref[16 ];
571547 unsigned int i = 0 ;
572548
573- memcpy (addr , m_address, 16 );
549+ std::copy (m_address. begin () , m_address. end (), addr );
574550 ((Ipv6Prefix)prefix).GetBytes (pref);
575551
576- /* a little bit ugly... */
577552 for (i = 0 ; i < 16 ; i++)
578553 {
579554 addr[i] = addr[i] & pref[i];
740715Ipv6Address::GetBytes (uint8_t buf[16 ]) const
741716{
742717 NS_LOG_FUNCTION (this << &buf);
743- memcpy (buf , m_address, 16 );
718+ std::copy (m_address. begin () , m_address. end (), buf );
744719}
745720
746721bool
@@ -774,17 +749,10 @@ operator>>(std::istream& is, Ipv6Address& address)
774749 return is;
775750}
776751
777- Ipv6Prefix::Ipv6Prefix ()
778- {
779- NS_LOG_FUNCTION (this );
780- memset (m_prefix, 0x00 , 16 );
781- m_prefixLength = 0 ;
782- }
783-
784752Ipv6Prefix::Ipv6Prefix (const char * prefix)
785753{
786754 NS_LOG_FUNCTION (this << prefix);
787- if (inet_pton (AF_INET6, prefix, m_prefix) <= 0 )
755+ if (inet_pton (AF_INET6, prefix, m_prefix. data () ) <= 0 )
788756 {
789757 NS_ABORT_MSG (" Error, can not build an IPv6 prefix from an invalid string: " << prefix);
790758 }
@@ -794,14 +762,14 @@ Ipv6Prefix::Ipv6Prefix(const char* prefix)
794762Ipv6Prefix::Ipv6Prefix (uint8_t prefix[16 ])
795763{
796764 NS_LOG_FUNCTION (this << &prefix);
797- memcpy (m_prefix , prefix, 16 );
765+ std::copy (prefix , prefix + 16 , m_prefix. begin () );
798766 m_prefixLength = GetMinimumPrefixLength ();
799767}
800768
801769Ipv6Prefix::Ipv6Prefix (const char * prefix, uint8_t prefixLength)
802770{
803771 NS_LOG_FUNCTION (this << prefix);
804- if (inet_pton (AF_INET6, prefix, m_prefix) <= 0 )
772+ if (inet_pton (AF_INET6, prefix, m_prefix. data () ) <= 0 )
805773 {
806774 NS_ABORT_MSG (" Error, can not build an IPv6 prefix from an invalid string: " << prefix);
807775 }
@@ -816,7 +784,7 @@ Ipv6Prefix::Ipv6Prefix(const char* prefix, uint8_t prefixLength)
816784Ipv6Prefix::Ipv6Prefix (uint8_t prefix[16 ], uint8_t prefixLength)
817785{
818786 NS_LOG_FUNCTION (this << &prefix);
819- memcpy (m_prefix , prefix, 16 );
787+ std::copy (prefix , prefix + 16 , m_prefix. begin () );
820788
821789 uint8_t autoLength = GetMinimumPrefixLength ();
822790 NS_ASSERT_MSG (autoLength <= prefixLength,
@@ -833,7 +801,7 @@ Ipv6Prefix::Ipv6Prefix(uint8_t prefix)
833801 unsigned int mod = 0 ;
834802 unsigned int i = 0 ;
835803
836- memset ( m_prefix, 0x00 , 16 );
804+ m_prefix. fill ( 0x00 );
837805 m_prefixLength = prefix;
838806
839807 NS_ASSERT (prefix <= 128 );
@@ -845,7 +813,7 @@ Ipv6Prefix::Ipv6Prefix(uint8_t prefix)
845813 // __warn_memset_zero_len compiler errors in some gcc>4.5.x
846814 if (nb > 0 )
847815 {
848- memset (m_prefix, 0xff , nb);
816+ memset (m_prefix. data () , 0xff , nb);
849817 }
850818 if (mod)
851819 {
@@ -862,24 +830,6 @@ Ipv6Prefix::Ipv6Prefix(uint8_t prefix)
862830 }
863831}
864832
865- Ipv6Prefix::Ipv6Prefix (const Ipv6Prefix& prefix)
866- {
867- memcpy (m_prefix, prefix.m_prefix , 16 );
868- m_prefixLength = prefix.m_prefixLength ;
869- }
870-
871- Ipv6Prefix::Ipv6Prefix (const Ipv6Prefix* prefix)
872- {
873- memcpy (m_prefix, prefix->m_prefix , 16 );
874- m_prefixLength = prefix->m_prefixLength ;
875- }
876-
877- Ipv6Prefix::~Ipv6Prefix ()
878- {
879- /* do nothing */
880- NS_LOG_FUNCTION (this );
881- }
882-
883833bool
884834Ipv6Prefix::IsMatch (Ipv6Address a, Ipv6Address b) const
885835{
@@ -938,16 +888,16 @@ void
938888Ipv6Prefix::GetBytes (uint8_t buf[16 ]) const
939889{
940890 NS_LOG_FUNCTION (this << &buf);
941- memcpy (buf, m_prefix, 16 );
891+ memcpy (buf, m_prefix. data () , 16 );
942892}
943893
944894Ipv6Address
945895Ipv6Prefix::ConvertToIpv6Address () const
946896{
947897 uint8_t prefixBytes[16 ];
948- memcpy (prefixBytes, m_prefix, 16 );
898+ memcpy (prefixBytes, m_prefix. data () , 16 );
949899
950- Ipv6Address convertedPrefix = Ipv6Address (prefixBytes);
900+ auto convertedPrefix = Ipv6Address (prefixBytes);
951901 return convertedPrefix;
952902}
953903
0 commit comments