Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: content/browser/renderer_host/p2p/socket_host_tcp.cc

Issue 159353002: This CL adds methods to manipulate RTP header extension, particularly (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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"
11 #include "jingle/glue/proxy_resolving_client_socket.h" 11 #include "jingle/glue/proxy_resolving_client_socket.h"
12 #include "net/base/io_buffer.h" 12 #include "net/base/io_buffer.h"
13 #include "net/base/net_errors.h" 13 #include "net/base/net_errors.h"
14 #include "net/base/net_util.h" 14 #include "net/base/net_util.h"
15 #include "net/socket/client_socket_factory.h" 15 #include "net/socket/client_socket_factory.h"
16 #include "net/socket/client_socket_handle.h" 16 #include "net/socket/client_socket_handle.h"
17 #include "net/socket/ssl_client_socket.h" 17 #include "net/socket/ssl_client_socket.h"
18 #include "net/socket/tcp_client_socket.h" 18 #include "net/socket/tcp_client_socket.h"
19 #include "net/url_request/url_request_context.h" 19 #include "net/url_request/url_request_context.h"
20 #include "net/url_request/url_request_context_getter.h" 20 #include "net/url_request/url_request_context_getter.h"
21 #include "third_party/libjingle/source/talk/base/asyncpacketsocket.h"
21 22
22 namespace { 23 namespace {
23 24
24 typedef uint16 PacketLength; 25 typedef uint16 PacketLength;
25 const int kPacketHeaderSize = sizeof(PacketLength); 26 const int kPacketHeaderSize = sizeof(PacketLength);
26 const int kReadBufferSize = 4096; 27 const int kReadBufferSize = 4096;
27 const int kPacketLengthOffset = 2; 28 const int kPacketLengthOffset = 2;
28 const int kTurnChannelDataHeaderSize = 4; 29 const int kTurnChannelDataHeaderSize = 4;
29 const int kRecvSocketBufferSize = 128 * 1024; 30 const int kRecvSocketBufferSize = 128 * 1024;
30 const int kSendSocketBufferSize = 128 * 1024; 31 const int kSendSocketBufferSize = 128 * 1024;
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 P2PSocketHost::StunMessageType type = P2PSocketHost::StunMessageType(); 309 P2PSocketHost::StunMessageType type = P2PSocketHost::StunMessageType();
309 bool stun = GetStunPacketType(&*data.begin(), data.size(), &type); 310 bool stun = GetStunPacketType(&*data.begin(), data.size(), &type);
310 if (!stun || type == STUN_DATA_INDICATION) { 311 if (!stun || type == STUN_DATA_INDICATION) {
311 LOG(ERROR) << "Page tried to send a data packet to " << to.ToString() 312 LOG(ERROR) << "Page tried to send a data packet to " << to.ToString()
312 << " before STUN binding is finished."; 313 << " before STUN binding is finished.";
313 OnError(); 314 OnError();
314 return; 315 return;
315 } 316 }
316 } 317 }
317 318
318 DoSend(to, data); 319 DoSend(to, data, options);
319 } 320 }
320 321
321 void P2PSocketHostTcpBase::WriteOrQueue( 322 void P2PSocketHostTcpBase::WriteOrQueue(
322 scoped_refptr<net::DrainableIOBuffer>& buffer) { 323 scoped_refptr<net::DrainableIOBuffer>& buffer) {
323 if (write_buffer_.get()) { 324 if (write_buffer_.get()) {
324 write_queue_.push(buffer); 325 write_queue_.push(buffer);
325 return; 326 return;
326 } 327 }
327 328
328 write_buffer_ = buffer; 329 write_buffer_ = buffer;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 441
441 int consumed = kPacketHeaderSize; 442 int consumed = kPacketHeaderSize;
442 char* cur = input + consumed; 443 char* cur = input + consumed;
443 std::vector<char> data(cur, cur + packet_size); 444 std::vector<char> data(cur, cur + packet_size);
444 OnPacket(data); 445 OnPacket(data);
445 consumed += packet_size; 446 consumed += packet_size;
446 return consumed; 447 return consumed;
447 } 448 }
448 449
449 void P2PSocketHostTcp::DoSend(const net::IPEndPoint& to, 450 void P2PSocketHostTcp::DoSend(const net::IPEndPoint& to,
450 const std::vector<char>& data) { 451 const std::vector<char>& data,
452 const talk_base::PacketOptions& options) {
451 int size = kPacketHeaderSize + data.size(); 453 int size = kPacketHeaderSize + data.size();
452 scoped_refptr<net::DrainableIOBuffer> buffer = 454 scoped_refptr<net::DrainableIOBuffer> buffer =
453 new net::DrainableIOBuffer(new net::IOBuffer(size), size); 455 new net::DrainableIOBuffer(new net::IOBuffer(size), size);
454 *reinterpret_cast<uint16*>(buffer->data()) = base::HostToNet16(data.size()); 456 *reinterpret_cast<uint16*>(buffer->data()) = base::HostToNet16(data.size());
455 memcpy(buffer->data() + kPacketHeaderSize, &data[0], data.size()); 457 memcpy(buffer->data() + kPacketHeaderSize, &data[0], data.size());
456 458
459 packet_processing_helpers::MaybeUpdatePacketAbsSendTimeExtnAndRtpAuthTag(
460 buffer->data(), buffer->BytesRemaining(), options);
461
457 WriteOrQueue(buffer); 462 WriteOrQueue(buffer);
458 } 463 }
459 464
460 // P2PSocketHostStunTcp 465 // P2PSocketHostStunTcp
461 P2PSocketHostStunTcp::P2PSocketHostStunTcp( 466 P2PSocketHostStunTcp::P2PSocketHostStunTcp(
462 IPC::Sender* message_sender, int id, 467 IPC::Sender* message_sender, int id,
463 P2PSocketType type, net::URLRequestContextGetter* url_context) 468 P2PSocketType type, net::URLRequestContextGetter* url_context)
464 : P2PSocketHostTcpBase(message_sender, id, type, url_context) { 469 : P2PSocketHostTcpBase(message_sender, id, type, url_context) {
465 DCHECK(type == P2P_SOCKET_STUN_TCP_CLIENT || 470 DCHECK(type == P2P_SOCKET_STUN_TCP_CLIENT ||
466 type == P2P_SOCKET_STUN_SSLTCP_CLIENT || 471 type == P2P_SOCKET_STUN_SSLTCP_CLIENT ||
(...skipping 18 matching lines...) Expand all
485 int consumed = 0; 490 int consumed = 0;
486 char* cur = input; 491 char* cur = input;
487 std::vector<char> data(cur, cur + packet_size); 492 std::vector<char> data(cur, cur + packet_size);
488 OnPacket(data); 493 OnPacket(data);
489 consumed += packet_size; 494 consumed += packet_size;
490 consumed += pad_bytes; 495 consumed += pad_bytes;
491 return consumed; 496 return consumed;
492 } 497 }
493 498
494 void P2PSocketHostStunTcp::DoSend(const net::IPEndPoint& to, 499 void P2PSocketHostStunTcp::DoSend(const net::IPEndPoint& to,
495 const std::vector<char>& data) { 500 const std::vector<char>& data,
501 const talk_base::PacketOptions& options) {
496 // Each packet is expected to have header (STUN/TURN ChannelData), where 502 // Each packet is expected to have header (STUN/TURN ChannelData), where
497 // header contains message type and and length of message. 503 // header contains message type and and length of message.
498 if (data.size() < kPacketHeaderSize + kPacketLengthOffset) { 504 if (data.size() < kPacketHeaderSize + kPacketLengthOffset) {
499 NOTREACHED(); 505 NOTREACHED();
500 OnError(); 506 OnError();
501 return; 507 return;
502 } 508 }
503 509
504 int pad_bytes; 510 int pad_bytes;
505 size_t expected_len = GetExpectedPacketSize( 511 size_t expected_len = GetExpectedPacketSize(
506 &data[0], data.size(), &pad_bytes); 512 &data[0], data.size(), &pad_bytes);
507 513
508 // Accepts only complete STUN/TURN packets. 514 // Accepts only complete STUN/TURN packets.
509 if (data.size() != expected_len) { 515 if (data.size() != expected_len) {
510 NOTREACHED(); 516 NOTREACHED();
511 OnError(); 517 OnError();
512 return; 518 return;
513 } 519 }
514 520
515 // Add any pad bytes to the total size. 521 // Add any pad bytes to the total size.
516 int size = data.size() + pad_bytes; 522 int size = data.size() + pad_bytes;
517 523
518 scoped_refptr<net::DrainableIOBuffer> buffer = 524 scoped_refptr<net::DrainableIOBuffer> buffer =
519 new net::DrainableIOBuffer(new net::IOBuffer(size), size); 525 new net::DrainableIOBuffer(new net::IOBuffer(size), size);
520 memcpy(buffer->data(), &data[0], data.size()); 526 memcpy(buffer->data(), &data[0], data.size());
521 527
528 // Update HMAC before writing padding bytes at the end.
Solis 2014/03/06 09:41:53 Comment is not true. AST will also be updated if p
Mallinath (Gone from Chromium) 2014/03/06 16:18:13 comment is still true, I just not mentioned AST in
Solis 2014/03/06 16:36:28 Don't you think that is misleading? Remove the com
Mallinath (Gone from Chromium) 2014/03/07 04:02:37 Done.
529 packet_processing_helpers::MaybeUpdatePacketAbsSendTimeExtnAndRtpAuthTag(
530 buffer->data(), data.size(), options);
531
522 if (pad_bytes) { 532 if (pad_bytes) {
523 char padding[4] = {0}; 533 char padding[4] = {0};
524 DCHECK_LE(pad_bytes, 4); 534 DCHECK_LE(pad_bytes, 4);
525 memcpy(buffer->data() + data.size(), padding, pad_bytes); 535 memcpy(buffer->data() + data.size(), padding, pad_bytes);
526 } 536 }
527 WriteOrQueue(buffer); 537 WriteOrQueue(buffer);
528 } 538 }
529 539
530 int P2PSocketHostStunTcp::GetExpectedPacketSize( 540 int P2PSocketHostStunTcp::GetExpectedPacketSize(
531 const char* data, int len, int* pad_bytes) { 541 const char* data, int len, int* pad_bytes) {
(...skipping 12 matching lines...) Expand all
544 } else { 554 } else {
545 packet_size += kTurnChannelDataHeaderSize; 555 packet_size += kTurnChannelDataHeaderSize;
546 // Calculate any padding if present. 556 // Calculate any padding if present.
547 if (packet_size % 4) 557 if (packet_size % 4)
548 *pad_bytes = 4 - packet_size % 4; 558 *pad_bytes = 4 - packet_size % 4;
549 } 559 }
550 return packet_size; 560 return packet_size;
551 } 561 }
552 562
553 } // namespace content 563 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698