summaryrefslogtreecommitdiffstats
path: root/chromium/content/browser/renderer_host/p2p/socket_host_udp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/renderer_host/p2p/socket_host_udp.cc')
-rw-r--r--chromium/content/browser/renderer_host/p2p/socket_host_udp.cc89
1 files changed, 58 insertions, 31 deletions
diff --git a/chromium/content/browser/renderer_host/p2p/socket_host_udp.cc b/chromium/content/browser/renderer_host/p2p/socket_host_udp.cc
index 8a14669a7ff..5dad882629f 100644
--- a/chromium/content/browser/renderer_host/p2p/socket_host_udp.cc
+++ b/chromium/content/browser/renderer_host/p2p/socket_host_udp.cc
@@ -5,16 +5,17 @@
#include "content/browser/renderer_host/p2p/socket_host_udp.h"
#include "base/bind.h"
-#include "base/command_line.h"
#include "base/debug/trace_event.h"
#include "base/stl_util.h"
#include "content/browser/renderer_host/p2p/socket_host_throttler.h"
#include "content/common/p2p_messages.h"
-#include "content/public/common/content_switches.h"
+#include "content/public/browser/content_browser_client.h"
+#include "content/public/common/content_client.h"
#include "ipc/ipc_sender.h"
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "net/base/net_util.h"
+#include "third_party/libjingle/source/talk/base/asyncpacketsocket.h"
namespace {
@@ -40,12 +41,8 @@ bool IsTransientError(int error) {
error == net::ERR_ADDRESS_INVALID ||
error == net::ERR_ACCESS_DENIED ||
error == net::ERR_CONNECTION_RESET ||
- error == net::ERR_OUT_OF_MEMORY;
-}
-
-bool AllowUDPWithoutSTUN() {
- return CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDisableP2PSocketSTUNFilter);
+ error == net::ERR_OUT_OF_MEMORY ||
+ error == net::ERR_INTERNET_DISCONNECTED;
}
} // namespace
@@ -55,12 +52,12 @@ namespace content {
P2PSocketHostUdp::PendingPacket::PendingPacket(
const net::IPEndPoint& to,
const std::vector<char>& content,
- net::DiffServCodePoint dscp_,
+ const talk_base::PacketOptions& options,
uint64 id)
: to(to),
data(new net::IOBuffer(content.size())),
size(content.size()),
- dscp(dscp_),
+ packet_options(options),
id(id) {
memcpy(data->data(), &content[0], size);
}
@@ -69,10 +66,12 @@ P2PSocketHostUdp::PendingPacket::~PendingPacket() {
}
P2PSocketHostUdp::P2PSocketHostUdp(IPC::Sender* message_sender,
- int id,
+ int socket_id,
P2PMessageThrottler* throttler)
- : P2PSocketHost(message_sender, id),
- socket_(new net::UDPServerSocket(NULL, net::NetLog::Source())),
+ : P2PSocketHost(message_sender, socket_id),
+ socket_(
+ new net::UDPServerSocket(GetContentClient()->browser()->GetNetLog(),
+ net::NetLog::Source())),
send_pending_(false),
last_dscp_(net::DSCP_CS0),
throttler_(throttler) {
@@ -86,7 +85,7 @@ P2PSocketHostUdp::~P2PSocketHostUdp() {
}
bool P2PSocketHostUdp::Init(const net::IPEndPoint& local_address,
- const net::IPEndPoint& remote_address) {
+ const P2PHostAndIPEndPoint& remote_address) {
DCHECK_EQ(state_, STATE_UNINITIALIZED);
int result = socket_->Listen(local_address);
@@ -97,7 +96,7 @@ bool P2PSocketHostUdp::Init(const net::IPEndPoint& local_address,
}
// Setting recv socket buffer size.
- if (!socket_->SetReceiveBufferSize(kRecvSocketBufferSize)) {
+ if (socket_->SetReceiveBufferSize(kRecvSocketBufferSize) != net::OK) {
LOG(WARNING) << "Failed to set socket receive buffer size to "
<< kRecvSocketBufferSize;
}
@@ -162,7 +161,7 @@ void P2PSocketHostUdp::HandleReadResult(int result) {
if (!ContainsKey(connected_peers_, recv_address_)) {
P2PSocketHost::StunMessageType type;
bool stun = GetStunPacketType(&*data.begin(), data.size(), &type);
- if ((stun && IsRequestOrResponse(type)) || AllowUDPWithoutSTUN()) {
+ if ((stun && IsRequestOrResponse(type))) {
connected_peers_.insert(recv_address_);
} else if (!stun || type == STUN_DATA_INDICATION) {
LOG(ERROR) << "Received unexpected data packet from "
@@ -174,6 +173,9 @@ void P2PSocketHostUdp::HandleReadResult(int result) {
message_sender_->Send(new P2PMsg_OnDataReceived(
id_, recv_address_, data, base::TimeTicks::Now()));
+
+ if (dump_incoming_rtp_packet_)
+ DumpRtpPacket(&data[0], data.size(), true);
} else if (result < 0 && !IsTransientError(result)) {
LOG(ERROR) << "Error when reading from UDP socket: " << result;
OnError();
@@ -182,7 +184,7 @@ void P2PSocketHostUdp::HandleReadResult(int result) {
void P2PSocketHostUdp::Send(const net::IPEndPoint& to,
const std::vector<char>& data,
- net::DiffServCodePoint dscp,
+ const talk_base::PacketOptions& options,
uint64 packet_id) {
if (!socket_) {
// The Send message may be sent after the an OnError message was
@@ -190,7 +192,7 @@ void P2PSocketHostUdp::Send(const net::IPEndPoint& to,
return;
}
- if (!ContainsKey(connected_peers_, to) && !AllowUDPWithoutSTUN()) {
+ if (!ContainsKey(connected_peers_, to)) {
P2PSocketHost::StunMessageType type = P2PSocketHost::StunMessageType();
bool stun = GetStunPacketType(&*data.begin(), data.size(), &type);
if (!stun || type == STUN_DATA_INDICATION) {
@@ -208,9 +210,10 @@ void P2PSocketHostUdp::Send(const net::IPEndPoint& to,
}
if (send_pending_) {
- send_queue_.push_back(PendingPacket(to, data, dscp, packet_id));
+ send_queue_.push_back(PendingPacket(to, data, options, packet_id));
} else {
- PendingPacket packet(to, data, dscp, packet_id);
+ // TODO(mallinath: Remove unnecessary memcpy in this case.
+ PendingPacket packet(to, data, options, packet_id);
DoSend(packet);
}
}
@@ -222,11 +225,13 @@ void P2PSocketHostUdp::DoSend(const PendingPacket& packet) {
// 1. If the outgoing packet is set to DSCP_NO_CHANGE
// 2. If no change in DSCP value from last packet
// 3. If there is any error in setting DSCP on socket.
- if (packet.dscp != net::DSCP_NO_CHANGE &&
- last_dscp_ != packet.dscp && last_dscp_ != net::DSCP_NO_CHANGE) {
- int result = socket_->SetDiffServCodePoint(packet.dscp);
+ net::DiffServCodePoint dscp =
+ static_cast<net::DiffServCodePoint>(packet.packet_options.dscp);
+ if (dscp != net::DSCP_NO_CHANGE && last_dscp_ != dscp &&
+ last_dscp_ != net::DSCP_NO_CHANGE) {
+ int result = socket_->SetDiffServCodePoint(dscp);
if (result == net::OK) {
- last_dscp_ = packet.dscp;
+ last_dscp_ = dscp;
} else if (!IsTransientError(result) && last_dscp_ != net::DSCP_CS0) {
// We receieved a non-transient error, and it seems we have
// not changed the DSCP in the past, disable DSCP as it unlikely
@@ -234,6 +239,8 @@ void P2PSocketHostUdp::DoSend(const PendingPacket& packet) {
last_dscp_ = net::DSCP_NO_CHANGE;
}
}
+ packet_processing_helpers::ApplyPacketOptions(
+ packet.data->data(), packet.size, packet.packet_options, 0);
int result = socket_->SendTo(
packet.data.get(),
packet.size,
@@ -257,6 +264,9 @@ void P2PSocketHostUdp::DoSend(const PendingPacket& packet) {
} else {
HandleSendResult(packet.id, result);
}
+
+ if (dump_outgoing_rtp_packet_)
+ DumpRtpPacket(packet.data->data(), packet.size, false);
}
void P2PSocketHostUdp::OnSend(uint64 packet_id, int result) {
@@ -277,15 +287,16 @@ void P2PSocketHostUdp::OnSend(uint64 packet_id, int result) {
void P2PSocketHostUdp::HandleSendResult(uint64 packet_id, int result) {
TRACE_EVENT_ASYNC_END1("p2p", "Send", packet_id,
"result", result);
- if (result > 0) {
- message_sender_->Send(new P2PMsg_OnSendComplete(id_));
- } else if (IsTransientError(result)) {
+ if (result < 0) {
+ if (!IsTransientError(result)) {
+ LOG(ERROR) << "Error when sending data in UDP socket: " << result;
+ OnError();
+ return;
+ }
VLOG(0) << "sendto() has failed twice returning a "
- " transient error. Dropping the packet.";
- } else if (result < 0) {
- LOG(ERROR) << "Error when sending data in UDP socket: " << result;
- OnError();
+ " transient error. Dropping the packet.";
}
+ message_sender_->Send(new P2PMsg_OnSendComplete(id_));
}
P2PSocketHost* P2PSocketHostUdp::AcceptIncomingTcpConnection(
@@ -295,4 +306,20 @@ P2PSocketHost* P2PSocketHostUdp::AcceptIncomingTcpConnection(
return NULL;
}
+bool P2PSocketHostUdp::SetOption(P2PSocketOption option, int value) {
+ DCHECK_EQ(STATE_OPEN, state_);
+ switch (option) {
+ case P2P_SOCKET_OPT_RCVBUF:
+ return socket_->SetReceiveBufferSize(value) == net::OK;
+ case P2P_SOCKET_OPT_SNDBUF:
+ return socket_->SetSendBufferSize(value) == net::OK;
+ case P2P_SOCKET_OPT_DSCP:
+ return (net::OK == socket_->SetDiffServCodePoint(
+ static_cast<net::DiffServCodePoint>(value))) ? true : false;
+ default:
+ NOTREACHED();
+ return false;
+ }
+}
+
} // namespace content