summaryrefslogtreecommitdiffstats
path: root/net/base/address_tracker_linux.cc
diff options
context:
space:
mode:
authorderekjchow <derekjchow@chromium.org>2015-05-05 12:28:09 -0700
committerCommit bot <commit-bot@chromium.org>2015-05-05 19:28:51 +0000
commit09c74490237aeefe5f41c1cad07a7d1e2b384590 (patch)
treef0376636c8115c41d83998691f8e209206fc365d /net/base/address_tracker_linux.cc
parent2734a9dffc7cc616a3a6f962ccd7ae8116d20dfd (diff)
downloadchromium_src-09c74490237aeefe5f41c1cad07a7d1e2b384590.zip
chromium_src-09c74490237aeefe5f41c1cad07a7d1e2b384590.tar.gz
chromium_src-09c74490237aeefe5f41c1cad07a7d1e2b384590.tar.bz2
(Reland) Enable ignoring network interfaces in NetworkChangeNotifierLinux.
NetworkChangeNotifier should not report network changes from interfaces that are not used to connect to the internet (ie. wifi APs). Adjust constructor for NetworkChangeNotifierLinux to accept a list of interfaces that are known to not be used to connect to internet. R=pauljensen@chromium.org,akuegel@chromium.org,jochen@chromium.org BUG=469863 Review URL: https://codereview.chromium.org/1128533003 Cr-Commit-Position: refs/heads/master@{#328378}
Diffstat (limited to 'net/base/address_tracker_linux.cc')
-rw-r--r--net/base/address_tracker_linux.cc32
1 files changed, 27 insertions, 5 deletions
diff --git a/net/base/address_tracker_linux.cc b/net/base/address_tracker_linux.cc
index 731bf4f9..45cd1ae 100644
--- a/net/base/address_tracker_linux.cc
+++ b/net/base/address_tracker_linux.cc
@@ -107,14 +107,17 @@ AddressTrackerLinux::AddressTrackerLinux()
tracking_(false) {
}
-AddressTrackerLinux::AddressTrackerLinux(const base::Closure& address_callback,
- const base::Closure& link_callback,
- const base::Closure& tunnel_callback)
+AddressTrackerLinux::AddressTrackerLinux(
+ const base::Closure& address_callback,
+ const base::Closure& link_callback,
+ const base::Closure& tunnel_callback,
+ const base::hash_set<std::string>& ignored_interfaces)
: get_interface_name_(GetInterfaceName),
address_callback_(address_callback),
link_callback_(link_callback),
tunnel_callback_(tunnel_callback),
netlink_fd_(-1),
+ ignored_interfaces_(ignored_interfaces),
connection_type_initialized_(false),
connection_type_initialized_cv_(&connection_type_lock_),
current_connection_type_(NetworkChangeNotifier::CONNECTION_NONE),
@@ -235,6 +238,15 @@ base::hash_set<int> AddressTrackerLinux::GetOnlineLinks() const {
return online_links_;
}
+bool AddressTrackerLinux::IsInterfaceIgnored(int interface_index) const {
+ if (ignored_interfaces_.empty())
+ return false;
+
+ char buf[IFNAMSIZ] = {0};
+ const char* interface_name = get_interface_name_(interface_index, buf);
+ return ignored_interfaces_.find(interface_name) != ignored_interfaces_.end();
+}
+
NetworkChangeNotifier::ConnectionType
AddressTrackerLinux::GetCurrentConnectionType() {
// http://crbug.com/125097
@@ -298,10 +310,12 @@ void AddressTrackerLinux::HandleMessage(char* buffer,
case RTM_NEWADDR: {
IPAddressNumber address;
bool really_deprecated;
+ struct ifaddrmsg* msg =
+ reinterpret_cast<struct ifaddrmsg*>(NLMSG_DATA(header));
+ if (IsInterfaceIgnored(msg->ifa_index))
+ break;
if (GetAddress(header, &address, &really_deprecated)) {
AddressTrackerAutoLock lock(*this, address_map_lock_);
- struct ifaddrmsg* msg =
- reinterpret_cast<struct ifaddrmsg*>(NLMSG_DATA(header));
// Routers may frequently (every few seconds) output the IPv6 ULA
// prefix which can cause the linux kernel to frequently output two
// back-to-back messages, one without the deprecated flag and one with
@@ -325,6 +339,10 @@ void AddressTrackerLinux::HandleMessage(char* buffer,
} break;
case RTM_DELADDR: {
IPAddressNumber address;
+ const struct ifaddrmsg* msg =
+ reinterpret_cast<struct ifaddrmsg*>(NLMSG_DATA(header));
+ if (IsInterfaceIgnored(msg->ifa_index))
+ break;
if (GetAddress(header, &address, NULL)) {
AddressTrackerAutoLock lock(*this, address_map_lock_);
if (address_map_.erase(address))
@@ -334,6 +352,8 @@ void AddressTrackerLinux::HandleMessage(char* buffer,
case RTM_NEWLINK: {
const struct ifinfomsg* msg =
reinterpret_cast<struct ifinfomsg*>(NLMSG_DATA(header));
+ if (IsInterfaceIgnored(msg->ifi_index))
+ break;
if (!(msg->ifi_flags & IFF_LOOPBACK) && (msg->ifi_flags & IFF_UP) &&
(msg->ifi_flags & IFF_LOWER_UP) && (msg->ifi_flags & IFF_RUNNING)) {
AddressTrackerAutoLock lock(*this, online_links_lock_);
@@ -354,6 +374,8 @@ void AddressTrackerLinux::HandleMessage(char* buffer,
case RTM_DELLINK: {
const struct ifinfomsg* msg =
reinterpret_cast<struct ifinfomsg*>(NLMSG_DATA(header));
+ if (IsInterfaceIgnored(msg->ifi_index))
+ break;
AddressTrackerAutoLock lock(*this, online_links_lock_);
if (online_links_.erase(msg->ifi_index)) {
*link_changed = true;