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/dns/address_sorter_posix.h" | 5 #include "net/dns/address_sorter_posix.h" |
6 | 6 |
7 #include <netinet/in.h> | 7 #include <netinet/in.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 arraysize(kDefaultPrecedenceTable))), | 244 arraysize(kDefaultPrecedenceTable))), |
245 label_table_(LoadPolicy(kDefaultLabelTable, | 245 label_table_(LoadPolicy(kDefaultLabelTable, |
246 arraysize(kDefaultLabelTable))), | 246 arraysize(kDefaultLabelTable))), |
247 ipv4_scope_table_(LoadPolicy(kDefaultIPv4ScopeTable, | 247 ipv4_scope_table_(LoadPolicy(kDefaultIPv4ScopeTable, |
248 arraysize(kDefaultIPv4ScopeTable))) { | 248 arraysize(kDefaultIPv4ScopeTable))) { |
249 NetworkChangeNotifier::AddIPAddressObserver(this); | 249 NetworkChangeNotifier::AddIPAddressObserver(this); |
250 OnIPAddressChanged(); | 250 OnIPAddressChanged(); |
251 } | 251 } |
252 | 252 |
253 AddressSorterPosix::~AddressSorterPosix() { | 253 AddressSorterPosix::~AddressSorterPosix() { |
| 254 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
254 NetworkChangeNotifier::RemoveIPAddressObserver(this); | 255 NetworkChangeNotifier::RemoveIPAddressObserver(this); |
255 } | 256 } |
256 | 257 |
257 void AddressSorterPosix::Sort(const AddressList& list, | 258 void AddressSorterPosix::Sort(const AddressList& list, |
258 const CallbackType& callback) const { | 259 const CallbackType& callback) const { |
259 DCHECK(CalledOnValidThread()); | 260 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
260 std::vector<std::unique_ptr<DestinationInfo>> sort_list; | 261 std::vector<std::unique_ptr<DestinationInfo>> sort_list; |
261 | 262 |
262 for (size_t i = 0; i < list.size(); ++i) { | 263 for (size_t i = 0; i < list.size(); ++i) { |
263 std::unique_ptr<DestinationInfo> info(new DestinationInfo()); | 264 std::unique_ptr<DestinationInfo> info(new DestinationInfo()); |
264 info->address = list[i].address(); | 265 info->address = list[i].address(); |
265 info->scope = GetScope(ipv4_scope_table_, info->address); | 266 info->scope = GetScope(ipv4_scope_table_, info->address); |
266 info->precedence = GetPolicyValue(precedence_table_, info->address); | 267 info->precedence = GetPolicyValue(precedence_table_, info->address); |
267 info->label = GetPolicyValue(label_table_, info->address); | 268 info->label = GetPolicyValue(label_table_, info->address); |
268 | 269 |
269 // Each socket can only be bound once. | 270 // Each socket can only be bound once. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 std::stable_sort(sort_list.begin(), sort_list.end(), CompareDestinations); | 309 std::stable_sort(sort_list.begin(), sort_list.end(), CompareDestinations); |
309 | 310 |
310 AddressList result; | 311 AddressList result; |
311 for (size_t i = 0; i < sort_list.size(); ++i) | 312 for (size_t i = 0; i < sort_list.size(); ++i) |
312 result.push_back(IPEndPoint(sort_list[i]->address, 0 /* port */)); | 313 result.push_back(IPEndPoint(sort_list[i]->address, 0 /* port */)); |
313 | 314 |
314 callback.Run(true, result); | 315 callback.Run(true, result); |
315 } | 316 } |
316 | 317 |
317 void AddressSorterPosix::OnIPAddressChanged() { | 318 void AddressSorterPosix::OnIPAddressChanged() { |
318 DCHECK(CalledOnValidThread()); | 319 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
319 source_map_.clear(); | 320 source_map_.clear(); |
320 #if defined(OS_LINUX) | 321 #if defined(OS_LINUX) |
321 const internal::AddressTrackerLinux* tracker = | 322 const internal::AddressTrackerLinux* tracker = |
322 NetworkChangeNotifier::GetAddressTracker(); | 323 NetworkChangeNotifier::GetAddressTracker(); |
323 if (!tracker) | 324 if (!tracker) |
324 return; | 325 return; |
325 typedef internal::AddressTrackerLinux::AddressMap AddressMap; | 326 typedef internal::AddressTrackerLinux::AddressMap AddressMap; |
326 AddressMap map = tracker->GetAddressMap(); | 327 AddressMap map = tracker->GetAddressMap(); |
327 for (AddressMap::const_iterator it = map.begin(); it != map.end(); ++it) { | 328 for (AddressMap::const_iterator it = map.begin(); it != map.end(); ++it) { |
328 const IPAddress& address = it->first; | 329 const IPAddress& address = it->first; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 } | 379 } |
379 FillPolicy(src.address(), &info); | 380 FillPolicy(src.address(), &info); |
380 } | 381 } |
381 freeifaddrs(addrs); | 382 freeifaddrs(addrs); |
382 close(ioctl_socket); | 383 close(ioctl_socket); |
383 #endif | 384 #endif |
384 } | 385 } |
385 | 386 |
386 void AddressSorterPosix::FillPolicy(const IPAddress& address, | 387 void AddressSorterPosix::FillPolicy(const IPAddress& address, |
387 SourceAddressInfo* info) const { | 388 SourceAddressInfo* info) const { |
388 DCHECK(CalledOnValidThread()); | 389 DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); |
389 info->scope = GetScope(ipv4_scope_table_, address); | 390 info->scope = GetScope(ipv4_scope_table_, address); |
390 info->label = GetPolicyValue(label_table_, address); | 391 info->label = GetPolicyValue(label_table_, address); |
391 } | 392 } |
392 | 393 |
393 // static | 394 // static |
394 std::unique_ptr<AddressSorter> AddressSorter::CreateAddressSorter() { | 395 std::unique_ptr<AddressSorter> AddressSorter::CreateAddressSorter() { |
395 return std::unique_ptr<AddressSorter>( | 396 return std::unique_ptr<AddressSorter>( |
396 new AddressSorterPosix(ClientSocketFactory::GetDefaultFactory())); | 397 new AddressSorterPosix(ClientSocketFactory::GetDefaultFactory())); |
397 } | 398 } |
398 | 399 |
399 } // namespace net | 400 } // namespace net |
OLD | NEW |