| 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;
|
| -}
|
|
|