Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1837)

Unified Diff: net/base/network_change_notifier_netlink_linux.cc

Issue 10689015: [net] Adds AddressTrackerLinux which keeps track of interface addresses using rtnetlink. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Responded to vandebo's review. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/base/network_change_notifier_netlink_linux.cc
diff --git a/net/base/network_change_notifier_netlink_linux.cc b/net/base/network_change_notifier_netlink_linux.cc
deleted file mode 100644
index 493e17ae2c8eb8ac8d7a1d101eedbbe4d9b1f65e..0000000000000000000000000000000000000000
--- a/net/base/network_change_notifier_netlink_linux.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright (c) 2010 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.
-
-#include "net/base/network_change_notifier_netlink_linux.h"
-
-#include <fcntl.h>
-// socket.h is needed to define types for the linux kernel header netlink.h
-// so it needs to come before netlink.h.
-#include <sys/socket.h>
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "base/logging.h"
-
-namespace {
-
-// Return true on success, false on failure.
-// Too small a function to bother putting in a library?
-bool SetNonBlocking(int fd) {
- int flags = fcntl(fd, F_GETFL, 0);
- if (-1 == flags)
- return false;
- return fcntl(fd, F_SETFL, flags | O_NONBLOCK) == 0 ? true : false;
-}
-
-bool IsIPv6Update(const struct nlmsghdr* netlink_message_header) {
- const struct ifaddrmsg* address_message =
- reinterpret_cast<struct ifaddrmsg*>(NLMSG_DATA(netlink_message_header));
- return address_message->ifa_family == AF_INET6;
-}
-
-bool IsDuplicateIPv6AddressUpdate(
- const struct nlmsghdr* netlink_message_header) {
- const struct ifaddrmsg* address_message =
- reinterpret_cast<struct ifaddrmsg*>(NLMSG_DATA(netlink_message_header));
- int address_message_length = IFA_PAYLOAD(netlink_message_header);
- const struct rtattr* route_attribute =
- reinterpret_cast<struct rtattr*>(IFA_RTA(address_message));
- DCHECK_EQ(address_message->ifa_family, AF_INET6);
-
- // Look for a cacheinfo attribute, and ignore new address broadcasts
- // where the updated time stamp is newer than the created time stamp.
- while (RTA_OK(route_attribute, address_message_length)) {
- if (route_attribute->rta_type == IFA_CACHEINFO) {
- struct ifa_cacheinfo* cache_info =
- reinterpret_cast<struct ifa_cacheinfo*>(RTA_DATA(route_attribute));
- if (cache_info->cstamp != cache_info->tstamp)
- return true;
- }
- route_attribute = RTA_NEXT(route_attribute, address_message_length);
- }
- return false;
-}
-
-} // namespace
-
-int InitializeNetlinkSocket() {
- int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
- if (sock < 0) {
- PLOG(ERROR) << "Error creating netlink socket";
- return -1;
- }
-
- if (!SetNonBlocking(sock)) {
- PLOG(ERROR) << "Failed to set netlink socket to non-blocking mode.";
- if (close(sock) != 0)
- PLOG(ERROR) << "Failed to close socket";
- return -1;
- }
-
- struct sockaddr_nl local_addr;
- memset(&local_addr, 0, sizeof(local_addr));
- local_addr.nl_family = AF_NETLINK;
- local_addr.nl_pid = getpid();
- local_addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |
- RTMGRP_NOTIFY;
- int ret = bind(sock, reinterpret_cast<struct sockaddr*>(&local_addr),
- sizeof(local_addr));
- if (ret < 0) {
- PLOG(ERROR) << "Error binding netlink socket";
- if (close(sock) != 0)
- PLOG(ERROR) << "Failed to close socket";
- return -1;
- }
-
- return sock;
-}
-
-bool HandleNetlinkMessage(char* buf, size_t len) {
- const struct nlmsghdr* netlink_message_header =
- reinterpret_cast<struct nlmsghdr*>(buf);
- DCHECK(netlink_message_header);
- for (; NLMSG_OK(netlink_message_header, len);
- netlink_message_header = NLMSG_NEXT(netlink_message_header, len)) {
- int netlink_message_type = netlink_message_header->nlmsg_type;
- switch (netlink_message_type) {
- case NLMSG_DONE:
- NOTREACHED()
- << "This is a monitoring netlink socket. It should never be done.";
- return false;
- case NLMSG_ERROR:
- LOG(ERROR) << "Unexpected netlink error.";
- return false;
- // During IP address changes, we will see all these messages. Only fire
- // the notification when we get a new address or remove an address. We
- // may still end up notifying observers more than strictly necessary, but
- // if the primary interface goes down and back up, then this is necessary.
- case RTM_NEWADDR:
- if (IsIPv6Update(netlink_message_header) &&
- IsDuplicateIPv6AddressUpdate(netlink_message_header))
- return false;
- return true;
- case RTM_DELADDR:
- return true;
- case RTM_NEWLINK:
- case RTM_DELLINK:
- return false;
- default:
- LOG(DFATAL) << "Received unexpected netlink message type: "
- << netlink_message_type;
- return false;
- }
- }
-
- return false;
-}

Powered by Google App Engine
This is Rietveld 408576698