48#include "ns3/assert.h"
100 (b) ^= ((a) << 10); \
103 (c) ^= ((b) >> 15); \
120 a += (
k[0] + ((ub4)
k[1] << 8) + ((ub4)
k[2] << 16) + ((ub4)
k[3] << 24));
121 b += (
k[4] + ((ub4)
k[5] << 8) + ((ub4)
k[6] << 16) + ((ub4)
k[7] << 24));
122 c += (
k[8] + ((ub4)
k[9] << 8) + ((ub4)
k[10] << 16) + ((ub4)
k[11] << 24));
133 c += ((ub4)
k[10] << 24);
135 c += ((ub4)
k[9] << 16);
137 c += ((ub4)
k[8] << 8);
139 b += ((ub4)
k[7] << 24);
141 b += ((ub4)
k[6] << 16);
143 b += ((ub4)
k[5] << 8);
147 a += ((ub4)
k[3] << 24);
149 a += ((ub4)
k[2] << 16);
151 a += ((ub4)
k[1] << 8);
183 static const char xdigits_l[] =
"0123456789abcdef";
184 static const char xdigits_u[] =
"0123456789ABCDEF";
185 unsigned char tmp[16];
186 unsigned char* tp = tmp;
187 unsigned char*
const endp = tp + 16;
188 unsigned char* colonp =
nullptr;
189 const char* xdigits =
nullptr;
191 const char* curtok = 0;
194 int seen_xdigits = 0;
195 unsigned int val = 0;
197 memset(tp, 0x00, 16);
210 while ((ch = *
address++) !=
'\0')
212 const char* pch =
nullptr;
214 if ((pch = strchr((xdigits = xdigits_l), ch)) ==
nullptr)
216 pch = strchr((xdigits = xdigits_u), ch);
222 val |= (pch - xdigits);
224 if (++seen_xdigits > 4)
251 *tp++ = (
unsigned char)(val >> 8) & 0xff;
252 *tp++ = (
unsigned char)val & 0xff;
260 if (ch ==
'.' && (endp - tp > 3 )) &&
261 inet_pton4 (curtok, tp) > 0)
277 *tp++ = (
unsigned char)(val >> 8) & 0xff;
278 *tp++ = (
unsigned char)val & 0xff;
281 if (colonp !=
nullptr)
287 const int n = tp - colonp;
295 for (i = 1; i <= n; i++)
297 endp[-i] = colonp[n - i];
309 memcpy(addr, tmp, 16);
392 uint8_t buf[16] = {0x00,
446 if (ipv6Addr.
IsAny())
470 memset(buf2 + 8, 0, 8);
472 memcpy(buf2 + 14, buf, 2);
491 memcpy(buf2 + 8, buf, 3);
494 memcpy(buf2 + 13, buf + 3, 3);
512 memcpy(buf2 + 8, buf, 8);
529 memset(buf2 + 8, 0, 8);
531 memcpy(buf2 + 14, buf, 2);
561 if (ipv6Addr.
IsAny())
578 memset(buf2, 0x00,
sizeof(buf2));
581 memcpy(buf2 + 14, buf, 2);
599 memset(buf2, 0x00,
sizeof(buf2));
602 memcpy(buf2 + 8, buf, 3);
605 memcpy(buf2 + 13, buf + 3, 3);
622 memset(buf2, 0x00,
sizeof(buf2));
625 memcpy(buf2 + 8, buf, 8);
642 memset(buf2, 0x00,
sizeof(buf2));
645 memcpy(buf2 + 14, buf, 2);
663 memset(buf, 0x00,
sizeof(buf));
695 for (i = 0; i < 8; i++)
705 for (i = 0; i < 8; i++)
723 if (bestBase == -1 || curLen > bestLen)
734 if (bestBase == -1 || curLen > bestLen)
740 if (bestBase != -1 && bestLen < 2)
763 if (bestBase != -1 && (bestBase + bestLen) == 8)
775 return (*
this == localhost);
804 static uint8_t v4MappedPrefix[12] =
805 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff};
806 if (memcmp(
m_address, v4MappedPrefix,
sizeof(v4MappedPrefix)) == 0)
826 for (i = 0; i < 16; i++)
828 addr[i] = addr[i] & pref[i];
839 static Ipv6Address documentation(
"ff02::1:ff00:0");
854 return (*
this == allNodesI || *
this == allNodesL || *
this == allNodesR);
865 return (*
this == allroutersI || *
this == allroutersL || *
this == allroutersR ||
866 *
this == allroutersS);
874 return (*
this == any);
991 static Ipv6Address ones(
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
1065 "Ipv6Prefix: address and prefix are not compatible: " <<
Ipv6Address(prefix)
1066 <<
"/" << +prefixLength);
1078 "Ipv6Prefix: address and prefix are not compatible: " <<
Ipv6Address(prefix)
1079 <<
"/" << +prefixLength);
1087 unsigned int nb = 0;
1088 unsigned int mod = 0;
1113 for (i = nb; i < 16; i++)
1150 for (i = 0; i < 16; i++)
1202 uint8_t prefixBytes[16];
1206 return convertedPrefix;
1228 uint8_t prefixLength = 0;
1231 for (
int8_t i = 15; i >= 0 && !stop; i--)
1235 for (uint8_t j = 0; j < 8 && !stop; j++)
1237 if ((mask & 1) == 0)
1249 return 128 - prefixLength;
a polymophic address class
static uint8_t Register()
Allocate a new type id for a new type of address.
Ipv4 addresses are stored in host order in this class.
void Serialize(uint8_t buf[4]) const
Serialize this address to a 4-byte buffer.
static Ipv4Address Deserialize(const uint8_t buf[4])
size_t operator()(const Ipv6Address &x) const
Returns the hash of an IPv6 address.
Describes an IPv6 address.
static uint8_t GetType()
Return the Type of address.
bool IsLinkLocal() const
If the IPv6 address is a link-local address (fe80::/64).
bool HasPrefix(const Ipv6Prefix &prefix) const
Compares an address and a prefix.
bool IsSolicitedMulticast() const
If the IPv6 address is a Solicited multicast address.
static Ipv6Address GetAllNodesMulticast()
Get the "all nodes multicast" address.
void Print(std::ostream &os) const
Print this address to the given output stream.
static Ipv6Address MakeSolicitedAddress(Ipv6Address addr)
Make the solicited IPv6 address.
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address.
bool IsDocumentation() const
If the IPv6 address is a documentation address (2001:DB8::/32).
static Ipv6Address GetAllHostsMulticast()
Get the "all hosts multicast" address.
bool IsAllNodesMulticast() const
If the IPv6 address is "all nodes multicast" (ff02::1/8).
bool IsLinkLocalMulticast() const
If the IPv6 address is link-local multicast (ff02::/16).
static Ipv6Address Deserialize(const uint8_t buf[16])
Deserialize this address.
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address.
static Ipv6Address MakeAutoconfiguredAddress(Address addr, Ipv6Address prefix)
Make the autoconfigured IPv6 address from a Mac address.
~Ipv6Address()
Destructor.
bool IsMulticast() const
If the IPv6 address is multicast (ff00::/8).
void GetBytes(uint8_t buf[16]) const
Get the bytes corresponding to the address.
bool IsIpv4MappedAddress() const
If the address is an IPv4-mapped address.
void Set(const char *address)
Sets an Ipv6Address by parsing the input C-string.
void Serialize(uint8_t buf[16]) const
Serialize this address to a 16-byte buffer.
Ipv6Address()
Default constructor.
Address ConvertTo() const
convert the IPv6Address object to an Address object.
bool IsAny() const
If the IPv6 address is the "Any" address.
static Ipv6Address GetAllRoutersMulticast()
Get the "all routers multicast" address.
bool IsLocalhost() const
If the IPv6 address is localhost (::1).
bool m_initialized
IPv6 address has been explicitly initialized to a valid value.
uint8_t m_address[16]
The address representation on 128 bits (16 bytes).
static Ipv6Address ConvertFrom(const Address &address)
Convert the Address object into an Ipv6Address ones.
bool IsInitialized() const
static Ipv6Address GetOnes()
Get the "all-1" IPv6 address (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
static Ipv6Address MakeAutoconfiguredLinkLocalAddress(Address mac)
Make the autoconfigured link-local IPv6 address from a Mac address.
Ipv4Address GetIpv4MappedAddress() const
Return the Ipv4 address.
static bool IsMatchingType(const Address &address)
If the Address matches the type.
static Ipv6Address MakeIpv4MappedAddress(Ipv4Address addr)
Make the Ipv4-mapped IPv6 address.
static Ipv6Address GetLoopback()
Get the loopback address.
Ipv6Address CombinePrefix(const Ipv6Prefix &prefix) const
Combine this address with a prefix.
bool IsAllRoutersMulticast() const
If the IPv6 address is "all routers multicast" (ff02::2/8).
Describes an IPv6 prefix.
uint8_t m_prefixLength
The prefix length.
static Ipv6Prefix GetLoopback()
Get the loopback prefix ( /128).
uint8_t m_prefix[16]
The prefix representation.
void Print(std::ostream &os) const
Print this address to the given output stream.
uint8_t GetPrefixLength() const
Get prefix length.
Ipv6Address ConvertToIpv6Address() const
Convert the Prefix into an IPv6 Address.
static Ipv6Prefix GetZero()
Get the zero prefix ( /0).
bool IsMatch(Ipv6Address a, Ipv6Address b) const
If the Address match the type.
static Ipv6Prefix GetOnes()
Get the "all-1" IPv6 mask (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
void SetPrefixLength(uint8_t prefixLength)
Set prefix length.
Ipv6Prefix()
Default constructor.
uint8_t GetMinimumPrefixLength() const
Get the minimum prefix length, i.e., 128 - the length of the largest sequence trailing zeroes.
void GetBytes(uint8_t buf[16]) const
Get the bytes corresponding to the prefix.
This class can contain 16 bit addresses.
static bool IsMatchingType(const Address &address)
static Mac16Address ConvertFrom(const Address &address)
void CopyTo(uint8_t buffer[2]) const
static bool IsMatchingType(const Address &address)
static Mac48Address ConvertFrom(const Address &address)
void CopyTo(uint8_t buffer[6]) const
static bool IsMatchingType(const Address &address)
void CopyTo(uint8_t buffer[8]) const
static Mac64Address ConvertFrom(const Address &address)
A class used for addressing MAC8 MAC's.
static Mac8Address ConvertFrom(const Address &address)
Convert a generic address to a Mac8Address.
static bool IsMatchingType(const Address &address)
Check that a generic Address is compatible with Mac8Address.
void CopyTo(uint8_t *pBuffer) const
Writes address to buffer parameter.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
std::string reference
reference tag
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::ostream & operator<<(std::ostream &os, const Angles &a)
ATTRIBUTE_HELPER_CPP(Length)
std::istream & operator>>(std::istream &is, Angles &a)
static uint32_t lookuphash(unsigned char *k, uint32_t length, uint32_t level)
Get a hash key.
static bool AsciiToIpv6Host(const char *address, uint8_t addr[16])
Convert an IPv6 C-string into a 128-bit representation.