| 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/address_tracker_linux.h" | 5 #include "net/base/address_tracker_linux.h" |
| 6 | 6 |
| 7 #include <linux/if.h> |
| 8 |
| 7 #include <vector> | 9 #include <vector> |
| 8 | 10 |
| 9 #include "base/bind.h" | 11 #include "base/bind.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 13 |
| 12 namespace net { | 14 namespace net { |
| 13 namespace internal { | 15 namespace internal { |
| 14 | 16 |
| 17 typedef std::vector<char> Buffer; |
| 18 |
| 15 void Noop() {} | 19 void Noop() {} |
| 16 | 20 |
| 17 class AddressTrackerLinuxTest : public testing::Test { | 21 class AddressTrackerLinuxTest : public testing::Test { |
| 18 protected: | 22 protected: |
| 19 AddressTrackerLinuxTest() : tracker_(base::Bind(&Noop)) {} | 23 AddressTrackerLinuxTest() : tracker_(base::Bind(&Noop), base::Bind(&Noop)) {} |
| 20 | 24 |
| 21 bool HandleMessage(char* buf, size_t length) { | 25 bool HandleAddressMessage(const Buffer& buf) { |
| 22 return tracker_.HandleMessage(buf, length); | 26 bool address_changed = false; |
| 27 bool link_changed = false; |
| 28 tracker_.HandleMessage(&buf[0], buf.size(), |
| 29 &address_changed, &link_changed); |
| 30 EXPECT_FALSE(link_changed); |
| 31 return address_changed; |
| 32 } |
| 33 |
| 34 bool HandleLinkMessage(const Buffer& buf) { |
| 35 bool address_changed = false; |
| 36 bool link_changed = false; |
| 37 tracker_.HandleMessage(&buf[0], buf.size(), |
| 38 &address_changed, &link_changed); |
| 39 EXPECT_FALSE(address_changed); |
| 40 return link_changed; |
| 23 } | 41 } |
| 24 | 42 |
| 25 AddressTrackerLinux::AddressMap GetAddressMap() { | 43 AddressTrackerLinux::AddressMap GetAddressMap() { |
| 26 return tracker_.GetAddressMap(); | 44 return tracker_.GetAddressMap(); |
| 27 } | 45 } |
| 28 | 46 |
| 47 const base::hash_set<int>* GetOnlineLinks() const { |
| 48 return &tracker_.online_links_; |
| 49 } |
| 50 |
| 29 AddressTrackerLinux tracker_; | 51 AddressTrackerLinux tracker_; |
| 30 }; | 52 }; |
| 31 | 53 |
| 32 namespace { | 54 namespace { |
| 33 | 55 |
| 34 typedef std::vector<char> Buffer; | |
| 35 | |
| 36 class NetlinkMessage { | 56 class NetlinkMessage { |
| 37 public: | 57 public: |
| 38 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { | 58 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { |
| 39 header()->nlmsg_type = type; | 59 header()->nlmsg_type = type; |
| 40 Align(); | 60 Align(); |
| 41 } | 61 } |
| 42 | 62 |
| 43 void AddPayload(const void* data, size_t length) { | 63 void AddPayload(const void* data, size_t length) { |
| 44 CHECK_EQ(static_cast<size_t>(NLMSG_HDRLEN), | 64 CHECK_EQ(static_cast<size_t>(NLMSG_HDRLEN), |
| 45 buffer_.size()) << "Payload must be added first"; | 65 buffer_.size()) << "Payload must be added first"; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 76 CHECK(NLMSG_OK(header(), buffer_.size())); | 96 CHECK(NLMSG_OK(header(), buffer_.size())); |
| 77 } | 97 } |
| 78 | 98 |
| 79 struct nlmsghdr* header() { | 99 struct nlmsghdr* header() { |
| 80 return reinterpret_cast<struct nlmsghdr*>(&buffer_[0]); | 100 return reinterpret_cast<struct nlmsghdr*>(&buffer_[0]); |
| 81 } | 101 } |
| 82 | 102 |
| 83 Buffer buffer_; | 103 Buffer buffer_; |
| 84 }; | 104 }; |
| 85 | 105 |
| 86 void MakeMessage(uint16 type, | 106 void MakeAddrMessage(uint16 type, |
| 87 uint8 flags, | 107 uint8 flags, |
| 88 uint8 family, | 108 uint8 family, |
| 89 const IPAddressNumber& address, | 109 const IPAddressNumber& address, |
| 90 const IPAddressNumber& local, | 110 const IPAddressNumber& local, |
| 91 Buffer* output) { | 111 Buffer* output) { |
| 92 NetlinkMessage nlmsg(type); | 112 NetlinkMessage nlmsg(type); |
| 93 struct ifaddrmsg msg = {}; | 113 struct ifaddrmsg msg = {}; |
| 94 msg.ifa_family = family; | 114 msg.ifa_family = family; |
| 95 msg.ifa_flags = flags; | 115 msg.ifa_flags = flags; |
| 96 nlmsg.AddPayload(&msg, sizeof(msg)); | 116 nlmsg.AddPayload(&msg, sizeof(msg)); |
| 97 if (address.size()) | 117 if (address.size()) |
| 98 nlmsg.AddAttribute(IFA_ADDRESS, &address[0], address.size()); | 118 nlmsg.AddAttribute(IFA_ADDRESS, &address[0], address.size()); |
| 99 if (local.size()) | 119 if (local.size()) |
| 100 nlmsg.AddAttribute(IFA_LOCAL, &local[0], local.size()); | 120 nlmsg.AddAttribute(IFA_LOCAL, &local[0], local.size()); |
| 101 nlmsg.AppendTo(output); | 121 nlmsg.AppendTo(output); |
| 102 } | 122 } |
| 103 | 123 |
| 124 void MakeLinkMessage(uint16 type, uint32 flags, uint32 index, Buffer* output) { |
| 125 NetlinkMessage nlmsg(type); |
| 126 struct ifinfomsg msg = {}; |
| 127 msg.ifi_index = index; |
| 128 msg.ifi_flags = flags; |
| 129 nlmsg.AddPayload(&msg, sizeof(msg)); |
| 130 output->clear(); |
| 131 nlmsg.AppendTo(output); |
| 132 } |
| 133 |
| 104 const unsigned char kAddress0[] = { 127, 0, 0, 1 }; | 134 const unsigned char kAddress0[] = { 127, 0, 0, 1 }; |
| 105 const unsigned char kAddress1[] = { 10, 0, 0, 1 }; | 135 const unsigned char kAddress1[] = { 10, 0, 0, 1 }; |
| 106 const unsigned char kAddress2[] = { 192, 168, 0, 1 }; | 136 const unsigned char kAddress2[] = { 192, 168, 0, 1 }; |
| 107 const unsigned char kAddress3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 137 const unsigned char kAddress3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 108 0, 0, 0, 1 }; | 138 0, 0, 0, 1 }; |
| 109 const unsigned char kAddress4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, | 139 const unsigned char kAddress4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, |
| 110 169, 254, 0, 1 }; | 140 169, 254, 0, 1 }; |
| 111 | 141 |
| 112 TEST_F(AddressTrackerLinuxTest, NewAddress) { | 142 TEST_F(AddressTrackerLinuxTest, NewAddress) { |
| 113 const IPAddressNumber kEmpty; | 143 const IPAddressNumber kEmpty; |
| 114 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 144 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 115 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); | 145 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); |
| 116 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); | 146 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); |
| 117 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); | 147 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); |
| 118 | 148 |
| 119 Buffer buffer; | 149 Buffer buffer; |
| 120 MakeMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); | 150 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, |
| 121 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 151 &buffer); |
| 152 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 122 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 153 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 123 EXPECT_EQ(1u, map.size()); | 154 EXPECT_EQ(1u, map.size()); |
| 124 EXPECT_TRUE(map.find(kAddr0) != map.end()); | 155 EXPECT_EQ(1u, map.count(kAddr0)); |
| 125 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 156 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 126 | 157 |
| 127 buffer.clear(); | 158 buffer.clear(); |
| 128 MakeMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr1, kAddr2, &buffer); | 159 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr1, kAddr2, |
| 129 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 160 &buffer); |
| 161 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 130 map = GetAddressMap(); | 162 map = GetAddressMap(); |
| 131 EXPECT_EQ(2u, map.size()); | 163 EXPECT_EQ(2u, map.size()); |
| 132 EXPECT_TRUE(map.find(kAddr0) != map.end()); | 164 EXPECT_EQ(1u, map.count(kAddr0)); |
| 133 EXPECT_TRUE(map.find(kAddr2) != map.end()); | 165 EXPECT_EQ(1u, map.count(kAddr2)); |
| 134 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr2].ifa_flags); | 166 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr2].ifa_flags); |
| 135 | 167 |
| 136 buffer.clear(); | 168 buffer.clear(); |
| 137 MakeMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); | 169 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); |
| 138 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 170 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 139 map = GetAddressMap(); | 171 map = GetAddressMap(); |
| 140 EXPECT_EQ(3u, map.size()); | 172 EXPECT_EQ(3u, map.size()); |
| 141 EXPECT_TRUE(map.find(kAddr3) != map.end()); | 173 EXPECT_EQ(1u, map.count(kAddr3)); |
| 142 } | 174 } |
| 143 | 175 |
| 144 TEST_F(AddressTrackerLinuxTest, NewAddressChange) { | 176 TEST_F(AddressTrackerLinuxTest, NewAddressChange) { |
| 145 const IPAddressNumber kEmpty; | 177 const IPAddressNumber kEmpty; |
| 146 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 178 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 147 | 179 |
| 148 Buffer buffer; | 180 Buffer buffer; |
| 149 MakeMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); | 181 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, |
| 150 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 182 &buffer); |
| 183 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 151 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 184 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 152 EXPECT_EQ(1u, map.size()); | 185 EXPECT_EQ(1u, map.size()); |
| 153 EXPECT_TRUE(map.find(kAddr0) != map.end()); | 186 EXPECT_EQ(1u, map.count(kAddr0)); |
| 154 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 187 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 155 | 188 |
| 156 buffer.clear(); | 189 buffer.clear(); |
| 157 MakeMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, &buffer); | 190 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, |
| 158 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 191 &buffer); |
| 192 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 159 map = GetAddressMap(); | 193 map = GetAddressMap(); |
| 160 EXPECT_EQ(1u, map.size()); | 194 EXPECT_EQ(1u, map.size()); |
| 161 EXPECT_TRUE(map.find(kAddr0) != map.end()); | 195 EXPECT_EQ(1u, map.count(kAddr0)); |
| 162 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); | 196 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); |
| 163 | 197 |
| 164 // Both messages in one buffer. | 198 // Both messages in one buffer. |
| 165 buffer.clear(); | 199 buffer.clear(); |
| 166 MakeMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); | 200 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, |
| 167 MakeMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, &buffer); | 201 &buffer); |
| 168 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 202 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, |
| 203 &buffer); |
| 204 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 169 map = GetAddressMap(); | 205 map = GetAddressMap(); |
| 170 EXPECT_EQ(1u, map.size()); | 206 EXPECT_EQ(1u, map.size()); |
| 171 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); | 207 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); |
| 172 } | 208 } |
| 173 | 209 |
| 174 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) { | 210 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) { |
| 175 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 211 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 176 | 212 |
| 177 Buffer buffer; | 213 Buffer buffer; |
| 178 MakeMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kAddr0, &buffer); | 214 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kAddr0, |
| 179 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 215 &buffer); |
| 216 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 180 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 217 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 181 EXPECT_EQ(1u, map.size()); | 218 EXPECT_EQ(1u, map.size()); |
| 182 EXPECT_TRUE(map.find(kAddr0) != map.end()); | 219 EXPECT_EQ(1u, map.count(kAddr0)); |
| 183 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 220 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 184 | 221 |
| 185 EXPECT_FALSE(HandleMessage(&buffer[0], buffer.size())); | 222 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 186 map = GetAddressMap(); | 223 map = GetAddressMap(); |
| 187 EXPECT_EQ(1u, map.size()); | 224 EXPECT_EQ(1u, map.size()); |
| 188 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 225 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 189 } | 226 } |
| 190 | 227 |
| 191 TEST_F(AddressTrackerLinuxTest, DeleteAddress) { | 228 TEST_F(AddressTrackerLinuxTest, DeleteAddress) { |
| 192 const IPAddressNumber kEmpty; | 229 const IPAddressNumber kEmpty; |
| 193 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 230 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 194 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); | 231 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); |
| 195 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); | 232 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); |
| 196 | 233 |
| 197 Buffer buffer; | 234 Buffer buffer; |
| 198 MakeMessage(RTM_NEWADDR, 0, AF_INET, kAddr0, kEmpty, &buffer); | 235 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kAddr0, kEmpty, &buffer); |
| 199 MakeMessage(RTM_NEWADDR, 0, AF_INET, kAddr1, kAddr2, &buffer); | 236 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kAddr1, kAddr2, &buffer); |
| 200 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 237 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 201 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 238 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 202 EXPECT_EQ(2u, map.size()); | 239 EXPECT_EQ(2u, map.size()); |
| 203 | 240 |
| 204 buffer.clear(); | 241 buffer.clear(); |
| 205 MakeMessage(RTM_DELADDR, 0, AF_INET, kEmpty, kAddr0, &buffer); | 242 MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kEmpty, kAddr0, &buffer); |
| 206 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 243 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 207 map = GetAddressMap(); | 244 map = GetAddressMap(); |
| 208 EXPECT_EQ(1u, map.size()); | 245 EXPECT_EQ(1u, map.size()); |
| 209 EXPECT_TRUE(map.find(kAddr0) == map.end()); | 246 EXPECT_EQ(0u, map.count(kAddr0)); |
| 210 EXPECT_TRUE(map.find(kAddr2) != map.end()); | 247 EXPECT_EQ(1u, map.count(kAddr2)); |
| 211 | 248 |
| 212 buffer.clear(); | 249 buffer.clear(); |
| 213 MakeMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kAddr1, &buffer); | 250 MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kAddr1, &buffer); |
| 214 // kAddr1 does not exist in the map. | 251 // kAddr1 does not exist in the map. |
| 215 EXPECT_FALSE(HandleMessage(&buffer[0], buffer.size())); | 252 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 216 map = GetAddressMap(); | 253 map = GetAddressMap(); |
| 217 EXPECT_EQ(1u, map.size()); | 254 EXPECT_EQ(1u, map.size()); |
| 218 | 255 |
| 219 buffer.clear(); | 256 buffer.clear(); |
| 220 MakeMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kEmpty, &buffer); | 257 MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kEmpty, &buffer); |
| 221 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 258 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 222 map = GetAddressMap(); | 259 map = GetAddressMap(); |
| 223 EXPECT_EQ(0u, map.size()); | 260 EXPECT_EQ(0u, map.size()); |
| 224 } | 261 } |
| 225 | 262 |
| 226 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) { | 263 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) { |
| 227 const IPAddressNumber kEmpty; | 264 const IPAddressNumber kEmpty; |
| 228 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 265 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 229 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); | 266 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); |
| 230 | 267 |
| 231 Buffer buffer; | 268 Buffer buffer; |
| 232 // Ignored family. | 269 // Ignored family. |
| 233 MakeMessage(RTM_NEWADDR, 0, AF_UNSPEC, kAddr3, kAddr0, &buffer); | 270 MakeAddrMessage(RTM_NEWADDR, 0, AF_UNSPEC, kAddr3, kAddr0, &buffer); |
| 234 // No address. | 271 // No address. |
| 235 MakeMessage(RTM_NEWADDR, 0, AF_INET, kEmpty, kEmpty, &buffer); | 272 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kEmpty, kEmpty, &buffer); |
| 236 // Ignored type. | 273 // Ignored type. |
| 237 MakeMessage(RTM_DELROUTE, 0, AF_INET6, kAddr3, kEmpty, &buffer); | 274 MakeAddrMessage(RTM_DELROUTE, 0, AF_INET6, kAddr3, kEmpty, &buffer); |
| 238 EXPECT_FALSE(HandleMessage(&buffer[0], buffer.size())); | 275 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 239 EXPECT_EQ(0u, GetAddressMap().size()); | 276 EXPECT_TRUE(GetAddressMap().empty()); |
| 240 | 277 |
| 241 // Valid message after ignored messages. | 278 // Valid message after ignored messages. |
| 242 NetlinkMessage nlmsg(RTM_NEWADDR); | 279 NetlinkMessage nlmsg(RTM_NEWADDR); |
| 243 struct ifaddrmsg msg = {}; | 280 struct ifaddrmsg msg = {}; |
| 244 msg.ifa_family = AF_INET; | 281 msg.ifa_family = AF_INET; |
| 245 nlmsg.AddPayload(&msg, sizeof(msg)); | 282 nlmsg.AddPayload(&msg, sizeof(msg)); |
| 246 // Ignored attribute. | 283 // Ignored attribute. |
| 247 struct ifa_cacheinfo cache_info = {}; | 284 struct ifa_cacheinfo cache_info = {}; |
| 248 nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info)); | 285 nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info)); |
| 249 nlmsg.AddAttribute(IFA_ADDRESS, &kAddr0[0], kAddr0.size()); | 286 nlmsg.AddAttribute(IFA_ADDRESS, &kAddr0[0], kAddr0.size()); |
| 250 nlmsg.AppendTo(&buffer); | 287 nlmsg.AppendTo(&buffer); |
| 251 | 288 |
| 252 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); | 289 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 253 EXPECT_EQ(1u, GetAddressMap().size()); | 290 EXPECT_EQ(1u, GetAddressMap().size()); |
| 254 } | 291 } |
| 255 | 292 |
| 293 TEST_F(AddressTrackerLinuxTest, AddInterface) { |
| 294 Buffer buffer; |
| 295 |
| 296 // Ignores loopback. |
| 297 MakeLinkMessage(RTM_NEWLINK, |
| 298 IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING, |
| 299 0, &buffer); |
| 300 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 301 EXPECT_TRUE(GetOnlineLinks()->empty()); |
| 302 |
| 303 // Ignores not IFF_LOWER_UP. |
| 304 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 305 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 306 EXPECT_TRUE(GetOnlineLinks()->empty()); |
| 307 |
| 308 // Ignores deletion. |
| 309 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 310 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 311 EXPECT_TRUE(GetOnlineLinks()->empty()); |
| 312 |
| 313 // Verify success. |
| 314 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 315 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 316 EXPECT_EQ(1u, GetOnlineLinks()->count(0)); |
| 317 EXPECT_EQ(1u, GetOnlineLinks()->size()); |
| 318 |
| 319 // Ignores redundant enables. |
| 320 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 321 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 322 EXPECT_EQ(1u, GetOnlineLinks()->count(0)); |
| 323 EXPECT_EQ(1u, GetOnlineLinks()->size()); |
| 324 |
| 325 // Verify adding another online device (e.g. VPN) is considered a change. |
| 326 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 1, &buffer); |
| 327 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 328 EXPECT_EQ(1u, GetOnlineLinks()->count(0)); |
| 329 EXPECT_EQ(1u, GetOnlineLinks()->count(1)); |
| 330 EXPECT_EQ(2u, GetOnlineLinks()->size()); |
| 331 } |
| 332 |
| 333 TEST_F(AddressTrackerLinuxTest, RemoveInterface) { |
| 334 Buffer buffer; |
| 335 |
| 336 // Should disappear when not IFF_LOWER_UP. |
| 337 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 338 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 339 EXPECT_FALSE(GetOnlineLinks()->empty()); |
| 340 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 341 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 342 EXPECT_TRUE(GetOnlineLinks()->empty()); |
| 343 |
| 344 // Ignores redundant disables. |
| 345 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 346 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 347 EXPECT_TRUE(GetOnlineLinks()->empty()); |
| 348 |
| 349 // Ignores deleting down interfaces. |
| 350 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 351 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 352 EXPECT_TRUE(GetOnlineLinks()->empty()); |
| 353 |
| 354 // Should disappear when deleted. |
| 355 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 356 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 357 EXPECT_FALSE(GetOnlineLinks()->empty()); |
| 358 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 359 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 360 EXPECT_TRUE(GetOnlineLinks()->empty()); |
| 361 } |
| 362 |
| 256 } // namespace | 363 } // namespace |
| 257 | 364 |
| 258 } // namespace internal | 365 } // namespace internal |
| 259 } // namespace net | 366 } // namespace net |
| OLD | NEW |