dtls_transport will when detecting a new fingerprint (e.g by usage of pranswer) signal DtlsTransportState::kNew. When this happen, the dtls crypto state is lost, and sctp should reconnect, srtp does this automatically in current code base. The existing behavior in dcsctp is that it will detect peer sending an init, and reconnect. But any messages sent between the dtls restart and the message arriving from the peer will be lost. This patch changes so that this case is gracefully handled by a) letting dcsctp_transport listen to dtls state this is big part of patch and involves changing the type of the underlying dtransport from rtc::PacketTransportInternal to cricket::DtlsTransportInternal. If requested, I can put this into a separate patch... b) if a dtls restart happens, delete and restart socket. Testcase that fails before patch and works after is attached. Bonus: And include-what-you-use on patch Bug: b/375327137 Change-Id: Ib78488ae75fd8aeb50d121adf464a33dabbf95e2 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/367202 Commit-Queue: Jonas Oreland <jonaso@webrtc.org> Reviewed-by: Victor Boivie <boivie@webrtc.org> Commit-Queue: Harald Alvestrand <hta@webrtc.org> Auto-Submit: Jonas Oreland <jonaso@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#43546}
40 lines
1.2 KiB
C++
40 lines
1.2 KiB
C++
/*
|
|
* Copyright 2021 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "media/sctp/sctp_transport_factory.h"
|
|
|
|
#include "api/environment/environment.h"
|
|
#include "p2p/dtls/dtls_transport_internal.h"
|
|
#include "rtc_base/system/unused.h"
|
|
|
|
#ifdef WEBRTC_HAVE_DCSCTP
|
|
#include "media/sctp/dcsctp_transport.h" // nogncheck
|
|
#endif
|
|
|
|
namespace cricket {
|
|
|
|
SctpTransportFactory::SctpTransportFactory(rtc::Thread* network_thread)
|
|
: network_thread_(network_thread) {
|
|
RTC_UNUSED(network_thread_);
|
|
}
|
|
|
|
std::unique_ptr<SctpTransportInternal>
|
|
SctpTransportFactory::CreateSctpTransport(const webrtc::Environment& env,
|
|
DtlsTransportInternal* transport) {
|
|
std::unique_ptr<SctpTransportInternal> result;
|
|
#ifdef WEBRTC_HAVE_DCSCTP
|
|
result = std::unique_ptr<SctpTransportInternal>(
|
|
new webrtc::DcSctpTransport(env, network_thread_, transport));
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
} // namespace cricket
|