25 #include "ns3/assert.h"
47 static uint32_t
lookuphash (
unsigned char* k, uint32_t length, uint32_t level)
49 #define mix(a, b, c) \
51 (a) -= (b); (a) -= (c); (a) ^= ((c) >> 13); \
52 (b) -= (c); (b) -= (a); (b) ^= ((a) << 8); \
53 (c) -= (a); (c) -= (b); (c) ^= ((b) >> 13); \
54 (a) -= (b); (a) -= (c); (a) ^= ((c) >> 12); \
55 (b) -= (c); (b) -= (a); (b) ^= ((a) << 16); \
56 (c) -= (a); (c) -= (b); (c) ^= ((b) >> 5); \
57 (a) -= (b); (a) -= (c); (a) ^= ((c) >> 3); \
58 (b) -= (c); (b) -= (a); (b) ^= ((a) << 10); \
59 (c) -= (a); (c) -= (b); (c) ^= ((b) >> 15); \
63 typedef unsigned char ub1;
77 a += (k[0] + ((ub4)k[1] << 8) + ((ub4)k[2] << 16) + ((ub4)k[3] << 24));
78 b += (k[4] + ((ub4)k[5] << 8) + ((ub4)k[6] << 16) + ((ub4)k[7] << 24));
79 c += (k[8] + ((ub4)k[9] << 8) + ((ub4)k[10] << 16) + ((ub4)k[11] << 24));
89 case 11: c += ((ub4)k[10] << 24);
90 case 10: c += ((ub4)k[9] << 16);
91 case 9: c += ((ub4)k[8] << 8);
92 case 8: b += ((ub4)k[7] << 24);
93 case 7: b += ((ub4)k[6] << 16);
94 case 6: b += ((ub4)k[5] << 8);
96 case 4: a += ((ub4)k[3] << 24);
97 case 3: a += ((ub4)k[2] << 16);
98 case 2: a += ((ub4)k[1] << 8);
122 static const char xdigits_l[] =
"0123456789abcdef";
123 static const char xdigits_u[] =
"0123456789ABCDEF";
124 unsigned char tmp[16];
125 unsigned char* tp = tmp;
126 unsigned char* endp = 0;
127 unsigned char* colonp = 0;
128 const char* xdigits = 0;
130 const char* curtok = 0;
133 int seen_xdigits = 0;
134 unsigned int val = 0;
136 memset (tp, 0x00, 16);
142 if (*++address !=
':')
150 while ((ch = *address++) !=
'\0')
154 if ((pch = strchr ((xdigits = xdigits_l), ch)) == 0)
156 pch = strchr ((xdigits = xdigits_u), ch);
162 val |= (pch - xdigits);
164 if (++seen_xdigits > 4)
189 *tp++ = (
unsigned char)(val >> 8) & 0xff;
190 *tp++ = (
unsigned char) val & 0xff;
198 if (ch ==
'.' && ((tp + 4 ) <= endp) &&
199 inet_pton4 (curtok, tp) > 0)
215 *tp++ = (
unsigned char)(val >> 8) & 0xff;
216 *tp++ = (
unsigned char) val & 0xff;
225 const int n = tp - colonp;
233 for (i = 1; i <= n; i++)
235 endp[-i] = colonp[n - i];
247 memcpy (addr, tmp, 16);
306 uint8_t buf[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 };
331 memcpy (buf2 + 8, buf, 3);
334 memcpy (buf2 + 13, buf + 3, 3);
349 memset (buf2, 0x00,
sizeof (buf2));
352 memcpy (buf2 + 8, buf, 3);
355 memcpy (buf2 + 13, buf + 3, 3);
370 memset (buf, 0x00,
sizeof (buf));
385 os << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[0]
386 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[1] <<
":"
387 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[2]
388 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[3] <<
":"
389 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[4]
390 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[5] <<
":"
391 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[6]
392 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[7] <<
":"
393 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[8]
394 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[9] <<
":"
395 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[10]
396 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[11] <<
":"
397 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[12]
398 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[13] <<
":"
399 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[14]
400 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_address[15]
401 << std::dec << std::setfill (
' ');
407 return (*
this == localhost);
430 uint8_t v4MappedPrefix[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
431 0x00, 0x00, 0xff, 0xff };
432 if (memcmp(
m_address, v4MappedPrefix,
sizeof(v4MappedPrefix)) == 0)
450 for (i = 0; i < 16; i++)
452 addr[i] = addr[i] & pref[i];
464 if (buf[0] == 0xff &&
477 return (*
this == allnodes);
483 return (*
this == allrouters);
489 return (*
this == allhosts);
495 return (*
this == any);
567 static Ipv6Address ones (
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
651 for (i = nb; i < 16; i++)
683 for (i = 0; i < 16; i++)
695 os << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[0]
696 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[1] <<
":"
697 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[2]
698 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[3] <<
":"
699 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[4]
700 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[5] <<
":"
701 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[6]
702 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[7] <<
":"
703 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[8]
704 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[9] <<
":"
705 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[10]
706 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[11] <<
":"
707 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[12]
708 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[13] <<
":"
709 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[14]
710 << std::hex << std::setw (2) << std::setfill (
'0') << (
unsigned int)
m_prefix[15];
739 uint8_t prefixLength = 0;
741 for(i = 0; i < 16; i++)