blob: 2d912e5ae9db69076407ebf65078212617d56081 [file] [log] [blame]
Zhi Huange818b6e2018-02-22 15:26:27 -08001/*
2 * Copyright 2017 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
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef PC_JSEP_TRANSPORT_CONTROLLER_H_
12#define PC_JSEP_TRANSPORT_CONTROLLER_H_
Zhi Huange818b6e2018-02-22 15:26:27 -080013
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000014#include <stdint.h>
15
16#include <functional>
Zhi Huange818b6e2018-02-22 15:26:27 -080017#include <map>
18#include <memory>
19#include <string>
20#include <utility>
21#include <vector>
22
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000023#include "absl/types/optional.h"
Harald Alvestrand0ccfbd22021-04-08 07:25:04 +000024#include "api/async_dns_resolver.h"
Zhi Huange818b6e2018-02-22 15:26:27 -080025#include "api/candidate.h"
Steve Anton10542f22019-01-11 09:11:00 -080026#include "api/crypto/crypto_options.h"
Qingsi Wang25ec8882019-11-15 12:33:05 -080027#include "api/ice_transport_factory.h"
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000028#include "api/ice_transport_interface.h"
29#include "api/jsep.h"
Steve Anton10542f22019-01-11 09:11:00 -080030#include "api/peer_connection_interface.h"
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000031#include "api/rtc_error.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020032#include "api/rtc_event_log/rtc_event_log.h"
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000033#include "api/scoped_refptr.h"
34#include "api/transport/data_channel_transport_interface.h"
35#include "api/transport/sctp_transport_factory_interface.h"
Steve Anton10542f22019-01-11 09:11:00 -080036#include "media/sctp/sctp_transport_internal.h"
37#include "p2p/base/dtls_transport.h"
Qingsi Wang25ec8882019-11-15 12:33:05 -080038#include "p2p/base/dtls_transport_factory.h"
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000039#include "p2p/base/dtls_transport_internal.h"
40#include "p2p/base/ice_transport_internal.h"
Steve Anton10542f22019-01-11 09:11:00 -080041#include "p2p/base/p2p_transport_channel.h"
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000042#include "p2p/base/packet_transport_internal.h"
43#include "p2p/base/port.h"
44#include "p2p/base/port_allocator.h"
45#include "p2p/base/transport_description.h"
46#include "p2p/base/transport_info.h"
Harald Alvestrand9f9bf382021-06-08 04:12:37 +000047#include "pc/bundle_manager.h"
Zhi Huange818b6e2018-02-22 15:26:27 -080048#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080049#include "pc/dtls_srtp_transport.h"
50#include "pc/dtls_transport.h"
51#include "pc/jsep_transport.h"
52#include "pc/rtp_transport.h"
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000053#include "pc/rtp_transport_internal.h"
54#include "pc/sctp_transport.h"
55#include "pc/session_description.h"
Steve Anton10542f22019-01-11 09:11:00 -080056#include "pc/srtp_transport.h"
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000057#include "pc/transport_stats.h"
Mirko Bonadei3d259352020-10-23 12:04:40 +020058#include "rtc_base/callback_list.h"
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000059#include "rtc_base/constructor_magic.h"
60#include "rtc_base/copy_on_write_buffer.h"
61#include "rtc_base/helpers.h"
62#include "rtc_base/ref_counted_object.h"
63#include "rtc_base/rtc_certificate.h"
64#include "rtc_base/ssl_certificate.h"
65#include "rtc_base/ssl_stream_adapter.h"
Artem Titove41c4332018-07-25 15:04:28 +020066#include "rtc_base/third_party/sigslot/sigslot.h"
Harald Alvestrand5761e7b2021-01-29 14:45:08 +000067#include "rtc_base/thread.h"
68#include "rtc_base/thread_annotations.h"
Zhi Huange818b6e2018-02-22 15:26:27 -080069
70namespace rtc {
71class Thread;
72class PacketTransportInternal;
73} // namespace rtc
74
75namespace webrtc {
76
Steve Antond25828a2018-08-31 13:06:05 -070077class JsepTransportController : public sigslot::has_slots<> {
Zhi Huange818b6e2018-02-22 15:26:27 -080078 public:
Zhi Huang365381f2018-04-13 16:44:34 -070079 // Used when the RtpTransport/DtlsTransport of the m= section is changed
80 // because the section is rejected or BUNDLE is enabled.
81 class Observer {
82 public:
83 virtual ~Observer() {}
84
85 // Returns true if media associated with |mid| was successfully set up to be
86 // demultiplexed on |rtp_transport|. Could return false if two bundled m=
87 // sections use the same SSRC, for example.
Bjorn A Mellemb689af42019-08-21 10:44:59 -070088 //
89 // If a data channel transport must be negotiated, |data_channel_transport|
90 // and |negotiation_state| indicate negotiation status. If
91 // |data_channel_transport| is null, the data channel transport should not
92 // be used. Otherwise, the value is a pointer to the transport to be used
93 // for data channels on |mid|, if any.
94 //
95 // The observer should not send data on |data_channel_transport| until
96 // |negotiation_state| is provisional or final. It should not delete
97 // |data_channel_transport| or any fallback transport until
98 // |negotiation_state| is final.
Taylor Brandstettercbaa2542018-04-16 16:42:14 -070099 virtual bool OnTransportChanged(
Zhi Huang365381f2018-04-13 16:44:34 -0700100 const std::string& mid,
Taylor Brandstettercbaa2542018-04-16 16:42:14 -0700101 RtpTransportInternal* rtp_transport,
Harald Alvestrandc85328f2019-02-28 07:51:00 +0100102 rtc::scoped_refptr<DtlsTransport> dtls_transport,
Bjorn A Mellembc3eebc2019-09-23 14:53:54 -0700103 DataChannelTransportInterface* data_channel_transport) = 0;
Zhi Huang365381f2018-04-13 16:44:34 -0700104 };
105
Zhi Huange818b6e2018-02-22 15:26:27 -0800106 struct Config {
107 // If |redetermine_role_on_ice_restart| is true, ICE role is redetermined
108 // upon setting a local transport description that indicates an ICE
109 // restart.
110 bool redetermine_role_on_ice_restart = true;
111 rtc::SSLProtocolVersion ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12;
112 // |crypto_options| is used to determine if created DTLS transports
113 // negotiate GCM crypto suites or not.
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700114 webrtc::CryptoOptions crypto_options;
Zhi Huange818b6e2018-02-22 15:26:27 -0800115 PeerConnectionInterface::BundlePolicy bundle_policy =
116 PeerConnectionInterface::kBundlePolicyBalanced;
117 PeerConnectionInterface::RtcpMuxPolicy rtcp_mux_policy =
118 PeerConnectionInterface::kRtcpMuxPolicyRequire;
119 bool disable_encryption = false;
120 bool enable_external_auth = false;
121 // Used to inject the ICE/DTLS transports created externally.
Qingsi Wang25ec8882019-11-15 12:33:05 -0800122 webrtc::IceTransportFactory* ice_transport_factory = nullptr;
123 cricket::DtlsTransportFactory* dtls_transport_factory = nullptr;
Zhi Huang365381f2018-04-13 16:44:34 -0700124 Observer* transport_observer = nullptr;
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200125 // Must be provided and valid for the lifetime of the
126 // JsepTransportController instance.
127 std::function<void(const rtc::CopyOnWriteBuffer& packet,
128 int64_t packet_time_us)>
129 rtcp_handler;
Harald Alvestrand133c0522021-01-29 14:27:12 +0000130 // Initial value for whether DtlsTransport reset causes a reset
131 // of SRTP parameters.
Zhi Huangb57e1692018-06-12 11:41:11 -0700132 bool active_reset_srtp_params = false;
Qingsi Wang7685e862018-06-11 20:15:46 -0700133 RtcEventLog* event_log = nullptr;
Anton Sukhanov7940da02018-10-10 10:34:49 -0700134
Bjorn A Mellembc3eebc2019-09-23 14:53:54 -0700135 // Factory for SCTP transports.
Per Kjellander2bca0082020-08-28 09:15:15 +0200136 SctpTransportFactoryInterface* sctp_factory = nullptr;
Lahiru Ginnaliya Gamathige70f9e242021-01-27 23:32:46 -0800137 std::function<void(const rtc::SSLHandshakeError)> on_dtls_handshake_error_;
Zhi Huange818b6e2018-02-22 15:26:27 -0800138 };
139
Tommic3257d02021-02-10 17:40:08 +0000140 // The ICE related events are fired on the |network_thread|.
141 // All the transport related methods are called on the |network_thread|
142 // and destruction of the JsepTransportController must occur on the
143 // |network_thread|.
Harald Alvestrand0ccfbd22021-04-08 07:25:04 +0000144 JsepTransportController(
145 rtc::Thread* network_thread,
146 cricket::PortAllocator* port_allocator,
147 AsyncDnsResolverFactoryInterface* async_dns_resolver_factory,
148 Config config);
Zhi Huange818b6e2018-02-22 15:26:27 -0800149 virtual ~JsepTransportController();
150
151 // The main method to be called; applies a description at the transport
152 // level, creating/destroying transport objects as needed and updating their
153 // properties. This includes RTP, DTLS, and ICE (but not SCTP). At least not
154 // yet? May make sense to in the future.
155 RTCError SetLocalDescription(SdpType type,
156 const cricket::SessionDescription* description);
157
158 RTCError SetRemoteDescription(SdpType type,
159 const cricket::SessionDescription* description);
160
161 // Get transports to be used for the provided |mid|. If bundling is enabled,
162 // calling GetRtpTransport for multiple MIDs may yield the same object.
163 RtpTransportInternal* GetRtpTransport(const std::string& mid) const;
Harald Alvestrandad88c882018-11-28 16:47:46 +0100164 cricket::DtlsTransportInternal* GetDtlsTransport(const std::string& mid);
165 const cricket::DtlsTransportInternal* GetRtcpDtlsTransport(
Zhi Huange818b6e2018-02-22 15:26:27 -0800166 const std::string& mid) const;
Harald Alvestrandad88c882018-11-28 16:47:46 +0100167 // Gets the externally sharable version of the DtlsTransport.
Harald Alvestrand4a7b3ac2019-01-17 10:39:40 +0100168 rtc::scoped_refptr<webrtc::DtlsTransport> LookupDtlsTransportByMid(
Harald Alvestrandad88c882018-11-28 16:47:46 +0100169 const std::string& mid);
Bjorn A Mellembc3eebc2019-09-23 14:53:54 -0700170 rtc::scoped_refptr<SctpTransport> GetSctpTransport(
171 const std::string& mid) const;
Zhi Huange818b6e2018-02-22 15:26:27 -0800172
Bjorn A Mellemb689af42019-08-21 10:44:59 -0700173 DataChannelTransportInterface* GetDataChannelTransport(
Anton Sukhanov316f3ac2019-05-23 15:50:38 -0700174 const std::string& mid) const;
175
Zhi Huange818b6e2018-02-22 15:26:27 -0800176 /*********************
177 * ICE-related methods
178 ********************/
179 // This method is public to allow PeerConnection to update it from
180 // SetConfiguration.
181 void SetIceConfig(const cricket::IceConfig& config);
182 // Set the "needs-ice-restart" flag as described in JSEP. After the flag is
183 // set, offers should generate new ufrags/passwords until an ICE restart
184 // occurs.
185 void SetNeedsIceRestartFlag();
186 // Returns true if the ICE restart flag above was set, and no ICE restart has
187 // occurred yet for this transport (by applying a local description with
188 // changed ufrag/password). If the transport has been deleted as a result of
189 // bundling, returns false.
190 bool NeedsIceRestart(const std::string& mid) const;
191 // Start gathering candidates for any new transports, or transports doing an
192 // ICE restart.
193 void MaybeStartGathering();
194 RTCError AddRemoteCandidates(
195 const std::string& mid,
196 const std::vector<cricket::Candidate>& candidates);
197 RTCError RemoveRemoteCandidates(
198 const std::vector<cricket::Candidate>& candidates);
199
200 /**********************
201 * DTLS-related methods
202 *********************/
203 // Specifies the identity to use in this session.
204 // Can only be called once.
205 bool SetLocalCertificate(
206 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
207 rtc::scoped_refptr<rtc::RTCCertificate> GetLocalCertificate(
208 const std::string& mid) const;
Taylor Brandstetterc3928662018-02-23 13:04:51 -0800209 // Caller owns returned certificate chain. This method mainly exists for
210 // stats reporting.
211 std::unique_ptr<rtc::SSLCertChain> GetRemoteSSLCertChain(
Zhi Huange818b6e2018-02-22 15:26:27 -0800212 const std::string& mid) const;
213 // Get negotiated role, if one has been negotiated.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200214 absl::optional<rtc::SSLRole> GetDtlsRole(const std::string& mid) const;
Zhi Huange818b6e2018-02-22 15:26:27 -0800215
216 // TODO(deadbeef): GetStats isn't const because all the way down to
217 // OpenSSLStreamAdapter, GetSslCipherSuite and GetDtlsSrtpCryptoSuite are not
218 // const. Fix this.
219 bool GetStats(const std::string& mid, cricket::TransportStats* stats);
Zhi Huange818b6e2018-02-22 15:26:27 -0800220
Zhi Huange830e682018-03-30 10:48:35 -0700221 bool initial_offerer() const { return initial_offerer_ && *initial_offerer_; }
Zhi Huang365381f2018-04-13 16:44:34 -0700222
Zhi Huangb57e1692018-06-12 11:41:11 -0700223 void SetActiveResetSrtpParams(bool active_reset_srtp_params);
224
Eldar Rellod85ea752020-02-19 20:41:07 +0200225 // For now the rollback only removes mid to transport mappings
Eldar Rello353a7182019-11-25 18:49:44 +0200226 // and deletes unused transports, but doesn't consider anything more complex.
Eldar Rellod85ea752020-02-19 20:41:07 +0200227 void RollbackTransports();
Eldar Rello5ab79e62019-10-09 18:29:44 +0300228
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800229 // F: void(const std::string&, const std::vector<cricket::Candidate>&)
230 template <typename F>
231 void SubscribeIceCandidateGathered(F&& callback) {
Tommic3257d02021-02-10 17:40:08 +0000232 RTC_DCHECK_RUN_ON(network_thread_);
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800233 signal_ice_candidates_gathered_.AddReceiver(std::forward<F>(callback));
234 }
235
236 // F: void(cricket::IceConnectionState)
237 template <typename F>
238 void SubscribeIceConnectionState(F&& callback) {
Tommic3257d02021-02-10 17:40:08 +0000239 RTC_DCHECK_RUN_ON(network_thread_);
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800240 signal_ice_connection_state_.AddReceiver(std::forward<F>(callback));
241 }
242
243 // F: void(PeerConnectionInterface::PeerConnectionState)
244 template <typename F>
245 void SubscribeConnectionState(F&& callback) {
Tommic3257d02021-02-10 17:40:08 +0000246 RTC_DCHECK_RUN_ON(network_thread_);
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800247 signal_connection_state_.AddReceiver(std::forward<F>(callback));
248 }
249
250 // F: void(PeerConnectionInterface::IceConnectionState)
251 template <typename F>
252 void SubscribeStandardizedIceConnectionState(F&& callback) {
Tommic3257d02021-02-10 17:40:08 +0000253 RTC_DCHECK_RUN_ON(network_thread_);
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800254 signal_standardized_ice_connection_state_.AddReceiver(
255 std::forward<F>(callback));
256 }
257
258 // F: void(cricket::IceGatheringState)
259 template <typename F>
260 void SubscribeIceGatheringState(F&& callback) {
Tommic3257d02021-02-10 17:40:08 +0000261 RTC_DCHECK_RUN_ON(network_thread_);
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800262 signal_ice_gathering_state_.AddReceiver(std::forward<F>(callback));
263 }
264
265 // F: void(const cricket::IceCandidateErrorEvent&)
266 template <typename F>
267 void SubscribeIceCandidateError(F&& callback) {
Tommic3257d02021-02-10 17:40:08 +0000268 RTC_DCHECK_RUN_ON(network_thread_);
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800269 signal_ice_candidate_error_.AddReceiver(std::forward<F>(callback));
270 }
271
272 // F: void(const std::vector<cricket::Candidate>&)
273 template <typename F>
274 void SubscribeIceCandidatesRemoved(F&& callback) {
Tommic3257d02021-02-10 17:40:08 +0000275 RTC_DCHECK_RUN_ON(network_thread_);
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800276 signal_ice_candidates_removed_.AddReceiver(std::forward<F>(callback));
277 }
278
279 // F: void(const cricket::CandidatePairChangeEvent&)
280 template <typename F>
281 void SubscribeIceCandidatePairChanged(F&& callback) {
Tommic3257d02021-02-10 17:40:08 +0000282 RTC_DCHECK_RUN_ON(network_thread_);
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800283 signal_ice_candidate_pair_changed_.AddReceiver(std::forward<F>(callback));
284 }
285
286 private:
Tommic3257d02021-02-10 17:40:08 +0000287 // All of these callbacks are fired on the network thread.
Zhi Huange818b6e2018-02-22 15:26:27 -0800288
289 // If any transport failed => failed,
290 // Else if all completed => completed,
291 // Else if all connected => connected,
292 // Else => connecting
Tommic3257d02021-02-10 17:40:08 +0000293 CallbackList<cricket::IceConnectionState> signal_ice_connection_state_
294 RTC_GUARDED_BY(network_thread_);
Zhi Huange818b6e2018-02-22 15:26:27 -0800295
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800296 CallbackList<PeerConnectionInterface::PeerConnectionState>
Tommic3257d02021-02-10 17:40:08 +0000297 signal_connection_state_ RTC_GUARDED_BY(network_thread_);
Lahiru Ginnaliya Gamathigee99c68d2020-09-30 14:33:45 -0700298
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800299 CallbackList<PeerConnectionInterface::IceConnectionState>
Tommic3257d02021-02-10 17:40:08 +0000300 signal_standardized_ice_connection_state_ RTC_GUARDED_BY(network_thread_);
Jonas Olsson635474e2018-10-18 15:58:17 +0200301
Zhi Huange818b6e2018-02-22 15:26:27 -0800302 // If all transports done gathering => complete,
303 // Else if any are gathering => gathering,
304 // Else => new
Tommic3257d02021-02-10 17:40:08 +0000305 CallbackList<cricket::IceGatheringState> signal_ice_gathering_state_
306 RTC_GUARDED_BY(network_thread_);
Zhi Huange818b6e2018-02-22 15:26:27 -0800307
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800308 // [mid, candidates]
309 CallbackList<const std::string&, const std::vector<cricket::Candidate>&>
Tommic3257d02021-02-10 17:40:08 +0000310 signal_ice_candidates_gathered_ RTC_GUARDED_BY(network_thread_);
Zhi Huange818b6e2018-02-22 15:26:27 -0800311
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800312 CallbackList<const cricket::IceCandidateErrorEvent&>
Tommic3257d02021-02-10 17:40:08 +0000313 signal_ice_candidate_error_ RTC_GUARDED_BY(network_thread_);
Eldar Relloda13ea22019-06-01 12:23:43 +0300314
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800315 CallbackList<const std::vector<cricket::Candidate>&>
Tommic3257d02021-02-10 17:40:08 +0000316 signal_ice_candidates_removed_ RTC_GUARDED_BY(network_thread_);
Zhi Huange818b6e2018-02-22 15:26:27 -0800317
Lahiru Ginnaliya Gamathige5eb527c2021-01-18 23:32:22 -0800318 CallbackList<const cricket::CandidatePairChangeEvent&>
Tommic3257d02021-02-10 17:40:08 +0000319 signal_ice_candidate_pair_changed_ RTC_GUARDED_BY(network_thread_);
Alex Drake00c7ecf2019-08-06 10:54:47 -0700320
Zhi Huange818b6e2018-02-22 15:26:27 -0800321 RTCError ApplyDescription_n(bool local,
322 SdpType type,
Niels Möller5cf0ef02021-01-18 14:00:36 +0100323 const cricket::SessionDescription* description)
324 RTC_RUN_ON(network_thread_);
Henrik Boströmf8187e02021-04-26 21:04:26 +0200325 RTCError ValidateAndMaybeUpdateBundleGroups(
Zhi Huangd2248f82018-04-10 14:41:03 -0700326 bool local,
327 SdpType type,
328 const cricket::SessionDescription* description);
Zhi Huange830e682018-03-30 10:48:35 -0700329 RTCError ValidateContent(const cricket::ContentInfo& content_info);
Zhi Huange818b6e2018-02-22 15:26:27 -0800330
Taylor Brandstettercbaa2542018-04-16 16:42:14 -0700331 void HandleRejectedContent(const cricket::ContentInfo& content_info,
Henrik Boströmf8187e02021-04-26 21:04:26 +0200332 std::map<std::string, cricket::ContentGroup*>&
333 established_bundle_groups_by_mid)
Niels Möller5cf0ef02021-01-18 14:00:36 +0100334 RTC_RUN_ON(network_thread_);
Henrik Boströmf8187e02021-04-26 21:04:26 +0200335 bool HandleBundledContent(const cricket::ContentInfo& content_info,
336 const cricket::ContentGroup& bundle_group)
Niels Möller5cf0ef02021-01-18 14:00:36 +0100337 RTC_RUN_ON(network_thread_);
Zhi Huange818b6e2018-02-22 15:26:27 -0800338
Zhi Huang365381f2018-04-13 16:44:34 -0700339 bool SetTransportForMid(const std::string& mid,
Taylor Brandstettercbaa2542018-04-16 16:42:14 -0700340 cricket::JsepTransport* jsep_transport);
341 void RemoveTransportForMid(const std::string& mid);
Zhi Huangd2248f82018-04-10 14:41:03 -0700342
Zhi Huange818b6e2018-02-22 15:26:27 -0800343 cricket::JsepTransportDescription CreateJsepTransportDescription(
Harald Alvestrand1716d392019-06-03 20:35:45 +0200344 const cricket::ContentInfo& content_info,
345 const cricket::TransportInfo& transport_info,
Zhi Huange830e682018-03-30 10:48:35 -0700346 const std::vector<int>& encrypted_extension_ids,
Niels Möllerdc80aaf2020-06-18 10:10:17 +0200347 int rtp_abs_sendtime_extn_id);
Zhi Huange818b6e2018-02-22 15:26:27 -0800348
Zhi Huange818b6e2018-02-22 15:26:27 -0800349 bool ShouldUpdateBundleGroup(SdpType type,
350 const cricket::SessionDescription* description);
351
Henrik Boströmf8187e02021-04-26 21:04:26 +0200352 std::map<const cricket::ContentGroup*, std::vector<int>>
353 MergeEncryptedHeaderExtensionIdsForBundles(
354 const std::map<std::string, cricket::ContentGroup*>& bundle_groups_by_mid,
Zhi Huange818b6e2018-02-22 15:26:27 -0800355 const cricket::SessionDescription* description);
Zhi Huange818b6e2018-02-22 15:26:27 -0800356 std::vector<int> GetEncryptedHeaderExtensionIds(
357 const cricket::ContentInfo& content_info);
358
Zhi Huange830e682018-03-30 10:48:35 -0700359 int GetRtpAbsSendTimeHeaderExtensionId(
360 const cricket::ContentInfo& content_info);
Zhi Huange818b6e2018-02-22 15:26:27 -0800361
Zhi Huange830e682018-03-30 10:48:35 -0700362 // This method takes the BUNDLE group into account. If the JsepTransport is
363 // destroyed because of BUNDLE, it would return the transport which other
364 // transports are bundled on (In current implementation, it is the first
365 // content in the BUNDLE group).
Zhi Huang365381f2018-04-13 16:44:34 -0700366 const cricket::JsepTransport* GetJsepTransportForMid(
Tomas Gunnarsson92eebef2021-02-10 13:05:44 +0100367 const std::string& mid) const RTC_RUN_ON(network_thread_);
368 cricket::JsepTransport* GetJsepTransportForMid(const std::string& mid)
369 RTC_RUN_ON(network_thread_);
Zhi Huange830e682018-03-30 10:48:35 -0700370
371 // Get the JsepTransport without considering the BUNDLE group. Return nullptr
372 // if the JsepTransport is destroyed.
Zhi Huang365381f2018-04-13 16:44:34 -0700373 const cricket::JsepTransport* GetJsepTransportByName(
Tomas Gunnarsson20f74562021-02-04 10:22:50 +0100374 const std::string& transport_name) const RTC_RUN_ON(network_thread_);
Zhi Huang365381f2018-04-13 16:44:34 -0700375 cricket::JsepTransport* GetJsepTransportByName(
Tomas Gunnarsson20f74562021-02-04 10:22:50 +0100376 const std::string& transport_name) RTC_RUN_ON(network_thread_);
Zhi Huange830e682018-03-30 10:48:35 -0700377
Anton Sukhanov7940da02018-10-10 10:34:49 -0700378 // Creates jsep transport. Noop if transport is already created.
379 // Transport is created either during SetLocalDescription (|local| == true) or
380 // during SetRemoteDescription (|local| == false). Passing |local| helps to
381 // differentiate initiator (caller) from answerer (callee).
Piotr (Peter) Slatala105ded32019-02-27 14:26:15 -0800382 RTCError MaybeCreateJsepTransport(
383 bool local,
384 const cricket::ContentInfo& content_info,
Niels Möller5cf0ef02021-01-18 14:00:36 +0100385 const cricket::SessionDescription& description)
386 RTC_RUN_ON(network_thread_);
Piotr (Peter) Slatala47dfdca2018-11-16 14:13:58 -0800387
Niels Möller5cf0ef02021-01-18 14:00:36 +0100388 void MaybeDestroyJsepTransport(const std::string& mid)
389 RTC_RUN_ON(network_thread_);
390 void DestroyAllJsepTransports_n() RTC_RUN_ON(network_thread_);
Zhi Huange818b6e2018-02-22 15:26:27 -0800391
Niels Möller5cf0ef02021-01-18 14:00:36 +0100392 void SetIceRole_n(cricket::IceRole ice_role) RTC_RUN_ON(network_thread_);
Zhi Huange818b6e2018-02-22 15:26:27 -0800393
394 cricket::IceRole DetermineIceRole(
Zhi Huang365381f2018-04-13 16:44:34 -0700395 cricket::JsepTransport* jsep_transport,
Zhi Huange818b6e2018-02-22 15:26:27 -0800396 const cricket::TransportInfo& transport_info,
397 SdpType type,
398 bool local);
399
400 std::unique_ptr<cricket::DtlsTransportInternal> CreateDtlsTransport(
Anton Sukhanovac6c0962019-07-10 15:44:56 -0700401 const cricket::ContentInfo& content_info,
Niels Möller2a707032020-06-16 16:39:13 +0200402 cricket::IceTransportInternal* ice);
Qingsi Wang25ec8882019-11-15 12:33:05 -0800403 rtc::scoped_refptr<webrtc::IceTransportInterface> CreateIceTransport(
404 const std::string& transport_name,
Zhi Huange818b6e2018-02-22 15:26:27 -0800405 bool rtcp);
406
407 std::unique_ptr<webrtc::RtpTransport> CreateUnencryptedRtpTransport(
408 const std::string& transport_name,
409 rtc::PacketTransportInternal* rtp_packet_transport,
410 rtc::PacketTransportInternal* rtcp_packet_transport);
411 std::unique_ptr<webrtc::SrtpTransport> CreateSdesTransport(
412 const std::string& transport_name,
Zhi Huange830e682018-03-30 10:48:35 -0700413 cricket::DtlsTransportInternal* rtp_dtls_transport,
414 cricket::DtlsTransportInternal* rtcp_dtls_transport);
Zhi Huange818b6e2018-02-22 15:26:27 -0800415 std::unique_ptr<webrtc::DtlsSrtpTransport> CreateDtlsSrtpTransport(
416 const std::string& transport_name,
417 cricket::DtlsTransportInternal* rtp_dtls_transport,
418 cricket::DtlsTransportInternal* rtcp_dtls_transport);
419
420 // Collect all the DtlsTransports, including RTP and RTCP, from the
421 // JsepTransports. JsepTransportController can iterate all the DtlsTransports
422 // and update the aggregate states.
423 std::vector<cricket::DtlsTransportInternal*> GetDtlsTransports();
424
425 // Handlers for signals from Transport.
Niels Möller5cf0ef02021-01-18 14:00:36 +0100426 void OnTransportWritableState_n(rtc::PacketTransportInternal* transport)
427 RTC_RUN_ON(network_thread_);
428 void OnTransportReceivingState_n(rtc::PacketTransportInternal* transport)
429 RTC_RUN_ON(network_thread_);
430 void OnTransportGatheringState_n(cricket::IceTransportInternal* transport)
431 RTC_RUN_ON(network_thread_);
Zhi Huange818b6e2018-02-22 15:26:27 -0800432 void OnTransportCandidateGathered_n(cricket::IceTransportInternal* transport,
Niels Möller5cf0ef02021-01-18 14:00:36 +0100433 const cricket::Candidate& candidate)
434 RTC_RUN_ON(network_thread_);
435 void OnTransportCandidateError_n(cricket::IceTransportInternal* transport,
436 const cricket::IceCandidateErrorEvent& event)
437 RTC_RUN_ON(network_thread_);
Zhi Huange818b6e2018-02-22 15:26:27 -0800438 void OnTransportCandidatesRemoved_n(cricket::IceTransportInternal* transport,
Niels Möller5cf0ef02021-01-18 14:00:36 +0100439 const cricket::Candidates& candidates)
440 RTC_RUN_ON(network_thread_);
441 void OnTransportRoleConflict_n(cricket::IceTransportInternal* transport)
442 RTC_RUN_ON(network_thread_);
443 void OnTransportStateChanged_n(cricket::IceTransportInternal* transport)
444 RTC_RUN_ON(network_thread_);
Alex Drake00c7ecf2019-08-06 10:54:47 -0700445 void OnTransportCandidatePairChanged_n(
Niels Möller5cf0ef02021-01-18 14:00:36 +0100446 const cricket::CandidatePairChangeEvent& event)
447 RTC_RUN_ON(network_thread_);
448 void UpdateAggregateStates_n() RTC_RUN_ON(network_thread_);
Zhi Huange818b6e2018-02-22 15:26:27 -0800449
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200450 void OnRtcpPacketReceived_n(rtc::CopyOnWriteBuffer* packet,
Niels Möller5cf0ef02021-01-18 14:00:36 +0100451 int64_t packet_time_us)
452 RTC_RUN_ON(network_thread_);
Sebastian Jansson1b83a9e2019-09-18 18:22:12 +0200453
Zhi Huange818b6e2018-02-22 15:26:27 -0800454 void OnDtlsHandshakeError(rtc::SSLHandshakeError error);
455
Zhi Huange818b6e2018-02-22 15:26:27 -0800456 rtc::Thread* const network_thread_ = nullptr;
457 cricket::PortAllocator* const port_allocator_ = nullptr;
Harald Alvestrand0ccfbd22021-04-08 07:25:04 +0000458 AsyncDnsResolverFactoryInterface* const async_dns_resolver_factory_ = nullptr;
Zhi Huange818b6e2018-02-22 15:26:27 -0800459
Zhi Huang365381f2018-04-13 16:44:34 -0700460 std::map<std::string, std::unique_ptr<cricket::JsepTransport>>
Tomas Gunnarsson20f74562021-02-04 10:22:50 +0100461 jsep_transports_by_name_ RTC_GUARDED_BY(network_thread_);
Zhi Huangd2248f82018-04-10 14:41:03 -0700462 // This keeps track of the mapping between media section
Zhi Huang365381f2018-04-13 16:44:34 -0700463 // (BaseChannel/SctpTransport) and the JsepTransport underneath.
Tomas Gunnarsson92eebef2021-02-10 13:05:44 +0100464 std::map<std::string, cricket::JsepTransport*> mid_to_transport_
465 RTC_GUARDED_BY(network_thread_);
Eldar Rellod85ea752020-02-19 20:41:07 +0200466 // Keep track of mids that have been mapped to transports. Used for rollback.
467 std::vector<std::string> pending_mids_ RTC_GUARDED_BY(network_thread_);
Jonas Olsson635474e2018-10-18 15:58:17 +0200468 // Aggregate states for Transports.
Alex Loiko9289eda2018-11-23 16:18:59 +0000469 // standardized_ice_connection_state_ is intended to replace
470 // ice_connection_state, see bugs.webrtc.org/9308
471 cricket::IceConnectionState ice_connection_state_ =
472 cricket::kIceConnectionConnecting;
473 PeerConnectionInterface::IceConnectionState
474 standardized_ice_connection_state_ =
475 PeerConnectionInterface::kIceConnectionNew;
Jonas Olsson635474e2018-10-18 15:58:17 +0200476 PeerConnectionInterface::PeerConnectionState combined_connection_state_ =
477 PeerConnectionInterface::PeerConnectionState::kNew;
Zhi Huange818b6e2018-02-22 15:26:27 -0800478 cricket::IceGatheringState ice_gathering_state_ = cricket::kIceGatheringNew;
479
Harald Alvestrand133c0522021-01-29 14:27:12 +0000480 const Config config_;
481 bool active_reset_srtp_params_ RTC_GUARDED_BY(network_thread_);
Piotr (Peter) Slatalab1ae10b2019-03-01 11:14:05 -0800482
Zhi Huange818b6e2018-02-22 15:26:27 -0800483 const cricket::SessionDescription* local_desc_ = nullptr;
484 const cricket::SessionDescription* remote_desc_ = nullptr;
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200485 absl::optional<bool> initial_offerer_;
Zhi Huange818b6e2018-02-22 15:26:27 -0800486
Zhi Huange818b6e2018-02-22 15:26:27 -0800487 cricket::IceConfig ice_config_;
488 cricket::IceRole ice_role_ = cricket::ICEROLE_CONTROLLING;
489 uint64_t ice_tiebreaker_ = rtc::CreateRandomId64();
490 rtc::scoped_refptr<rtc::RTCCertificate> certificate_;
Zhi Huange818b6e2018-02-22 15:26:27 -0800491
Harald Alvestrand9f9bf382021-06-08 04:12:37 +0000492 BundleManager bundles_;
493
Zhi Huange818b6e2018-02-22 15:26:27 -0800494 RTC_DISALLOW_COPY_AND_ASSIGN(JsepTransportController);
495};
496
497} // namespace webrtc
498
Steve Anton10542f22019-01-11 09:11:00 -0800499#endif // PC_JSEP_TRANSPORT_CONTROLLER_H_