blob: 61c9e8069049c799a6379093b346aea230612b8e [file] [log] [blame]
// 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 <netstack/netconfig.h>
#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<sockaddr*>(&(interface->addr)))) {
continue;
}
IPEndPoint address;
if (!address.FromSockAddr(reinterpret_cast<sockaddr*>(&(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<sockaddr*>(&(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