| /* |
| * 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. |
| */ |
| |
| #ifndef PC_SCTP_TRANSPORT_H_ |
| #define PC_SCTP_TRANSPORT_H_ |
| |
| #include <memory> |
| |
| #include "api/dtls_transport_interface.h" |
| #include "api/scoped_refptr.h" |
| #include "api/sctp_transport_interface.h" |
| #include "api/sequence_checker.h" |
| #include "api/transport/data_channel_transport_interface.h" |
| #include "media/sctp/sctp_transport_internal.h" |
| #include "p2p/base/dtls_transport_internal.h" |
| #include "pc/dtls_transport.h" |
| #include "rtc_base/checks.h" |
| #include "rtc_base/thread.h" |
| #include "rtc_base/thread_annotations.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 DataChannelTransportInterface { |
| public: |
| explicit SctpTransport( |
| std::unique_ptr<cricket::SctpTransportInternal> internal); |
| |
| // SctpTransportInterface |
| rtc::scoped_refptr<DtlsTransportInterface> dtls_transport() const override; |
| SctpTransportInformation Information() const override; |
| void RegisterObserver(SctpTransportObserverInterface* observer) override; |
| void UnregisterObserver() override; |
| |
| // DataChannelTransportInterface |
| RTCError OpenChannel(int channel_id) override; |
| RTCError SendData(int channel_id, |
| const SendDataParams& params, |
| const rtc::CopyOnWriteBuffer& buffer) override; |
| RTCError CloseChannel(int channel_id) override; |
| void SetDataSink(DataChannelSink* sink) override; |
| bool IsReadyToSend() const override; |
| size_t buffered_amount(int channel_id) const 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(https://bugs.webrtc.org/10629): Move functions that need |
| // internal() to be functions on the SctpTransport interface, |
| // and make the internal() function private. |
| cricket::SctpTransportInternal* internal() { |
| RTC_DCHECK_RUN_ON(owner_thread_); |
| return internal_sctp_transport_.get(); |
| } |
| |
| const cricket::SctpTransportInternal* internal() const { |
| RTC_DCHECK_RUN_ON(owner_thread_); |
| return internal_sctp_transport_.get(); |
| } |
| |
| protected: |
| ~SctpTransport() override; |
| |
| private: |
| void UpdateInformation(SctpTransportState state); |
| void OnInternalReadyToSendData(); |
| void OnAssociationChangeCommunicationUp(); |
| void OnInternalClosingProcedureStartedRemotely(int sid); |
| void OnInternalClosingProcedureComplete(int sid); |
| void OnDtlsStateChange(cricket::DtlsTransportInternal* transport, |
| DtlsTransportState state); |
| |
| // NOTE: `owner_thread_` is the thread that the SctpTransport object is |
| // constructed on. In the context of PeerConnection, it's the network thread. |
| rtc::Thread* const owner_thread_; |
| SctpTransportInformation info_ RTC_GUARDED_BY(owner_thread_); |
| std::unique_ptr<cricket::SctpTransportInternal> internal_sctp_transport_ |
| RTC_GUARDED_BY(owner_thread_); |
| SctpTransportObserverInterface* observer_ RTC_GUARDED_BY(owner_thread_) = |
| nullptr; |
| rtc::scoped_refptr<DtlsTransport> dtls_transport_ |
| RTC_GUARDED_BY(owner_thread_); |
| }; |
| |
| } // namespace webrtc |
| #endif // PC_SCTP_TRANSPORT_H_ |