xref: /aosp_15_r20/external/webrtc/pc/jsep_transport.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2018 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 PC_JSEP_TRANSPORT_H_
12*d9f75844SAndroid Build Coastguard Worker #define PC_JSEP_TRANSPORT_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <functional>
15*d9f75844SAndroid Build Coastguard Worker #include <map>
16*d9f75844SAndroid Build Coastguard Worker #include <memory>
17*d9f75844SAndroid Build Coastguard Worker #include <string>
18*d9f75844SAndroid Build Coastguard Worker #include <vector>
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/candidate.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/crypto_params.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/ice_transport_interface.h"
24*d9f75844SAndroid Build Coastguard Worker #include "api/jsep.h"
25*d9f75844SAndroid Build Coastguard Worker #include "api/rtc_error.h"
26*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h"
27*d9f75844SAndroid Build Coastguard Worker #include "api/sequence_checker.h"
28*d9f75844SAndroid Build Coastguard Worker #include "api/transport/data_channel_transport_interface.h"
29*d9f75844SAndroid Build Coastguard Worker #include "media/sctp/sctp_transport_internal.h"
30*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/dtls_transport.h"
31*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/dtls_transport_internal.h"
32*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/ice_transport_internal.h"
33*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/p2p_constants.h"
34*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/transport_description.h"
35*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/transport_info.h"
36*d9f75844SAndroid Build Coastguard Worker #include "pc/dtls_srtp_transport.h"
37*d9f75844SAndroid Build Coastguard Worker #include "pc/dtls_transport.h"
38*d9f75844SAndroid Build Coastguard Worker #include "pc/rtcp_mux_filter.h"
39*d9f75844SAndroid Build Coastguard Worker #include "pc/rtp_transport.h"
40*d9f75844SAndroid Build Coastguard Worker #include "pc/rtp_transport_internal.h"
41*d9f75844SAndroid Build Coastguard Worker #include "pc/sctp_transport.h"
42*d9f75844SAndroid Build Coastguard Worker #include "pc/session_description.h"
43*d9f75844SAndroid Build Coastguard Worker #include "pc/srtp_filter.h"
44*d9f75844SAndroid Build Coastguard Worker #include "pc/srtp_transport.h"
45*d9f75844SAndroid Build Coastguard Worker #include "pc/transport_stats.h"
46*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
47*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/rtc_certificate.h"
48*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ssl_fingerprint.h"
49*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ssl_stream_adapter.h"
50*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread.h"
51*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h"
52*d9f75844SAndroid Build Coastguard Worker 
53*d9f75844SAndroid Build Coastguard Worker namespace cricket {
54*d9f75844SAndroid Build Coastguard Worker 
55*d9f75844SAndroid Build Coastguard Worker class DtlsTransportInternal;
56*d9f75844SAndroid Build Coastguard Worker 
57*d9f75844SAndroid Build Coastguard Worker struct JsepTransportDescription {
58*d9f75844SAndroid Build Coastguard Worker  public:
59*d9f75844SAndroid Build Coastguard Worker   JsepTransportDescription();
60*d9f75844SAndroid Build Coastguard Worker   JsepTransportDescription(
61*d9f75844SAndroid Build Coastguard Worker       bool rtcp_mux_enabled,
62*d9f75844SAndroid Build Coastguard Worker       const std::vector<CryptoParams>& cryptos,
63*d9f75844SAndroid Build Coastguard Worker       const std::vector<int>& encrypted_header_extension_ids,
64*d9f75844SAndroid Build Coastguard Worker       int rtp_abs_sendtime_extn_id,
65*d9f75844SAndroid Build Coastguard Worker       const TransportDescription& transport_description);
66*d9f75844SAndroid Build Coastguard Worker   JsepTransportDescription(const JsepTransportDescription& from);
67*d9f75844SAndroid Build Coastguard Worker   ~JsepTransportDescription();
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker   JsepTransportDescription& operator=(const JsepTransportDescription& from);
70*d9f75844SAndroid Build Coastguard Worker 
71*d9f75844SAndroid Build Coastguard Worker   bool rtcp_mux_enabled = true;
72*d9f75844SAndroid Build Coastguard Worker   std::vector<CryptoParams> cryptos;
73*d9f75844SAndroid Build Coastguard Worker   std::vector<int> encrypted_header_extension_ids;
74*d9f75844SAndroid Build Coastguard Worker   int rtp_abs_sendtime_extn_id = -1;
75*d9f75844SAndroid Build Coastguard Worker   // TODO(zhihuang): Add the ICE and DTLS related variables and methods from
76*d9f75844SAndroid Build Coastguard Worker   // TransportDescription and remove this extra layer of abstraction.
77*d9f75844SAndroid Build Coastguard Worker   TransportDescription transport_desc;
78*d9f75844SAndroid Build Coastguard Worker };
79*d9f75844SAndroid Build Coastguard Worker 
80*d9f75844SAndroid Build Coastguard Worker // Helper class used by JsepTransportController that processes
81*d9f75844SAndroid Build Coastguard Worker // TransportDescriptions. A TransportDescription represents the
82*d9f75844SAndroid Build Coastguard Worker // transport-specific properties of an SDP m= section, processed according to
83*d9f75844SAndroid Build Coastguard Worker // JSEP. Each transport consists of DTLS and ICE transport channels for RTP
84*d9f75844SAndroid Build Coastguard Worker // (and possibly RTCP, if rtcp-mux isn't used).
85*d9f75844SAndroid Build Coastguard Worker //
86*d9f75844SAndroid Build Coastguard Worker // On Threading: JsepTransport performs work solely on the network thread, and
87*d9f75844SAndroid Build Coastguard Worker // so its methods should only be called on the network thread.
88*d9f75844SAndroid Build Coastguard Worker class JsepTransport {
89*d9f75844SAndroid Build Coastguard Worker  public:
90*d9f75844SAndroid Build Coastguard Worker   // `mid` is just used for log statements in order to identify the Transport.
91*d9f75844SAndroid Build Coastguard Worker   // Note that `local_certificate` is allowed to be null since a remote
92*d9f75844SAndroid Build Coastguard Worker   // description may be set before a local certificate is generated.
93*d9f75844SAndroid Build Coastguard Worker   JsepTransport(
94*d9f75844SAndroid Build Coastguard Worker       const std::string& mid,
95*d9f75844SAndroid Build Coastguard Worker       const rtc::scoped_refptr<rtc::RTCCertificate>& local_certificate,
96*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<webrtc::IceTransportInterface> ice_transport,
97*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<webrtc::IceTransportInterface> rtcp_ice_transport,
98*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<webrtc::RtpTransport> unencrypted_rtp_transport,
99*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<webrtc::SrtpTransport> sdes_transport,
100*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<webrtc::DtlsSrtpTransport> dtls_srtp_transport,
101*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<DtlsTransportInternal> rtp_dtls_transport,
102*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<DtlsTransportInternal> rtcp_dtls_transport,
103*d9f75844SAndroid Build Coastguard Worker       std::unique_ptr<SctpTransportInternal> sctp_transport,
104*d9f75844SAndroid Build Coastguard Worker       std::function<void()> rtcp_mux_active_callback);
105*d9f75844SAndroid Build Coastguard Worker 
106*d9f75844SAndroid Build Coastguard Worker   ~JsepTransport();
107*d9f75844SAndroid Build Coastguard Worker 
108*d9f75844SAndroid Build Coastguard Worker   JsepTransport(const JsepTransport&) = delete;
109*d9f75844SAndroid Build Coastguard Worker   JsepTransport& operator=(const JsepTransport&) = delete;
110*d9f75844SAndroid Build Coastguard Worker 
111*d9f75844SAndroid Build Coastguard Worker   // Returns the MID of this transport. This is only used for logging.
mid()112*d9f75844SAndroid Build Coastguard Worker   const std::string& mid() const { return mid_; }
113*d9f75844SAndroid Build Coastguard Worker 
114*d9f75844SAndroid Build Coastguard Worker   // Must be called before applying local session description.
115*d9f75844SAndroid Build Coastguard Worker   // Needed in order to verify the local fingerprint.
SetLocalCertificate(const rtc::scoped_refptr<rtc::RTCCertificate> & local_certificate)116*d9f75844SAndroid Build Coastguard Worker   void SetLocalCertificate(
117*d9f75844SAndroid Build Coastguard Worker       const rtc::scoped_refptr<rtc::RTCCertificate>& local_certificate) {
118*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_RUN_ON(network_thread_);
119*d9f75844SAndroid Build Coastguard Worker     local_certificate_ = local_certificate;
120*d9f75844SAndroid Build Coastguard Worker   }
121*d9f75844SAndroid Build Coastguard Worker 
122*d9f75844SAndroid Build Coastguard Worker   // Return the local certificate provided by SetLocalCertificate.
GetLocalCertificate()123*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<rtc::RTCCertificate> GetLocalCertificate() const {
124*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_RUN_ON(network_thread_);
125*d9f75844SAndroid Build Coastguard Worker     return local_certificate_;
126*d9f75844SAndroid Build Coastguard Worker   }
127*d9f75844SAndroid Build Coastguard Worker 
128*d9f75844SAndroid Build Coastguard Worker   webrtc::RTCError SetLocalJsepTransportDescription(
129*d9f75844SAndroid Build Coastguard Worker       const JsepTransportDescription& jsep_description,
130*d9f75844SAndroid Build Coastguard Worker       webrtc::SdpType type);
131*d9f75844SAndroid Build Coastguard Worker 
132*d9f75844SAndroid Build Coastguard Worker   // Set the remote TransportDescription to be used by DTLS and ICE channels
133*d9f75844SAndroid Build Coastguard Worker   // that are part of this Transport.
134*d9f75844SAndroid Build Coastguard Worker   webrtc::RTCError SetRemoteJsepTransportDescription(
135*d9f75844SAndroid Build Coastguard Worker       const JsepTransportDescription& jsep_description,
136*d9f75844SAndroid Build Coastguard Worker       webrtc::SdpType type);
137*d9f75844SAndroid Build Coastguard Worker   webrtc::RTCError AddRemoteCandidates(const Candidates& candidates);
138*d9f75844SAndroid Build Coastguard Worker 
139*d9f75844SAndroid Build Coastguard Worker   // Set the "needs-ice-restart" flag as described in JSEP. After the flag is
140*d9f75844SAndroid Build Coastguard Worker   // set, offers should generate new ufrags/passwords until an ICE restart
141*d9f75844SAndroid Build Coastguard Worker   // occurs.
142*d9f75844SAndroid Build Coastguard Worker   //
143*d9f75844SAndroid Build Coastguard Worker   // This and `needs_ice_restart()` must be called on the network thread.
144*d9f75844SAndroid Build Coastguard Worker   void SetNeedsIceRestartFlag();
145*d9f75844SAndroid Build Coastguard Worker 
146*d9f75844SAndroid Build Coastguard Worker   // Returns true if the ICE restart flag above was set, and no ICE restart has
147*d9f75844SAndroid Build Coastguard Worker   // occurred yet for this transport (by applying a local description with
148*d9f75844SAndroid Build Coastguard Worker   // changed ufrag/password).
needs_ice_restart()149*d9f75844SAndroid Build Coastguard Worker   bool needs_ice_restart() const {
150*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_RUN_ON(network_thread_);
151*d9f75844SAndroid Build Coastguard Worker     return needs_ice_restart_;
152*d9f75844SAndroid Build Coastguard Worker   }
153*d9f75844SAndroid Build Coastguard Worker 
154*d9f75844SAndroid Build Coastguard Worker   // Returns role if negotiated, or empty absl::optional if it hasn't been
155*d9f75844SAndroid Build Coastguard Worker   // negotiated yet.
156*d9f75844SAndroid Build Coastguard Worker   absl::optional<rtc::SSLRole> GetDtlsRole() const;
157*d9f75844SAndroid Build Coastguard Worker 
158*d9f75844SAndroid Build Coastguard Worker   // TODO(deadbeef): Make this const. See comment in transportcontroller.h.
159*d9f75844SAndroid Build Coastguard Worker   bool GetStats(TransportStats* stats);
160*d9f75844SAndroid Build Coastguard Worker 
local_description()161*d9f75844SAndroid Build Coastguard Worker   const JsepTransportDescription* local_description() const {
162*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_RUN_ON(network_thread_);
163*d9f75844SAndroid Build Coastguard Worker     return local_description_.get();
164*d9f75844SAndroid Build Coastguard Worker   }
165*d9f75844SAndroid Build Coastguard Worker 
remote_description()166*d9f75844SAndroid Build Coastguard Worker   const JsepTransportDescription* remote_description() const {
167*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_RUN_ON(network_thread_);
168*d9f75844SAndroid Build Coastguard Worker     return remote_description_.get();
169*d9f75844SAndroid Build Coastguard Worker   }
170*d9f75844SAndroid Build Coastguard Worker 
171*d9f75844SAndroid Build Coastguard Worker   // Returns the rtp transport, if any.
rtp_transport()172*d9f75844SAndroid Build Coastguard Worker   webrtc::RtpTransportInternal* rtp_transport() const {
173*d9f75844SAndroid Build Coastguard Worker     if (dtls_srtp_transport_) {
174*d9f75844SAndroid Build Coastguard Worker       return dtls_srtp_transport_.get();
175*d9f75844SAndroid Build Coastguard Worker     }
176*d9f75844SAndroid Build Coastguard Worker     if (sdes_transport_) {
177*d9f75844SAndroid Build Coastguard Worker       return sdes_transport_.get();
178*d9f75844SAndroid Build Coastguard Worker     }
179*d9f75844SAndroid Build Coastguard Worker     if (unencrypted_rtp_transport_) {
180*d9f75844SAndroid Build Coastguard Worker       return unencrypted_rtp_transport_.get();
181*d9f75844SAndroid Build Coastguard Worker     }
182*d9f75844SAndroid Build Coastguard Worker     return nullptr;
183*d9f75844SAndroid Build Coastguard Worker   }
184*d9f75844SAndroid Build Coastguard Worker 
rtp_dtls_transport()185*d9f75844SAndroid Build Coastguard Worker   const DtlsTransportInternal* rtp_dtls_transport() const {
186*d9f75844SAndroid Build Coastguard Worker     if (rtp_dtls_transport_) {
187*d9f75844SAndroid Build Coastguard Worker       return rtp_dtls_transport_->internal();
188*d9f75844SAndroid Build Coastguard Worker     }
189*d9f75844SAndroid Build Coastguard Worker     return nullptr;
190*d9f75844SAndroid Build Coastguard Worker   }
191*d9f75844SAndroid Build Coastguard Worker 
rtp_dtls_transport()192*d9f75844SAndroid Build Coastguard Worker   DtlsTransportInternal* rtp_dtls_transport() {
193*d9f75844SAndroid Build Coastguard Worker     if (rtp_dtls_transport_) {
194*d9f75844SAndroid Build Coastguard Worker       return rtp_dtls_transport_->internal();
195*d9f75844SAndroid Build Coastguard Worker     }
196*d9f75844SAndroid Build Coastguard Worker     return nullptr;
197*d9f75844SAndroid Build Coastguard Worker   }
198*d9f75844SAndroid Build Coastguard Worker 
rtcp_dtls_transport()199*d9f75844SAndroid Build Coastguard Worker   const DtlsTransportInternal* rtcp_dtls_transport() const {
200*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_RUN_ON(network_thread_);
201*d9f75844SAndroid Build Coastguard Worker     if (rtcp_dtls_transport_) {
202*d9f75844SAndroid Build Coastguard Worker       return rtcp_dtls_transport_->internal();
203*d9f75844SAndroid Build Coastguard Worker     }
204*d9f75844SAndroid Build Coastguard Worker     return nullptr;
205*d9f75844SAndroid Build Coastguard Worker   }
206*d9f75844SAndroid Build Coastguard Worker 
rtcp_dtls_transport()207*d9f75844SAndroid Build Coastguard Worker   DtlsTransportInternal* rtcp_dtls_transport() {
208*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_RUN_ON(network_thread_);
209*d9f75844SAndroid Build Coastguard Worker     if (rtcp_dtls_transport_) {
210*d9f75844SAndroid Build Coastguard Worker       return rtcp_dtls_transport_->internal();
211*d9f75844SAndroid Build Coastguard Worker     }
212*d9f75844SAndroid Build Coastguard Worker     return nullptr;
213*d9f75844SAndroid Build Coastguard Worker   }
214*d9f75844SAndroid Build Coastguard Worker 
RtpDtlsTransport()215*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<webrtc::DtlsTransport> RtpDtlsTransport() {
216*d9f75844SAndroid Build Coastguard Worker     return rtp_dtls_transport_;
217*d9f75844SAndroid Build Coastguard Worker   }
218*d9f75844SAndroid Build Coastguard Worker 
SctpTransport()219*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<webrtc::SctpTransport> SctpTransport() const {
220*d9f75844SAndroid Build Coastguard Worker     return sctp_transport_;
221*d9f75844SAndroid Build Coastguard Worker   }
222*d9f75844SAndroid Build Coastguard Worker 
223*d9f75844SAndroid Build Coastguard Worker   // TODO(bugs.webrtc.org/9719): Delete method, update callers to use
224*d9f75844SAndroid Build Coastguard Worker   // SctpTransport() instead.
data_channel_transport()225*d9f75844SAndroid Build Coastguard Worker   webrtc::DataChannelTransportInterface* data_channel_transport() const {
226*d9f75844SAndroid Build Coastguard Worker     return sctp_transport_.get();
227*d9f75844SAndroid Build Coastguard Worker   }
228*d9f75844SAndroid Build Coastguard Worker 
229*d9f75844SAndroid Build Coastguard Worker   // TODO(deadbeef): The methods below are only public for testing. Should make
230*d9f75844SAndroid Build Coastguard Worker   // them utility functions or objects so they can be tested independently from
231*d9f75844SAndroid Build Coastguard Worker   // this class.
232*d9f75844SAndroid Build Coastguard Worker 
233*d9f75844SAndroid Build Coastguard Worker   // Returns an error if the certificate's identity does not match the
234*d9f75844SAndroid Build Coastguard Worker   // fingerprint, or either is NULL.
235*d9f75844SAndroid Build Coastguard Worker   webrtc::RTCError VerifyCertificateFingerprint(
236*d9f75844SAndroid Build Coastguard Worker       const rtc::RTCCertificate* certificate,
237*d9f75844SAndroid Build Coastguard Worker       const rtc::SSLFingerprint* fingerprint) const;
238*d9f75844SAndroid Build Coastguard Worker 
239*d9f75844SAndroid Build Coastguard Worker   void SetActiveResetSrtpParams(bool active_reset_srtp_params);
240*d9f75844SAndroid Build Coastguard Worker 
241*d9f75844SAndroid Build Coastguard Worker  private:
242*d9f75844SAndroid Build Coastguard Worker   bool SetRtcpMux(bool enable, webrtc::SdpType type, ContentSource source);
243*d9f75844SAndroid Build Coastguard Worker 
244*d9f75844SAndroid Build Coastguard Worker   void ActivateRtcpMux() RTC_RUN_ON(network_thread_);
245*d9f75844SAndroid Build Coastguard Worker 
246*d9f75844SAndroid Build Coastguard Worker   bool SetSdes(const std::vector<CryptoParams>& cryptos,
247*d9f75844SAndroid Build Coastguard Worker                const std::vector<int>& encrypted_extension_ids,
248*d9f75844SAndroid Build Coastguard Worker                webrtc::SdpType type,
249*d9f75844SAndroid Build Coastguard Worker                ContentSource source);
250*d9f75844SAndroid Build Coastguard Worker 
251*d9f75844SAndroid Build Coastguard Worker   // Negotiates and sets the DTLS parameters based on the current local and
252*d9f75844SAndroid Build Coastguard Worker   // remote transport description, such as the DTLS role to use, and whether
253*d9f75844SAndroid Build Coastguard Worker   // DTLS should be activated.
254*d9f75844SAndroid Build Coastguard Worker   //
255*d9f75844SAndroid Build Coastguard Worker   // Called when an answer TransportDescription is applied.
256*d9f75844SAndroid Build Coastguard Worker   webrtc::RTCError NegotiateAndSetDtlsParameters(
257*d9f75844SAndroid Build Coastguard Worker       webrtc::SdpType local_description_type);
258*d9f75844SAndroid Build Coastguard Worker 
259*d9f75844SAndroid Build Coastguard Worker   // Negotiates the DTLS role based off the offer and answer as specified by
260*d9f75844SAndroid Build Coastguard Worker   // RFC 4145, section-4.1. Returns an RTCError if role cannot be determined
261*d9f75844SAndroid Build Coastguard Worker   // from the local description and remote description.
262*d9f75844SAndroid Build Coastguard Worker   webrtc::RTCError NegotiateDtlsRole(
263*d9f75844SAndroid Build Coastguard Worker       webrtc::SdpType local_description_type,
264*d9f75844SAndroid Build Coastguard Worker       ConnectionRole local_connection_role,
265*d9f75844SAndroid Build Coastguard Worker       ConnectionRole remote_connection_role,
266*d9f75844SAndroid Build Coastguard Worker       absl::optional<rtc::SSLRole>* negotiated_dtls_role);
267*d9f75844SAndroid Build Coastguard Worker 
268*d9f75844SAndroid Build Coastguard Worker   // Pushes down the ICE parameters from the remote description.
269*d9f75844SAndroid Build Coastguard Worker   void SetRemoteIceParameters(const IceParameters& ice_parameters,
270*d9f75844SAndroid Build Coastguard Worker                               IceTransportInternal* ice);
271*d9f75844SAndroid Build Coastguard Worker 
272*d9f75844SAndroid Build Coastguard Worker   // Pushes down the DTLS parameters obtained via negotiation.
273*d9f75844SAndroid Build Coastguard Worker   static webrtc::RTCError SetNegotiatedDtlsParameters(
274*d9f75844SAndroid Build Coastguard Worker       DtlsTransportInternal* dtls_transport,
275*d9f75844SAndroid Build Coastguard Worker       absl::optional<rtc::SSLRole> dtls_role,
276*d9f75844SAndroid Build Coastguard Worker       rtc::SSLFingerprint* remote_fingerprint);
277*d9f75844SAndroid Build Coastguard Worker 
278*d9f75844SAndroid Build Coastguard Worker   bool GetTransportStats(DtlsTransportInternal* dtls_transport,
279*d9f75844SAndroid Build Coastguard Worker                          int component,
280*d9f75844SAndroid Build Coastguard Worker                          TransportStats* stats);
281*d9f75844SAndroid Build Coastguard Worker 
282*d9f75844SAndroid Build Coastguard Worker   // Owning thread, for safety checks
283*d9f75844SAndroid Build Coastguard Worker   const rtc::Thread* const network_thread_;
284*d9f75844SAndroid Build Coastguard Worker   const std::string mid_;
285*d9f75844SAndroid Build Coastguard Worker   // needs-ice-restart bit as described in JSEP.
286*d9f75844SAndroid Build Coastguard Worker   bool needs_ice_restart_ RTC_GUARDED_BY(network_thread_) = false;
287*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<rtc::RTCCertificate> local_certificate_
288*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(network_thread_);
289*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<JsepTransportDescription> local_description_
290*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(network_thread_);
291*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<JsepTransportDescription> remote_description_
292*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(network_thread_);
293*d9f75844SAndroid Build Coastguard Worker 
294*d9f75844SAndroid Build Coastguard Worker   // Ice transport which may be used by any of upper-layer transports (below).
295*d9f75844SAndroid Build Coastguard Worker   // Owned by JsepTransport and guaranteed to outlive the transports below.
296*d9f75844SAndroid Build Coastguard Worker   const rtc::scoped_refptr<webrtc::IceTransportInterface> ice_transport_;
297*d9f75844SAndroid Build Coastguard Worker   const rtc::scoped_refptr<webrtc::IceTransportInterface> rtcp_ice_transport_;
298*d9f75844SAndroid Build Coastguard Worker 
299*d9f75844SAndroid Build Coastguard Worker   // To avoid downcasting and make it type safe, keep three unique pointers for
300*d9f75844SAndroid Build Coastguard Worker   // different SRTP mode and only one of these is non-nullptr.
301*d9f75844SAndroid Build Coastguard Worker   const std::unique_ptr<webrtc::RtpTransport> unencrypted_rtp_transport_;
302*d9f75844SAndroid Build Coastguard Worker   const std::unique_ptr<webrtc::SrtpTransport> sdes_transport_;
303*d9f75844SAndroid Build Coastguard Worker   const std::unique_ptr<webrtc::DtlsSrtpTransport> dtls_srtp_transport_;
304*d9f75844SAndroid Build Coastguard Worker 
305*d9f75844SAndroid Build Coastguard Worker   const rtc::scoped_refptr<webrtc::DtlsTransport> rtp_dtls_transport_;
306*d9f75844SAndroid Build Coastguard Worker   // The RTCP transport is const for all usages, except that it is cleared
307*d9f75844SAndroid Build Coastguard Worker   // when RTCP multiplexing is turned on; this happens on the network thread.
308*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<webrtc::DtlsTransport> rtcp_dtls_transport_
309*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(network_thread_);
310*d9f75844SAndroid Build Coastguard Worker 
311*d9f75844SAndroid Build Coastguard Worker   const rtc::scoped_refptr<webrtc::SctpTransport> sctp_transport_;
312*d9f75844SAndroid Build Coastguard Worker 
313*d9f75844SAndroid Build Coastguard Worker   SrtpFilter sdes_negotiator_ RTC_GUARDED_BY(network_thread_);
314*d9f75844SAndroid Build Coastguard Worker   RtcpMuxFilter rtcp_mux_negotiator_ RTC_GUARDED_BY(network_thread_);
315*d9f75844SAndroid Build Coastguard Worker 
316*d9f75844SAndroid Build Coastguard Worker   // Cache the encrypted header extension IDs for SDES negoitation.
317*d9f75844SAndroid Build Coastguard Worker   absl::optional<std::vector<int>> send_extension_ids_
318*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(network_thread_);
319*d9f75844SAndroid Build Coastguard Worker   absl::optional<std::vector<int>> recv_extension_ids_
320*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(network_thread_);
321*d9f75844SAndroid Build Coastguard Worker 
322*d9f75844SAndroid Build Coastguard Worker   // This is invoked when RTCP-mux becomes active and
323*d9f75844SAndroid Build Coastguard Worker   // `rtcp_dtls_transport_` is destroyed. The JsepTransportController will
324*d9f75844SAndroid Build Coastguard Worker   // receive the callback and update the aggregate transport states.
325*d9f75844SAndroid Build Coastguard Worker   std::function<void()> rtcp_mux_active_callback_;
326*d9f75844SAndroid Build Coastguard Worker };
327*d9f75844SAndroid Build Coastguard Worker 
328*d9f75844SAndroid Build Coastguard Worker }  // namespace cricket
329*d9f75844SAndroid Build Coastguard Worker 
330*d9f75844SAndroid Build Coastguard Worker #endif  // PC_JSEP_TRANSPORT_H_
331