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