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

Side by Side Diff: webrtc/p2p/base/dtlstransportchannel.cc

Issue 1912323002: Cache a ClientHello received before the DTLS handshake has started. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 8 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
OLDNEW
1 /* 1 /*
2 * Copyright 2011 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2011 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 462
463 if (!dtls_active_) { 463 if (!dtls_active_) {
464 // Not doing DTLS. 464 // Not doing DTLS.
465 SignalReadPacket(this, data, size, packet_time, 0); 465 SignalReadPacket(this, data, size, packet_time, 0);
466 return; 466 return;
467 } 467 }
468 468
469 switch (dtls_state()) { 469 switch (dtls_state()) {
470 case DTLS_TRANSPORT_NEW: 470 case DTLS_TRANSPORT_NEW:
471 if (dtls_) { 471 if (dtls_) {
472 // Drop packets received before DTLS has actually started. 472 LOG_J(LS_INFO, this) << "Packet received before DTLS started.";
473 LOG_J(LS_INFO, this) << "Dropping packet received before DTLS started.";
474 } else { 473 } else {
475 // Currently drop the packet, but we might in future 474 LOG_J(LS_WARNING, this) << "Packet received before we know if we are "
476 // decide to take this as evidence that the other 475 << "doing DTLS or not.";
477 // side is ready to do DTLS and start the handshake 476 }
478 // on our end. 477 // Cache the last DTLS packet (should be a client hello) received before
479 LOG_J(LS_WARNING, this) << "Received packet before we know if we are " 478 // DTLS has actually started.
480 << "doing DTLS or not; dropping."; 479 if (IsDtlsPacket(data, size)) {
juberti2 2016/04/25 20:40:18 We should probably also verify this is a CLIENT HE
Taylor Brandstetter 2016/04/26 22:55:58 Done.
480 LOG_J(LS_INFO, this) << "Caching DTLS packet until DTLS is started.";
481 cached_dtls_packet_.SetData(data, size);
482 } else {
483 LOG_J(LS_INFO, this) << "Not a DTLS packet; dropping.";
481 } 484 }
482 break; 485 break;
483 486
484 case DTLS_TRANSPORT_CONNECTING: 487 case DTLS_TRANSPORT_CONNECTING:
485 case DTLS_TRANSPORT_CONNECTED: 488 case DTLS_TRANSPORT_CONNECTED:
486 // We should only get DTLS or SRTP packets; STUN's already been demuxed. 489 // We should only get DTLS or SRTP packets; STUN's already been demuxed.
487 // Is this potentially a DTLS packet? 490 // Is this potentially a DTLS packet?
488 if (IsDtlsPacket(data, size)) { 491 if (IsDtlsPacket(data, size)) {
489 if (!HandleDtlsPacket(data, size)) { 492 if (!HandleDtlsPacket(data, size)) {
490 LOG_J(LS_ERROR, this) << "Failed to handle DTLS packet."; 493 LOG_J(LS_ERROR, this) << "Failed to handle DTLS packet.";
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
569 bool DtlsTransportChannelWrapper::MaybeStartDtls() { 572 bool DtlsTransportChannelWrapper::MaybeStartDtls() {
570 if (dtls_ && channel_->writable()) { 573 if (dtls_ && channel_->writable()) {
571 if (dtls_->StartSSLWithPeer()) { 574 if (dtls_->StartSSLWithPeer()) {
572 LOG_J(LS_ERROR, this) << "Couldn't start DTLS handshake"; 575 LOG_J(LS_ERROR, this) << "Couldn't start DTLS handshake";
573 set_dtls_state(DTLS_TRANSPORT_FAILED); 576 set_dtls_state(DTLS_TRANSPORT_FAILED);
574 return false; 577 return false;
575 } 578 }
576 LOG_J(LS_INFO, this) 579 LOG_J(LS_INFO, this)
577 << "DtlsTransportChannelWrapper: Started DTLS handshake"; 580 << "DtlsTransportChannelWrapper: Started DTLS handshake";
578 set_dtls_state(DTLS_TRANSPORT_CONNECTING); 581 set_dtls_state(DTLS_TRANSPORT_CONNECTING);
582 // Now that the handshake has started, we can process a cached packet
583 // (if one exists).
584 if (cached_dtls_packet_.size()) {
585 if (ssl_role_ == rtc::SSL_SERVER) {
586 LOG_J(LS_INFO, this) << "Handling cached DTLS packet.";
587 if (!HandleDtlsPacket(cached_dtls_packet_.data<char>(),
588 cached_dtls_packet_.size())) {
589 LOG_J(LS_ERROR, this) << "Failed to handle DTLS packet.";
590 }
591 } else {
592 LOG_J(LS_WARNING, this) << "Discarding cached DTLS packet because "
juberti2 2016/04/25 20:40:18 Log text could be clearer to indicate this is a re
Taylor Brandstetter 2016/04/26 22:55:58 Now that the message is changed to "discarding cac
593 << "we don't have the server role.";
594 }
595 cached_dtls_packet_.Clear();
596 }
579 } 597 }
580 return true; 598 return true;
581 } 599 }
582 600
583 // Called from OnReadPacket when a DTLS packet is received. 601 // Called from OnReadPacket when a DTLS packet is received.
584 bool DtlsTransportChannelWrapper::HandleDtlsPacket(const char* data, 602 bool DtlsTransportChannelWrapper::HandleDtlsPacket(const char* data,
585 size_t size) { 603 size_t size) {
586 // Sanity check we're not passing junk that 604 // Sanity check we're not passing junk that
587 // just looks like DTLS. 605 // just looks like DTLS.
588 const uint8_t* tmp_data = reinterpret_cast<const uint8_t*>(data); 606 const uint8_t* tmp_data = reinterpret_cast<const uint8_t*>(data);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 671
654 void DtlsTransportChannelWrapper::Reconnect() { 672 void DtlsTransportChannelWrapper::Reconnect() {
655 set_dtls_state(DTLS_TRANSPORT_NEW); 673 set_dtls_state(DTLS_TRANSPORT_NEW);
656 set_writable(false); 674 set_writable(false);
657 if (channel_->writable()) { 675 if (channel_->writable()) {
658 OnWritableState(channel_); 676 OnWritableState(channel_);
659 } 677 }
660 } 678 }
661 679
662 } // namespace cricket 680 } // namespace cricket
OLDNEW
« webrtc/p2p/base/dtlstransportchannel.h ('K') | « webrtc/p2p/base/dtlstransportchannel.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698