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