// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_BASE_ADDRESS_TRACKER_LINUX_H_ #define NET_BASE_ADDRESS_TRACKER_LINUX_H_ #include // Needed to include netlink. // Mask superfluous definition of |struct net|. This is fixed in Linux 2.6.38. #define net net_kernel #include #undef net #include #include "base/basictypes.h" #include "base/callback.h" #include "base/compiler_specific.h" #include "base/message_loop.h" #include "base/synchronization/lock.h" #include "net/base/net_util.h" namespace net { namespace internal { // Keeps track of network interface addresses using rtnetlink. Used by // NetworkChangeNotifier to provide signals to registered IPAddressObservers. class NET_EXPORT_PRIVATE AddressTrackerLinux : public MessageLoopForIO::Watcher { public: typedef std::map AddressMap; // Will run |callback| when the AddressMap changes. explicit AddressTrackerLinux(const base::Closure& callback); virtual ~AddressTrackerLinux(); // Starts watching system configuration for changes. The current thread must // have a MessageLoopForIO. void Init(); AddressMap GetAddressMap() const; private: friend class AddressTrackerLinuxTest; // Returns true if |map_| changed while reading messages from |netlink_fd_|. bool ReadMessages(); // Returns true if |map_| changed while reading the message from |buffer|. bool HandleMessage(const char* buffer, size_t length); // MessageLoopForIO::Watcher: virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE; virtual void OnFileCanWriteWithoutBlocking(int /* fd */) OVERRIDE; base::Closure callback_; int netlink_fd_; MessageLoopForIO::FileDescriptorWatcher watcher_; mutable base::Lock lock_; AddressMap map_; }; } // namespace internal } // namespace net #endif // NET_BASE_ADDRESS_TRACKER_LINUX_H_