Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2019 The WebRTC project authors. All Rights Reserved. |
| 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license |
| 5 | * that can be found in the LICENSE file in the root of the source |
| 6 | * tree. An additional intellectual property rights grant can be found |
| 7 | * in the file PATENTS. All contributing project authors may |
| 8 | * be found in the AUTHORS file in the root of the source tree. |
| 9 | */ |
| 10 | |
| 11 | #ifndef PC_DATA_CHANNEL_CONTROLLER_H_ |
| 12 | #define PC_DATA_CHANNEL_CONTROLLER_H_ |
| 13 | |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 14 | #include <string> |
| 15 | #include <vector> |
| 16 | |
Harald Alvestrand | 5761e7b | 2021-01-29 14:45:08 | [diff] [blame] | 17 | #include "api/data_channel_interface.h" |
Harald Alvestrand | c24a218 | 2022-02-23 13:44:59 | [diff] [blame] | 18 | #include "api/rtc_error.h" |
Harald Alvestrand | 5761e7b | 2021-01-29 14:45:08 | [diff] [blame] | 19 | #include "api/scoped_refptr.h" |
Artem Titov | d15a575 | 2021-02-10 13:31:24 | [diff] [blame] | 20 | #include "api/sequence_checker.h" |
Tommi | 13759ba | 2023-03-06 11:51:39 | [diff] [blame] | 21 | #include "api/task_queue/pending_task_safety_flag.h" |
Harald Alvestrand | 5761e7b | 2021-01-29 14:45:08 | [diff] [blame] | 22 | #include "api/transport/data_channel_transport_interface.h" |
Harald Alvestrand | 5761e7b | 2021-01-29 14:45:08 | [diff] [blame] | 23 | #include "pc/data_channel_utils.h" |
Taylor Brandstetter | 3a034e1 | 2020-07-09 22:32:34 | [diff] [blame] | 24 | #include "pc/sctp_data_channel.h" |
Harald Alvestrand | 5761e7b | 2021-01-29 14:45:08 | [diff] [blame] | 25 | #include "rtc_base/checks.h" |
| 26 | #include "rtc_base/copy_on_write_buffer.h" |
| 27 | #include "rtc_base/ssl_stream_adapter.h" |
Harald Alvestrand | 5761e7b | 2021-01-29 14:45:08 | [diff] [blame] | 28 | #include "rtc_base/thread.h" |
| 29 | #include "rtc_base/thread_annotations.h" |
Harald Alvestrand | 246724b | 2019-12-03 21:31:42 | [diff] [blame] | 30 | #include "rtc_base/weak_ptr.h" |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 31 | |
| 32 | namespace webrtc { |
| 33 | |
Harald Alvestrand | 5b84f38 | 2022-02-08 10:49:09 | [diff] [blame] | 34 | class PeerConnectionInternal; |
Mirko Bonadei | e0bc8d2 | 2022-02-08 07:41:25 | [diff] [blame] | 35 | |
Harald Alvestrand | 9e5aeb9 | 2022-05-11 09:35:36 | [diff] [blame] | 36 | class DataChannelController : public SctpDataChannelControllerInterface, |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 37 | public DataChannelSink { |
| 38 | public: |
Harald Alvestrand | 5b84f38 | 2022-02-08 10:49:09 | [diff] [blame] | 39 | explicit DataChannelController(PeerConnectionInternal* pc) : pc_(pc) {} |
Harald Alvestrand | 9e5aeb9 | 2022-05-11 09:35:36 | [diff] [blame] | 40 | ~DataChannelController(); |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 41 | |
Harald Alvestrand | ab81316 | 2020-01-09 12:29:56 | [diff] [blame] | 42 | // Not copyable or movable. |
| 43 | DataChannelController(DataChannelController&) = delete; |
| 44 | DataChannelController& operator=(const DataChannelController& other) = delete; |
| 45 | DataChannelController(DataChannelController&&) = delete; |
| 46 | DataChannelController& operator=(DataChannelController&& other) = delete; |
| 47 | |
Harald Alvestrand | 7af57c6 | 2021-04-16 11:12:14 | [diff] [blame] | 48 | // Implements |
Taylor Brandstetter | 3a034e1 | 2020-07-09 22:32:34 | [diff] [blame] | 49 | // SctpDataChannelProviderInterface. |
Tommi | 1fabbac | 2023-03-21 13:48:51 | [diff] [blame] | 50 | RTCError SendData(StreamId sid, |
| 51 | const SendDataParams& params, |
| 52 | const rtc::CopyOnWriteBuffer& payload) override; |
Tommi | 4c84222 | 2023-03-21 10:35:24 | [diff] [blame] | 53 | void AddSctpDataStream(StreamId sid) override; |
| 54 | void RemoveSctpDataStream(StreamId sid) override; |
Tommi | d2afbaf | 2023-03-02 09:51:16 | [diff] [blame] | 55 | void OnChannelStateChanged(SctpDataChannel* channel, |
| 56 | DataChannelInterface::DataState state) override; |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 57 | |
| 58 | // Implements DataChannelSink. |
| 59 | void OnDataReceived(int channel_id, |
| 60 | DataMessageType type, |
| 61 | const rtc::CopyOnWriteBuffer& buffer) override; |
| 62 | void OnChannelClosing(int channel_id) override; |
| 63 | void OnChannelClosed(int channel_id) override; |
| 64 | void OnReadyToSend() override; |
Florent Castelli | dcb9ffc | 2021-06-29 12:58:23 | [diff] [blame] | 65 | void OnTransportClosed(RTCError error) override; |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 66 | |
Tommi | 1f708ef | 2023-03-31 16:40:50 | [diff] [blame] | 67 | // Called as part of destroying the owning PeerConnection. |
| 68 | void PrepareForShutdown(); |
| 69 | |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 70 | // Called from PeerConnection::SetupDataChannelTransport_n |
Tommi | aa3c9f2 | 2023-04-18 10:19:19 | [diff] [blame] | 71 | void SetupDataChannelTransport_n(DataChannelTransportInterface* transport); |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 72 | // Called from PeerConnection::TeardownDataChannelTransport_n |
Tommi | b00d63c | 2023-04-12 17:49:53 | [diff] [blame] | 73 | void TeardownDataChannelTransport_n(RTCError error); |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 74 | |
| 75 | // Called from PeerConnection::OnTransportChanged |
| 76 | // to make required changes to datachannels' transports. |
| 77 | void OnTransportChanged( |
| 78 | DataChannelTransportInterface* data_channel_transport); |
| 79 | |
Tomas Gunnarsson | 2e94de5 | 2020-06-16 14:54:10 | [diff] [blame] | 80 | // Called from PeerConnection::GetDataChannelStats on the signaling thread. |
Taylor Brandstetter | 3a034e1 | 2020-07-09 22:32:34 | [diff] [blame] | 81 | std::vector<DataChannelStats> GetDataChannelStats() const; |
Tomas Gunnarsson | 2e94de5 | 2020-06-16 14:54:10 | [diff] [blame] | 82 | |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 83 | // Creates channel and adds it to the collection of DataChannels that will |
Taylor Brandstetter | 3a034e1 | 2020-07-09 22:32:34 | [diff] [blame] | 84 | // be offered in a SessionDescription, and wraps it in a proxy object. |
Tommi | 4f7ade5 | 2023-03-29 18:46:59 | [diff] [blame] | 85 | RTCErrorOr<rtc::scoped_refptr<DataChannelInterface>> |
| 86 | InternalCreateDataChannelWithProxy(const std::string& label, |
| 87 | const InternalDataChannelInit& config); |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 88 | void AllocateSctpSids(rtc::SSLRole role); |
| 89 | |
Philipp Hancke | 522380f | 2023-05-09 07:41:03 | [diff] [blame] | 90 | // Check if data channels are currently tracked. Used to decide whether a |
| 91 | // rejected m=application section should be reoffered. |
| 92 | bool HasDataChannels() const; |
Tommi | 77158ac | 2023-03-30 07:05:23 | [diff] [blame] | 93 | |
Harald Alvestrand | 5da3eb0 | 2023-03-15 20:39:42 | [diff] [blame] | 94 | // At some point in time, a data channel has existed. |
| 95 | bool HasUsedDataChannels() const; |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 96 | |
Tommi | 5271965 | 2023-04-04 09:59:55 | [diff] [blame] | 97 | protected: |
| 98 | rtc::Thread* network_thread() const; |
| 99 | rtc::Thread* signaling_thread() const; |
| 100 | |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 101 | private: |
Tommi | 44ebe2a | 2023-05-15 13:14:10 | [diff] [blame] | 102 | void OnSctpDataChannelClosed(SctpDataChannel* channel); |
| 103 | |
Tommi | f9e13f8 | 2023-04-06 19:21:45 | [diff] [blame] | 104 | // Creates a new SctpDataChannel object on the network thread. |
| 105 | RTCErrorOr<rtc::scoped_refptr<SctpDataChannel>> CreateDataChannel( |
| 106 | const std::string& label, |
| 107 | InternalDataChannelInit& config) RTC_RUN_ON(network_thread()); |
| 108 | |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 109 | // Parses and handles open messages. Returns true if the message is an open |
Tommi | 5bbfb00 | 2023-03-04 15:47:53 | [diff] [blame] | 110 | // message and should be considered to be handled, false otherwise. |
Tommi | 4e1c957 | 2023-03-15 11:36:20 | [diff] [blame] | 111 | bool HandleOpenMessage_n(int channel_id, |
| 112 | DataMessageType type, |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 113 | const rtc::CopyOnWriteBuffer& buffer) |
Tommi | 5bbfb00 | 2023-03-04 15:47:53 | [diff] [blame] | 114 | RTC_RUN_ON(network_thread()); |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 115 | // Called when a valid data channel OPEN message is received. |
Tommi | f9e13f8 | 2023-04-06 19:21:45 | [diff] [blame] | 116 | void OnDataChannelOpenMessage(rtc::scoped_refptr<SctpDataChannel> channel, |
| 117 | bool ready_to_send) |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 118 | RTC_RUN_ON(signaling_thread()); |
| 119 | |
Tommi | 4f7ade5 | 2023-03-29 18:46:59 | [diff] [blame] | 120 | // Accepts a `StreamId` which may be pre-negotiated or unassigned. For |
| 121 | // pre-negotiated sids, attempts to reserve the sid in the allocation pool, |
| 122 | // for unassigned sids attempts to generate a new sid if possible. Returns |
| 123 | // RTCError::OK() if the sid is reserved (and may have been generated) or |
| 124 | // if not enough information exists to generate a sid, in which case the sid |
| 125 | // will still be unassigned upon return, but will be assigned later. |
| 126 | // If the pool has been exhausted or a sid has already been reserved, an |
| 127 | // error will be returned. |
| 128 | RTCError ReserveOrAllocateSid(StreamId& sid, |
| 129 | absl::optional<rtc::SSLRole> fallback_ssl_role) |
| 130 | RTC_RUN_ON(network_thread()); |
| 131 | |
Tomas Gunnarsson | 2e94de5 | 2020-06-16 14:54:10 | [diff] [blame] | 132 | // Called when all data channels need to be notified of a transport channel |
| 133 | // (calls OnTransportChannelCreated on the signaling thread). |
| 134 | void NotifyDataChannelsOfTransportCreated(); |
| 135 | |
Tommi | aa3c9f2 | 2023-04-18 10:19:19 | [diff] [blame] | 136 | void set_data_channel_transport(DataChannelTransportInterface* transport); |
| 137 | |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 138 | // Plugin transport used for data channels. Pointer may be accessed and |
| 139 | // checked from any thread, but the object may only be touched on the |
| 140 | // network thread. |
Tommi | add7ac0 | 2023-04-12 10:01:10 | [diff] [blame] | 141 | DataChannelTransportInterface* data_channel_transport_ |
| 142 | RTC_GUARDED_BY(network_thread()) = nullptr; |
Tommi | 4f7ade5 | 2023-03-29 18:46:59 | [diff] [blame] | 143 | SctpSidAllocator sid_allocator_ RTC_GUARDED_BY(network_thread()); |
Tommi | 4f7ade5 | 2023-03-29 18:46:59 | [diff] [blame] | 144 | std::vector<rtc::scoped_refptr<SctpDataChannel>> sctp_data_channels_n_ |
| 145 | RTC_GUARDED_BY(network_thread()); |
Tommi | 44ebe2a | 2023-05-15 13:14:10 | [diff] [blame] | 146 | enum class DataChannelUsage : uint8_t { |
| 147 | kNeverUsed = 0, |
| 148 | kHaveBeenUsed, |
| 149 | kInUse |
| 150 | }; |
| 151 | DataChannelUsage channel_usage_ RTC_GUARDED_BY(signaling_thread()) = |
| 152 | DataChannelUsage::kNeverUsed; |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 153 | |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 154 | // Owning PeerConnection. |
Harald Alvestrand | 5b84f38 | 2022-02-08 10:49:09 | [diff] [blame] | 155 | PeerConnectionInternal* const pc_; |
Tommi | f9e13f8 | 2023-04-06 19:21:45 | [diff] [blame] | 156 | // The weak pointers must be dereferenced and invalidated on the network |
Niels Möller | 236e36c | 2021-03-23 08:23:10 | [diff] [blame] | 157 | // thread only. |
Tommi | f9e13f8 | 2023-04-06 19:21:45 | [diff] [blame] | 158 | rtc::WeakPtrFactory<DataChannelController> weak_factory_ |
| 159 | RTC_GUARDED_BY(network_thread()){this}; |
Tommi | 13759ba | 2023-03-06 11:51:39 | [diff] [blame] | 160 | ScopedTaskSafety signaling_safety_; |
Harald Alvestrand | 05e4d08 | 2019-12-03 13:04:21 | [diff] [blame] | 161 | }; |
| 162 | |
| 163 | } // namespace webrtc |
| 164 | |
| 165 | #endif // PC_DATA_CHANNEL_CONTROLLER_H_ |