48 #include "ns3/assert.h" 
   72 static uint32_t 
lookuphash (
unsigned char* k, uint32_t length, uint32_t level)
 
   75 #define mix(a, b, c) \ 
   77      (a) -= (b); (a) -= (c); (a) ^= ((c) >> 13); \ 
   78      (b) -= (c); (b) -= (a); (b) ^= ((a) << 8);  \ 
   79      (c) -= (a); (c) -= (b); (c) ^= ((b) >> 13); \ 
   80      (a) -= (b); (a) -= (c); (a) ^= ((c) >> 12); \ 
   81      (b) -= (c); (b) -= (a); (b) ^= ((a) << 16); \ 
   82      (c) -= (a); (c) -= (b); (c) ^= ((b) >> 5);  \ 
   83      (a) -= (b); (a) -= (c); (a) ^= ((c) >> 3);  \ 
   84      (b) -= (c); (b) -= (a); (b) ^= ((a) << 10); \ 
   85      (c) -= (a); (c) -= (b); (c) ^= ((b) >> 15); \ 
  102       a += (k[0] + ((ub4)k[1] << 8) + ((ub4)k[2] << 16) + ((ub4)k[3] << 24));
 
  103       b += (k[4] + ((ub4)k[5] << 8) + ((ub4)k[6] << 16) + ((ub4)k[7] << 24));
 
  104       c += (k[8] + ((ub4)k[9] << 8) + ((ub4)k[10] << 16) + ((ub4)k[11] << 24));
 
  114     case 11: c += ((ub4)k[10] << 24);
 
  115     case 10: c += ((ub4)k[9] << 16);
 
  116     case 9: c += ((ub4)k[8] << 8);  
 
  117     case 8: b += ((ub4)k[7] << 24);
 
  118     case 7: b += ((ub4)k[6] << 16);
 
  119     case 6: b += ((ub4)k[5] << 8);
 
  121     case 4: a += ((ub4)k[3] << 24);
 
  122     case 3: a += ((ub4)k[2] << 16);
 
  123     case 2: a += ((ub4)k[1] << 8);
 
  153   static const char xdigits_l[] = 
"0123456789abcdef";
 
  154   static const char xdigits_u[] = 
"0123456789ABCDEF";
 
  155   unsigned char tmp[16];
 
  156   unsigned char* tp = tmp;
 
  157   unsigned char* 
const endp = tp + 16;
 
  158   unsigned char* colonp = 0;
 
  159   const char* xdigits = 0;
 
  161   const char* curtok = 0;
 
  164   int seen_xdigits = 0;
 
  165   unsigned int val = 0;
 
  167   memset (tp, 0x00, 16);
 
  172       if (*++address != 
':')
 
  180   while ((ch = *address++) != 
'\0')
 
  184       if ((pch = strchr ((xdigits = xdigits_l), ch)) == 0)
 
  186           pch = strchr ((xdigits = xdigits_u), ch);
 
  192           val |= (pch - xdigits);
 
  194           if (++seen_xdigits > 4)
 
  219           *tp++ = (
unsigned char)(val >> 8) & 0xff;
 
  220           *tp++ = (
unsigned char) val & 0xff;
 
  228       if (ch == 
'.' && (endp - tp > 3 )) &&
 
  229           inet_pton4 (curtok, tp) > 0)
 
  245       *tp++ = (
unsigned char)(val >> 8) & 0xff;
 
  246       *tp++ = (
unsigned char) val & 0xff;
 
  255       const int n = tp - colonp;
 
  263       for (i = 1; i <= n; i++)
 
  265           endp[-i] = colonp[n - i];
 
  277   memcpy (addr, tmp, 16);
 
  347   uint8_t buf[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  348                       0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 };
 
  374   memcpy (buf2 + 14, buf, 2);
 
  392   memcpy (buf2 + 8, buf, 3);
 
  395   memcpy (buf2 + 13, buf + 3, 3);
 
  412   memcpy (buf2 + 8, buf, 8);
 
  429   memcpy (buf2 + 14, buf, 2);
 
  446   memset (buf2, 0x00, 
sizeof (buf2));
 
  449   memcpy (buf2 + 14, buf, 2);
 
  466   memset (buf2, 0x00, 
sizeof (buf2));
 
  469   memcpy (buf2 + 8, buf, 3);
 
  472   memcpy (buf2 + 13, buf + 3, 3);
 
  488   memset (buf2, 0x00, 
sizeof (buf2));
 
  491   memcpy (buf2 + 8, buf, 8);
 
  507   memset (buf2, 0x00, 
sizeof (buf2));
 
  510   memcpy (buf2 + 14, buf, 2);
 
  527   memset (buf, 0x00, 
sizeof (buf));
 
  566   int8_t bestBase = -1;
 
  589               if (bestBase == -1 || curLen > bestLen)
 
  600       if (bestBase == -1 || curLen > bestLen)
 
  606   if (bestBase != -1 && bestLen < 2)
 
  611   for (i = 0; i < 8;) {
 
  624       os << std::hex << (
unsigned int) address[i];
 
  628   if (bestBase != -1 && (bestBase + bestLen) == 8)
 
  639   return (*
this == localhost);
 
  665   uint8_t v4MappedPrefix[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
  666                                  0x00, 0x00, 0xff, 0xff };
 
  667   if (memcmp(
m_address, v4MappedPrefix, 
sizeof(v4MappedPrefix)) == 0)
 
  686   for (i = 0; i < 16; i++)
 
  688       addr[i] = addr[i] & pref[i];
 
  701   if (buf[0] == 0xff && 
 
  717   return (*
this == allNodesI || *
this == allNodesL || *
this == allNodesR);
 
  727   return (*
this == allroutersI || *
this == allroutersL || *
this == allroutersR || *
this == allroutersS);
 
  734   return (*
this == allhosts);
 
  741   return (*
this == any);
 
  837   static Ipv6Address ones (
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
 
  928       for (i = nb; i < 16; i++)
 
  962   for (i = 0; i < 16; i++)
 
 1010   uint8_t prefixLength = 0;
 
 1012   for(i = 0; i < 16; i++)
 
 1023   return prefixLength;
 
bool IsMatch(Ipv6Address a, Ipv6Address b) const 
If the Address match the type. 
 
static bool IsMatchingType(const Address &address)
If the Address matches the type. 
 
bool IsAny() const 
If the IPv6 address is the "Any" address. 
 
static Ipv4Address Deserialize(const uint8_t buf[4])
 
static Ipv6Address GetLoopback()
Get the loopback address. 
 
std::istream & operator>>(std::istream &is, Angles &a)
initialize a struct Angles from input 
 
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
 
Ipv6Address()
Default constructor. 
 
uint8_t m_address[16]
The address representation on 128 bits (16 bytes). 
 
bool IsLinkLocalMulticast() const 
If the IPv6 address is link-local multicast (ff02::/16). 
 
Ipv6Prefix()
Default constructor. 
 
void CopyTo(uint8_t *pBuffer) const 
Writes address to buffer parameter. 
 
#define ATTRIBUTE_HELPER_CPP(type)
Define the attribute value, accessor and checkers for class type. 
 
static Ipv6Address Deserialize(const uint8_t buf[16])
Deserialize this address. 
 
bool IsLinkLocal() const 
If the IPv6 address is a link-local address (fe80::/64). 
 
bool IsAllRoutersMulticast() const 
If the IPv6 address is "all routers multicast" (ff02::2/8). 
 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
 
bool IsEqual(const Ipv6Prefix &other) const 
Comparison operation between two Ipv6Prefix. 
 
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address. 
 
static Ipv6Address MakeAutoconfiguredAddress(Mac16Address addr, Ipv6Address prefix)
Make the autoconfigured IPv6 address with Mac16Address. 
 
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name. 
 
size_t operator()(Ipv6Address const &x) const 
Unary operator to hash IPv6 address. 
 
bool IsEqual(const Ipv6Address &other) const 
Comparison operation between two Ipv6Addresses. 
 
bool IsDocumentation() const 
If the IPv6 address is a documentation address (2001:DB8::/32). 
 
NS_DEPRECATED bool IsAllHostsMulticast() const 
If the IPv6 address is "all hosts multicast" (ff02::3/8). 
 
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function. 
 
bool IsAllNodesMulticast() const 
If the IPv6 address is "all nodes multicast" (ff02::1/8). 
 
static Ipv6Prefix GetZero()
Get the zero prefix ( /0). 
 
static uint32_t lookuphash(unsigned char *k, uint32_t length, uint32_t level)
Get a hash key. 
 
a polymophic address class 
 
bool CheckCompatible(uint8_t type, uint8_t len) const 
 
void CopyTo(uint8_t buffer[8]) const 
 
void CopyTo(uint8_t buffer[6]) const 
 
Address ConvertTo(void) const 
convert the IPv6Address object to an Address object. 
 
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address. 
 
A class used for addressing MAC8 MAC's. 
 
void CopyTo(uint8_t buffer[2]) const 
 
void Print(std::ostream &os) const 
Print this address to the given output stream. 
 
void Serialize(uint8_t buf[4]) const 
Serialize this address to a 4-byte buffer. 
 
void GetBytes(uint8_t buf[16]) const 
Get the bytes corresponding to the address. 
 
void Set(char const *address)
Sets an Ipv6Address by parsing the input C-string. 
 
static Ipv6Address GetAllHostsMulticast()
Get the "all hosts multicast" address. 
 
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
bool IsMulticast() const 
If the IPv6 address is multicast (ff00::/8). 
 
static Ipv6Address GetAllNodesMulticast()
Get the "all nodes multicast" address. 
 
uint8_t m_prefix[16]
The prefix representation. 
 
static bool AsciiToIpv6Host(const char *address, uint8_t addr[16])
Convert an IPv6 C-string into a 128-bit representation. 
 
This class can contain 16 bit addresses. 
 
static Ipv6Address MakeAutoconfiguredLinkLocalAddress(Mac16Address mac)
Make the autoconfigured link-local IPv6 address with Mac16Address. 
 
Describes an IPv6 address. 
 
Ipv4 addresses are stored in host order in this class. 
 
void Print(std::ostream &os) const 
Print this address to the given output stream. 
 
bool IsSolicitedMulticast() const 
If the IPv6 address is a Solicited multicast address. 
 
static Ipv6Prefix GetOnes()
Get the "all-1" IPv6 mask (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff). 
 
uint32_t CopyTo(uint8_t buffer[MAX_SIZE]) const 
Copy the address bytes into a buffer. 
 
void GetBytes(uint8_t buf[16]) const 
Get the bytes corresponding to the prefix. 
 
~Ipv6Address()
Destructor. 
 
static Ipv6Address GetOnes()
Get the "all-1" IPv6 address (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff). 
 
static Ipv6Prefix GetLoopback()
Get the loopback prefix ( /128). 
 
Describes an IPv6 prefix. 
 
Ipv4Address GetIpv4MappedAddress() const 
Return the Ipv4 address. 
 
uint8_t GetPrefixLength() const 
Get prefix length. 
 
bool IsLocalhost() const 
If the IPv6 address is localhost (::1). 
 
static Ipv6Address MakeIpv4MappedAddress(Ipv4Address addr)
Make the Ipv4-mapped IPv6 address. 
 
Ipv6Address CombinePrefix(Ipv6Prefix const &prefix)
Combine this address with a prefix. 
 
bool IsIpv4MappedAddress() const 
If the address is an IPv4-mapped address. 
 
static uint8_t Register(void)
Allocate a new type id for a new type of address. 
 
static uint8_t GetType(void)
Return the Type of address. 
 
static Ipv6Address MakeSolicitedAddress(Ipv6Address addr)
Make the solicited IPv6 address. 
 
static Ipv6Address GetAllRoutersMulticast()
Get the "all routers multicast" address. 
 
static Ipv6Address ConvertFrom(const Address &address)
Convert the Address object into an Ipv6Address ones. 
 
void Serialize(uint8_t buf[16]) const 
Serialize this address to a 16-byte buffer.