xref: /aosp_15_r20/external/webrtc/media/sctp/dcsctp_transport.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef MEDIA_SCTP_DCSCTP_TRANSPORT_H_
12*d9f75844SAndroid Build Coastguard Worker #define MEDIA_SCTP_DCSCTP_TRANSPORT_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <memory>
15*d9f75844SAndroid Build Coastguard Worker #include <string>
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
18*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_base.h"
21*d9f75844SAndroid Build Coastguard Worker #include "media/sctp/sctp_transport_internal.h"
22*d9f75844SAndroid Build Coastguard Worker #include "net/dcsctp/public/dcsctp_options.h"
23*d9f75844SAndroid Build Coastguard Worker #include "net/dcsctp/public/dcsctp_socket.h"
24*d9f75844SAndroid Build Coastguard Worker #include "net/dcsctp/public/dcsctp_socket_factory.h"
25*d9f75844SAndroid Build Coastguard Worker #include "net/dcsctp/public/types.h"
26*d9f75844SAndroid Build Coastguard Worker #include "net/dcsctp/timer/task_queue_timeout.h"
27*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/packet_transport_internal.h"
28*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/containers/flat_map.h"
29*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/copy_on_write_buffer.h"
30*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/random.h"
31*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/third_party/sigslot/sigslot.h"
32*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread.h"
33*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h"
34*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/clock.h"
35*d9f75844SAndroid Build Coastguard Worker 
36*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
37*d9f75844SAndroid Build Coastguard Worker 
38*d9f75844SAndroid Build Coastguard Worker class DcSctpTransport : public cricket::SctpTransportInternal,
39*d9f75844SAndroid Build Coastguard Worker                         public dcsctp::DcSctpSocketCallbacks,
40*d9f75844SAndroid Build Coastguard Worker                         public sigslot::has_slots<> {
41*d9f75844SAndroid Build Coastguard Worker  public:
42*d9f75844SAndroid Build Coastguard Worker   DcSctpTransport(rtc::Thread* network_thread,
43*d9f75844SAndroid Build Coastguard Worker                   rtc::PacketTransportInternal* transport,
44*d9f75844SAndroid Build Coastguard Worker                   Clock* clock);
45*d9f75844SAndroid Build Coastguard Worker   DcSctpTransport(rtc::Thread* network_thread,
46*d9f75844SAndroid Build Coastguard Worker                   rtc::PacketTransportInternal* transport,
47*d9f75844SAndroid Build Coastguard Worker                   Clock* clock,
48*d9f75844SAndroid Build Coastguard Worker                   std::unique_ptr<dcsctp::DcSctpSocketFactory> socket_factory);
49*d9f75844SAndroid Build Coastguard Worker   ~DcSctpTransport() override;
50*d9f75844SAndroid Build Coastguard Worker 
51*d9f75844SAndroid Build Coastguard Worker   // cricket::SctpTransportInternal
52*d9f75844SAndroid Build Coastguard Worker   void SetOnConnectedCallback(std::function<void()> callback) override;
53*d9f75844SAndroid Build Coastguard Worker   void SetDataChannelSink(DataChannelSink* sink) override;
54*d9f75844SAndroid Build Coastguard Worker   void SetDtlsTransport(rtc::PacketTransportInternal* transport) override;
55*d9f75844SAndroid Build Coastguard Worker   bool Start(int local_sctp_port,
56*d9f75844SAndroid Build Coastguard Worker              int remote_sctp_port,
57*d9f75844SAndroid Build Coastguard Worker              int max_message_size) override;
58*d9f75844SAndroid Build Coastguard Worker   bool OpenStream(int sid) override;
59*d9f75844SAndroid Build Coastguard Worker   bool ResetStream(int sid) override;
60*d9f75844SAndroid Build Coastguard Worker   bool SendData(int sid,
61*d9f75844SAndroid Build Coastguard Worker                 const SendDataParams& params,
62*d9f75844SAndroid Build Coastguard Worker                 const rtc::CopyOnWriteBuffer& payload,
63*d9f75844SAndroid Build Coastguard Worker                 cricket::SendDataResult* result = nullptr) override;
64*d9f75844SAndroid Build Coastguard Worker   bool ReadyToSendData() override;
65*d9f75844SAndroid Build Coastguard Worker   int max_message_size() const override;
66*d9f75844SAndroid Build Coastguard Worker   absl::optional<int> max_outbound_streams() const override;
67*d9f75844SAndroid Build Coastguard Worker   absl::optional<int> max_inbound_streams() const override;
68*d9f75844SAndroid Build Coastguard Worker   void set_debug_name_for_testing(const char* debug_name) override;
69*d9f75844SAndroid Build Coastguard Worker 
70*d9f75844SAndroid Build Coastguard Worker  private:
71*d9f75844SAndroid Build Coastguard Worker   // dcsctp::DcSctpSocketCallbacks
72*d9f75844SAndroid Build Coastguard Worker   dcsctp::SendPacketStatus SendPacketWithStatus(
73*d9f75844SAndroid Build Coastguard Worker       rtc::ArrayView<const uint8_t> data) override;
74*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<dcsctp::Timeout> CreateTimeout(
75*d9f75844SAndroid Build Coastguard Worker       webrtc::TaskQueueBase::DelayPrecision precision) override;
76*d9f75844SAndroid Build Coastguard Worker   dcsctp::TimeMs TimeMillis() override;
77*d9f75844SAndroid Build Coastguard Worker   uint32_t GetRandomInt(uint32_t low, uint32_t high) override;
78*d9f75844SAndroid Build Coastguard Worker   void OnTotalBufferedAmountLow() override;
79*d9f75844SAndroid Build Coastguard Worker   void OnMessageReceived(dcsctp::DcSctpMessage message) override;
80*d9f75844SAndroid Build Coastguard Worker   void OnError(dcsctp::ErrorKind error, absl::string_view message) override;
81*d9f75844SAndroid Build Coastguard Worker   void OnAborted(dcsctp::ErrorKind error, absl::string_view message) override;
82*d9f75844SAndroid Build Coastguard Worker   void OnConnected() override;
83*d9f75844SAndroid Build Coastguard Worker   void OnClosed() override;
84*d9f75844SAndroid Build Coastguard Worker   void OnConnectionRestarted() override;
85*d9f75844SAndroid Build Coastguard Worker   void OnStreamsResetFailed(
86*d9f75844SAndroid Build Coastguard Worker       rtc::ArrayView<const dcsctp::StreamID> outgoing_streams,
87*d9f75844SAndroid Build Coastguard Worker       absl::string_view reason) override;
88*d9f75844SAndroid Build Coastguard Worker   void OnStreamsResetPerformed(
89*d9f75844SAndroid Build Coastguard Worker       rtc::ArrayView<const dcsctp::StreamID> outgoing_streams) override;
90*d9f75844SAndroid Build Coastguard Worker   void OnIncomingStreamsReset(
91*d9f75844SAndroid Build Coastguard Worker       rtc::ArrayView<const dcsctp::StreamID> incoming_streams) override;
92*d9f75844SAndroid Build Coastguard Worker 
93*d9f75844SAndroid Build Coastguard Worker   // Transport callbacks
94*d9f75844SAndroid Build Coastguard Worker   void ConnectTransportSignals();
95*d9f75844SAndroid Build Coastguard Worker   void DisconnectTransportSignals();
96*d9f75844SAndroid Build Coastguard Worker   void OnTransportWritableState(rtc::PacketTransportInternal* transport);
97*d9f75844SAndroid Build Coastguard Worker   void OnTransportReadPacket(rtc::PacketTransportInternal* transport,
98*d9f75844SAndroid Build Coastguard Worker                              const char* data,
99*d9f75844SAndroid Build Coastguard Worker                              size_t length,
100*d9f75844SAndroid Build Coastguard Worker                              const int64_t& /* packet_time_us */,
101*d9f75844SAndroid Build Coastguard Worker                              int flags);
102*d9f75844SAndroid Build Coastguard Worker   void OnTransportClosed(rtc::PacketTransportInternal* transport);
103*d9f75844SAndroid Build Coastguard Worker 
104*d9f75844SAndroid Build Coastguard Worker   void MaybeConnectSocket();
105*d9f75844SAndroid Build Coastguard Worker 
106*d9f75844SAndroid Build Coastguard Worker   rtc::Thread* network_thread_;
107*d9f75844SAndroid Build Coastguard Worker   rtc::PacketTransportInternal* transport_;
108*d9f75844SAndroid Build Coastguard Worker   Clock* clock_;
109*d9f75844SAndroid Build Coastguard Worker   Random random_;
110*d9f75844SAndroid Build Coastguard Worker 
111*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<dcsctp::DcSctpSocketFactory> socket_factory_;
112*d9f75844SAndroid Build Coastguard Worker   dcsctp::TaskQueueTimeoutFactory task_queue_timeout_factory_;
113*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<dcsctp::DcSctpSocketInterface> socket_;
114*d9f75844SAndroid Build Coastguard Worker   std::string debug_name_ = "DcSctpTransport";
115*d9f75844SAndroid Build Coastguard Worker   rtc::CopyOnWriteBuffer receive_buffer_;
116*d9f75844SAndroid Build Coastguard Worker 
117*d9f75844SAndroid Build Coastguard Worker   // Used to keep track of the state of data channels.
118*d9f75844SAndroid Build Coastguard Worker   // Reset needs to happen both ways before signaling the transport
119*d9f75844SAndroid Build Coastguard Worker   // is closed.
120*d9f75844SAndroid Build Coastguard Worker   struct StreamState {
121*d9f75844SAndroid Build Coastguard Worker     // True when the local connection has initiated the reset.
122*d9f75844SAndroid Build Coastguard Worker     // If a connection receives a reset for a stream that isn't
123*d9f75844SAndroid Build Coastguard Worker     // already being reset locally, it needs to fire the signal
124*d9f75844SAndroid Build Coastguard Worker     // SignalClosingProcedureStartedRemotely.
125*d9f75844SAndroid Build Coastguard Worker     bool closure_initiated = false;
126*d9f75844SAndroid Build Coastguard Worker     // True when the local connection received OnIncomingStreamsReset
127*d9f75844SAndroid Build Coastguard Worker     bool incoming_reset_done = false;
128*d9f75844SAndroid Build Coastguard Worker     // True when the local connection received OnStreamsResetPerformed
129*d9f75844SAndroid Build Coastguard Worker     bool outgoing_reset_done = false;
130*d9f75844SAndroid Build Coastguard Worker   };
131*d9f75844SAndroid Build Coastguard Worker 
132*d9f75844SAndroid Build Coastguard Worker   // Map of all currently open or closing data channels
133*d9f75844SAndroid Build Coastguard Worker   flat_map<dcsctp::StreamID, StreamState> stream_states_
134*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(network_thread_);
135*d9f75844SAndroid Build Coastguard Worker   bool ready_to_send_data_ = false;
136*d9f75844SAndroid Build Coastguard Worker   std::function<void()> on_connected_callback_ RTC_GUARDED_BY(network_thread_);
137*d9f75844SAndroid Build Coastguard Worker   DataChannelSink* data_channel_sink_ RTC_GUARDED_BY(network_thread_) = nullptr;
138*d9f75844SAndroid Build Coastguard Worker };
139*d9f75844SAndroid Build Coastguard Worker 
140*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
141*d9f75844SAndroid Build Coastguard Worker 
142*d9f75844SAndroid Build Coastguard Worker #endif  // MEDIA_SCTP_DCSCTP_TRANSPORT_H_
143