diff options
author | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-04 11:35:19 +0000 |
---|---|---|
committer | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-04 11:35:19 +0000 |
commit | ea5c30d9ec4859662f1cf5484bb623d842e73226 (patch) | |
tree | c94bd98bc4c6288a335b4e40d0935d7913d54df5 | |
parent | 42f4f82df2459c2516e598461019e083e0376751 (diff) | |
download | chromium_src-ea5c30d9ec4859662f1cf5484bb623d842e73226.zip chromium_src-ea5c30d9ec4859662f1cf5484bb623d842e73226.tar.gz chromium_src-ea5c30d9ec4859662f1cf5484bb623d842e73226.tar.bz2 |
Added net::NetworkInterface::interface_index.
Not implemented for Android.
BUG=319068
Review URL: https://codereview.chromium.org/100703002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238671 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/local_discovery/privet_traffic_detector.cc | 2 | ||||
-rw-r--r-- | net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java | 15 | ||||
-rw-r--r-- | net/base/net_util.cc | 6 | ||||
-rw-r--r-- | net/base/net_util.h | 2 | ||||
-rw-r--r-- | net/base/net_util_posix.cc | 11 | ||||
-rw-r--r-- | net/base/net_util_unittest.cc | 31 | ||||
-rw-r--r-- | net/base/net_util_win.cc | 4 |
7 files changed, 61 insertions, 10 deletions
diff --git a/chrome/browser/local_discovery/privet_traffic_detector.cc b/chrome/browser/local_discovery/privet_traffic_detector.cc index e95c74f..602e7f1 100644 --- a/chrome/browser/local_discovery/privet_traffic_detector.cc +++ b/chrome/browser/local_discovery/privet_traffic_detector.cc @@ -39,7 +39,7 @@ void GetNetworkListOnFileThread( net::IPAddressNumber localhost_prefix(4, 0); localhost_prefix[0] = 127; - ip4_networks.push_back(net::NetworkInterface("lo", localhost_prefix, 8)); + ip4_networks.push_back(net::NetworkInterface("lo", 0, localhost_prefix, 8)); content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, base::Bind(callback, ip4_networks)); } diff --git a/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java b/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java index 49b6634..b7aec32 100644 --- a/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java +++ b/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java @@ -143,11 +143,12 @@ class AndroidNetworkLibrary { /** * @return the network interfaces list (if any) string. The items in - * the list string are delimited by a semicolon ";", each item - * is a network interface name and address pair and formatted - * as "name,address". e.g. - * eth0,10.0.0.2;eth0,fe80::5054:ff:fe12:3456 - * represents a network list string which containts two items. + * the list string are delimited by a new line, each item + * is tab separated network interface name, address with network + * prefix length and network interface index. + * as "name\taddress/prefix\tindex". e.g. + * eth0\t10.0.0.2/8\t5\neth0\tfe80::5054:ff:fe12:3456/16\t5 + * represents a network list string with two items. */ @CalledByNative static public String getNetworkList() { @@ -183,6 +184,10 @@ class AndroidNetworkLibrary { addressString.append(ipAddress); addressString.append("/"); addressString.append(interfaceAddress.getNetworkPrefixLength()); + addressString.append("\t"); + + // TODO(vitalybuka): use netIf.getIndex() when API level 19 is availible. + addressString.append("0"); if (result.length() != 0) result.append("\n"); diff --git a/net/base/net_util.cc b/net/base/net_util.cc index 4a4ff52..241d748 100644 --- a/net/base/net_util.cc +++ b/net/base/net_util.cc @@ -2186,9 +2186,13 @@ NetworkInterface::NetworkInterface() : network_prefix(0) { } NetworkInterface::NetworkInterface(const std::string& name, + uint32 interface_index, const IPAddressNumber& address, size_t network_prefix) - : name(name), address(address), network_prefix(network_prefix) { + : name(name), + interface_index(interface_index), + address(address), + network_prefix(network_prefix) { } NetworkInterface::~NetworkInterface() { diff --git a/net/base/net_util.h b/net/base/net_util.h index 5735111..eb7829b 100644 --- a/net/base/net_util.h +++ b/net/base/net_util.h @@ -515,11 +515,13 @@ NET_EXPORT_PRIVATE bool IsLocalhost(const std::string& host); struct NET_EXPORT NetworkInterface { NetworkInterface(); NetworkInterface(const std::string& name, + uint32 interface_index, const IPAddressNumber& address, size_t network_prefix); ~NetworkInterface(); std::string name; + uint32 interface_index; // Always 0 on Android. IPAddressNumber address; size_t network_prefix; }; diff --git a/net/base/net_util_posix.cc b/net/base/net_util_posix.cc index 4ff3ee9..5e1042b 100644 --- a/net/base/net_util_posix.cc +++ b/net/base/net_util_posix.cc @@ -81,8 +81,12 @@ bool GetNetworkList(NetworkInterfaceList* networks) { &address, &network_prefix)); + CHECK(network_tokenizer.GetNext()); + uint32 index = 0; + CHECK(base::StringToUint(network_tokenizer.token(), &index)); + networks->push_back( - NetworkInterface(name, address, network_prefix)); + NetworkInterface(name, index, address, network_prefix)); } return true; #else @@ -108,6 +112,7 @@ bool GetNetworkList(NetworkInterfaceList* networks) { struct sockaddr* addr = interface->ifa_addr; if (!addr) continue; + // Skip unspecified addresses (i.e. made of zeroes) and loopback addresses // configured on non-loopback interfaces. int addr_size = 0; @@ -144,7 +149,9 @@ bool GetNetworkList(NetworkInterfaceList* networks) { } } - networks->push_back(NetworkInterface(name, address.address(), net_mask)); + networks->push_back( + NetworkInterface(name, if_nametoindex(name.c_str()), + address.address(), net_mask)); } } diff --git a/net/base/net_util_unittest.cc b/net/base/net_util_unittest.cc index 8200ad3..f6d4d6c 100644 --- a/net/base/net_util_unittest.cc +++ b/net/base/net_util_unittest.cc @@ -21,6 +21,15 @@ #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" +#if defined(OS_WIN) +#include <iphlpapi.h> +#include <objbase.h> +#include "base/win/windows_version.h" +#pragma comment(lib, "iphlpapi.lib") +#elif !defined(OS_ANDROID) +#include <net/if.h> +#endif // OS_WIN + namespace net { namespace { @@ -3310,6 +3319,28 @@ TEST(NetUtilTest, GetNetworkList) { EXPECT_FALSE(all_zeroes); EXPECT_GT(it->network_prefix, 1u); EXPECT_LE(it->network_prefix, it->address.size() * 8); + +#if defined(OS_WIN) + if (base::win::GetVersion() >= base::win::VERSION_VISTA) { + // WIN_XP has no used functions. + NET_LUID luid; + // On Windows |name| is NET_LUID. + ConvertInterfaceIndexToLuid(it->interface_index, &luid); + GUID guid; + ConvertInterfaceLuidToGuid(&luid, &guid); + LPOLESTR name; + StringFromCLSID(guid, &name); + EXPECT_STREQ(UTF8ToWide(it->name).c_str(), name); + CoTaskMemFree(name); + } else { + EXPECT_LT(it->interface_index, 1u << 24u); // Must fit 0.x.x.x. + EXPECT_NE(it->interface_index, 0u); // 0 means to use default. + } +#elif !defined(OS_ANDROID) + char name[IF_NAMESIZE]; + EXPECT_TRUE(if_indextoname(it->interface_index, name)); + EXPECT_STREQ(it->name.c_str(), name); +#endif } } diff --git a/net/base/net_util_win.cc b/net/base/net_util_win.cc index b44836c..d0efe39 100644 --- a/net/base/net_util_win.cc +++ b/net/base/net_util_win.cc @@ -200,8 +200,10 @@ bool GetNetworkList(NetworkInterfaceList* networks) { } } } + uint32 index = + (family == AF_INET) ? adapter->IfIndex : adapter->Ipv6IfIndex; networks->push_back( - NetworkInterface(adapter->AdapterName, endpoint.address(), + NetworkInterface(adapter->AdapterName, index, endpoint.address(), net_prefix)); } } |