| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 // Prefixes used for categorizing IPv6 addresses. | 36 // Prefixes used for categorizing IPv6 addresses. |
| 37 static const in6_addr kV4MappedPrefix = {{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 37 static const in6_addr kV4MappedPrefix = {{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 38 0xFF, 0xFF, 0}}}; | 38 0xFF, 0xFF, 0}}}; |
| 39 static const in6_addr k6To4Prefix = {{{0x20, 0x02, 0}}}; | 39 static const in6_addr k6To4Prefix = {{{0x20, 0x02, 0}}}; |
| 40 static const in6_addr kTeredoPrefix = {{{0x20, 0x01, 0x00, 0x00}}}; | 40 static const in6_addr kTeredoPrefix = {{{0x20, 0x01, 0x00, 0x00}}}; |
| 41 static const in6_addr kV4CompatibilityPrefix = {{{0}}}; | 41 static const in6_addr kV4CompatibilityPrefix = {{{0}}}; |
| 42 static const in6_addr k6BonePrefix = {{{0x3f, 0xfe, 0}}}; | 42 static const in6_addr k6BonePrefix = {{{0x3f, 0xfe, 0}}}; |
| 43 | 43 |
| 44 bool IPAddress::strip_sensitive_ = false; | 44 bool IPAddress::strip_sensitive_ = false; |
| 45 | 45 |
| 46 static bool IsPrivateV4(uint32 ip); | 46 static bool IsPrivateV4(uint32_t ip); |
| 47 static in_addr ExtractMappedAddress(const in6_addr& addr); | 47 static in_addr ExtractMappedAddress(const in6_addr& addr); |
| 48 | 48 |
| 49 uint32 IPAddress::v4AddressAsHostOrderInteger() const { | 49 uint32_t IPAddress::v4AddressAsHostOrderInteger() const { |
| 50 if (family_ == AF_INET) { | 50 if (family_ == AF_INET) { |
| 51 return NetworkToHost32(u_.ip4.s_addr); | 51 return NetworkToHost32(u_.ip4.s_addr); |
| 52 } else { | 52 } else { |
| 53 return 0; | 53 return 0; |
| 54 } | 54 } |
| 55 } | 55 } |
| 56 | 56 |
| 57 bool IPAddress::IsNil() const { | 57 bool IPAddress::IsNil() const { |
| 58 return IPIsUnspec(*this); | 58 return IPIsUnspec(*this); |
| 59 } | 59 } |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 | 208 |
| 209 std::ostream& operator<<(std::ostream& os, const InterfaceAddress& ip) { | 209 std::ostream& operator<<(std::ostream& os, const InterfaceAddress& ip) { |
| 210 os << static_cast<const IPAddress&>(ip); | 210 os << static_cast<const IPAddress&>(ip); |
| 211 | 211 |
| 212 if (ip.family() == AF_INET6) | 212 if (ip.family() == AF_INET6) |
| 213 os << "|flags:0x" << std::hex << ip.ipv6_flags(); | 213 os << "|flags:0x" << std::hex << ip.ipv6_flags(); |
| 214 | 214 |
| 215 return os; | 215 return os; |
| 216 } | 216 } |
| 217 | 217 |
| 218 bool IsPrivateV4(uint32 ip_in_host_order) { | 218 bool IsPrivateV4(uint32_t ip_in_host_order) { |
| 219 return ((ip_in_host_order >> 24) == 127) || | 219 return ((ip_in_host_order >> 24) == 127) || |
| 220 ((ip_in_host_order >> 24) == 10) || | 220 ((ip_in_host_order >> 24) == 10) || |
| 221 ((ip_in_host_order >> 20) == ((172 << 4) | 1)) || | 221 ((ip_in_host_order >> 20) == ((172 << 4) | 1)) || |
| 222 ((ip_in_host_order >> 16) == ((192 << 8) | 168)) || | 222 ((ip_in_host_order >> 16) == ((192 << 8) | 168)) || |
| 223 ((ip_in_host_order >> 16) == ((169 << 8) | 254)); | 223 ((ip_in_host_order >> 16) == ((169 << 8) | 254)); |
| 224 } | 224 } |
| 225 | 225 |
| 226 in_addr ExtractMappedAddress(const in6_addr& in6) { | 226 in_addr ExtractMappedAddress(const in6_addr& in6) { |
| 227 in_addr ipv4; | 227 in_addr ipv4; |
| 228 ::memcpy(&ipv4.s_addr, &in6.s6_addr[12], sizeof(ipv4.s_addr)); | 228 ::memcpy(&ipv4.s_addr, &in6.s6_addr[12], sizeof(ipv4.s_addr)); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 return ip.family() == AF_UNSPEC; | 314 return ip.family() == AF_UNSPEC; |
| 315 } | 315 } |
| 316 | 316 |
| 317 size_t HashIP(const IPAddress& ip) { | 317 size_t HashIP(const IPAddress& ip) { |
| 318 switch (ip.family()) { | 318 switch (ip.family()) { |
| 319 case AF_INET: { | 319 case AF_INET: { |
| 320 return ip.ipv4_address().s_addr; | 320 return ip.ipv4_address().s_addr; |
| 321 } | 321 } |
| 322 case AF_INET6: { | 322 case AF_INET6: { |
| 323 in6_addr v6addr = ip.ipv6_address(); | 323 in6_addr v6addr = ip.ipv6_address(); |
| 324 const uint32* v6_as_ints = | 324 const uint32_t* v6_as_ints = |
| 325 reinterpret_cast<const uint32*>(&v6addr.s6_addr); | 325 reinterpret_cast<const uint32_t*>(&v6addr.s6_addr); |
| 326 return v6_as_ints[0] ^ v6_as_ints[1] ^ v6_as_ints[2] ^ v6_as_ints[3]; | 326 return v6_as_ints[0] ^ v6_as_ints[1] ^ v6_as_ints[2] ^ v6_as_ints[3]; |
| 327 } | 327 } |
| 328 } | 328 } |
| 329 return 0; | 329 return 0; |
| 330 } | 330 } |
| 331 | 331 |
| 332 IPAddress TruncateIP(const IPAddress& ip, int length) { | 332 IPAddress TruncateIP(const IPAddress& ip, int length) { |
| 333 if (length < 0) { | 333 if (length < 0) { |
| 334 return IPAddress(); | 334 return IPAddress(); |
| 335 } | 335 } |
| 336 if (ip.family() == AF_INET) { | 336 if (ip.family() == AF_INET) { |
| 337 if (length > 31) { | 337 if (length > 31) { |
| 338 return ip; | 338 return ip; |
| 339 } | 339 } |
| 340 if (length == 0) { | 340 if (length == 0) { |
| 341 return IPAddress(INADDR_ANY); | 341 return IPAddress(INADDR_ANY); |
| 342 } | 342 } |
| 343 int mask = (0xFFFFFFFF << (32 - length)); | 343 int mask = (0xFFFFFFFF << (32 - length)); |
| 344 uint32 host_order_ip = NetworkToHost32(ip.ipv4_address().s_addr); | 344 uint32_t host_order_ip = NetworkToHost32(ip.ipv4_address().s_addr); |
| 345 in_addr masked; | 345 in_addr masked; |
| 346 masked.s_addr = HostToNetwork32(host_order_ip & mask); | 346 masked.s_addr = HostToNetwork32(host_order_ip & mask); |
| 347 return IPAddress(masked); | 347 return IPAddress(masked); |
| 348 } else if (ip.family() == AF_INET6) { | 348 } else if (ip.family() == AF_INET6) { |
| 349 if (length > 127) { | 349 if (length > 127) { |
| 350 return ip; | 350 return ip; |
| 351 } | 351 } |
| 352 if (length == 0) { | 352 if (length == 0) { |
| 353 return IPAddress(in6addr_any); | 353 return IPAddress(in6addr_any); |
| 354 } | 354 } |
| 355 in6_addr v6addr = ip.ipv6_address(); | 355 in6_addr v6addr = ip.ipv6_address(); |
| 356 int position = length / 32; | 356 int position = length / 32; |
| 357 int inner_length = 32 - (length - (position * 32)); | 357 int inner_length = 32 - (length - (position * 32)); |
| 358 // Note: 64bit mask constant needed to allow possible 32-bit left shift. | 358 // Note: 64bit mask constant needed to allow possible 32-bit left shift. |
| 359 uint32 inner_mask = 0xFFFFFFFFLL << inner_length; | 359 uint32_t inner_mask = 0xFFFFFFFFLL << inner_length; |
| 360 uint32* v6_as_ints = | 360 uint32_t* v6_as_ints = reinterpret_cast<uint32_t*>(&v6addr.s6_addr); |
| 361 reinterpret_cast<uint32*>(&v6addr.s6_addr); | |
| 362 for (int i = 0; i < 4; ++i) { | 361 for (int i = 0; i < 4; ++i) { |
| 363 if (i == position) { | 362 if (i == position) { |
| 364 uint32 host_order_inner = NetworkToHost32(v6_as_ints[i]); | 363 uint32_t host_order_inner = NetworkToHost32(v6_as_ints[i]); |
| 365 v6_as_ints[i] = HostToNetwork32(host_order_inner & inner_mask); | 364 v6_as_ints[i] = HostToNetwork32(host_order_inner & inner_mask); |
| 366 } else if (i > position) { | 365 } else if (i > position) { |
| 367 v6_as_ints[i] = 0; | 366 v6_as_ints[i] = 0; |
| 368 } | 367 } |
| 369 } | 368 } |
| 370 return IPAddress(v6addr); | 369 return IPAddress(v6addr); |
| 371 } | 370 } |
| 372 return IPAddress(); | 371 return IPAddress(); |
| 373 } | 372 } |
| 374 | 373 |
| 375 int CountIPMaskBits(IPAddress mask) { | 374 int CountIPMaskBits(IPAddress mask) { |
| 376 uint32 word_to_count = 0; | 375 uint32_t word_to_count = 0; |
| 377 int bits = 0; | 376 int bits = 0; |
| 378 switch (mask.family()) { | 377 switch (mask.family()) { |
| 379 case AF_INET: { | 378 case AF_INET: { |
| 380 word_to_count = NetworkToHost32(mask.ipv4_address().s_addr); | 379 word_to_count = NetworkToHost32(mask.ipv4_address().s_addr); |
| 381 break; | 380 break; |
| 382 } | 381 } |
| 383 case AF_INET6: { | 382 case AF_INET6: { |
| 384 in6_addr v6addr = mask.ipv6_address(); | 383 in6_addr v6addr = mask.ipv6_address(); |
| 385 const uint32* v6_as_ints = | 384 const uint32_t* v6_as_ints = |
| 386 reinterpret_cast<const uint32*>(&v6addr.s6_addr); | 385 reinterpret_cast<const uint32_t*>(&v6addr.s6_addr); |
| 387 int i = 0; | 386 int i = 0; |
| 388 for (; i < 4; ++i) { | 387 for (; i < 4; ++i) { |
| 389 if (v6_as_ints[i] != 0xFFFFFFFF) { | 388 if (v6_as_ints[i] != 0xFFFFFFFF) { |
| 390 break; | 389 break; |
| 391 } | 390 } |
| 392 } | 391 } |
| 393 if (i < 4) { | 392 if (i < 4) { |
| 394 word_to_count = NetworkToHost32(v6_as_ints[i]); | 393 word_to_count = NetworkToHost32(v6_as_ints[i]); |
| 395 } | 394 } |
| 396 bits = (i * 32); | 395 bits = (i * 32); |
| 397 break; | 396 break; |
| 398 } | 397 } |
| 399 default: { | 398 default: { |
| 400 return 0; | 399 return 0; |
| 401 } | 400 } |
| 402 } | 401 } |
| 403 if (word_to_count == 0) { | 402 if (word_to_count == 0) { |
| 404 return bits; | 403 return bits; |
| 405 } | 404 } |
| 406 | 405 |
| 407 // Public domain bit-twiddling hack from: | 406 // Public domain bit-twiddling hack from: |
| 408 // http://graphics.stanford.edu/~seander/bithacks.html | 407 // http://graphics.stanford.edu/~seander/bithacks.html |
| 409 // Counts the trailing 0s in the word. | 408 // Counts the trailing 0s in the word. |
| 410 unsigned int zeroes = 32; | 409 unsigned int zeroes = 32; |
| 411 word_to_count &= -static_cast<int32>(word_to_count); | 410 word_to_count &= -static_cast<int32_t>(word_to_count); |
| 412 if (word_to_count) zeroes--; | 411 if (word_to_count) zeroes--; |
| 413 if (word_to_count & 0x0000FFFF) zeroes -= 16; | 412 if (word_to_count & 0x0000FFFF) zeroes -= 16; |
| 414 if (word_to_count & 0x00FF00FF) zeroes -= 8; | 413 if (word_to_count & 0x00FF00FF) zeroes -= 8; |
| 415 if (word_to_count & 0x0F0F0F0F) zeroes -= 4; | 414 if (word_to_count & 0x0F0F0F0F) zeroes -= 4; |
| 416 if (word_to_count & 0x33333333) zeroes -= 2; | 415 if (word_to_count & 0x33333333) zeroes -= 2; |
| 417 if (word_to_count & 0x55555555) zeroes -= 1; | 416 if (word_to_count & 0x55555555) zeroes -= 1; |
| 418 | 417 |
| 419 return bits + (32 - zeroes); | 418 return bits + (32 - zeroes); |
| 420 } | 419 } |
| 421 | 420 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 IPAddress GetLoopbackIP(int family) { | 500 IPAddress GetLoopbackIP(int family) { |
| 502 if (family == AF_INET) { | 501 if (family == AF_INET) { |
| 503 return rtc::IPAddress(INADDR_LOOPBACK); | 502 return rtc::IPAddress(INADDR_LOOPBACK); |
| 504 } | 503 } |
| 505 if (family == AF_INET6) { | 504 if (family == AF_INET6) { |
| 506 return rtc::IPAddress(in6addr_loopback); | 505 return rtc::IPAddress(in6addr_loopback); |
| 507 } | 506 } |
| 508 return rtc::IPAddress(); | 507 return rtc::IPAddress(); |
| 509 } | 508 } |
| 510 } // Namespace rtc | 509 } // Namespace rtc |
| OLD | NEW |