зеркало из https://github.com/mozilla/gecko-dev.git
50 строки
1.4 KiB
C++
50 строки
1.4 KiB
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef NETWORK_IPV6_UTILS_H_
|
|
#define NETWORK_IPV6_UTILS_H_
|
|
|
|
namespace mozilla {
|
|
namespace net {
|
|
namespace utils {
|
|
|
|
// IPv6 address scopes.
|
|
#define IPV6_SCOPE_GLOBAL 0 // Global scope.
|
|
#define IPV6_SCOPE_LINKLOCAL 1 // Link-local scope.
|
|
#define IPV6_SCOPE_SITELOCAL 2 // Site-local scope (deprecated).
|
|
#define IPV6_SCOPE_UNIQUELOCAL 3 // Unique local
|
|
#define IPV6_SCOPE_NODELOCAL 4 // Loopback
|
|
|
|
// Return the scope of the given address.
|
|
static int ipv6_scope(const unsigned char addr[16]) {
|
|
const unsigned char* b = addr;
|
|
unsigned short w = (unsigned short)((b[0] << 8) | b[1]);
|
|
|
|
if ((b[0] & 0xFE) == 0xFC) {
|
|
return IPV6_SCOPE_UNIQUELOCAL;
|
|
}
|
|
switch (w & 0xFFC0) {
|
|
case 0xFE80:
|
|
return IPV6_SCOPE_LINKLOCAL;
|
|
case 0xFEC0:
|
|
return IPV6_SCOPE_SITELOCAL;
|
|
case 0x0000:
|
|
w = b[1] | b[2] | b[3] | b[4] | b[5] | b[6] | b[7] | b[8] | b[9] | b[10] |
|
|
b[11] | b[12] | b[13] | b[14];
|
|
if (w || b[15] != 0x01) {
|
|
break;
|
|
}
|
|
return IPV6_SCOPE_NODELOCAL;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return IPV6_SCOPE_GLOBAL;
|
|
}
|
|
|
|
} // namespace utils
|
|
} // namespace net
|
|
} // namespace mozilla
|
|
|
|
#endif // NETWORK_IPV6_UTILS_H_
|