| 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 #ifndef NET_BASE_ADDRESS_TRACKER_LINUX_H_ | 5 #ifndef NET_BASE_ADDRESS_TRACKER_LINUX_H_ |
| 6 #define NET_BASE_ADDRESS_TRACKER_LINUX_H_ | 6 #define NET_BASE_ADDRESS_TRACKER_LINUX_H_ |
| 7 | 7 |
| 8 #include <sys/socket.h> // Needed to include netlink. | 8 #include <sys/socket.h> // Needed to include netlink. |
| 9 // Mask superfluous definition of |struct net|. This is fixed in Linux 2.6.38. | 9 // Mask superfluous definition of |struct net|. This is fixed in Linux 2.6.38. |
| 10 #define net net_kernel | 10 #define net net_kernel |
| 11 #include <linux/rtnetlink.h> | 11 #include <linux/rtnetlink.h> |
| 12 #undef net | 12 #undef net |
| 13 #include <stddef.h> | 13 #include <stddef.h> |
| 14 | 14 |
| 15 #include <map> | 15 #include <map> |
| 16 #include <unordered_set> | |
| 17 | 16 |
| 18 #include "base/callback.h" | 17 #include "base/callback.h" |
| 19 #include "base/compiler_specific.h" | 18 #include "base/compiler_specific.h" |
| 19 #include "base/containers/hash_tables.h" |
| 20 #include "base/macros.h" | 20 #include "base/macros.h" |
| 21 #include "base/message_loop/message_loop.h" | 21 #include "base/message_loop/message_loop.h" |
| 22 #include "base/synchronization/condition_variable.h" | 22 #include "base/synchronization/condition_variable.h" |
| 23 #include "base/synchronization/lock.h" | 23 #include "base/synchronization/lock.h" |
| 24 #include "base/threading/thread_checker.h" | 24 #include "base/threading/thread_checker.h" |
| 25 #include "net/base/ip_address.h" | 25 #include "net/base/ip_address.h" |
| 26 #include "net/base/network_change_notifier.h" | 26 #include "net/base/network_change_notifier.h" |
| 27 | 27 |
| 28 namespace net { | 28 namespace net { |
| 29 namespace internal { | 29 namespace internal { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 44 // Tracking version constructor: it will run |address_callback| when | 44 // Tracking version constructor: it will run |address_callback| when |
| 45 // the AddressMap changes, |link_callback| when the list of online | 45 // the AddressMap changes, |link_callback| when the list of online |
| 46 // links changes, and |tunnel_callback| when the list of online | 46 // links changes, and |tunnel_callback| when the list of online |
| 47 // tunnels changes. | 47 // tunnels changes. |
| 48 // |ignored_interfaces| is the list of interfaces to ignore. Changes to an | 48 // |ignored_interfaces| is the list of interfaces to ignore. Changes to an |
| 49 // ignored interface will not cause any callback to be run. An ignored | 49 // ignored interface will not cause any callback to be run. An ignored |
| 50 // interface will not have entries in GetAddressMap() and GetOnlineLinks(). | 50 // interface will not have entries in GetAddressMap() and GetOnlineLinks(). |
| 51 // NOTE: Only ignore interfaces not used to connect to the internet. Adding | 51 // NOTE: Only ignore interfaces not used to connect to the internet. Adding |
| 52 // interfaces used to connect to the internet can cause critical network | 52 // interfaces used to connect to the internet can cause critical network |
| 53 // changed signals to be lost allowing incorrect stale state to persist. | 53 // changed signals to be lost allowing incorrect stale state to persist. |
| 54 AddressTrackerLinux( | 54 AddressTrackerLinux(const base::Closure& address_callback, |
| 55 const base::Closure& address_callback, | 55 const base::Closure& link_callback, |
| 56 const base::Closure& link_callback, | 56 const base::Closure& tunnel_callback, |
| 57 const base::Closure& tunnel_callback, | 57 const base::hash_set<std::string>& ignored_interfaces); |
| 58 const std::unordered_set<std::string>& ignored_interfaces); | |
| 59 ~AddressTrackerLinux() override; | 58 ~AddressTrackerLinux() override; |
| 60 | 59 |
| 61 // In tracking mode, it starts watching the system configuration for | 60 // In tracking mode, it starts watching the system configuration for |
| 62 // changes. The current thread must have a MessageLoopForIO. In | 61 // changes. The current thread must have a MessageLoopForIO. In |
| 63 // non-tracking mode, once Init() returns, a snapshot of the system | 62 // non-tracking mode, once Init() returns, a snapshot of the system |
| 64 // configuration is available through GetOnlineLinks() and | 63 // configuration is available through GetOnlineLinks() and |
| 65 // GetAddressMap(). | 64 // GetAddressMap(). |
| 66 void Init(); | 65 void Init(); |
| 67 | 66 |
| 68 AddressMap GetAddressMap() const; | 67 AddressMap GetAddressMap() const; |
| 69 | 68 |
| 70 // Returns set of interface indicies for online interfaces. | 69 // Returns set of interface indicies for online interfaces. |
| 71 std::unordered_set<int> GetOnlineLinks() const; | 70 base::hash_set<int> GetOnlineLinks() const; |
| 72 | 71 |
| 73 // Implementation of NetworkChangeNotifierLinux::GetCurrentConnectionType(). | 72 // Implementation of NetworkChangeNotifierLinux::GetCurrentConnectionType(). |
| 74 // Safe to call from any thread, but will block until Init() has completed. | 73 // Safe to call from any thread, but will block until Init() has completed. |
| 75 NetworkChangeNotifier::ConnectionType GetCurrentConnectionType(); | 74 NetworkChangeNotifier::ConnectionType GetCurrentConnectionType(); |
| 76 | 75 |
| 77 // Returns the name for the interface with interface index |interface_index|. | 76 // Returns the name for the interface with interface index |interface_index|. |
| 78 // |buf| should be a pointer to an array of size IFNAMSIZ. The returned | 77 // |buf| should be a pointer to an array of size IFNAMSIZ. The returned |
| 79 // pointer will point to |buf|. This function acts like if_indextoname which | 78 // pointer will point to |buf|. This function acts like if_indextoname which |
| 80 // cannot be used as net/if.h cannot be mixed with linux/if.h. We'll stick | 79 // cannot be used as net/if.h cannot be mixed with linux/if.h. We'll stick |
| 81 // with exclusively talking to the kernel and not the C library. | 80 // with exclusively talking to the kernel and not the C library. |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 base::Closure tunnel_callback_; | 153 base::Closure tunnel_callback_; |
| 155 | 154 |
| 156 int netlink_fd_; | 155 int netlink_fd_; |
| 157 base::MessageLoopForIO::FileDescriptorWatcher watcher_; | 156 base::MessageLoopForIO::FileDescriptorWatcher watcher_; |
| 158 | 157 |
| 159 mutable base::Lock address_map_lock_; | 158 mutable base::Lock address_map_lock_; |
| 160 AddressMap address_map_; | 159 AddressMap address_map_; |
| 161 | 160 |
| 162 // Set of interface indices for links that are currently online. | 161 // Set of interface indices for links that are currently online. |
| 163 mutable base::Lock online_links_lock_; | 162 mutable base::Lock online_links_lock_; |
| 164 std::unordered_set<int> online_links_; | 163 base::hash_set<int> online_links_; |
| 165 | 164 |
| 166 // Set of interface names that should be ignored. | 165 // Set of interface names that should be ignored. |
| 167 const std::unordered_set<std::string> ignored_interfaces_; | 166 const base::hash_set<std::string> ignored_interfaces_; |
| 168 | 167 |
| 169 base::Lock connection_type_lock_; | 168 base::Lock connection_type_lock_; |
| 170 bool connection_type_initialized_; | 169 bool connection_type_initialized_; |
| 171 base::ConditionVariable connection_type_initialized_cv_; | 170 base::ConditionVariable connection_type_initialized_cv_; |
| 172 NetworkChangeNotifier::ConnectionType current_connection_type_; | 171 NetworkChangeNotifier::ConnectionType current_connection_type_; |
| 173 bool tracking_; | 172 bool tracking_; |
| 174 int threads_waiting_for_connection_type_initialization_; | 173 int threads_waiting_for_connection_type_initialization_; |
| 175 | 174 |
| 176 // Used to verify single-threaded access in non-tracking mode. | 175 // Used to verify single-threaded access in non-tracking mode. |
| 177 base::ThreadChecker thread_checker_; | 176 base::ThreadChecker thread_checker_; |
| 178 }; | 177 }; |
| 179 | 178 |
| 180 } // namespace internal | 179 } // namespace internal |
| 181 } // namespace net | 180 } // namespace net |
| 182 | 181 |
| 183 #endif // NET_BASE_ADDRESS_TRACKER_LINUX_H_ | 182 #endif // NET_BASE_ADDRESS_TRACKER_LINUX_H_ |
| OLD | NEW |