diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn index 5838f31089..b27be1e266 100644 --- a/p2p/BUILD.gn +++ b/p2p/BUILD.gn @@ -98,6 +98,7 @@ rtc_library("rtc_p2p") { "../rtc_base", "../rtc_base:async_resolver_interface", "../rtc_base:async_socket", + "../rtc_base:callback_list", "../rtc_base:checks", "../rtc_base:ip_address", "../rtc_base:net_helpers", diff --git a/p2p/base/dtls_transport.cc b/p2p/base/dtls_transport.cc index 52fe5c65a2..b1fb162c0c 100644 --- a/p2p/base/dtls_transport.cc +++ b/p2p/base/dtls_transport.cc @@ -820,7 +820,9 @@ void DtlsTransport::set_dtls_state(DtlsTransportState state) { } void DtlsTransport::OnDtlsHandshakeError(rtc::SSLHandshakeError error) { + // Keep the old signaling for downstream usage. SignalDtlsHandshakeError(error); + SendDtlsHandshakeError(error); } void DtlsTransport::ConfigureHandshakeTimeout() { diff --git a/p2p/base/dtls_transport_internal.h b/p2p/base/dtls_transport_internal.h index 4c35d7371f..a85d7d2569 100644 --- a/p2p/base/dtls_transport_internal.h +++ b/p2p/base/dtls_transport_internal.h @@ -16,12 +16,14 @@ #include #include +#include #include "api/crypto/crypto_options.h" #include "api/dtls_transport_interface.h" #include "api/scoped_refptr.h" #include "p2p/base/ice_transport_internal.h" #include "p2p/base/packet_transport_internal.h" +#include "rtc_base/callback_list.h" #include "rtc_base/constructor_magic.h" #include "rtc_base/ssl_certificate.h" #include "rtc_base/ssl_fingerprint.h" @@ -116,12 +118,23 @@ class DtlsTransportInternal : public rtc::PacketTransportInternal { // Emitted whenever the Dtls handshake failed on some transport channel. sigslot::signal1 SignalDtlsHandshakeError; + // F: void(rtc::SSLHandshakeError) + template + void SubscribeDtlsHandshakeError(F&& callback) { + dtls_handshake_error_callback_list_.AddReceiver(std::forward(callback)); + } + + void SendDtlsHandshakeError(rtc::SSLHandshakeError error) { + dtls_handshake_error_callback_list_.Send(error); + } protected: DtlsTransportInternal(); private: RTC_DISALLOW_COPY_AND_ASSIGN(DtlsTransportInternal); + webrtc::CallbackList + dtls_handshake_error_callback_list_; }; } // namespace cricket diff --git a/pc/jsep_transport_controller.cc b/pc/jsep_transport_controller.cc index bb03cc78c3..045c991eea 100644 --- a/pc/jsep_transport_controller.cc +++ b/pc/jsep_transport_controller.cc @@ -477,8 +477,6 @@ JsepTransportController::CreateDtlsTransport( this, &JsepTransportController::OnTransportWritableState_n); dtls->SignalReceivingState.connect( this, &JsepTransportController::OnTransportReceivingState_n); - dtls->SignalDtlsHandshakeError.connect( - this, &JsepTransportController::OnDtlsHandshakeError); dtls->ice_transport()->SignalGatheringState.connect( this, &JsepTransportController::OnTransportGatheringState_n); dtls->ice_transport()->SignalCandidateGathered.connect( @@ -495,6 +493,9 @@ JsepTransportController::CreateDtlsTransport( this, &JsepTransportController::OnTransportStateChanged_n); dtls->ice_transport()->SignalCandidatePairChanged.connect( this, &JsepTransportController::OnTransportCandidatePairChanged_n); + + dtls->SubscribeDtlsHandshakeError( + [this](rtc::SSLHandshakeError error) { OnDtlsHandshakeError(error); }); return dtls; }