summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/base/net_util.cc70
-rw-r--r--net/base/net_util.h18
-rw-r--r--net/socket/tcp_client_socket_libevent.cc35
-rw-r--r--net/socket/tcp_client_socket_win.cc33
4 files changed, 126 insertions, 30 deletions
diff --git a/net/base/net_util.cc b/net/base/net_util.cc
index fff02a9..8188c92 100644
--- a/net/base/net_util.cc
+++ b/net/base/net_util.cc
@@ -4,8 +4,6 @@
#include "net/base/net_util.h"
-#include <algorithm>
-#include <map>
#include <unicode/regex.h>
#include <unicode/ucnv.h>
#include <unicode/uidna.h>
@@ -13,13 +11,14 @@
#include <unicode/uniset.h>
#include <unicode/uscript.h>
#include <unicode/uset.h>
+#include <algorithm>
+#include <map>
#include "build/build_config.h"
#if defined(OS_WIN)
#include <windows.h>
#include <winsock2.h>
-#include <ws2tcpip.h>
#include <wspiapi.h> // Needed for Win2k compat.
#elif defined(OS_POSIX)
#include <fcntl.h>
@@ -27,7 +26,6 @@
#include <netdb.h>
#include <net/if.h>
#include <netinet/in.h>
-#include <sys/socket.h>
#endif
#include "base/base64.h"
@@ -1579,6 +1577,11 @@ std::string GetHostAndOptionalPort(const GURL& url) {
}
std::string NetAddressToString(const struct addrinfo* net_address) {
+ return NetAddressToString(net_address->ai_addr, net_address->ai_addrlen);
+}
+
+std::string NetAddressToString(const struct sockaddr* net_address,
+ socklen_t address_len) {
#if defined(OS_WIN)
EnsureWinsockInit();
#endif
@@ -1586,22 +1589,28 @@ std::string NetAddressToString(const struct addrinfo* net_address) {
// This buffer is large enough to fit the biggest IPv6 string.
char buffer[INET6_ADDRSTRLEN];
- int result = getnameinfo(net_address->ai_addr,
- net_address->ai_addrlen, buffer, sizeof(buffer), NULL, 0, NI_NUMERICHOST);
+ int result = getnameinfo(net_address, address_len, buffer, sizeof(buffer),
+ NULL, 0, NI_NUMERICHOST);
if (result != 0) {
- DVLOG(1) << "getnameinfo() failed with " << result;
+ DVLOG(1) << "getnameinfo() failed with " << result << ": "
+ << gai_strerror(result);
buffer[0] = '\0';
}
return std::string(buffer);
}
std::string NetAddressToStringWithPort(const struct addrinfo* net_address) {
- std::string ip_address_string = NetAddressToString(net_address);
+ return NetAddressToStringWithPort(
+ net_address->ai_addr, net_address->ai_addrlen);
+}
+std::string NetAddressToStringWithPort(const struct sockaddr* net_address,
+ socklen_t address_len) {
+ std::string ip_address_string = NetAddressToString(net_address, address_len);
if (ip_address_string.empty())
return std::string(); // Failed.
- int port = GetPortFromAddrinfo(net_address);
+ int port = GetPortFromSockaddr(net_address, address_len);
if (ip_address_string.find(':') != std::string::npos) {
// Surround with square brackets to avoid ambiguity.
@@ -2039,17 +2048,38 @@ bool IPNumberMatchesPrefix(const IPAddressNumber& ip_number,
}
// Returns the port field of the sockaddr in |info|.
-uint16* GetPortFieldFromAddrinfo(const struct addrinfo* info) {
+uint16* GetPortFieldFromAddrinfo(struct addrinfo* info) {
+ const struct addrinfo* const_info = info;
+ const uint16* port_field = GetPortFieldFromAddrinfo(const_info);
+ return const_cast<uint16*>(port_field);
+}
+
+const uint16* GetPortFieldFromAddrinfo(const struct addrinfo* info) {
DCHECK(info);
- if (info->ai_family == AF_INET) {
- DCHECK_EQ(sizeof(sockaddr_in), static_cast<size_t>(info->ai_addrlen));
- struct sockaddr_in* sockaddr =
- reinterpret_cast<struct sockaddr_in*>(info->ai_addr);
+ const struct sockaddr* address = info->ai_addr;
+ DCHECK(address);
+ DCHECK_EQ(info->ai_family, address->sa_family);
+ return GetPortFieldFromSockaddr(address, info->ai_addrlen);
+}
+
+int GetPortFromAddrinfo(const struct addrinfo* info) {
+ const uint16* port_field = GetPortFieldFromAddrinfo(info);
+ if (!port_field)
+ return -1;
+ return ntohs(*port_field);
+}
+
+const uint16* GetPortFieldFromSockaddr(const struct sockaddr* address,
+ socklen_t address_len) {
+ if (address->sa_family == AF_INET) {
+ DCHECK_LE(sizeof(sockaddr_in), static_cast<size_t>(address_len));
+ const struct sockaddr_in* sockaddr =
+ reinterpret_cast<const struct sockaddr_in*>(address);
return &sockaddr->sin_port;
- } else if (info->ai_family == AF_INET6) {
- DCHECK_EQ(sizeof(sockaddr_in6), static_cast<size_t>(info->ai_addrlen));
- struct sockaddr_in6* sockaddr =
- reinterpret_cast<struct sockaddr_in6*>(info->ai_addr);
+ } else if (address->sa_family == AF_INET6) {
+ DCHECK_LE(sizeof(sockaddr_in6), static_cast<size_t>(address_len));
+ const struct sockaddr_in6* sockaddr =
+ reinterpret_cast<const struct sockaddr_in6*>(address);
return &sockaddr->sin6_port;
} else {
NOTREACHED();
@@ -2057,8 +2087,8 @@ uint16* GetPortFieldFromAddrinfo(const struct addrinfo* info) {
}
}
-int GetPortFromAddrinfo(const struct addrinfo* info) {
- uint16* port_field = GetPortFieldFromAddrinfo(info);
+int GetPortFromSockaddr(const struct sockaddr* address, socklen_t address_len) {
+ const uint16* port_field = GetPortFieldFromSockaddr(address, address_len);
if (!port_field)
return -1;
return ntohs(*port_field);
diff --git a/net/base/net_util.h b/net/base/net_util.h
index f53ee7e..935eab6 100644
--- a/net/base/net_util.h
+++ b/net/base/net_util.h
@@ -8,8 +8,11 @@
#include "build/build_config.h"
-#ifdef OS_WIN
+#if defined(OS_WIN)
#include <windows.h>
+#include <ws2tcpip.h>
+#elif defined(OS_POSIX)
+#include <sys/socket.h>
#endif
#include <string>
@@ -107,10 +110,14 @@ std::string GetHostAndOptionalPort(const GURL& url);
// Returns the string representation of an address, like "192.168.0.1".
// Returns empty string on failure.
std::string NetAddressToString(const struct addrinfo* net_address);
+std::string NetAddressToString(const struct sockaddr* net_address,
+ socklen_t address_len);
// Same as NetAddressToString, but additionally includes the port number. For
// example: "192.168.0.1:99" or "[::1]:80".
std::string NetAddressToStringWithPort(const struct addrinfo* net_address);
+std::string NetAddressToStringWithPort(const struct sockaddr* net_address,
+ socklen_t address_len);
// Returns the hostname of the current system. Returns empty string on failure.
std::string GetHostName();
@@ -404,11 +411,18 @@ bool IPNumberMatchesPrefix(const IPAddressNumber& ip_number,
size_t prefix_length_in_bits);
// Returns the port field of the sockaddr in |info|.
-uint16* GetPortFieldFromAddrinfo(const struct addrinfo* info);
+const uint16* GetPortFieldFromAddrinfo(const struct addrinfo* info);
+uint16* GetPortFieldFromAddrinfo(struct addrinfo* info);
// Returns the value of |info's| port (in host byte ordering).
int GetPortFromAddrinfo(const struct addrinfo* info);
+// Same except for struct sockaddr.
+const uint16* GetPortFieldFromSockaddr(const struct sockaddr* address,
+ socklen_t address_len);
+int GetPortFromSockaddr(const struct sockaddr* address,
+ socklen_t address_len);
+
} // namespace net
#endif // NET_BASE_NET_UTIL_H_
diff --git a/net/socket/tcp_client_socket_libevent.cc b/net/socket/tcp_client_socket_libevent.cc
index 52956aa..83528dd 100644
--- a/net/socket/tcp_client_socket_libevent.cc
+++ b/net/socket/tcp_client_socket_libevent.cc
@@ -19,6 +19,7 @@
#include "base/metrics/stats_counters.h"
#include "base/string_util.h"
#include "net/base/address_list_net_log_param.h"
+#include "net/base/connection_type_histograms.h"
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "net/base/net_log.h"
@@ -522,10 +523,36 @@ int TCPClientSocketLibevent::SetupSocket() {
}
void TCPClientSocketLibevent::LogConnectCompletion(int net_error) {
- scoped_refptr<NetLog::EventParameters> params;
- if (net_error != OK)
- params = new NetLogIntegerParameter("net_error", net_error);
- net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT, params);
+ if (net_error == OK)
+ UpdateConnectionTypeHistograms(CONNECTION_ANY);
+
+ if (net_error != OK) {
+ net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT,
+ make_scoped_refptr(
+ new NetLogIntegerParameter("net_error", net_error)));
+ return;
+ }
+
+ struct sockaddr_storage source_address;
+ socklen_t addrlen = sizeof(source_address);
+ int rv = getsockname(
+ socket_, reinterpret_cast<struct sockaddr*>(&source_address), &addrlen);
+ if (rv != 0) {
+ PLOG(ERROR) << "getsockname() [rv: " << rv << "] error: ";
+ NOTREACHED();
+ scoped_refptr<NetLog::EventParameters> params;
+ net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT, NULL);
+ return;
+ }
+
+ const std::string source_address_str =
+ NetAddressToStringWithPort(
+ reinterpret_cast<const struct sockaddr*>(&source_address),
+ sizeof(source_address));
+ net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT,
+ make_scoped_refptr(new NetLogStringParameter(
+ "source address",
+ source_address_str)));
}
void TCPClientSocketLibevent::DoReadCallback(int rv) {
diff --git a/net/socket/tcp_client_socket_win.cc b/net/socket/tcp_client_socket_win.cc
index b33c6de..d98485e 100644
--- a/net/socket/tcp_client_socket_win.cc
+++ b/net/socket/tcp_client_socket_win.cc
@@ -757,12 +757,37 @@ int TCPClientSocketWin::SetupSocket() {
}
void TCPClientSocketWin::LogConnectCompletion(int net_error) {
- scoped_refptr<NetLog::EventParameters> params;
- if (net_error != OK)
- params = new NetLogIntegerParameter("net_error", net_error);
- net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT, params);
if (net_error == OK)
UpdateConnectionTypeHistograms(CONNECTION_ANY);
+
+ if (net_error != OK) {
+ net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT,
+ make_scoped_refptr(
+ new NetLogIntegerParameter("net_error", net_error)));
+ return;
+ }
+
+ struct sockaddr_storage source_address;
+ socklen_t addrlen = sizeof(source_address);
+ int rv = getsockname(
+ socket_, reinterpret_cast<struct sockaddr*>(&source_address), &addrlen);
+ if (rv != 0) {
+ LOG(ERROR) << "getsockname() [rv: " << rv
+ << "] error: " << WSAGetLastError();
+ NOTREACHED();
+ scoped_refptr<NetLog::EventParameters> params;
+ net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT, NULL);
+ return;
+ }
+
+ const std::string source_address_str =
+ NetAddressToStringWithPort(
+ reinterpret_cast<const struct sockaddr*>(&source_address),
+ sizeof(source_address));
+ net_log_.EndEvent(NetLog::TYPE_TCP_CONNECT,
+ make_scoped_refptr(new NetLogStringParameter(
+ "source address",
+ source_address_str)));
}
void TCPClientSocketWin::DoReadCallback(int rv) {