network_interfaces_getifaddrs_unittest.cc 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/base/network_interfaces_getifaddrs.h"
  5. #include <string>
  6. #include "build/build_config.h"
  7. #include "net/base/ip_endpoint.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. #include <ifaddrs.h>
  10. #include <net/if.h>
  11. #include <netinet/in.h>
  12. namespace net {
  13. namespace {
  14. class IPAttributesGetterTest : public internal::IPAttributesGetter {
  15. public:
  16. IPAttributesGetterTest() = default;
  17. // internal::IPAttributesGetter interface.
  18. bool IsInitialized() const override { return true; }
  19. bool GetAddressAttributes(const ifaddrs* if_addr, int* attributes) override {
  20. *attributes = attributes_;
  21. return true;
  22. }
  23. NetworkChangeNotifier::ConnectionType GetNetworkInterfaceType(
  24. const ifaddrs* if_addr) override {
  25. return NetworkChangeNotifier::CONNECTION_UNKNOWN;
  26. }
  27. void set_attributes(int attributes) { attributes_ = attributes; }
  28. private:
  29. int attributes_ = 0;
  30. };
  31. // Helper function to create a single valid ifaddrs
  32. bool FillIfaddrs(ifaddrs* interfaces,
  33. const char* ifname,
  34. uint flags,
  35. const IPAddress& ip_address,
  36. const IPAddress& ip_netmask,
  37. sockaddr_storage sock_addrs[2]) {
  38. interfaces->ifa_next = nullptr;
  39. interfaces->ifa_name = const_cast<char*>(ifname);
  40. interfaces->ifa_flags = flags;
  41. socklen_t sock_len = sizeof(sockaddr_storage);
  42. // Convert to sockaddr for next check.
  43. if (!IPEndPoint(ip_address, 0)
  44. .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[0]),
  45. &sock_len)) {
  46. return false;
  47. }
  48. interfaces->ifa_addr = reinterpret_cast<sockaddr*>(&sock_addrs[0]);
  49. sock_len = sizeof(sockaddr_storage);
  50. if (!IPEndPoint(ip_netmask, 0)
  51. .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[1]),
  52. &sock_len)) {
  53. return false;
  54. }
  55. interfaces->ifa_netmask = reinterpret_cast<sockaddr*>(&sock_addrs[1]);
  56. return true;
  57. }
  58. static const char kIfnameEm1[] = "em1";
  59. static const char kIfnameVmnet[] = "vmnet";
  60. static const unsigned char kIPv6LocalAddr[] = {0, 0, 0, 0, 0, 0, 0, 0,
  61. 0, 0, 0, 0, 0, 0, 0, 1};
  62. // The following 3 addresses need to be changed together. IPv6Addr is the IPv6
  63. // address. IPv6Netmask is the mask address with as many leading bits set to 1
  64. // as the prefix length. IPv6AddrPrefix needs to match IPv6Addr with the same
  65. // number of bits as the prefix length.
  66. static const unsigned char kIPv6Addr[] = {0x24, 0x01, 0xfa, 0x00, 0x00, 0x04,
  67. 0x10, 0x00, 0xbe, 0x30, 0x5b, 0xff,
  68. 0xfe, 0xe5, 0x00, 0xc3};
  69. static const unsigned char kIPv6Netmask[] = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
  70. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  71. 0x00, 0x00, 0x00, 0x00};
  72. TEST(NetworkInterfacesTest, IfaddrsToNetworkInterfaceList) {
  73. IPAddress ipv6_local_address(kIPv6LocalAddr);
  74. IPAddress ipv6_address(kIPv6Addr);
  75. IPAddress ipv6_netmask(kIPv6Netmask);
  76. NetworkInterfaceList results;
  77. IPAttributesGetterTest ip_attributes_getter;
  78. sockaddr_storage addresses[2];
  79. ifaddrs interface;
  80. // Address of offline links should be ignored.
  81. ASSERT_TRUE(FillIfaddrs(&interface, kIfnameEm1, IFF_UP, ipv6_address,
  82. ipv6_netmask, addresses));
  83. EXPECT_TRUE(internal::IfaddrsToNetworkInterfaceList(
  84. INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, &ip_attributes_getter,
  85. &results));
  86. EXPECT_EQ(results.size(), 0ul);
  87. // Local address should be trimmed out.
  88. ASSERT_TRUE(FillIfaddrs(&interface, kIfnameEm1, IFF_RUNNING,
  89. ipv6_local_address, ipv6_netmask, addresses));
  90. EXPECT_TRUE(internal::IfaddrsToNetworkInterfaceList(
  91. INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, &ip_attributes_getter,
  92. &results));
  93. EXPECT_EQ(results.size(), 0ul);
  94. // vmware address should return by default.
  95. ASSERT_TRUE(FillIfaddrs(&interface, kIfnameVmnet, IFF_RUNNING, ipv6_address,
  96. ipv6_netmask, addresses));
  97. EXPECT_TRUE(internal::IfaddrsToNetworkInterfaceList(
  98. INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, &ip_attributes_getter,
  99. &results));
  100. EXPECT_EQ(results.size(), 1ul);
  101. EXPECT_EQ(results[0].name, kIfnameVmnet);
  102. EXPECT_EQ(results[0].prefix_length, 1ul);
  103. EXPECT_EQ(results[0].address, ipv6_address);
  104. results.clear();
  105. // vmware address should be trimmed out if policy specified so.
  106. ASSERT_TRUE(FillIfaddrs(&interface, kIfnameVmnet, IFF_RUNNING, ipv6_address,
  107. ipv6_netmask, addresses));
  108. EXPECT_TRUE(internal::IfaddrsToNetworkInterfaceList(
  109. EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, &ip_attributes_getter,
  110. &results));
  111. EXPECT_EQ(results.size(), 0ul);
  112. results.clear();
  113. // Addresses with banned attributes should be ignored.
  114. ip_attributes_getter.set_attributes(IP_ADDRESS_ATTRIBUTE_ANYCAST);
  115. ASSERT_TRUE(FillIfaddrs(&interface, kIfnameEm1, IFF_RUNNING, ipv6_address,
  116. ipv6_netmask, addresses));
  117. EXPECT_TRUE(internal::IfaddrsToNetworkInterfaceList(
  118. INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, &ip_attributes_getter,
  119. &results));
  120. EXPECT_EQ(results.size(), 0ul);
  121. results.clear();
  122. // Addresses with allowed attribute IFA_F_TEMPORARY should be returned and
  123. // attributes should be translated correctly.
  124. ip_attributes_getter.set_attributes(IP_ADDRESS_ATTRIBUTE_TEMPORARY);
  125. ASSERT_TRUE(FillIfaddrs(&interface, kIfnameEm1, IFF_RUNNING, ipv6_address,
  126. ipv6_netmask, addresses));
  127. EXPECT_TRUE(internal::IfaddrsToNetworkInterfaceList(
  128. INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, &ip_attributes_getter,
  129. &results));
  130. EXPECT_EQ(results.size(), 1ul);
  131. EXPECT_EQ(results[0].name, kIfnameEm1);
  132. EXPECT_EQ(results[0].prefix_length, 1ul);
  133. EXPECT_EQ(results[0].address, ipv6_address);
  134. EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY);
  135. results.clear();
  136. // Addresses with allowed attribute IFA_F_DEPRECATED should be returned and
  137. // attributes should be translated correctly.
  138. ip_attributes_getter.set_attributes(IP_ADDRESS_ATTRIBUTE_DEPRECATED);
  139. ASSERT_TRUE(FillIfaddrs(&interface, kIfnameEm1, IFF_RUNNING, ipv6_address,
  140. ipv6_netmask, addresses));
  141. EXPECT_TRUE(internal::IfaddrsToNetworkInterfaceList(
  142. INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, &ip_attributes_getter,
  143. &results));
  144. EXPECT_EQ(results.size(), 1ul);
  145. EXPECT_EQ(results[0].name, kIfnameEm1);
  146. EXPECT_EQ(results[0].prefix_length, 1ul);
  147. EXPECT_EQ(results[0].address, ipv6_address);
  148. EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED);
  149. results.clear();
  150. }
  151. } // namespace
  152. } // namespace net