1 /* 2 * Copyright 2019 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef API_ICE_TRANSPORT_INTERFACE_H_ 12 #define API_ICE_TRANSPORT_INTERFACE_H_ 13 14 #include <string> 15 16 #include "api/async_dns_resolver.h" 17 #include "api/async_resolver_factory.h" 18 #include "api/rtc_error.h" 19 #include "api/rtc_event_log/rtc_event_log.h" 20 #include "api/scoped_refptr.h" 21 #include "rtc_base/ref_count.h" 22 23 namespace cricket { 24 class IceTransportInternal; 25 class PortAllocator; 26 class IceControllerFactoryInterface; 27 class ActiveIceControllerFactoryInterface; 28 } // namespace cricket 29 30 namespace webrtc { 31 class FieldTrialsView; 32 33 // An ICE transport, as represented to the outside world. 34 // This object is refcounted, and is therefore alive until the 35 // last holder has released it. 36 class IceTransportInterface : public rtc::RefCountInterface { 37 public: 38 // Accessor for the internal representation of an ICE transport. 39 // The returned object can only be safely used on the signalling thread. 40 // TODO(crbug.com/907849): Add API calls for the functions that have to 41 // be exposed to clients, and stop allowing access to the 42 // cricket::IceTransportInternal API. 43 virtual cricket::IceTransportInternal* internal() = 0; 44 }; 45 46 struct IceTransportInit final { 47 public: 48 IceTransportInit() = default; 49 IceTransportInit(const IceTransportInit&) = delete; 50 IceTransportInit(IceTransportInit&&) = default; 51 IceTransportInit& operator=(const IceTransportInit&) = delete; 52 IceTransportInit& operator=(IceTransportInit&&) = default; 53 port_allocatorfinal54 cricket::PortAllocator* port_allocator() { return port_allocator_; } set_port_allocatorfinal55 void set_port_allocator(cricket::PortAllocator* port_allocator) { 56 port_allocator_ = port_allocator; 57 } 58 async_dns_resolver_factoryfinal59 AsyncDnsResolverFactoryInterface* async_dns_resolver_factory() { 60 return async_dns_resolver_factory_; 61 } set_async_dns_resolver_factoryfinal62 void set_async_dns_resolver_factory( 63 AsyncDnsResolverFactoryInterface* async_dns_resolver_factory) { 64 RTC_DCHECK(!async_resolver_factory_); 65 async_dns_resolver_factory_ = async_dns_resolver_factory; 66 } async_resolver_factoryfinal67 AsyncResolverFactory* async_resolver_factory() { 68 return async_resolver_factory_; 69 } 70 ABSL_DEPRECATED("bugs.webrtc.org/12598") set_async_resolver_factoryfinal71 void set_async_resolver_factory( 72 AsyncResolverFactory* async_resolver_factory) { 73 RTC_DCHECK(!async_dns_resolver_factory_); 74 async_resolver_factory_ = async_resolver_factory; 75 } 76 event_logfinal77 RtcEventLog* event_log() { return event_log_; } set_event_logfinal78 void set_event_log(RtcEventLog* event_log) { event_log_ = event_log; } 79 set_ice_controller_factoryfinal80 void set_ice_controller_factory( 81 cricket::IceControllerFactoryInterface* ice_controller_factory) { 82 ice_controller_factory_ = ice_controller_factory; 83 } ice_controller_factoryfinal84 cricket::IceControllerFactoryInterface* ice_controller_factory() { 85 return ice_controller_factory_; 86 } 87 88 // An active ICE controller actively manages the connection used by an ICE 89 // transport, in contrast with a legacy ICE controller that only picks the 90 // best connection to use or ping, and lets the transport decide when and 91 // whether to switch. 92 // 93 // Which ICE controller is used is determined based on the field trial 94 // "WebRTC-UseActiveIceController" as follows: 95 // 96 // 1. If the field trial is not enabled 97 // a. The legacy ICE controller factory is used if one is supplied. 98 // b. If not, a default ICE controller (BasicIceController) is 99 // constructed and used. 100 // 101 // 2. If the field trial is enabled 102 // a. If an active ICE controller factory is supplied, it is used and 103 // the legacy ICE controller factory is not used. 104 // b. If not, a default active ICE controller is used, wrapping over the 105 // supplied or the default legacy ICE controller. set_active_ice_controller_factoryfinal106 void set_active_ice_controller_factory( 107 cricket::ActiveIceControllerFactoryInterface* 108 active_ice_controller_factory) { 109 active_ice_controller_factory_ = active_ice_controller_factory; 110 } 111 cricket::ActiveIceControllerFactoryInterface* active_ice_controller_factoryfinal112 active_ice_controller_factory() { 113 return active_ice_controller_factory_; 114 } 115 field_trialsfinal116 const FieldTrialsView* field_trials() { return field_trials_; } set_field_trialsfinal117 void set_field_trials(const FieldTrialsView* field_trials) { 118 field_trials_ = field_trials; 119 } 120 121 private: 122 cricket::PortAllocator* port_allocator_ = nullptr; 123 AsyncDnsResolverFactoryInterface* async_dns_resolver_factory_ = nullptr; 124 // For backwards compatibility. Only one resolver factory can be set. 125 AsyncResolverFactory* async_resolver_factory_ = nullptr; 126 RtcEventLog* event_log_ = nullptr; 127 cricket::IceControllerFactoryInterface* ice_controller_factory_ = nullptr; 128 cricket::ActiveIceControllerFactoryInterface* active_ice_controller_factory_ = 129 nullptr; 130 const FieldTrialsView* field_trials_ = nullptr; 131 // TODO(https://crbug.com/webrtc/12657): Redesign to have const members. 132 }; 133 134 // TODO(qingsi): The factory interface is defined in this file instead of its 135 // namesake file ice_transport_factory.h to avoid the extra dependency on p2p/ 136 // introduced there by the p2p/-dependent factory methods. Move the factory 137 // methods to a different file or rename it. 138 class IceTransportFactory { 139 public: 140 virtual ~IceTransportFactory() = default; 141 // As a refcounted object, the returned ICE transport may outlive the host 142 // construct into which its reference is given, e.g. a peer connection. As a 143 // result, the returned ICE transport should not hold references to any object 144 // that the transport does not own and that has a lifetime bound to the host 145 // construct. Also, assumptions on the thread safety of the returned transport 146 // should be clarified by implementations. For example, a peer connection 147 // requires the returned transport to be constructed and destroyed on the 148 // network thread and an ICE transport factory that intends to work with a 149 // peer connection should offer transports compatible with these assumptions. 150 virtual rtc::scoped_refptr<IceTransportInterface> CreateIceTransport( 151 const std::string& transport_name, 152 int component, 153 IceTransportInit init) = 0; 154 }; 155 156 } // namespace webrtc 157 #endif // API_ICE_TRANSPORT_INTERFACE_H_ 158