tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

MediaTransportHandler.h (8059B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #ifndef _MTRANSPORTHANDLER_H__
      6 #define _MTRANSPORTHANDLER_H__
      7 
      8 #include <set>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "MediaEventSource.h"
     13 #include "RTCStatsReport.h"
     14 #include "common/CandidateInfo.h"
     15 #include "mozilla/RefPtr.h"
     16 #include "mozilla/dom/RTCConfigurationBinding.h"
     17 #include "mozilla/dom/RTCIceTransportBinding.h"  // RTCIceTransportState
     18 #include "mozilla/dom/RTCPeerConnectionBinding.h"
     19 #include "nsISupportsImpl.h"
     20 #include "nsString.h"
     21 #include "transport/dtlsidentity.h"  // For DtlsDigest
     22 #include "transport/nr_socket_proxy_config.h"
     23 #include "transport/nricectx.h"        // Need some enums
     24 #include "transport/transportlayer.h"  // Need the State enum
     25 
     26 namespace mozilla {
     27 class DtlsIdentity;
     28 class NrIceCtx;
     29 class NrIceMediaStream;
     30 class NrIceResolver;
     31 class TransportFlow;
     32 class RTCStatsQuery;
     33 
     34 namespace dom {
     35 struct RTCStatsReportInternal;
     36 }
     37 
     38 class MediaTransportHandler {
     39 public:
     40  // Creates either a MediaTransportHandlerSTS or a MediaTransportHandlerIPC,
     41  // as appropriate.
     42  static already_AddRefed<MediaTransportHandler> Create();
     43 
     44  explicit MediaTransportHandler()
     45      : mStateCacheMutex("MediaTransportHandler::mStateCacheMutex") {}
     46 
     47  // Exposed so we can synchronously validate ICE servers from PeerConnection
     48  static nsresult ConvertIceServers(
     49      const nsTArray<dom::RTCIceServer>& aIceServers,
     50      std::vector<NrIceStunServer>* aStunServers,
     51      std::vector<NrIceTurnServer>* aTurnServers);
     52 
     53  typedef MozPromise<dom::Sequence<nsString>, nsresult, true> IceLogPromise;
     54 
     55  virtual void Initialize() {}
     56 
     57  // There's a wrinkle here; the ICE logging is not separated out by
     58  // MediaTransportHandler. These are a little more like static methods, but
     59  // to avoid needing yet another IPC interface, we bolt them on here.
     60  virtual RefPtr<IceLogPromise> GetIceLog(const nsCString& aPattern) = 0;
     61  virtual void ClearIceLog() = 0;
     62  virtual void EnterPrivateMode() = 0;
     63  virtual void ExitPrivateMode() = 0;
     64 
     65  virtual void CreateIceCtx(const std::string& aName) = 0;
     66 
     67  virtual nsresult SetIceConfig(const nsTArray<dom::RTCIceServer>& aIceServers,
     68                                dom::RTCIceTransportPolicy aIcePolicy) = 0;
     69 
     70  // We will probably be able to move the proxy lookup stuff into
     71  // this class once we move mtransport to its own process.
     72  virtual void SetProxyConfig(NrSocketProxyConfig&& aProxyConfig) = 0;
     73 
     74  virtual void EnsureProvisionalTransport(const std::string& aTransportId,
     75                                          const std::string& aLocalUfrag,
     76                                          const std::string& aLocalPwd,
     77                                          int aComponentCount) = 0;
     78 
     79  virtual void SetTargetForDefaultLocalAddressLookup(
     80      const std::string& aTargetIp, uint16_t aTargetPort) = 0;
     81 
     82  // We set default-route-only as late as possible because it depends on what
     83  // capture permissions have been granted on the window, which could easily
     84  // change between Init (ie; when the PC is created) and StartIceGathering
     85  // (ie; when we set the local description).
     86  virtual void StartIceGathering(bool aDefaultRouteOnly,
     87                                 bool aObfuscateHostAddresses,
     88                                 // TODO: It probably makes sense to look
     89                                 // this up internally
     90                                 const nsTArray<NrIceStunAddr>& aStunAddrs) = 0;
     91 
     92  virtual void ActivateTransport(
     93      const std::string& aTransportId, const std::string& aLocalUfrag,
     94      const std::string& aLocalPwd, size_t aComponentCount,
     95      const std::string& aUfrag, const std::string& aPassword,
     96      const nsTArray<uint8_t>& aKeyDer, const nsTArray<uint8_t>& aCertDer,
     97      SSLKEAType aAuthType, bool aDtlsClient, const DtlsDigestList& aDigests,
     98      bool aPrivacyRequested) = 0;
     99 
    100  virtual void RemoveTransportsExcept(
    101      const std::set<std::string>& aTransportIds) = 0;
    102 
    103  virtual void StartIceChecks(bool aIsControlling,
    104                              const std::vector<std::string>& aIceOptions) = 0;
    105 
    106  virtual void SendPacket(const std::string& aTransportId,
    107                          MediaPacket&& aPacket) = 0;
    108 
    109  virtual void AddIceCandidate(const std::string& aTransportId,
    110                               const std::string& aCandidate,
    111                               const std::string& aUFrag,
    112                               const std::string& aObfuscatedAddress) = 0;
    113 
    114  virtual void UpdateNetworkState(bool aOnline) = 0;
    115 
    116  virtual RefPtr<dom::RTCStatsPromise> GetIceStats(
    117      const std::string& aTransportId, DOMHighResTimeStamp aNow) = 0;
    118 
    119  NS_INLINE_DECL_THREADSAFE_REFCOUNTING_WITH_DESTROY(MediaTransportHandler,
    120                                                     Destroy())
    121 
    122  TransportLayer::State GetState(const std::string& aTransportId,
    123                                 bool aRtcp) const;
    124 
    125  MediaEventSourceOneCopyPerThread<std::string, MediaPacket>&
    126  GetRtpPacketReceived() {
    127    return mRtpPacketReceived;
    128  }
    129 
    130  MediaEventSourceOneCopyPerThread<std::string, MediaPacket>&
    131  GetSctpPacketReceived() {
    132    return mSctpPacketReceived;
    133  }
    134 
    135  MediaEventSource<std::string, CandidateInfo>& GetCandidateGathered() {
    136    return mCandidateGathered;
    137  }
    138 
    139  MediaEventSource<std::string, bool>& GetAlpnNegotiated() {
    140    return mAlpnNegotiated;
    141  }
    142 
    143  MediaEventSource<std::string, dom::RTCIceGathererState>&
    144  GetGatheringStateChange() {
    145    return mGatheringStateChange;
    146  }
    147  MediaEventSource<std::string, dom::RTCIceTransportState>&
    148  GetConnectionStateChange() {
    149    return mConnectionStateChange;
    150  }
    151  MediaEventSource<std::string, MediaPacket>& GetEncryptedSending() {
    152    return mEncryptedSending;
    153  }
    154  MediaEventSource<std::string, TransportLayer::State>& GetStateChange() {
    155    return mStateChange;
    156  }
    157  MediaEventSource<std::string, TransportLayer::State>& GetRtcpStateChange() {
    158    return mRtcpStateChange;
    159  }
    160 
    161 protected:
    162  void OnCandidate(const std::string& aTransportId,
    163                   CandidateInfo&& aCandidateInfo);
    164  void OnAlpnNegotiated(const std::string& aAlpn);
    165  void OnGatheringStateChange(const std::string& aTransportId,
    166                              dom::RTCIceGathererState aState);
    167  void OnConnectionStateChange(const std::string& aTransportId,
    168                               dom::RTCIceTransportState aState);
    169  void OnPacketReceived(std::string&& aTransportId, MediaPacket&& aPacket);
    170  void OnEncryptedSending(const std::string& aTransportId,
    171                          MediaPacket&& aPacket);
    172  void OnStateChange(const std::string& aTransportId,
    173                     TransportLayer::State aState);
    174  void OnRtcpStateChange(const std::string& aTransportId,
    175                         TransportLayer::State aState);
    176  virtual void Destroy() = 0;
    177  virtual ~MediaTransportHandler() = default;
    178  mutable Mutex mStateCacheMutex;
    179  std::map<std::string, TransportLayer::State> mStateCache;
    180  std::map<std::string, TransportLayer::State> mRtcpStateCache;
    181 
    182  // Just RTP/RTCP
    183  MediaEventProducerOneCopyPerThread<std::string, MediaPacket>
    184      mRtpPacketReceived;
    185  // Just SCTP
    186  MediaEventProducerOneCopyPerThread<std::string, MediaPacket>
    187      mSctpPacketReceived;
    188  MediaEventProducer<std::string, CandidateInfo> mCandidateGathered;
    189  MediaEventProducer<std::string, bool> mAlpnNegotiated;
    190  MediaEventProducer<std::string, dom::RTCIceGathererState>
    191      mGatheringStateChange;
    192  MediaEventProducer<std::string, dom::RTCIceTransportState>
    193      mConnectionStateChange;
    194  MediaEventProducer<std::string, MediaPacket> mEncryptedSending;
    195  MediaEventProducer<std::string, TransportLayer::State> mStateChange;
    196  MediaEventProducer<std::string, TransportLayer::State> mRtcpStateChange;
    197 };
    198 
    199 void TokenizeCandidate(const std::string& aCandidate,
    200                       std::vector<std::string>& aTokens);
    201 
    202 }  // namespace mozilla
    203 
    204 #endif  //_MTRANSPORTHANDLER_H__