diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-26 04:13:59 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-26 04:13:59 +0000 |
commit | 93e7901867cfa9264d743b891027ab1a48ed4547 (patch) | |
tree | 81fda20a5a260f7fcccee6a2652ffd4587ae52b0 /net/base | |
parent | 9727a106bea991601ceba5bb63247a1e1080d348 (diff) | |
download | chromium_src-93e7901867cfa9264d743b891027ab1a48ed4547.zip chromium_src-93e7901867cfa9264d743b891027ab1a48ed4547.tar.gz chromium_src-93e7901867cfa9264d743b891027ab1a48ed4547.tar.bz2 |
Log source ip and port in NetLog.
This will make it easier to identify specific TCP connections in a wireshark trace.
BUG=70649
TEST=Connect somewhere, check about:net-internals to see that source ip and port are logged.
Review URL: http://codereview.chromium.org/6394004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72607 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base')
-rw-r--r-- | net/base/net_util.cc | 70 | ||||
-rw-r--r-- | net/base/net_util.h | 18 |
2 files changed, 66 insertions, 22 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_ |