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_tcp.h" | 5 #include "content/browser/renderer_host/p2p/socket_host_tcp.h" |
6 | 6 |
7 #include "base/sys_byteorder.h" | 7 #include "base/sys_byteorder.h" |
8 #include "content/common/p2p_messages.h" | 8 #include "content/common/p2p_messages.h" |
9 #include "ipc/ipc_sender.h" | 9 #include "ipc/ipc_sender.h" |
10 #include "jingle/glue/fake_ssl_client_socket.h" | 10 #include "jingle/glue/fake_ssl_client_socket.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 bool IsPseudoTlsClientSocket(content::P2PSocketType type) { | 38 bool IsPseudoTlsClientSocket(content::P2PSocketType type) { |
39 return (type == content::P2P_SOCKET_SSLTCP_CLIENT || | 39 return (type == content::P2P_SOCKET_SSLTCP_CLIENT || |
40 type == content::P2P_SOCKET_STUN_SSLTCP_CLIENT); | 40 type == content::P2P_SOCKET_STUN_SSLTCP_CLIENT); |
41 } | 41 } |
42 | 42 |
43 } // namespace | 43 } // namespace |
44 | 44 |
45 namespace content { | 45 namespace content { |
46 | 46 |
47 P2PSocketHostTcpBase::P2PSocketHostTcpBase( | 47 P2PSocketHostTcpBase::P2PSocketHostTcpBase( |
48 IPC::Sender* message_sender, | 48 IPC::Sender* message_sender, int id, |
49 int socket_id, | 49 P2PSocketType type, net::URLRequestContextGetter* url_context) |
50 P2PSocketType type, | 50 : P2PSocketHost(message_sender, id), |
51 net::URLRequestContextGetter* url_context) | |
52 : P2PSocketHost(message_sender, socket_id), | |
53 write_pending_(false), | 51 write_pending_(false), |
54 connected_(false), | 52 connected_(false), |
55 type_(type), | 53 type_(type), |
56 url_context_(url_context) { | 54 url_context_(url_context) { |
57 } | 55 } |
58 | 56 |
59 P2PSocketHostTcpBase::~P2PSocketHostTcpBase() { | 57 P2PSocketHostTcpBase::~P2PSocketHostTcpBase() { |
60 if (state_ == STATE_OPEN) { | 58 if (state_ == STATE_OPEN) { |
61 DCHECK(socket_.get()); | 59 DCHECK(socket_.get()); |
62 socket_.reset(); | 60 socket_.reset(); |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 << remote_address_.ip_address.ToString() | 280 << remote_address_.ip_address.ToString() |
283 << " before STUN binding is finished. " | 281 << " before STUN binding is finished. " |
284 << "Terminating connection."; | 282 << "Terminating connection."; |
285 OnError(); | 283 OnError(); |
286 return; | 284 return; |
287 } | 285 } |
288 } | 286 } |
289 | 287 |
290 message_sender_->Send(new P2PMsg_OnDataReceived( | 288 message_sender_->Send(new P2PMsg_OnDataReceived( |
291 id_, remote_address_.ip_address, data, base::TimeTicks::Now())); | 289 id_, remote_address_.ip_address, data, base::TimeTicks::Now())); |
292 | |
293 if (dump_incoming_rtp_packet_) | |
294 DumpRtpPacket(&data[0], data.size(), true); | |
295 } | 290 } |
296 | 291 |
297 // Note: dscp is not actually used on TCP sockets as this point, | 292 // Note: dscp is not actually used on TCP sockets as this point, |
298 // but may be honored in the future. | 293 // but may be honored in the future. |
299 void P2PSocketHostTcpBase::Send(const net::IPEndPoint& to, | 294 void P2PSocketHostTcpBase::Send(const net::IPEndPoint& to, |
300 const std::vector<char>& data, | 295 const std::vector<char>& data, |
301 const talk_base::PacketOptions& options, | 296 const talk_base::PacketOptions& options, |
302 uint64 packet_id) { | 297 uint64 packet_id) { |
303 if (!socket_) { | 298 if (!socket_) { |
304 // The Send message may be sent after the an OnError message was | 299 // The Send message may be sent after the an OnError message was |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 case P2P_SOCKET_OPT_SNDBUF: | 416 case P2P_SOCKET_OPT_SNDBUF: |
422 return socket_->SetSendBufferSize(value) == net::OK; | 417 return socket_->SetSendBufferSize(value) == net::OK; |
423 case P2P_SOCKET_OPT_DSCP: | 418 case P2P_SOCKET_OPT_DSCP: |
424 return false; // For TCP sockets DSCP setting is not available. | 419 return false; // For TCP sockets DSCP setting is not available. |
425 default: | 420 default: |
426 NOTREACHED(); | 421 NOTREACHED(); |
427 return false; | 422 return false; |
428 } | 423 } |
429 } | 424 } |
430 | 425 |
431 P2PSocketHostTcp::P2PSocketHostTcp(IPC::Sender* message_sender, | 426 P2PSocketHostTcp::P2PSocketHostTcp( |
432 int socket_id, | 427 IPC::Sender* message_sender, int id, |
433 P2PSocketType type, | 428 P2PSocketType type, net::URLRequestContextGetter* url_context) |
434 net::URLRequestContextGetter* url_context) | 429 : P2PSocketHostTcpBase(message_sender, id, type, url_context) { |
435 : P2PSocketHostTcpBase(message_sender, socket_id, type, url_context) { | |
436 DCHECK(type == P2P_SOCKET_TCP_CLIENT || | 430 DCHECK(type == P2P_SOCKET_TCP_CLIENT || |
437 type == P2P_SOCKET_SSLTCP_CLIENT || | 431 type == P2P_SOCKET_SSLTCP_CLIENT || |
438 type == P2P_SOCKET_TLS_CLIENT); | 432 type == P2P_SOCKET_TLS_CLIENT); |
439 } | 433 } |
440 | 434 |
441 P2PSocketHostTcp::~P2PSocketHostTcp() { | 435 P2PSocketHostTcp::~P2PSocketHostTcp() { |
442 } | 436 } |
443 | 437 |
444 int P2PSocketHostTcp::ProcessInput(char* input, int input_len) { | 438 int P2PSocketHostTcp::ProcessInput(char* input, int input_len) { |
445 if (input_len < kPacketHeaderSize) | 439 if (input_len < kPacketHeaderSize) |
(...skipping 22 matching lines...) Expand all Loading... |
468 packet_processing_helpers::ApplyPacketOptions( | 462 packet_processing_helpers::ApplyPacketOptions( |
469 buffer->data() + kPacketHeaderSize, | 463 buffer->data() + kPacketHeaderSize, |
470 buffer->BytesRemaining() - kPacketHeaderSize, | 464 buffer->BytesRemaining() - kPacketHeaderSize, |
471 options, 0); | 465 options, 0); |
472 | 466 |
473 WriteOrQueue(buffer); | 467 WriteOrQueue(buffer); |
474 } | 468 } |
475 | 469 |
476 // P2PSocketHostStunTcp | 470 // P2PSocketHostStunTcp |
477 P2PSocketHostStunTcp::P2PSocketHostStunTcp( | 471 P2PSocketHostStunTcp::P2PSocketHostStunTcp( |
478 IPC::Sender* message_sender, | 472 IPC::Sender* message_sender, int id, |
479 int socket_id, | 473 P2PSocketType type, net::URLRequestContextGetter* url_context) |
480 P2PSocketType type, | 474 : P2PSocketHostTcpBase(message_sender, id, type, url_context) { |
481 net::URLRequestContextGetter* url_context) | |
482 : P2PSocketHostTcpBase(message_sender, socket_id, type, url_context) { | |
483 DCHECK(type == P2P_SOCKET_STUN_TCP_CLIENT || | 475 DCHECK(type == P2P_SOCKET_STUN_TCP_CLIENT || |
484 type == P2P_SOCKET_STUN_SSLTCP_CLIENT || | 476 type == P2P_SOCKET_STUN_SSLTCP_CLIENT || |
485 type == P2P_SOCKET_STUN_TLS_CLIENT); | 477 type == P2P_SOCKET_STUN_TLS_CLIENT); |
486 } | 478 } |
487 | 479 |
488 P2PSocketHostStunTcp::~P2PSocketHostStunTcp() { | 480 P2PSocketHostStunTcp::~P2PSocketHostStunTcp() { |
489 } | 481 } |
490 | 482 |
491 int P2PSocketHostStunTcp::ProcessInput(char* input, int input_len) { | 483 int P2PSocketHostStunTcp::ProcessInput(char* input, int input_len) { |
492 if (input_len < kPacketHeaderSize + kPacketLengthOffset) | 484 if (input_len < kPacketHeaderSize + kPacketLengthOffset) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
540 | 532 |
541 packet_processing_helpers::ApplyPacketOptions( | 533 packet_processing_helpers::ApplyPacketOptions( |
542 buffer->data(), data.size(), options, 0); | 534 buffer->data(), data.size(), options, 0); |
543 | 535 |
544 if (pad_bytes) { | 536 if (pad_bytes) { |
545 char padding[4] = {0}; | 537 char padding[4] = {0}; |
546 DCHECK_LE(pad_bytes, 4); | 538 DCHECK_LE(pad_bytes, 4); |
547 memcpy(buffer->data() + data.size(), padding, pad_bytes); | 539 memcpy(buffer->data() + data.size(), padding, pad_bytes); |
548 } | 540 } |
549 WriteOrQueue(buffer); | 541 WriteOrQueue(buffer); |
550 | |
551 if (dump_outgoing_rtp_packet_) | |
552 DumpRtpPacket(buffer->data(), data.size(), false); | |
553 } | 542 } |
554 | 543 |
555 int P2PSocketHostStunTcp::GetExpectedPacketSize( | 544 int P2PSocketHostStunTcp::GetExpectedPacketSize( |
556 const char* data, int len, int* pad_bytes) { | 545 const char* data, int len, int* pad_bytes) { |
557 DCHECK_LE(kTurnChannelDataHeaderSize, len); | 546 DCHECK_LE(kTurnChannelDataHeaderSize, len); |
558 // Both stun and turn had length at offset 2. | 547 // Both stun and turn had length at offset 2. |
559 int packet_size = base::NetToHost16(*reinterpret_cast<const uint16*>( | 548 int packet_size = base::NetToHost16(*reinterpret_cast<const uint16*>( |
560 data + kPacketLengthOffset)); | 549 data + kPacketLengthOffset)); |
561 | 550 |
562 // Get packet type (STUN or TURN). | 551 // Get packet type (STUN or TURN). |
563 uint16 msg_type = base::NetToHost16(*reinterpret_cast<const uint16*>(data)); | 552 uint16 msg_type = base::NetToHost16(*reinterpret_cast<const uint16*>(data)); |
564 | 553 |
565 *pad_bytes = 0; | 554 *pad_bytes = 0; |
566 // Add heder length to packet length. | 555 // Add heder length to packet length. |
567 if ((msg_type & 0xC000) == 0) { | 556 if ((msg_type & 0xC000) == 0) { |
568 packet_size += kStunHeaderSize; | 557 packet_size += kStunHeaderSize; |
569 } else { | 558 } else { |
570 packet_size += kTurnChannelDataHeaderSize; | 559 packet_size += kTurnChannelDataHeaderSize; |
571 // Calculate any padding if present. | 560 // Calculate any padding if present. |
572 if (packet_size % 4) | 561 if (packet_size % 4) |
573 *pad_bytes = 4 - packet_size % 4; | 562 *pad_bytes = 4 - packet_size % 4; |
574 } | 563 } |
575 return packet_size; | 564 return packet_size; |
576 } | 565 } |
577 | 566 |
578 } // namespace content | 567 } // namespace content |
OLD | NEW |