summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-04 11:35:19 +0000
committervitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-04 11:35:19 +0000
commitea5c30d9ec4859662f1cf5484bb623d842e73226 (patch)
treec94bd98bc4c6288a335b4e40d0935d7913d54df5
parent42f4f82df2459c2516e598461019e083e0376751 (diff)
downloadchromium_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.cc2
-rw-r--r--net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java15
-rw-r--r--net/base/net_util.cc6
-rw-r--r--net/base/net_util.h2
-rw-r--r--net/base/net_util_posix.cc11
-rw-r--r--net/base/net_util_unittest.cc31
-rw-r--r--net/base/net_util_win.cc4
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));
}
}