// Copyright 2017 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_interfaces.h" #include #include "net/base/ip_endpoint.h" #include "net/base/network_interfaces_posix.h" namespace net { bool GetNetworkList(NetworkInterfaceList* networks, int policy) { int s = socket(AF_INET, SOCK_DGRAM, 0); if (s <= 0) { PLOG(ERROR) << "socket"; return false; } netc_get_if_info_t netconfig; int size = ioctl_netc_get_if_info(s, &netconfig); PCHECK(close(s) == 0); if (size < 0) { PLOG(ERROR) << "ioctl_netc_get_if_info"; return false; } networks->clear(); for (size_t i = 0; i < netconfig.n_info; ++i) { netc_if_info_t* interface = netconfig.info + i; // Skip loopback addresses. if (internal::IsLoopbackOrUnspecifiedAddress( reinterpret_cast(&(interface->addr)))) { continue; } IPEndPoint address; if (!address.FromSockAddr(reinterpret_cast(&(interface->addr)), sizeof(interface->addr))) { DLOG(WARNING) << "ioctl_netc_get_if_info returned invalid address."; continue; } int prefix_length = 0; IPEndPoint netmask; if (netmask.FromSockAddr(reinterpret_cast(&(interface->netmask)), sizeof(interface->netmask))) { prefix_length = MaskPrefixLength(netmask.address()); } // TODO(sergeyu): attributes field is used to return address state for IPv6 // addresses. Currently ioctl_netc_get_if_info doesn't provide this // information. int attributes = 0; networks->push_back( NetworkInterface(interface->name, interface->name, interface->index, NetworkChangeNotifier::CONNECTION_UNKNOWN, address.address(), prefix_length, attributes)); } return true; } std::string GetWifiSSID() { NOTIMPLEMENTED(); return std::string(); } } // namespace net