| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/p2p/socket_host_udp.h" | 5 #include "content/browser/renderer_host/p2p/socket_host_udp.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "content/browser/renderer_host/p2p/socket_host_throttler.h" | 10 #include "content/browser/renderer_host/p2p/socket_host_throttler.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 P2PSocketHostUdp::P2PSocketHostUdp(IPC::Sender* message_sender, | 68 P2PSocketHostUdp::P2PSocketHostUdp(IPC::Sender* message_sender, |
| 69 int socket_id, | 69 int socket_id, |
| 70 P2PMessageThrottler* throttler) | 70 P2PMessageThrottler* throttler) |
| 71 : P2PSocketHost(message_sender, socket_id), | 71 : P2PSocketHost(message_sender, socket_id), |
| 72 socket_( | 72 socket_( |
| 73 new net::UDPServerSocket(GetContentClient()->browser()->GetNetLog(), | 73 new net::UDPServerSocket(GetContentClient()->browser()->GetNetLog(), |
| 74 net::NetLog::Source())), | 74 net::NetLog::Source())), |
| 75 send_pending_(false), | 75 send_pending_(false), |
| 76 last_dscp_(net::DSCP_CS0), | 76 last_dscp_(net::DSCP_CS0), |
| 77 throttler_(throttler) { | 77 throttler_(throttler) { |
| 78 protocol_type_ = P2PSocketHost::UDP; |
| 78 } | 79 } |
| 79 | 80 |
| 80 P2PSocketHostUdp::~P2PSocketHostUdp() { | 81 P2PSocketHostUdp::~P2PSocketHostUdp() { |
| 81 if (state_ == STATE_OPEN) { | 82 if (state_ == STATE_OPEN) { |
| 82 DCHECK(socket_.get()); | 83 DCHECK(socket_.get()); |
| 83 socket_.reset(); | 84 socket_.reset(); |
| 84 } | 85 } |
| 85 } | 86 } |
| 86 | 87 |
| 87 bool P2PSocketHostUdp::Init(const net::IPEndPoint& local_address, | 88 bool P2PSocketHostUdp::Init(const net::IPEndPoint& local_address, |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 return; | 205 return; |
| 205 } | 206 } |
| 206 | 207 |
| 207 if (throttler_->DropNextPacket(data.size())) { | 208 if (throttler_->DropNextPacket(data.size())) { |
| 208 VLOG(0) << "STUN message is dropped due to high volume."; | 209 VLOG(0) << "STUN message is dropped due to high volume."; |
| 209 // Do not reset socket. | 210 // Do not reset socket. |
| 210 return; | 211 return; |
| 211 } | 212 } |
| 212 } | 213 } |
| 213 | 214 |
| 215 IncrementTotalSentPackets(); |
| 216 |
| 214 if (send_pending_) { | 217 if (send_pending_) { |
| 215 send_queue_.push_back(PendingPacket(to, data, options, packet_id)); | 218 send_queue_.push_back(PendingPacket(to, data, options, packet_id)); |
| 219 IncrementDelayedBytes(data.size()); |
| 220 IncrementDelayedPackets(); |
| 216 } else { | 221 } else { |
| 217 // TODO(mallinath: Remove unnecessary memcpy in this case. | 222 // TODO(mallinath: Remove unnecessary memcpy in this case. |
| 218 PendingPacket packet(to, data, options, packet_id); | 223 PendingPacket packet(to, data, options, packet_id); |
| 219 DoSend(packet); | 224 DoSend(packet); |
| 220 } | 225 } |
| 221 } | 226 } |
| 222 | 227 |
| 223 void P2PSocketHostUdp::DoSend(const PendingPacket& packet) { | 228 void P2PSocketHostUdp::DoSend(const PendingPacket& packet) { |
| 224 TRACE_EVENT_ASYNC_STEP_INTO1("p2p", "Send", packet.id, "UdpAsyncSendTo", | 229 TRACE_EVENT_ASYNC_STEP_INTO1("p2p", "Send", packet.id, "UdpAsyncSendTo", |
| 225 "size", packet.size); | 230 "size", packet.size); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 void P2PSocketHostUdp::OnSend(uint64 packet_id, int result) { | 279 void P2PSocketHostUdp::OnSend(uint64 packet_id, int result) { |
| 275 DCHECK(send_pending_); | 280 DCHECK(send_pending_); |
| 276 DCHECK_NE(result, net::ERR_IO_PENDING); | 281 DCHECK_NE(result, net::ERR_IO_PENDING); |
| 277 | 282 |
| 278 send_pending_ = false; | 283 send_pending_ = false; |
| 279 | 284 |
| 280 HandleSendResult(packet_id, result); | 285 HandleSendResult(packet_id, result); |
| 281 | 286 |
| 282 // Send next packets if we have them waiting in the buffer. | 287 // Send next packets if we have them waiting in the buffer. |
| 283 while (state_ == STATE_OPEN && !send_queue_.empty() && !send_pending_) { | 288 while (state_ == STATE_OPEN && !send_queue_.empty() && !send_pending_) { |
| 284 DoSend(send_queue_.front()); | 289 PendingPacket packet = send_queue_.front(); |
| 290 DoSend(packet); |
| 285 send_queue_.pop_front(); | 291 send_queue_.pop_front(); |
| 292 DecrementDelayedBytes(packet.size); |
| 286 } | 293 } |
| 287 } | 294 } |
| 288 | 295 |
| 289 void P2PSocketHostUdp::HandleSendResult(uint64 packet_id, int result) { | 296 void P2PSocketHostUdp::HandleSendResult(uint64 packet_id, int result) { |
| 290 TRACE_EVENT_ASYNC_END1("p2p", "Send", packet_id, | 297 TRACE_EVENT_ASYNC_END1("p2p", "Send", packet_id, |
| 291 "result", result); | 298 "result", result); |
| 292 if (result < 0) { | 299 if (result < 0) { |
| 293 if (!IsTransientError(result)) { | 300 if (!IsTransientError(result)) { |
| 294 LOG(ERROR) << "Error when sending data in UDP socket: " << result; | 301 LOG(ERROR) << "Error when sending data in UDP socket: " << result; |
| 295 OnError(); | 302 OnError(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 318 case P2P_SOCKET_OPT_DSCP: | 325 case P2P_SOCKET_OPT_DSCP: |
| 319 return (net::OK == socket_->SetDiffServCodePoint( | 326 return (net::OK == socket_->SetDiffServCodePoint( |
| 320 static_cast<net::DiffServCodePoint>(value))) ? true : false; | 327 static_cast<net::DiffServCodePoint>(value))) ? true : false; |
| 321 default: | 328 default: |
| 322 NOTREACHED(); | 329 NOTREACHED(); |
| 323 return false; | 330 return false; |
| 324 } | 331 } |
| 325 } | 332 } |
| 326 | 333 |
| 327 } // namespace content | 334 } // namespace content |
| OLD | NEW |