summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorvitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-26 03:14:16 +0000
committervitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-26 03:14:16 +0000
commit9f9a7b7175149bdd212109fbfcd995cb4249071a (patch)
treeeca49d4b8561676dbf97b17b0ea804116c49fb6f /net
parent65bc0bf82b2b232891b1ef82c231ea849a651246 (diff)
downloadchromium_src-9f9a7b7175149bdd212109fbfcd995cb4249071a.zip
chromium_src-9f9a7b7175149bdd212109fbfcd995cb4249071a.tar.gz
chromium_src-9f9a7b7175149bdd212109fbfcd995cb4249071a.tar.bz2
Added NetworkInterface::network_prefix.
BUG=295997 NOTRY=true Review URL: https://codereview.chromium.org/23726043 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@225303 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r--net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java13
-rw-r--r--net/base/net_util.cc29
-rw-r--r--net/base/net_util.h12
-rw-r--r--net/base/net_util_posix.cc47
-rw-r--r--net/base/net_util_unittest.cc3
-rw-r--r--net/base/net_util_win.cc3
-rw-r--r--net/dns/address_sorter_posix.cc24
7 files changed, 82 insertions, 49 deletions
diff --git a/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java b/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java
index 95752cc..49b6634 100644
--- a/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java
+++ b/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java
@@ -17,6 +17,7 @@ import org.chromium.net.CertificateMimeType;
import java.net.Inet6Address;
import java.net.InetAddress;
+import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URLConnection;
@@ -24,6 +25,7 @@ import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.util.Enumeration;
+import java.util.List;
/**
* This class implements net utilities required by the net component.
@@ -165,24 +167,25 @@ class AndroidNetworkLibrary {
// Skip loopback interfaces, and ones which are down.
if (!netIf.isUp() || netIf.isLoopback())
continue;
- Enumeration<InetAddress> addressList = netIf.getInetAddresses();
- while (addressList.hasMoreElements()) {
- InetAddress address = addressList.nextElement();
+ for (InterfaceAddress interfaceAddress : netIf.getInterfaceAddresses()) {
+ InetAddress address = interfaceAddress.getAddress();
// Skip loopback addresses configured on non-loopback interfaces.
if (address.isLoopbackAddress())
continue;
StringBuilder addressString = new StringBuilder();
addressString.append(netIf.getName());
- addressString.append(",");
+ addressString.append("\t");
String ipAddress = address.getHostAddress();
if (address instanceof Inet6Address && ipAddress.contains("%")) {
ipAddress = ipAddress.substring(0, ipAddress.lastIndexOf("%"));
}
addressString.append(ipAddress);
+ addressString.append("/");
+ addressString.append(interfaceAddress.getNetworkPrefixLength());
if (result.length() != 0)
- result.append(";");
+ result.append("\n");
result.append(addressString.toString());
}
} catch (SocketException e) {
diff --git a/net/base/net_util.cc b/net/base/net_util.cc
index dd0826c..20f69f8 100644
--- a/net/base/net_util.cc
+++ b/net/base/net_util.cc
@@ -2142,15 +2142,38 @@ bool IsLocalhost(const std::string& host) {
return false;
}
-NetworkInterface::NetworkInterface() {
+NetworkInterface::NetworkInterface() : network_prefix(0) {
}
NetworkInterface::NetworkInterface(const std::string& name,
- const IPAddressNumber& address)
- : name(name), address(address) {
+ const IPAddressNumber& address,
+ uint8 network_prefix)
+ : name(name), address(address), network_prefix(network_prefix) {
}
NetworkInterface::~NetworkInterface() {
}
+unsigned CommonPrefixLength(const IPAddressNumber& a1,
+ const IPAddressNumber& a2) {
+ DCHECK_EQ(a1.size(), a2.size());
+ for (size_t i = 0; i < a1.size(); ++i) {
+ unsigned diff = a1[i] ^ a2[i];
+ if (!diff)
+ continue;
+ for (unsigned j = 0; j < CHAR_BIT; ++j) {
+ if (diff & (1 << (CHAR_BIT - 1)))
+ return i * CHAR_BIT + j;
+ diff <<= 1;
+ }
+ NOTREACHED();
+ }
+ return a1.size() * CHAR_BIT;
+}
+
+unsigned MaskPrefixLength(const IPAddressNumber& mask) {
+ IPAddressNumber all_ones(mask.size(), 0xFF);
+ return CommonPrefixLength(mask, all_ones);
+}
+
} // namespace net
diff --git a/net/base/net_util.h b/net/base/net_util.h
index 6b8884d..e28ffe3 100644
--- a/net/base/net_util.h
+++ b/net/base/net_util.h
@@ -516,11 +516,14 @@ NET_EXPORT_PRIVATE bool IsLocalhost(const std::string& host);
// interface.
struct NET_EXPORT NetworkInterface {
NetworkInterface();
- NetworkInterface(const std::string& name, const IPAddressNumber& address);
+ NetworkInterface(const std::string& name,
+ const IPAddressNumber& address,
+ uint8 network_prefix);
~NetworkInterface();
std::string name;
IPAddressNumber address;
+ uint8 network_prefix;
};
typedef std::vector<NetworkInterface> NetworkInterfaceList;
@@ -553,6 +556,13 @@ enum WifiPHYLayerProtocol {
// Currently only available on OS_WIN.
NET_EXPORT WifiPHYLayerProtocol GetWifiPHYLayerProtocol();
+// Returns number of matching initial bits between the addresses |a1| and |a2|.
+unsigned CommonPrefixLength(const IPAddressNumber& a1,
+ const IPAddressNumber& a2);
+
+// Computes the number of leading 1-bits in |mask|.
+unsigned MaskPrefixLength(const IPAddressNumber& mask);
+
} // namespace net
#endif // NET_BASE_NET_UTIL_H_
diff --git a/net/base/net_util_posix.cc b/net/base/net_util_posix.cc
index 904d802..50ff6e7 100644
--- a/net/base/net_util_posix.cc
+++ b/net/base/net_util_posix.cc
@@ -9,6 +9,7 @@
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/posix/eintr_wrapper.h"
+#include "base/strings/string_number_conversions.h"
#include "base/strings/string_tokenizer.h"
#include "base/strings/string_util.h"
#include "base/threading/thread_restrictions.h"
@@ -66,24 +67,33 @@ bool FileURLToFilePath(const GURL& url, base::FilePath* path) {
bool GetNetworkList(NetworkInterfaceList* networks) {
#if defined(OS_ANDROID)
std::string network_list = android::GetNetworkList();
- base::StringTokenizer network_interfaces(network_list, ";");
+ base::StringTokenizer network_interfaces(network_list, "\n");
while (network_interfaces.GetNext()) {
std::string network_item = network_interfaces.token();
- base::StringTokenizer network_tokenizer(network_item, ",");
- std::string name;
- if (!network_tokenizer.GetNext())
- continue;
- name = network_tokenizer.token();
+ base::StringTokenizer network_tokenizer(network_item, "\t");
+ CHECK(network_tokenizer.GetNext());
+ std::string name = network_tokenizer.token();
- std::string literal_address;
- if (!network_tokenizer.GetNext())
- continue;
- literal_address = network_tokenizer.token();
+ CHECK(network_tokenizer.GetNext());
+ std::string interface_address = network_tokenizer.token();
+
+ base::StringTokenizer address_tokenizer(interface_address, "/");
+
+ CHECK(address_tokenizer.GetNext());
+ std::string literal_address = address_tokenizer.token();
+
+ CHECK(address_tokenizer.GetNext());
+ std::string network_prefix = address_tokenizer.token();
IPAddressNumber address;
- if (!ParseIPLiteralToNumber(literal_address, &address))
- continue;
- networks->push_back(NetworkInterface(name, address));
+ CHECK(ParseIPLiteralToNumber(literal_address, &address));
+
+ unsigned net_mask = 0;
+ CHECK(base::StringToUint(network_prefix, &net_mask));
+ CHECK_LE(net_mask, address.size() * 8);
+
+ networks->push_back(
+ NetworkInterface(name, address, static_cast<uint8>(net_mask)));
}
return true;
#else
@@ -133,10 +143,19 @@ bool GetNetworkList(NetworkInterfaceList* networks) {
// Skip non-IP addresses.
continue;
}
+
IPEndPoint address;
std::string name = interface->ifa_name;
if (address.FromSockAddr(addr, addr_size)) {
- networks->push_back(NetworkInterface(name, address.address()));
+ uint8 net_mask = 0;
+ if (interface->ifa_netmask) {
+ IPEndPoint netmask;
+ if (netmask.FromSockAddr(interface->ifa_netmask, addr_size)) {
+ net_mask = MaskPrefixLength(netmask.address());
+ }
+ }
+
+ networks->push_back(NetworkInterface(name, address.address(), net_mask));
}
}
diff --git a/net/base/net_util_unittest.cc b/net/base/net_util_unittest.cc
index 207e05a..7e00b67 100644
--- a/net/base/net_util_unittest.cc
+++ b/net/base/net_util_unittest.cc
@@ -3291,7 +3291,6 @@ TEST(NetUtilTest, IsLocalhost) {
TEST(NetUtilTest, GetNetworkList) {
NetworkInterfaceList list;
ASSERT_TRUE(GetNetworkList(&list));
-
for (NetworkInterfaceList::iterator it = list.begin();
it != list.end(); ++it) {
// Verify that the name is not empty.
@@ -3309,6 +3308,8 @@ TEST(NetUtilTest, GetNetworkList) {
}
}
EXPECT_FALSE(all_zeroes);
+ EXPECT_GE(it->network_prefix, 1u);
+ EXPECT_LE(it->network_prefix, it->address.size() * 8);
}
}
diff --git a/net/base/net_util_win.cc b/net/base/net_util_win.cc
index 986af79..7a2ec19 100644
--- a/net/base/net_util_win.cc
+++ b/net/base/net_util_win.cc
@@ -169,7 +169,8 @@ bool GetNetworkList(NetworkInterfaceList* networks) {
if (endpoint.FromSockAddr(address->Address.lpSockaddr,
address->Address.iSockaddrLength)) {
std::string name = adapter->AdapterName;
- networks->push_back(NetworkInterface(name, endpoint.address()));
+ networks->push_back(NetworkInterface(name, endpoint.address(),
+ address->OnLinkPrefixLength));
}
}
}
diff --git a/net/dns/address_sorter_posix.cc b/net/dns/address_sorter_posix.cc
index 8d87774..514a00f 100644
--- a/net/dns/address_sorter_posix.cc
+++ b/net/dns/address_sorter_posix.cc
@@ -175,30 +175,6 @@ AddressSorterPosix::PolicyEntry kDefaultIPv4ScopeTable[] = {
{ { }, 0, AddressSorterPosix::SCOPE_GLOBAL },
};
-// Returns number of matching initial bits between the addresses |a1| and |a2|.
-unsigned CommonPrefixLength(const IPAddressNumber& a1,
- const IPAddressNumber& a2) {
- DCHECK_EQ(a1.size(), a2.size());
- for (size_t i = 0; i < a1.size(); ++i) {
- unsigned diff = a1[i] ^ a2[i];
- if (!diff)
- continue;
- for (unsigned j = 0; j < CHAR_BIT; ++j) {
- if (diff & (1 << (CHAR_BIT - 1)))
- return i * CHAR_BIT + j;
- diff <<= 1;
- }
- NOTREACHED();
- }
- return a1.size() * CHAR_BIT;
-}
-
-// Computes the number of leading 1-bits in |mask|.
-unsigned MaskPrefixLength(const IPAddressNumber& mask) {
- IPAddressNumber all_ones(mask.size(), 0xFF);
- return CommonPrefixLength(mask, all_ones);
-}
-
struct DestinationInfo {
IPAddressNumber address;
AddressSorterPosix::AddressScope scope;