blob: bfce16c10c63f2dbf212663cbdae33cb265f8a23 [file] [log] [blame]
Harald Alvestrand05e4d082019-12-03 14:04:21 +01001/*
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
14#include <map>
15#include <memory>
16#include <string>
17#include <vector>
18
19#include "pc/channel.h"
20#include "pc/data_channel.h"
21
22namespace webrtc {
23
24class PeerConnection;
25
26class DataChannelController : public DataChannelProviderInterface,
27 public DataChannelSink {
28 public:
29 explicit DataChannelController(PeerConnection* pc) : pc_(pc) {}
30
31 // Implements DataChannelProviderInterface.
32 bool SendData(const cricket::SendDataParams& params,
33 const rtc::CopyOnWriteBuffer& payload,
34 cricket::SendDataResult* result) override;
35 bool ConnectDataChannel(DataChannel* webrtc_data_channel) override;
36 void DisconnectDataChannel(DataChannel* webrtc_data_channel) override;
37 void AddSctpDataStream(int sid) override;
38 void RemoveSctpDataStream(int sid) override;
39 bool ReadyToSendData() const override;
40
41 // Implements DataChannelSink.
42 void OnDataReceived(int channel_id,
43 DataMessageType type,
44 const rtc::CopyOnWriteBuffer& buffer) override;
45 void OnChannelClosing(int channel_id) override;
46 void OnChannelClosed(int channel_id) override;
47 void OnReadyToSend() override;
48
49 // Called from PeerConnection::SetupDataChannelTransport_n
50 void SetupDataChannelTransport_n();
51 // Called from PeerConnection::TeardownDataChannelTransport_n
52 void TeardownDataChannelTransport_n();
53
54 // Called from PeerConnection::OnTransportChanged
55 // to make required changes to datachannels' transports.
56 void OnTransportChanged(
57 DataChannelTransportInterface* data_channel_transport);
58
59 // Creates channel and adds it to the collection of DataChannels that will
60 // be offered in a SessionDescription.
61 rtc::scoped_refptr<DataChannel> InternalCreateDataChannel(
62 const std::string& label,
63 const InternalDataChannelInit*
64 config) /* RTC_RUN_ON(signaling_thread()) */;
65 void AllocateSctpSids(rtc::SSLRole role);
66
67 DataChannel* FindDataChannelBySid(int sid) const;
68
69 // Checks if any data channel has been added.
70 bool HasDataChannels() const;
71 bool HasSctpDataChannels() const {
72 RTC_DCHECK_RUN_ON(signaling_thread());
73 return !sctp_data_channels_.empty();
74 }
75 bool HasRtpDataChannels() const {
76 RTC_DCHECK_RUN_ON(signaling_thread());
77 return !rtp_data_channels_.empty();
78 }
79
80 // Called when it's appropriate to delete released datachannels.
81 void FreeDataChannels() {
82 RTC_DCHECK_RUN_ON(signaling_thread());
83 sctp_data_channels_to_free_.clear();
84 }
85
86 void UpdateLocalRtpDataChannels(const cricket::StreamParamsVec& streams);
87 void UpdateRemoteRtpDataChannels(const cricket::StreamParamsVec& streams);
88
89 // Accessors
90 cricket::DataChannelType data_channel_type() const {
91 return data_channel_type_;
92 }
93 void set_data_channel_type(cricket::DataChannelType type) {
94 data_channel_type_ = type;
95 }
96 cricket::RtpDataChannel* rtp_data_channel() const {
97 return rtp_data_channel_;
98 }
99 void set_rtp_data_channel(cricket::RtpDataChannel* channel) {
100 rtp_data_channel_ = channel;
101 }
102 DataChannelTransportInterface* data_channel_transport() const {
103 return data_channel_transport_;
104 }
105 void set_data_channel_transport(DataChannelTransportInterface* transport) {
106 data_channel_transport_ = transport;
107 }
108 const std::map<std::string, rtc::scoped_refptr<DataChannel>>*
109 rtp_data_channels() const {
110 RTC_DCHECK_RUN_ON(signaling_thread());
111 return &rtp_data_channels_;
112 }
113 const std::vector<rtc::scoped_refptr<DataChannel>>* sctp_data_channels()
114 const {
115 RTC_DCHECK_RUN_ON(signaling_thread());
116 return &sctp_data_channels_;
117 }
118
119 sigslot::signal1<DataChannel*>& SignalDataChannelCreated() {
120 RTC_DCHECK_RUN_ON(signaling_thread());
121 return SignalDataChannelCreated_;
122 }
123 // Called when the transport for the data channels is closed or destroyed.
124 void OnTransportChannelClosed();
125
126 void OnSctpDataChannelClosed(DataChannel* channel);
127
128 private:
129 // Parses and handles open messages. Returns true if the message is an open
130 // message, false otherwise.
131 bool HandleOpenMessage_s(const cricket::ReceiveDataParams& params,
132 const rtc::CopyOnWriteBuffer& buffer)
133 RTC_RUN_ON(signaling_thread());
134 // Called when a valid data channel OPEN message is received.
135 void OnDataChannelOpenMessage(const std::string& label,
136 const InternalDataChannelInit& config)
137 RTC_RUN_ON(signaling_thread());
138
139 void CreateRemoteRtpDataChannel(const std::string& label,
140 uint32_t remote_ssrc)
141 RTC_RUN_ON(signaling_thread());
142
143 void UpdateClosingRtpDataChannels(
144 const std::vector<std::string>& active_channels,
145 bool is_local_update) RTC_RUN_ON(signaling_thread());
146
147 rtc::Thread* network_thread() const;
148 rtc::Thread* signaling_thread() const;
149
150 // Specifies which kind of data channel is allowed. This is controlled
151 // by the chrome command-line flag and constraints:
152 // 1. If chrome command-line switch 'enable-sctp-data-channels' is enabled,
153 // constraint kEnableDtlsSrtp is true, and constaint kEnableRtpDataChannels is
154 // not set or false, SCTP is allowed (DCT_SCTP);
155 // 2. If constraint kEnableRtpDataChannels is true, RTP is allowed (DCT_RTP);
156 // 3. If both 1&2 are false, data channel is not allowed (DCT_NONE).
157 cricket::DataChannelType data_channel_type_ =
158 cricket::DCT_NONE; // TODO(bugs.webrtc.org/9987): Accessed on both
159 // signaling and network thread.
160
161 // Plugin transport used for data channels. Pointer may be accessed and
162 // checked from any thread, but the object may only be touched on the
163 // network thread.
164 // TODO(bugs.webrtc.org/9987): Accessed on both signaling and network
165 // thread.
166 DataChannelTransportInterface* data_channel_transport_ = nullptr;
167
168 // Cached value of whether the data channel transport is ready to send.
169 bool data_channel_transport_ready_to_send_
170 RTC_GUARDED_BY(signaling_thread()) = false;
171
172 // |rtp_data_channel_| is used if in RTP data channel mode,
173 // |data_channel_transport_| when using SCTP.
174 cricket::RtpDataChannel* rtp_data_channel_ = nullptr;
175 // TODO(bugs.webrtc.org/9987): Accessed on both
176 // signaling and some other thread.
177
178 SctpSidAllocator sid_allocator_ /* RTC_GUARDED_BY(signaling_thread()) */;
179 std::vector<rtc::scoped_refptr<DataChannel>> sctp_data_channels_
180 RTC_GUARDED_BY(signaling_thread());
181 std::vector<rtc::scoped_refptr<DataChannel>> sctp_data_channels_to_free_
182 RTC_GUARDED_BY(signaling_thread());
183
184 // Map of label -> DataChannel
185 std::map<std::string, rtc::scoped_refptr<DataChannel>> rtp_data_channels_
186 RTC_GUARDED_BY(signaling_thread());
187
188 // Signals from |data_channel_transport_|. These are invoked on the
189 // signaling thread.
190 sigslot::signal1<bool> SignalDataChannelTransportWritable_s
191 RTC_GUARDED_BY(signaling_thread());
192 sigslot::signal2<const cricket::ReceiveDataParams&,
193 const rtc::CopyOnWriteBuffer&>
194 SignalDataChannelTransportReceivedData_s
195 RTC_GUARDED_BY(signaling_thread());
196 sigslot::signal1<int> SignalDataChannelTransportChannelClosing_s
197 RTC_GUARDED_BY(signaling_thread());
198 sigslot::signal1<int> SignalDataChannelTransportChannelClosed_s
199 RTC_GUARDED_BY(signaling_thread());
200
201 sigslot::signal1<DataChannel*> SignalDataChannelCreated_
202 RTC_GUARDED_BY(signaling_thread());
203
204 // Used to invoke data channel transport signals on the signaling thread.
205 std::unique_ptr<rtc::AsyncInvoker> data_channel_transport_invoker_
206 RTC_GUARDED_BY(network_thread());
207
208 // Owning PeerConnection.
209 PeerConnection* const pc_;
210};
211
212} // namespace webrtc
213
214#endif // PC_DATA_CHANNEL_CONTROLLER_H_