summaryrefslogtreecommitdiffstats
path: root/net/udp/udp_socket_libevent.cc
diff options
context:
space:
mode:
authormmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-18 20:08:10 +0000
committermmenke@chromium.org <mmenke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-18 20:08:10 +0000
commit8866f623dfd914c9f4c26ab96f90aecf4a372ef9 (patch)
tree4f45fa083309b6934e1888c27c9df2344cd391f0 /net/udp/udp_socket_libevent.cc
parentdef979a39bd25dfb24c80138699ffb359c495757 (diff)
downloadchromium_src-8866f623dfd914c9f4c26ab96f90aecf4a372ef9.zip
chromium_src-8866f623dfd914c9f4c26ab96f90aecf4a372ef9.tar.gz
chromium_src-8866f623dfd914c9f4c26ab96f90aecf4a372ef9.tar.bz2
Add NetLog support to UDP sockets.
BUG=99508 TEST=UDPSocketTest.Connect Review URL: http://codereview.chromium.org/8200011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@106109 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/udp/udp_socket_libevent.cc')
-rw-r--r--net/udp/udp_socket_libevent.cc120
1 files changed, 89 insertions, 31 deletions
diff --git a/net/udp/udp_socket_libevent.cc b/net/udp/udp_socket_libevent.cc
index 1e790df..87cd9f6 100644
--- a/net/udp/udp_socket_libevent.cc
+++ b/net/udp/udp_socket_libevent.cc
@@ -19,6 +19,7 @@
#include "net/base/net_errors.h"
#include "net/base/net_log.h"
#include "net/base/net_util.h"
+#include "net/udp/udp_data_transfer_param.h"
#if defined(OS_POSIX)
#include <netinet/in.h>
#endif
@@ -48,7 +49,7 @@ UDPSocketLibevent::UDPSocketLibevent(
write_buf_len_(0),
read_callback_(NULL),
write_callback_(NULL),
- net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)) {
+ net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_UDP_SOCKET)) {
scoped_refptr<NetLog::EventParameters> params;
if (source.is_valid())
params = new NetLogSourceParameter("source_dependency", source);
@@ -158,7 +159,9 @@ int UDPSocketLibevent::RecvFrom(IOBuffer* buf,
socket_, true, MessageLoopForIO::WATCH_READ,
&read_socket_watcher_, &read_watcher_)) {
PLOG(ERROR) << "WatchFileDescriptor failed on read";
- return MapSystemError(errno);
+ int result = MapSystemError(errno);
+ LogRead(result, NULL, 0, NULL);
+ return result;
}
read_buf_ = buf;
@@ -191,20 +194,17 @@ int UDPSocketLibevent::SendToOrWrite(IOBuffer* buf,
DCHECK(callback); // Synchronous operation not supported
DCHECK_GT(buf_len, 0);
- int nwrite = InternalSendTo(buf, buf_len, address);
- if (nwrite >= 0) {
- base::StatsCounter write_bytes("udp.write_bytes");
- write_bytes.Add(nwrite);
- return nwrite;
- }
- if (errno != EAGAIN && errno != EWOULDBLOCK)
- return MapSystemError(errno);
+ int result = InternalSendTo(buf, buf_len, address);
+ if (result != ERR_IO_PENDING)
+ return result;
if (!MessageLoopForIO::current()->WatchFileDescriptor(
socket_, true, MessageLoopForIO::WATCH_WRITE,
&write_socket_watcher_, &write_watcher_)) {
DVLOG(1) << "WatchFileDescriptor failed on write, errno " << errno;
- return MapSystemError(errno);
+ int result = MapSystemError(errno);
+ LogWrite(result, NULL, NULL);
+ return result;
}
write_buf_ = buf;
@@ -218,6 +218,16 @@ int UDPSocketLibevent::SendToOrWrite(IOBuffer* buf,
}
int UDPSocketLibevent::Connect(const IPEndPoint& address) {
+ net_log_.BeginEvent(
+ NetLog::TYPE_UDP_CONNECT,
+ make_scoped_refptr(new NetLogStringParameter("address",
+ address.ToString())));
+ int rv = InternalConnect(address);
+ net_log_.EndEventWithNetErrorCode(NetLog::TYPE_UDP_CONNECT, rv);
+ return rv;
+}
+
+int UDPSocketLibevent::InternalConnect(const IPEndPoint& address) {
DCHECK(CalledOnValidThread());
DCHECK(!is_connected());
DCHECK(!remote_address_.get());
@@ -307,6 +317,33 @@ void UDPSocketLibevent::DidCompleteRead() {
}
}
+void UDPSocketLibevent::LogRead(int result,
+ const char* bytes,
+ socklen_t addr_len,
+ const sockaddr* addr) const {
+ if (result < 0) {
+ net_log_.AddEventWithNetErrorCode(NetLog::TYPE_UDP_RECEIVE_ERROR, result);
+ return;
+ }
+
+ if (net_log_.IsLoggingAllEvents()) {
+ DCHECK(addr_len > 0);
+ DCHECK(addr);
+
+ IPEndPoint address;
+ bool is_address_valid = address.FromSockAddr(addr, addr_len);
+ net_log_.AddEvent(
+ NetLog::TYPE_UDP_BYTES_RECEIVED,
+ make_scoped_refptr(
+ new UDPDataTransferNetLogParam(
+ result, bytes, net_log_.IsLoggingBytes(),
+ is_address_valid ? &address : NULL)));
+ }
+
+ base::StatsCounter read_bytes("udp.read_bytes");
+ read_bytes.Add(result);
+}
+
int UDPSocketLibevent::CreateSocket(const IPEndPoint& address) {
socket_ = socket(address.GetFamily(), SOCK_DGRAM, 0);
if (socket_ == kInvalidSocket)
@@ -322,12 +359,6 @@ int UDPSocketLibevent::CreateSocket(const IPEndPoint& address) {
void UDPSocketLibevent::DidCompleteWrite() {
int result = InternalSendTo(write_buf_, write_buf_len_,
send_to_address_.get());
- if (result >= 0) {
- base::StatsCounter write_bytes("udp.write_bytes");
- write_bytes.Add(result);
- } else {
- result = MapSystemError(errno);
- }
if (result != ERR_IO_PENDING) {
write_buf_ = NULL;
@@ -338,6 +369,27 @@ void UDPSocketLibevent::DidCompleteWrite() {
}
}
+void UDPSocketLibevent::LogWrite(int result,
+ const char* bytes,
+ const IPEndPoint* address) const {
+ if (result < 0) {
+ net_log_.AddEventWithNetErrorCode(NetLog::TYPE_UDP_SEND_ERROR, result);
+ return;
+ }
+
+ if (net_log_.IsLoggingAllEvents()) {
+ net_log_.AddEvent(
+ NetLog::TYPE_UDP_BYTES_SENT,
+ make_scoped_refptr(
+ new UDPDataTransferNetLogParam(result, bytes,
+ net_log_.IsLoggingBytes(),
+ address)));
+ }
+
+ base::StatsCounter write_bytes("udp.write_bytes");
+ write_bytes.Add(result);
+}
+
int UDPSocketLibevent::InternalRecvFrom(IOBuffer* buf, int buf_len,
IPEndPoint* address) {
int bytes_transferred;
@@ -357,15 +409,13 @@ int UDPSocketLibevent::InternalRecvFrom(IOBuffer* buf, int buf_len,
int result;
if (bytes_transferred >= 0) {
result = bytes_transferred;
- base::StatsCounter read_bytes("udp.read_bytes");
- read_bytes.Add(bytes_transferred);
- if (address) {
- if (!address->FromSockAddr(addr, addr_len))
- result = ERR_FAILED;
- }
+ if (address && !address->FromSockAddr(addr, addr_len))
+ result = ERR_FAILED;
} else {
result = MapSystemError(errno);
}
+ if (result != ERR_IO_PENDING)
+ LogRead(result, buf->data(), addr_len, addr);
return result;
}
@@ -379,16 +429,24 @@ int UDPSocketLibevent::InternalSendTo(IOBuffer* buf, int buf_len,
addr = NULL;
addr_len = 0;
} else {
- if (!address->ToSockAddr(addr, &addr_len))
- return ERR_FAILED;
+ if (!address->ToSockAddr(addr, &addr_len)) {
+ int result = ERR_FAILED;
+ LogWrite(result, NULL, NULL);
+ return result;
+ }
}
- return HANDLE_EINTR(sendto(socket_,
- buf->data(),
- buf_len,
- 0,
- addr,
- addr_len));
+ int result = HANDLE_EINTR(sendto(socket_,
+ buf->data(),
+ buf_len,
+ 0,
+ addr,
+ addr_len));
+ if (result < 0)
+ result = MapSystemError(errno);
+ if (result != ERR_IO_PENDING)
+ LogWrite(result, buf->data(), address);
+ return result;
}
int UDPSocketLibevent::DoBind(const IPEndPoint& address) {