OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/base/network_interfaces.h" | 5 #include "net/base/network_interfaces.h" |
6 | 6 |
7 #include <ostream> | 7 #include <ostream> |
8 #include <string> | 8 #include <string> |
9 #include <unordered_set> | 9 #include <unordered_set> |
10 | 10 |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include <netinet/in_var.h> | 29 #include <netinet/in_var.h> |
30 #endif // !OS_IOS | 30 #endif // !OS_IOS |
31 #endif // OS_MACOSX | 31 #endif // OS_MACOSX |
32 #endif // !OS_NACL && !OS_WIN | 32 #endif // !OS_NACL && !OS_WIN |
33 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
34 #include "url/gurl.h" | 34 #include "url/gurl.h" |
35 | 35 |
36 #if defined(OS_WIN) | 36 #if defined(OS_WIN) |
37 #include <iphlpapi.h> | 37 #include <iphlpapi.h> |
38 #include <objbase.h> | 38 #include <objbase.h> |
39 #include "base/win/windows_version.h" | |
40 #endif // OS_WIN | 39 #endif // OS_WIN |
41 | 40 |
42 #if !defined(OS_MACOSX) && !defined(OS_NACL) && !defined(OS_WIN) | 41 #if !defined(OS_MACOSX) && !defined(OS_NACL) && !defined(OS_WIN) |
43 #include "net/base/address_tracker_linux.h" | 42 #include "net/base/address_tracker_linux.h" |
44 #endif // !OS_MACOSX && !OS_NACL && !OS_WIN | 43 #endif // !OS_MACOSX && !OS_NACL && !OS_WIN |
45 | 44 |
46 #if defined(OS_WIN) | 45 #if defined(OS_WIN) |
47 #include "net/base/network_interfaces_win.h" | 46 #include "net/base/network_interfaces_win.h" |
48 #else // OS_WIN | 47 #else // OS_WIN |
49 #include "net/base/network_interfaces_posix.h" | 48 #include "net/base/network_interfaces_posix.h" |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 | 130 |
132 // Verify that the address is correct. | 131 // Verify that the address is correct. |
133 EXPECT_TRUE(it->address.IsValid()) << "Invalid address of size " | 132 EXPECT_TRUE(it->address.IsValid()) << "Invalid address of size " |
134 << it->address.size(); | 133 << it->address.size(); |
135 EXPECT_FALSE(it->address.IsZero()); | 134 EXPECT_FALSE(it->address.IsZero()); |
136 EXPECT_GT(it->prefix_length, 1u); | 135 EXPECT_GT(it->prefix_length, 1u); |
137 EXPECT_LE(it->prefix_length, it->address.size() * 8); | 136 EXPECT_LE(it->prefix_length, it->address.size() * 8); |
138 | 137 |
139 #if defined(OS_WIN) | 138 #if defined(OS_WIN) |
140 // On Windows |name| is NET_LUID. | 139 // On Windows |name| is NET_LUID. |
141 base::ScopedNativeLibrary phlpapi_lib( | 140 NET_LUID luid; |
142 base::FilePath(FILE_PATH_LITERAL("iphlpapi.dll"))); | 141 EXPECT_EQ(static_cast<DWORD>(NO_ERROR), |
143 ASSERT_TRUE(phlpapi_lib.is_valid()); | 142 ConvertInterfaceIndexToLuid(it->interface_index, &luid)); |
144 typedef NETIO_STATUS (WINAPI* ConvertInterfaceIndexToLuid)(NET_IFINDEX, | 143 GUID guid; |
145 PNET_LUID); | 144 EXPECT_EQ(static_cast<DWORD>(NO_ERROR), |
146 ConvertInterfaceIndexToLuid interface_to_luid = | 145 ConvertInterfaceLuidToGuid(&luid, &guid)); |
147 reinterpret_cast<ConvertInterfaceIndexToLuid>( | 146 LPOLESTR name; |
148 phlpapi_lib.GetFunctionPointer("ConvertInterfaceIndexToLuid")); | 147 StringFromCLSID(guid, &name); |
| 148 EXPECT_STREQ(base::UTF8ToWide(it->name).c_str(), name); |
| 149 CoTaskMemFree(name); |
149 | 150 |
150 typedef NETIO_STATUS (WINAPI* ConvertInterfaceLuidToGuid)(NET_LUID*, | |
151 GUID*); | |
152 ConvertInterfaceLuidToGuid luid_to_guid = | |
153 reinterpret_cast<ConvertInterfaceLuidToGuid>( | |
154 phlpapi_lib.GetFunctionPointer("ConvertInterfaceLuidToGuid")); | |
155 | |
156 if (interface_to_luid && luid_to_guid) { | |
157 NET_LUID luid; | |
158 EXPECT_EQ(static_cast<DWORD>(NO_ERROR), | |
159 interface_to_luid(it->interface_index, &luid)); | |
160 GUID guid; | |
161 EXPECT_EQ(static_cast<DWORD>(NO_ERROR), luid_to_guid(&luid, &guid)); | |
162 LPOLESTR name; | |
163 StringFromCLSID(guid, &name); | |
164 EXPECT_STREQ(base::UTF8ToWide(it->name).c_str(), name); | |
165 CoTaskMemFree(name); | |
166 continue; | |
167 } else { | |
168 EXPECT_LT(base::win::GetVersion(), base::win::VERSION_VISTA); | |
169 EXPECT_LT(it->interface_index, 1u << 24u); // Must fit 0.x.x.x. | |
170 EXPECT_NE(it->interface_index, 0u); // 0 means to use default. | |
171 } | |
172 if (it->type == NetworkChangeNotifier::CONNECTION_WIFI) { | 151 if (it->type == NetworkChangeNotifier::CONNECTION_WIFI) { |
173 EXPECT_NE(WIFI_PHY_LAYER_PROTOCOL_NONE, GetWifiPHYLayerProtocol()); | 152 EXPECT_NE(WIFI_PHY_LAYER_PROTOCOL_NONE, GetWifiPHYLayerProtocol()); |
174 } | 153 } |
175 #elif !defined(OS_ANDROID) | 154 #elif !defined(OS_ANDROID) |
176 char name[IF_NAMESIZE]; | 155 char name[IF_NAMESIZE]; |
177 EXPECT_TRUE(if_indextoname(it->interface_index, name)); | 156 EXPECT_TRUE(if_indextoname(it->interface_index, name)); |
178 EXPECT_STREQ(it->name.c_str(), name); | 157 EXPECT_STREQ(it->name.c_str(), name); |
179 #endif | 158 #endif |
180 } | 159 } |
181 } | 160 } |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 adapter_address.FirstPrefix = &adapter_prefix; | 462 adapter_address.FirstPrefix = &adapter_prefix; |
484 | 463 |
485 // Address of offline links should be ignored. | 464 // Address of offline links should be ignored. |
486 ASSERT_TRUE(FillAdapterAddress( | 465 ASSERT_TRUE(FillAdapterAddress( |
487 &adapter_address /* adapter_address */, ifname_em1 /* ifname */, | 466 &adapter_address /* adapter_address */, ifname_em1 /* ifname */, |
488 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, | 467 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, |
489 addresses /* sock_addrs */)); | 468 addresses /* sock_addrs */)); |
490 adapter_address.OperStatus = IfOperStatusDown; | 469 adapter_address.OperStatus = IfOperStatusDown; |
491 | 470 |
492 EXPECT_TRUE(internal::GetNetworkListImpl( | 471 EXPECT_TRUE(internal::GetNetworkListImpl( |
493 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address)); | 472 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &adapter_address)); |
494 | 473 |
495 EXPECT_EQ(results.size(), 0ul); | 474 EXPECT_EQ(results.size(), 0ul); |
496 | 475 |
497 // Address on loopback interface should be trimmed out. | 476 // Address on loopback interface should be trimmed out. |
498 ASSERT_TRUE(FillAdapterAddress( | 477 ASSERT_TRUE(FillAdapterAddress( |
499 &adapter_address /* adapter_address */, ifname_em1 /* ifname */, | 478 &adapter_address /* adapter_address */, ifname_em1 /* ifname */, |
500 ipv6_local_address /* ip_address */, ipv6_prefix /* ip_netmask */, | 479 ipv6_local_address /* ip_address */, ipv6_prefix /* ip_netmask */, |
501 addresses /* sock_addrs */)); | 480 addresses /* sock_addrs */)); |
502 adapter_address.IfType = IF_TYPE_SOFTWARE_LOOPBACK; | 481 adapter_address.IfType = IF_TYPE_SOFTWARE_LOOPBACK; |
503 | 482 |
504 EXPECT_TRUE(internal::GetNetworkListImpl( | 483 EXPECT_TRUE(internal::GetNetworkListImpl( |
505 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address)); | 484 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &adapter_address)); |
506 EXPECT_EQ(results.size(), 0ul); | 485 EXPECT_EQ(results.size(), 0ul); |
507 | 486 |
508 // vmware address should return by default. | 487 // vmware address should return by default. |
509 ASSERT_TRUE(FillAdapterAddress( | 488 ASSERT_TRUE(FillAdapterAddress( |
510 &adapter_address /* adapter_address */, ifname_vm /* ifname */, | 489 &adapter_address /* adapter_address */, ifname_vm /* ifname */, |
511 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, | 490 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, |
512 addresses /* sock_addrs */)); | 491 addresses /* sock_addrs */)); |
513 EXPECT_TRUE(internal::GetNetworkListImpl( | 492 EXPECT_TRUE(internal::GetNetworkListImpl( |
514 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address)); | 493 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &adapter_address)); |
515 EXPECT_EQ(results.size(), 1ul); | 494 EXPECT_EQ(results.size(), 1ul); |
516 EXPECT_EQ(results[0].name, ifname_vm); | 495 EXPECT_EQ(results[0].name, ifname_vm); |
517 EXPECT_EQ(results[0].prefix_length, 1ul); | 496 EXPECT_EQ(results[0].prefix_length, 1ul); |
518 EXPECT_EQ(results[0].address, ipv6_address); | 497 EXPECT_EQ(results[0].address, ipv6_address); |
519 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_NONE); | 498 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_NONE); |
520 results.clear(); | 499 results.clear(); |
521 | 500 |
522 // vmware address should be trimmed out if policy specified so. | 501 // vmware address should be trimmed out if policy specified so. |
523 ASSERT_TRUE(FillAdapterAddress( | 502 ASSERT_TRUE(FillAdapterAddress( |
524 &adapter_address /* adapter_address */, ifname_vm /* ifname */, | 503 &adapter_address /* adapter_address */, ifname_vm /* ifname */, |
525 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, | 504 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, |
526 addresses /* sock_addrs */)); | 505 addresses /* sock_addrs */)); |
527 EXPECT_TRUE(internal::GetNetworkListImpl( | 506 EXPECT_TRUE(internal::GetNetworkListImpl( |
528 &results, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address)); | 507 &results, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &adapter_address)); |
529 EXPECT_EQ(results.size(), 0ul); | 508 EXPECT_EQ(results.size(), 0ul); |
530 results.clear(); | 509 results.clear(); |
531 | 510 |
532 // Addresses with incompleted DAD should be ignored. | 511 // Addresses with incompleted DAD should be ignored. |
533 ASSERT_TRUE(FillAdapterAddress( | 512 ASSERT_TRUE(FillAdapterAddress( |
534 &adapter_address /* adapter_address */, ifname_em1 /* ifname */, | 513 &adapter_address /* adapter_address */, ifname_em1 /* ifname */, |
535 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, | 514 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, |
536 addresses /* sock_addrs */)); | 515 addresses /* sock_addrs */)); |
537 adapter_address.FirstUnicastAddress->DadState = IpDadStateTentative; | 516 adapter_address.FirstUnicastAddress->DadState = IpDadStateTentative; |
538 | 517 |
539 EXPECT_TRUE(internal::GetNetworkListImpl( | 518 EXPECT_TRUE(internal::GetNetworkListImpl( |
540 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address)); | 519 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &adapter_address)); |
541 EXPECT_EQ(results.size(), 0ul); | 520 EXPECT_EQ(results.size(), 0ul); |
542 results.clear(); | 521 results.clear(); |
543 | 522 |
544 // Addresses with allowed attribute IpSuffixOriginRandom should be returned | 523 // Addresses with allowed attribute IpSuffixOriginRandom should be returned |
545 // and attributes should be translated correctly to | 524 // and attributes should be translated correctly to |
546 // IP_ADDRESS_ATTRIBUTE_TEMPORARY. | 525 // IP_ADDRESS_ATTRIBUTE_TEMPORARY. |
547 ASSERT_TRUE(FillAdapterAddress( | 526 ASSERT_TRUE(FillAdapterAddress( |
548 &adapter_address /* adapter_address */, ifname_em1 /* ifname */, | 527 &adapter_address /* adapter_address */, ifname_em1 /* ifname */, |
549 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, | 528 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, |
550 addresses /* sock_addrs */)); | 529 addresses /* sock_addrs */)); |
551 adapter_address.FirstUnicastAddress->PrefixOrigin = | 530 adapter_address.FirstUnicastAddress->PrefixOrigin = |
552 IpPrefixOriginRouterAdvertisement; | 531 IpPrefixOriginRouterAdvertisement; |
553 adapter_address.FirstUnicastAddress->SuffixOrigin = IpSuffixOriginRandom; | 532 adapter_address.FirstUnicastAddress->SuffixOrigin = IpSuffixOriginRandom; |
554 | 533 |
555 EXPECT_TRUE(internal::GetNetworkListImpl( | 534 EXPECT_TRUE(internal::GetNetworkListImpl( |
556 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address)); | 535 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &adapter_address)); |
557 EXPECT_EQ(results.size(), 1ul); | 536 EXPECT_EQ(results.size(), 1ul); |
558 EXPECT_EQ(results[0].name, ifname_em1); | 537 EXPECT_EQ(results[0].name, ifname_em1); |
559 EXPECT_EQ(results[0].prefix_length, 1ul); | 538 EXPECT_EQ(results[0].prefix_length, 1ul); |
560 EXPECT_EQ(results[0].address, ipv6_address); | 539 EXPECT_EQ(results[0].address, ipv6_address); |
561 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY); | 540 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY); |
562 results.clear(); | 541 results.clear(); |
563 | 542 |
564 // Addresses with preferred lifetime 0 should be returned and | 543 // Addresses with preferred lifetime 0 should be returned and |
565 // attributes should be translated correctly to | 544 // attributes should be translated correctly to |
566 // IP_ADDRESS_ATTRIBUTE_DEPRECATED. | 545 // IP_ADDRESS_ATTRIBUTE_DEPRECATED. |
567 ASSERT_TRUE(FillAdapterAddress( | 546 ASSERT_TRUE(FillAdapterAddress( |
568 &adapter_address /* adapter_address */, ifname_em1 /* ifname */, | 547 &adapter_address /* adapter_address */, ifname_em1 /* ifname */, |
569 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, | 548 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */, |
570 addresses /* sock_addrs */)); | 549 addresses /* sock_addrs */)); |
571 adapter_address.FirstUnicastAddress->PreferredLifetime = 0; | 550 adapter_address.FirstUnicastAddress->PreferredLifetime = 0; |
572 adapter_address.FriendlyName = const_cast<PWCHAR>(L"FriendlyInterfaceName"); | 551 adapter_address.FriendlyName = const_cast<PWCHAR>(L"FriendlyInterfaceName"); |
573 EXPECT_TRUE(internal::GetNetworkListImpl( | 552 EXPECT_TRUE(internal::GetNetworkListImpl( |
574 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address)); | 553 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &adapter_address)); |
575 EXPECT_EQ(results.size(), 1ul); | 554 EXPECT_EQ(results.size(), 1ul); |
576 EXPECT_EQ(results[0].friendly_name, "FriendlyInterfaceName"); | 555 EXPECT_EQ(results[0].friendly_name, "FriendlyInterfaceName"); |
577 EXPECT_EQ(results[0].name, ifname_em1); | 556 EXPECT_EQ(results[0].name, ifname_em1); |
578 EXPECT_EQ(results[0].prefix_length, 1ul); | 557 EXPECT_EQ(results[0].prefix_length, 1ul); |
579 EXPECT_EQ(results[0].address, ipv6_address); | 558 EXPECT_EQ(results[0].address, ipv6_address); |
580 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED); | 559 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED); |
581 results.clear(); | 560 results.clear(); |
582 } | 561 } |
583 | 562 |
584 #endif // !OS_MACOSX && !OS_WIN && !OS_NACL | 563 #endif // !OS_MACOSX && !OS_WIN && !OS_NACL |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 // We can't check the result of GetHostName() directly, since the result | 721 // We can't check the result of GetHostName() directly, since the result |
743 // will differ across machines. Our goal here is to simply exercise the | 722 // will differ across machines. Our goal here is to simply exercise the |
744 // code path, and check that things "look about right". | 723 // code path, and check that things "look about right". |
745 std::string hostname = GetHostName(); | 724 std::string hostname = GetHostName(); |
746 EXPECT_FALSE(hostname.empty()); | 725 EXPECT_FALSE(hostname.empty()); |
747 } | 726 } |
748 | 727 |
749 } // namespace | 728 } // namespace |
750 | 729 |
751 } // namespace net | 730 } // namespace net |
OLD | NEW |