1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2004 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 P2P_BASE_STUN_PORT_H_ 12*d9f75844SAndroid Build Coastguard Worker #define P2P_BASE_STUN_PORT_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 19*d9f75844SAndroid Build Coastguard Worker #include "absl/memory/memory.h" 20*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/pending_task_safety_flag.h" 22*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/port.h" 23*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/stun_request.h" 24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/async_packet_socket.h" 25*d9f75844SAndroid Build Coastguard Worker 26*d9f75844SAndroid Build Coastguard Worker namespace cricket { 27*d9f75844SAndroid Build Coastguard Worker 28*d9f75844SAndroid Build Coastguard Worker // Lifetime chosen for STUN ports on low-cost networks. 29*d9f75844SAndroid Build Coastguard Worker static const int INFINITE_LIFETIME = -1; 30*d9f75844SAndroid Build Coastguard Worker // Lifetime for STUN ports on high-cost networks: 2 minutes 31*d9f75844SAndroid Build Coastguard Worker static const int HIGH_COST_PORT_KEEPALIVE_LIFETIME = 2 * 60 * 1000; 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker // Communicates using the address on the outside of a NAT. 34*d9f75844SAndroid Build Coastguard Worker class UDPPort : public Port { 35*d9f75844SAndroid Build Coastguard Worker public: 36*d9f75844SAndroid Build Coastguard Worker static std::unique_ptr<UDPPort> Create( 37*d9f75844SAndroid Build Coastguard Worker rtc::Thread* thread, 38*d9f75844SAndroid Build Coastguard Worker rtc::PacketSocketFactory* factory, 39*d9f75844SAndroid Build Coastguard Worker const rtc::Network* network, 40*d9f75844SAndroid Build Coastguard Worker rtc::AsyncPacketSocket* socket, 41*d9f75844SAndroid Build Coastguard Worker absl::string_view username, 42*d9f75844SAndroid Build Coastguard Worker absl::string_view password, 43*d9f75844SAndroid Build Coastguard Worker bool emit_local_for_anyaddress, 44*d9f75844SAndroid Build Coastguard Worker absl::optional<int> stun_keepalive_interval, 45*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials = nullptr) { 46*d9f75844SAndroid Build Coastguard Worker // Using `new` to access a non-public constructor. 47*d9f75844SAndroid Build Coastguard Worker auto port = absl::WrapUnique( 48*d9f75844SAndroid Build Coastguard Worker new UDPPort(thread, factory, network, socket, username, password, 49*d9f75844SAndroid Build Coastguard Worker emit_local_for_anyaddress, field_trials)); 50*d9f75844SAndroid Build Coastguard Worker port->set_stun_keepalive_delay(stun_keepalive_interval); 51*d9f75844SAndroid Build Coastguard Worker if (!port->Init()) { 52*d9f75844SAndroid Build Coastguard Worker return nullptr; 53*d9f75844SAndroid Build Coastguard Worker } 54*d9f75844SAndroid Build Coastguard Worker return port; 55*d9f75844SAndroid Build Coastguard Worker } 56*d9f75844SAndroid Build Coastguard Worker 57*d9f75844SAndroid Build Coastguard Worker static std::unique_ptr<UDPPort> Create( 58*d9f75844SAndroid Build Coastguard Worker rtc::Thread* thread, 59*d9f75844SAndroid Build Coastguard Worker rtc::PacketSocketFactory* factory, 60*d9f75844SAndroid Build Coastguard Worker const rtc::Network* network, 61*d9f75844SAndroid Build Coastguard Worker uint16_t min_port, 62*d9f75844SAndroid Build Coastguard Worker uint16_t max_port, 63*d9f75844SAndroid Build Coastguard Worker absl::string_view username, 64*d9f75844SAndroid Build Coastguard Worker absl::string_view password, 65*d9f75844SAndroid Build Coastguard Worker bool emit_local_for_anyaddress, 66*d9f75844SAndroid Build Coastguard Worker absl::optional<int> stun_keepalive_interval, 67*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials = nullptr) { 68*d9f75844SAndroid Build Coastguard Worker // Using `new` to access a non-public constructor. 69*d9f75844SAndroid Build Coastguard Worker auto port = absl::WrapUnique( 70*d9f75844SAndroid Build Coastguard Worker new UDPPort(thread, factory, network, min_port, max_port, username, 71*d9f75844SAndroid Build Coastguard Worker password, emit_local_for_anyaddress, field_trials)); 72*d9f75844SAndroid Build Coastguard Worker port->set_stun_keepalive_delay(stun_keepalive_interval); 73*d9f75844SAndroid Build Coastguard Worker if (!port->Init()) { 74*d9f75844SAndroid Build Coastguard Worker return nullptr; 75*d9f75844SAndroid Build Coastguard Worker } 76*d9f75844SAndroid Build Coastguard Worker return port; 77*d9f75844SAndroid Build Coastguard Worker } 78*d9f75844SAndroid Build Coastguard Worker 79*d9f75844SAndroid Build Coastguard Worker ~UDPPort() override; 80*d9f75844SAndroid Build Coastguard Worker GetLocalAddress()81*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress GetLocalAddress() const { 82*d9f75844SAndroid Build Coastguard Worker return socket_->GetLocalAddress(); 83*d9f75844SAndroid Build Coastguard Worker } 84*d9f75844SAndroid Build Coastguard Worker server_addresses()85*d9f75844SAndroid Build Coastguard Worker const ServerAddresses& server_addresses() const { return server_addresses_; } set_server_addresses(const ServerAddresses & addresses)86*d9f75844SAndroid Build Coastguard Worker void set_server_addresses(const ServerAddresses& addresses) { 87*d9f75844SAndroid Build Coastguard Worker server_addresses_ = addresses; 88*d9f75844SAndroid Build Coastguard Worker } 89*d9f75844SAndroid Build Coastguard Worker 90*d9f75844SAndroid Build Coastguard Worker void PrepareAddress() override; 91*d9f75844SAndroid Build Coastguard Worker 92*d9f75844SAndroid Build Coastguard Worker Connection* CreateConnection(const Candidate& address, 93*d9f75844SAndroid Build Coastguard Worker CandidateOrigin origin) override; 94*d9f75844SAndroid Build Coastguard Worker int SetOption(rtc::Socket::Option opt, int value) override; 95*d9f75844SAndroid Build Coastguard Worker int GetOption(rtc::Socket::Option opt, int* value) override; 96*d9f75844SAndroid Build Coastguard Worker int GetError() override; 97*d9f75844SAndroid Build Coastguard Worker 98*d9f75844SAndroid Build Coastguard Worker bool HandleIncomingPacket(rtc::AsyncPacketSocket* socket, 99*d9f75844SAndroid Build Coastguard Worker const char* data, 100*d9f75844SAndroid Build Coastguard Worker size_t size, 101*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& remote_addr, 102*d9f75844SAndroid Build Coastguard Worker int64_t packet_time_us) override; 103*d9f75844SAndroid Build Coastguard Worker 104*d9f75844SAndroid Build Coastguard Worker bool SupportsProtocol(absl::string_view protocol) const override; 105*d9f75844SAndroid Build Coastguard Worker ProtocolType GetProtocol() const override; 106*d9f75844SAndroid Build Coastguard Worker 107*d9f75844SAndroid Build Coastguard Worker void GetStunStats(absl::optional<StunStats>* stats) override; 108*d9f75844SAndroid Build Coastguard Worker 109*d9f75844SAndroid Build Coastguard Worker void set_stun_keepalive_delay(const absl::optional<int>& delay); stun_keepalive_delay()110*d9f75844SAndroid Build Coastguard Worker int stun_keepalive_delay() const { return stun_keepalive_delay_; } 111*d9f75844SAndroid Build Coastguard Worker 112*d9f75844SAndroid Build Coastguard Worker // Visible for testing. stun_keepalive_lifetime()113*d9f75844SAndroid Build Coastguard Worker int stun_keepalive_lifetime() const { return stun_keepalive_lifetime_; } set_stun_keepalive_lifetime(int lifetime)114*d9f75844SAndroid Build Coastguard Worker void set_stun_keepalive_lifetime(int lifetime) { 115*d9f75844SAndroid Build Coastguard Worker stun_keepalive_lifetime_ = lifetime; 116*d9f75844SAndroid Build Coastguard Worker } 117*d9f75844SAndroid Build Coastguard Worker request_manager()118*d9f75844SAndroid Build Coastguard Worker StunRequestManager& request_manager() { return request_manager_; } 119*d9f75844SAndroid Build Coastguard Worker 120*d9f75844SAndroid Build Coastguard Worker protected: 121*d9f75844SAndroid Build Coastguard Worker UDPPort(rtc::Thread* thread, 122*d9f75844SAndroid Build Coastguard Worker rtc::PacketSocketFactory* factory, 123*d9f75844SAndroid Build Coastguard Worker const rtc::Network* network, 124*d9f75844SAndroid Build Coastguard Worker uint16_t min_port, 125*d9f75844SAndroid Build Coastguard Worker uint16_t max_port, 126*d9f75844SAndroid Build Coastguard Worker absl::string_view username, 127*d9f75844SAndroid Build Coastguard Worker absl::string_view password, 128*d9f75844SAndroid Build Coastguard Worker bool emit_local_for_anyaddress, 129*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials); 130*d9f75844SAndroid Build Coastguard Worker 131*d9f75844SAndroid Build Coastguard Worker UDPPort(rtc::Thread* thread, 132*d9f75844SAndroid Build Coastguard Worker rtc::PacketSocketFactory* factory, 133*d9f75844SAndroid Build Coastguard Worker const rtc::Network* network, 134*d9f75844SAndroid Build Coastguard Worker rtc::AsyncPacketSocket* socket, 135*d9f75844SAndroid Build Coastguard Worker absl::string_view username, 136*d9f75844SAndroid Build Coastguard Worker absl::string_view password, 137*d9f75844SAndroid Build Coastguard Worker bool emit_local_for_anyaddress, 138*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials); 139*d9f75844SAndroid Build Coastguard Worker 140*d9f75844SAndroid Build Coastguard Worker bool Init(); 141*d9f75844SAndroid Build Coastguard Worker 142*d9f75844SAndroid Build Coastguard Worker int SendTo(const void* data, 143*d9f75844SAndroid Build Coastguard Worker size_t size, 144*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& addr, 145*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions& options, 146*d9f75844SAndroid Build Coastguard Worker bool payload) override; 147*d9f75844SAndroid Build Coastguard Worker 148*d9f75844SAndroid Build Coastguard Worker void UpdateNetworkCost() override; 149*d9f75844SAndroid Build Coastguard Worker 150*d9f75844SAndroid Build Coastguard Worker rtc::DiffServCodePoint StunDscpValue() const override; 151*d9f75844SAndroid Build Coastguard Worker 152*d9f75844SAndroid Build Coastguard Worker void OnLocalAddressReady(rtc::AsyncPacketSocket* socket, 153*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& address); 154*d9f75844SAndroid Build Coastguard Worker 155*d9f75844SAndroid Build Coastguard Worker void PostAddAddress(bool is_final) override; 156*d9f75844SAndroid Build Coastguard Worker 157*d9f75844SAndroid Build Coastguard Worker void OnReadPacket(rtc::AsyncPacketSocket* socket, 158*d9f75844SAndroid Build Coastguard Worker const char* data, 159*d9f75844SAndroid Build Coastguard Worker size_t size, 160*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& remote_addr, 161*d9f75844SAndroid Build Coastguard Worker const int64_t& packet_time_us); 162*d9f75844SAndroid Build Coastguard Worker 163*d9f75844SAndroid Build Coastguard Worker void OnSentPacket(rtc::AsyncPacketSocket* socket, 164*d9f75844SAndroid Build Coastguard Worker const rtc::SentPacket& sent_packet) override; 165*d9f75844SAndroid Build Coastguard Worker 166*d9f75844SAndroid Build Coastguard Worker void OnReadyToSend(rtc::AsyncPacketSocket* socket); 167*d9f75844SAndroid Build Coastguard Worker 168*d9f75844SAndroid Build Coastguard Worker // This method will send STUN binding request if STUN server address is set. 169*d9f75844SAndroid Build Coastguard Worker void MaybePrepareStunCandidate(); 170*d9f75844SAndroid Build Coastguard Worker 171*d9f75844SAndroid Build Coastguard Worker void SendStunBindingRequests(); 172*d9f75844SAndroid Build Coastguard Worker 173*d9f75844SAndroid Build Coastguard Worker // Helper function which will set `addr`'s IP to the default local address if 174*d9f75844SAndroid Build Coastguard Worker // `addr` is the "any" address and `emit_local_for_anyaddress_` is true. When 175*d9f75844SAndroid Build Coastguard Worker // returning false, it indicates that the operation has failed and the 176*d9f75844SAndroid Build Coastguard Worker // address shouldn't be used by any candidate. 177*d9f75844SAndroid Build Coastguard Worker bool MaybeSetDefaultLocalAddress(rtc::SocketAddress* addr) const; 178*d9f75844SAndroid Build Coastguard Worker 179*d9f75844SAndroid Build Coastguard Worker private: 180*d9f75844SAndroid Build Coastguard Worker // A helper class which can be called repeatedly to resolve multiple 181*d9f75844SAndroid Build Coastguard Worker // addresses, as opposed to rtc::AsyncDnsResolverInterface, which can only 182*d9f75844SAndroid Build Coastguard Worker // resolve one address per instance. 183*d9f75844SAndroid Build Coastguard Worker class AddressResolver { 184*d9f75844SAndroid Build Coastguard Worker public: 185*d9f75844SAndroid Build Coastguard Worker explicit AddressResolver( 186*d9f75844SAndroid Build Coastguard Worker rtc::PacketSocketFactory* factory, 187*d9f75844SAndroid Build Coastguard Worker std::function<void(const rtc::SocketAddress&, int)> done_callback); 188*d9f75844SAndroid Build Coastguard Worker 189*d9f75844SAndroid Build Coastguard Worker void Resolve(const rtc::SocketAddress& address, 190*d9f75844SAndroid Build Coastguard Worker int family, 191*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView& field_trials); 192*d9f75844SAndroid Build Coastguard Worker bool GetResolvedAddress(const rtc::SocketAddress& input, 193*d9f75844SAndroid Build Coastguard Worker int family, 194*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress* output) const; 195*d9f75844SAndroid Build Coastguard Worker 196*d9f75844SAndroid Build Coastguard Worker private: 197*d9f75844SAndroid Build Coastguard Worker typedef std::map<rtc::SocketAddress, 198*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::AsyncDnsResolverInterface>> 199*d9f75844SAndroid Build Coastguard Worker ResolverMap; 200*d9f75844SAndroid Build Coastguard Worker 201*d9f75844SAndroid Build Coastguard Worker rtc::PacketSocketFactory* socket_factory_; 202*d9f75844SAndroid Build Coastguard Worker // The function is called when resolving the specified address is finished. 203*d9f75844SAndroid Build Coastguard Worker // The first argument is the input address, the second argument is the error 204*d9f75844SAndroid Build Coastguard Worker // or 0 if it succeeded. 205*d9f75844SAndroid Build Coastguard Worker std::function<void(const rtc::SocketAddress&, int)> done_; 206*d9f75844SAndroid Build Coastguard Worker // Resolver may fire callbacks that refer to done_, so ensure 207*d9f75844SAndroid Build Coastguard Worker // that all resolvers are destroyed first. 208*d9f75844SAndroid Build Coastguard Worker ResolverMap resolvers_; 209*d9f75844SAndroid Build Coastguard Worker }; 210*d9f75844SAndroid Build Coastguard Worker 211*d9f75844SAndroid Build Coastguard Worker // DNS resolution of the STUN server. 212*d9f75844SAndroid Build Coastguard Worker void ResolveStunAddress(const rtc::SocketAddress& stun_addr); 213*d9f75844SAndroid Build Coastguard Worker void OnResolveResult(const rtc::SocketAddress& input, int error); 214*d9f75844SAndroid Build Coastguard Worker 215*d9f75844SAndroid Build Coastguard Worker // Send a STUN binding request to the given address. Calling this method may 216*d9f75844SAndroid Build Coastguard Worker // cause the set of known server addresses to be modified, eg. by replacing an 217*d9f75844SAndroid Build Coastguard Worker // unresolved server address with a resolved address. 218*d9f75844SAndroid Build Coastguard Worker void SendStunBindingRequest(const rtc::SocketAddress& stun_addr); 219*d9f75844SAndroid Build Coastguard Worker 220*d9f75844SAndroid Build Coastguard Worker // Below methods handles binding request responses. 221*d9f75844SAndroid Build Coastguard Worker void OnStunBindingRequestSucceeded( 222*d9f75844SAndroid Build Coastguard Worker int rtt_ms, 223*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& stun_server_addr, 224*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& stun_reflected_addr); 225*d9f75844SAndroid Build Coastguard Worker void OnStunBindingOrResolveRequestFailed( 226*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& stun_server_addr, 227*d9f75844SAndroid Build Coastguard Worker int error_code, 228*d9f75844SAndroid Build Coastguard Worker absl::string_view reason); 229*d9f75844SAndroid Build Coastguard Worker 230*d9f75844SAndroid Build Coastguard Worker // Sends STUN requests to the server. 231*d9f75844SAndroid Build Coastguard Worker void OnSendPacket(const void* data, size_t size, StunRequest* req); 232*d9f75844SAndroid Build Coastguard Worker 233*d9f75844SAndroid Build Coastguard Worker // TODO(mallinaht) - Move this up to cricket::Port when SignalAddressReady is 234*d9f75844SAndroid Build Coastguard Worker // changed to SignalPortReady. 235*d9f75844SAndroid Build Coastguard Worker void MaybeSetPortCompleteOrError(); 236*d9f75844SAndroid Build Coastguard Worker 237*d9f75844SAndroid Build Coastguard Worker bool HasStunCandidateWithAddress(const rtc::SocketAddress& addr) const; 238*d9f75844SAndroid Build Coastguard Worker 239*d9f75844SAndroid Build Coastguard Worker // If this is a low-cost network, it will keep on sending STUN binding 240*d9f75844SAndroid Build Coastguard Worker // requests indefinitely to keep the NAT binding alive. Otherwise, stop 241*d9f75844SAndroid Build Coastguard Worker // sending STUN binding requests after HIGH_COST_PORT_KEEPALIVE_LIFETIME. GetStunKeepaliveLifetime()242*d9f75844SAndroid Build Coastguard Worker int GetStunKeepaliveLifetime() { 243*d9f75844SAndroid Build Coastguard Worker return (network_cost() >= rtc::kNetworkCostHigh) 244*d9f75844SAndroid Build Coastguard Worker ? HIGH_COST_PORT_KEEPALIVE_LIFETIME 245*d9f75844SAndroid Build Coastguard Worker : INFINITE_LIFETIME; 246*d9f75844SAndroid Build Coastguard Worker } 247*d9f75844SAndroid Build Coastguard Worker 248*d9f75844SAndroid Build Coastguard Worker ServerAddresses server_addresses_; 249*d9f75844SAndroid Build Coastguard Worker ServerAddresses bind_request_succeeded_servers_; 250*d9f75844SAndroid Build Coastguard Worker ServerAddresses bind_request_failed_servers_; 251*d9f75844SAndroid Build Coastguard Worker StunRequestManager request_manager_; 252*d9f75844SAndroid Build Coastguard Worker rtc::AsyncPacketSocket* socket_; 253*d9f75844SAndroid Build Coastguard Worker int error_; 254*d9f75844SAndroid Build Coastguard Worker int send_error_count_ = 0; 255*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<AddressResolver> resolver_; 256*d9f75844SAndroid Build Coastguard Worker bool ready_; 257*d9f75844SAndroid Build Coastguard Worker int stun_keepalive_delay_; 258*d9f75844SAndroid Build Coastguard Worker int stun_keepalive_lifetime_ = INFINITE_LIFETIME; 259*d9f75844SAndroid Build Coastguard Worker rtc::DiffServCodePoint dscp_; 260*d9f75844SAndroid Build Coastguard Worker 261*d9f75844SAndroid Build Coastguard Worker StunStats stats_; 262*d9f75844SAndroid Build Coastguard Worker 263*d9f75844SAndroid Build Coastguard Worker // This is true by default and false when 264*d9f75844SAndroid Build Coastguard Worker // PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE is specified. 265*d9f75844SAndroid Build Coastguard Worker bool emit_local_for_anyaddress_; 266*d9f75844SAndroid Build Coastguard Worker 267*d9f75844SAndroid Build Coastguard Worker friend class StunBindingRequest; 268*d9f75844SAndroid Build Coastguard Worker }; 269*d9f75844SAndroid Build Coastguard Worker 270*d9f75844SAndroid Build Coastguard Worker class StunPort : public UDPPort { 271*d9f75844SAndroid Build Coastguard Worker public: 272*d9f75844SAndroid Build Coastguard Worker static std::unique_ptr<StunPort> Create( 273*d9f75844SAndroid Build Coastguard Worker rtc::Thread* thread, 274*d9f75844SAndroid Build Coastguard Worker rtc::PacketSocketFactory* factory, 275*d9f75844SAndroid Build Coastguard Worker const rtc::Network* network, 276*d9f75844SAndroid Build Coastguard Worker uint16_t min_port, 277*d9f75844SAndroid Build Coastguard Worker uint16_t max_port, 278*d9f75844SAndroid Build Coastguard Worker absl::string_view username, 279*d9f75844SAndroid Build Coastguard Worker absl::string_view password, 280*d9f75844SAndroid Build Coastguard Worker const ServerAddresses& servers, 281*d9f75844SAndroid Build Coastguard Worker absl::optional<int> stun_keepalive_interval, 282*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials); 283*d9f75844SAndroid Build Coastguard Worker 284*d9f75844SAndroid Build Coastguard Worker void PrepareAddress() override; 285*d9f75844SAndroid Build Coastguard Worker 286*d9f75844SAndroid Build Coastguard Worker protected: 287*d9f75844SAndroid Build Coastguard Worker StunPort(rtc::Thread* thread, 288*d9f75844SAndroid Build Coastguard Worker rtc::PacketSocketFactory* factory, 289*d9f75844SAndroid Build Coastguard Worker const rtc::Network* network, 290*d9f75844SAndroid Build Coastguard Worker uint16_t min_port, 291*d9f75844SAndroid Build Coastguard Worker uint16_t max_port, 292*d9f75844SAndroid Build Coastguard Worker absl::string_view username, 293*d9f75844SAndroid Build Coastguard Worker absl::string_view password, 294*d9f75844SAndroid Build Coastguard Worker const ServerAddresses& servers, 295*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials); 296*d9f75844SAndroid Build Coastguard Worker }; 297*d9f75844SAndroid Build Coastguard Worker 298*d9f75844SAndroid Build Coastguard Worker } // namespace cricket 299*d9f75844SAndroid Build Coastguard Worker 300*d9f75844SAndroid Build Coastguard Worker #endif // P2P_BASE_STUN_PORT_H_ 301