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