Chromium Code Reviews| 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/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 263 void P2PSocketHostUdp::Send(const net::IPEndPoint& to, | 263 void P2PSocketHostUdp::Send(const net::IPEndPoint& to, |
| 264 const std::vector<char>& data, | 264 const std::vector<char>& data, |
| 265 const rtc::PacketOptions& options, | 265 const rtc::PacketOptions& options, |
| 266 uint64_t packet_id) { | 266 uint64_t packet_id) { |
| 267 if (!socket_) { | 267 if (!socket_) { |
| 268 // The Send message may be sent after the an OnError message was | 268 // The Send message may be sent after the an OnError message was |
| 269 // sent by hasn't been processed the renderer. | 269 // sent by hasn't been processed the renderer. |
| 270 return; | 270 return; |
| 271 } | 271 } |
| 272 | 272 |
| 273 if (!base::ContainsKey(connected_peers_, to)) { | |
| 274 P2PSocketHost::StunMessageType type = P2PSocketHost::StunMessageType(); | |
| 275 bool stun = GetStunPacketType(&*data.begin(), data.size(), &type); | |
| 276 if (!stun || type == STUN_DATA_INDICATION) { | |
| 277 LOG(ERROR) << "Page tried to send a data packet to " << to.ToString() | |
| 278 << " before STUN binding is finished."; | |
| 279 OnError(); | |
| 280 return; | |
| 281 } | |
| 282 | |
| 283 if (throttler_->DropNextPacket(data.size())) { | |
| 284 VLOG(0) << "STUN message is dropped due to high volume."; | |
| 285 // Do not reset socket. | |
| 286 return; | |
| 287 } | |
| 288 } | |
| 289 | |
| 290 IncrementTotalSentPackets(); | 273 IncrementTotalSentPackets(); |
| 291 | 274 |
| 292 if (send_pending_) { | 275 if (send_pending_) { |
| 293 send_queue_.push_back(PendingPacket(to, data, options, packet_id)); | 276 send_queue_.push_back(PendingPacket(to, data, options, packet_id)); |
| 294 IncrementDelayedBytes(data.size()); | 277 IncrementDelayedBytes(data.size()); |
| 295 IncrementDelayedPackets(); | 278 IncrementDelayedPackets(); |
| 296 } else { | 279 } else { |
| 297 // TODO(mallinath: Remove unnecessary memcpy in this case. | 280 // TODO(mallinath: Remove unnecessary memcpy in this case. |
| 298 PendingPacket packet(to, data, options, packet_id); | 281 PendingPacket packet(to, data, options, packet_id); |
| 299 DoSend(packet); | 282 DoSend(packet); |
| 300 } | 283 } |
| 301 } | 284 } |
| 302 | 285 |
| 303 void P2PSocketHostUdp::DoSend(const PendingPacket& packet) { | 286 void P2PSocketHostUdp::DoSend(const PendingPacket& packet) { |
| 287 base::TimeTicks send_time = base::TimeTicks::Now(); | |
| 288 | |
| 289 if (!base::ContainsKey(connected_peers_, packet.to)) { | |
| 290 P2PSocketHost::StunMessageType type = P2PSocketHost::StunMessageType(); | |
| 291 bool stun = GetStunPacketType(packet.data->data(), packet.size, &type); | |
| 292 if (!stun || type == STUN_DATA_INDICATION) { | |
| 293 LOG(ERROR) << "Page tried to send a data packet to " | |
| 294 << packet.to.ToString() << " before STUN binding is finished."; | |
| 295 OnError(); | |
| 296 return; | |
| 297 } | |
| 298 | |
| 299 if (throttler_->DropNextPacket(packet.size)) { | |
| 300 VLOG(0) << "STUN message is dropped due to high volume."; | |
| 301 message_sender_->Send(new P2PMsg_OnSendComplete( | |
| 302 id_, P2PSendPacketMetrics(packet.id, packet.packet_options.packet_id, | |
| 303 send_time))); | |
|
pthatcher2
2016/09/02 05:21:19
We should leave a comment about how important it i
Sergey Ulanov
2016/09/02 17:00:46
Done.
| |
| 304 // Do not reset socket. | |
| 305 return; | |
| 306 } | |
| 307 } | |
| 308 | |
| 304 TRACE_EVENT_ASYNC_STEP_INTO1("p2p", "Send", packet.id, "UdpAsyncSendTo", | 309 TRACE_EVENT_ASYNC_STEP_INTO1("p2p", "Send", packet.id, "UdpAsyncSendTo", |
| 305 "size", packet.size); | 310 "size", packet.size); |
| 306 // Don't try to set DSCP in following conditions, | 311 // Don't try to set DSCP in following conditions, |
| 307 // 1. If the outgoing packet is set to DSCP_NO_CHANGE | 312 // 1. If the outgoing packet is set to DSCP_NO_CHANGE |
| 308 // 2. If no change in DSCP value from last packet | 313 // 2. If no change in DSCP value from last packet |
| 309 // 3. If there is any error in setting DSCP on socket. | 314 // 3. If there is any error in setting DSCP on socket. |
| 310 net::DiffServCodePoint dscp = | 315 net::DiffServCodePoint dscp = |
| 311 static_cast<net::DiffServCodePoint>(packet.packet_options.dscp); | 316 static_cast<net::DiffServCodePoint>(packet.packet_options.dscp); |
| 312 if (dscp != net::DSCP_NO_CHANGE && last_dscp_ != dscp && | 317 if (dscp != net::DSCP_NO_CHANGE && last_dscp_ != dscp && |
| 313 last_dscp_ != net::DSCP_NO_CHANGE) { | 318 last_dscp_ != net::DSCP_NO_CHANGE) { |
| 314 int result = socket_->SetDiffServCodePoint(dscp); | 319 int result = socket_->SetDiffServCodePoint(dscp); |
| 315 if (result == net::OK) { | 320 if (result == net::OK) { |
| 316 last_dscp_ = dscp; | 321 last_dscp_ = dscp; |
| 317 } else if (!IsTransientError(result) && last_dscp_ != net::DSCP_CS0) { | 322 } else if (!IsTransientError(result) && last_dscp_ != net::DSCP_CS0) { |
| 318 // We receieved a non-transient error, and it seems we have | 323 // We receieved a non-transient error, and it seems we have |
| 319 // not changed the DSCP in the past, disable DSCP as it unlikely | 324 // not changed the DSCP in the past, disable DSCP as it unlikely |
| 320 // to work in the future. | 325 // to work in the future. |
| 321 last_dscp_ = net::DSCP_NO_CHANGE; | 326 last_dscp_ = net::DSCP_NO_CHANGE; |
| 322 } | 327 } |
| 323 } | 328 } |
| 324 | 329 |
| 325 base::TimeTicks send_time = base::TimeTicks::Now(); | |
| 326 cricket::ApplyPacketOptions(reinterpret_cast<uint8_t*>(packet.data->data()), | 330 cricket::ApplyPacketOptions(reinterpret_cast<uint8_t*>(packet.data->data()), |
| 327 packet.size, | 331 packet.size, |
| 328 packet.packet_options.packet_time_params, | 332 packet.packet_options.packet_time_params, |
| 329 (send_time - base::TimeTicks()).InMicroseconds()); | 333 (send_time - base::TimeTicks()).InMicroseconds()); |
| 330 auto callback_binding = | 334 auto callback_binding = |
| 331 base::Bind(&P2PSocketHostUdp::OnSend, base::Unretained(this), packet.id, | 335 base::Bind(&P2PSocketHostUdp::OnSend, base::Unretained(this), packet.id, |
| 332 packet.packet_options.packet_id, send_time); | 336 packet.packet_options.packet_id, send_time); |
| 333 int result = socket_->SendTo(packet.data.get(), packet.size, packet.to, | 337 int result = socket_->SendTo(packet.data.get(), packet.size, packet.to, |
| 334 callback_binding); | 338 callback_binding); |
| 335 | 339 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 436 net::UDPServerSocket* socket = new net::UDPServerSocket( | 440 net::UDPServerSocket* socket = new net::UDPServerSocket( |
| 437 GetContentClient()->browser()->GetNetLog(), net::NetLog::Source()); | 441 GetContentClient()->browser()->GetNetLog(), net::NetLog::Source()); |
| 438 #if defined(OS_WIN) | 442 #if defined(OS_WIN) |
| 439 socket->UseNonBlockingIO(); | 443 socket->UseNonBlockingIO(); |
| 440 #endif | 444 #endif |
| 441 | 445 |
| 442 return base::WrapUnique(socket); | 446 return base::WrapUnique(socket); |
| 443 } | 447 } |
| 444 | 448 |
| 445 } // namespace content | 449 } // namespace content |
| OLD | NEW |