blob: a13a58c68e6619d6d5469c893bdb9a8135f9ddbb [file] [log] [blame]
* Copyright 2019 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 <memory>
#include "api/scoped_refptr.h"
#include "api/sctp_transport_interface.h"
#include "media/sctp/sctp_transport.h"
#include "pc/dtls_transport.h"
namespace webrtc {
// This implementation wraps a cricket::SctpTransport, and takes
// ownership of it.
// This object must be constructed and updated on the networking thread,
// the same thread as the one the cricket::SctpTransportInternal object
// lives on.
class SctpTransport : public SctpTransportInterface,
public sigslot::has_slots<> {
explicit SctpTransport(
std::unique_ptr<cricket::SctpTransportInternal> internal);
rtc::scoped_refptr<DtlsTransportInterface> dtls_transport() const override;
SctpTransportInformation Information() const override;
void RegisterObserver(SctpTransportObserverInterface* observer) override;
void UnregisterObserver() override;
// Internal functions
void Clear();
void SetDtlsTransport(rtc::scoped_refptr<DtlsTransport>);
// Initialize the cricket::SctpTransport. This can be called from
// the signaling thread.
void Start(int local_port, int remote_port, int max_message_size);
// TODO( Move functions that need
// internal() to be functions on the webrtc::SctpTransport interface,
// and make the internal() function private.
cricket::SctpTransportInternal* internal() {
rtc::CritScope scope(&lock_);
return internal_sctp_transport_.get();
const cricket::SctpTransportInternal* internal() const {
rtc::CritScope scope(&lock_);
return internal_sctp_transport_.get();
~SctpTransport() override;
void UpdateInformation(SctpTransportState state);
void OnInternalReadyToSendData();
void OnAssociationChangeCommunicationUp();
void OnInternalClosingProcedureStartedRemotely(int sid);
void OnInternalClosingProcedureComplete(int sid);
void OnDtlsStateChange(cricket::DtlsTransportInternal* transport,
cricket::DtlsTransportState state);
// Note - owner_thread never changes, but can't be const if we do
// Invoke() on it.
rtc::Thread* owner_thread_;
rtc::CriticalSection lock_;
// Variables accessible off-thread, guarded by lock_
SctpTransportInformation info_ RTC_GUARDED_BY(lock_);
std::unique_ptr<cricket::SctpTransportInternal> internal_sctp_transport_
// Variables only accessed on-thread
SctpTransportObserverInterface* observer_ RTC_GUARDED_BY(owner_thread_) =
rtc::scoped_refptr<DtlsTransport> dtls_transport_
} // namespace webrtc