1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2012 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_TURN_PORT_H_ 12*d9f75844SAndroid Build Coastguard Worker #define P2P_BASE_TURN_PORT_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stdio.h> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include <map> 17*d9f75844SAndroid Build Coastguard Worker #include <memory> 18*d9f75844SAndroid Build Coastguard Worker #include <set> 19*d9f75844SAndroid Build Coastguard Worker #include <string> 20*d9f75844SAndroid Build Coastguard Worker #include <vector> 21*d9f75844SAndroid Build Coastguard Worker 22*d9f75844SAndroid Build Coastguard Worker #include "absl/memory/memory.h" 23*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h" 24*d9f75844SAndroid Build Coastguard Worker #include "api/async_dns_resolver.h" 25*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/pending_task_safety_flag.h" 26*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_base.h" 27*d9f75844SAndroid Build Coastguard Worker #include "p2p/base/port.h" 28*d9f75844SAndroid Build Coastguard Worker #include "p2p/client/basic_port_allocator.h" 29*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/async_packet_socket.h" 30*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ssl_certificate.h" 31*d9f75844SAndroid Build Coastguard Worker 32*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 33*d9f75844SAndroid Build Coastguard Worker class TurnCustomizer; 34*d9f75844SAndroid Build Coastguard Worker } 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker namespace cricket { 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker const int kMaxTurnUsernameLength = 509; // RFC 8489 section 14.3 39*d9f75844SAndroid Build Coastguard Worker 40*d9f75844SAndroid Build Coastguard Worker extern const int STUN_ATTR_TURN_LOGGING_ID; 41*d9f75844SAndroid Build Coastguard Worker extern const char TURN_PORT_TYPE[]; 42*d9f75844SAndroid Build Coastguard Worker class TurnAllocateRequest; 43*d9f75844SAndroid Build Coastguard Worker class TurnEntry; 44*d9f75844SAndroid Build Coastguard Worker 45*d9f75844SAndroid Build Coastguard Worker class TurnPort : public Port { 46*d9f75844SAndroid Build Coastguard Worker public: 47*d9f75844SAndroid Build Coastguard Worker enum PortState { 48*d9f75844SAndroid Build Coastguard Worker STATE_CONNECTING, // Initial state, cannot send any packets. 49*d9f75844SAndroid Build Coastguard Worker STATE_CONNECTED, // Socket connected, ready to send stun requests. 50*d9f75844SAndroid Build Coastguard Worker STATE_READY, // Received allocate success, can send any packets. 51*d9f75844SAndroid Build Coastguard Worker STATE_RECEIVEONLY, // Had REFRESH_REQUEST error, cannot send any packets. 52*d9f75844SAndroid Build Coastguard Worker STATE_DISCONNECTED, // TCP connection died, cannot send/receive any 53*d9f75844SAndroid Build Coastguard Worker // packets. 54*d9f75844SAndroid Build Coastguard Worker }; 55*d9f75844SAndroid Build Coastguard Worker Validate(const CreateRelayPortArgs & args)56*d9f75844SAndroid Build Coastguard Worker static bool Validate(const CreateRelayPortArgs& args) { 57*d9f75844SAndroid Build Coastguard Worker // Do basic parameter validation. 58*d9f75844SAndroid Build Coastguard Worker if (args.config->credentials.username.size() > kMaxTurnUsernameLength) { 59*d9f75844SAndroid Build Coastguard Worker RTC_LOG(LS_ERROR) << "Attempt to use TURN with a too long username " 60*d9f75844SAndroid Build Coastguard Worker << "of length " 61*d9f75844SAndroid Build Coastguard Worker << args.config->credentials.username.size(); 62*d9f75844SAndroid Build Coastguard Worker return false; 63*d9f75844SAndroid Build Coastguard Worker } 64*d9f75844SAndroid Build Coastguard Worker // Do not connect to low-numbered ports. The default STUN port is 3478. 65*d9f75844SAndroid Build Coastguard Worker if (!AllowedTurnPort(args.server_address->address.port(), 66*d9f75844SAndroid Build Coastguard Worker args.field_trials)) { 67*d9f75844SAndroid Build Coastguard Worker RTC_LOG(LS_ERROR) << "Attempt to use TURN to connect to port " 68*d9f75844SAndroid Build Coastguard Worker << args.server_address->address.port(); 69*d9f75844SAndroid Build Coastguard Worker return false; 70*d9f75844SAndroid Build Coastguard Worker } 71*d9f75844SAndroid Build Coastguard Worker return true; 72*d9f75844SAndroid Build Coastguard Worker } 73*d9f75844SAndroid Build Coastguard Worker 74*d9f75844SAndroid Build Coastguard Worker // Create a TURN port using the shared UDP socket, `socket`. Create(const CreateRelayPortArgs & args,rtc::AsyncPacketSocket * socket)75*d9f75844SAndroid Build Coastguard Worker static std::unique_ptr<TurnPort> Create(const CreateRelayPortArgs& args, 76*d9f75844SAndroid Build Coastguard Worker rtc::AsyncPacketSocket* socket) { 77*d9f75844SAndroid Build Coastguard Worker if (!Validate(args)) { 78*d9f75844SAndroid Build Coastguard Worker return nullptr; 79*d9f75844SAndroid Build Coastguard Worker } 80*d9f75844SAndroid Build Coastguard Worker // Using `new` to access a non-public constructor. 81*d9f75844SAndroid Build Coastguard Worker return absl::WrapUnique( 82*d9f75844SAndroid Build Coastguard Worker new TurnPort(args.network_thread, args.socket_factory, args.network, 83*d9f75844SAndroid Build Coastguard Worker socket, args.username, args.password, *args.server_address, 84*d9f75844SAndroid Build Coastguard Worker args.config->credentials, args.relative_priority, 85*d9f75844SAndroid Build Coastguard Worker args.config->tls_alpn_protocols, 86*d9f75844SAndroid Build Coastguard Worker args.config->tls_elliptic_curves, args.turn_customizer, 87*d9f75844SAndroid Build Coastguard Worker args.config->tls_cert_verifier, args.field_trials)); 88*d9f75844SAndroid Build Coastguard Worker } 89*d9f75844SAndroid Build Coastguard Worker 90*d9f75844SAndroid Build Coastguard Worker // Create a TURN port that will use a new socket, bound to `network` and 91*d9f75844SAndroid Build Coastguard Worker // using a port in the range between `min_port` and `max_port`. Create(const CreateRelayPortArgs & args,int min_port,int max_port)92*d9f75844SAndroid Build Coastguard Worker static std::unique_ptr<TurnPort> Create(const CreateRelayPortArgs& args, 93*d9f75844SAndroid Build Coastguard Worker int min_port, 94*d9f75844SAndroid Build Coastguard Worker int max_port) { 95*d9f75844SAndroid Build Coastguard Worker if (!Validate(args)) { 96*d9f75844SAndroid Build Coastguard Worker return nullptr; 97*d9f75844SAndroid Build Coastguard Worker } 98*d9f75844SAndroid Build Coastguard Worker // Using `new` to access a non-public constructor. 99*d9f75844SAndroid Build Coastguard Worker return absl::WrapUnique( 100*d9f75844SAndroid Build Coastguard Worker new TurnPort(args.network_thread, args.socket_factory, args.network, 101*d9f75844SAndroid Build Coastguard Worker min_port, max_port, args.username, args.password, 102*d9f75844SAndroid Build Coastguard Worker *args.server_address, args.config->credentials, 103*d9f75844SAndroid Build Coastguard Worker args.relative_priority, args.config->tls_alpn_protocols, 104*d9f75844SAndroid Build Coastguard Worker args.config->tls_elliptic_curves, args.turn_customizer, 105*d9f75844SAndroid Build Coastguard Worker args.config->tls_cert_verifier, args.field_trials)); 106*d9f75844SAndroid Build Coastguard Worker } 107*d9f75844SAndroid Build Coastguard Worker 108*d9f75844SAndroid Build Coastguard Worker ~TurnPort() override; 109*d9f75844SAndroid Build Coastguard Worker server_address()110*d9f75844SAndroid Build Coastguard Worker const ProtocolAddress& server_address() const { return server_address_; } 111*d9f75844SAndroid Build Coastguard Worker // Returns an empty address if the local address has not been assigned. 112*d9f75844SAndroid Build Coastguard Worker rtc::SocketAddress GetLocalAddress() const; 113*d9f75844SAndroid Build Coastguard Worker ready()114*d9f75844SAndroid Build Coastguard Worker bool ready() const { return state_ == STATE_READY; } connected()115*d9f75844SAndroid Build Coastguard Worker bool connected() const { 116*d9f75844SAndroid Build Coastguard Worker return state_ == STATE_READY || state_ == STATE_CONNECTED; 117*d9f75844SAndroid Build Coastguard Worker } credentials()118*d9f75844SAndroid Build Coastguard Worker const RelayCredentials& credentials() const { return credentials_; } 119*d9f75844SAndroid Build Coastguard Worker 120*d9f75844SAndroid Build Coastguard Worker ProtocolType GetProtocol() const override; 121*d9f75844SAndroid Build Coastguard Worker 122*d9f75844SAndroid Build Coastguard Worker virtual TlsCertPolicy GetTlsCertPolicy() const; 123*d9f75844SAndroid Build Coastguard Worker virtual void SetTlsCertPolicy(TlsCertPolicy tls_cert_policy); 124*d9f75844SAndroid Build Coastguard Worker 125*d9f75844SAndroid Build Coastguard Worker void SetTurnLoggingId(absl::string_view turn_logging_id); 126*d9f75844SAndroid Build Coastguard Worker 127*d9f75844SAndroid Build Coastguard Worker virtual std::vector<std::string> GetTlsAlpnProtocols() const; 128*d9f75844SAndroid Build Coastguard Worker virtual std::vector<std::string> GetTlsEllipticCurves() const; 129*d9f75844SAndroid Build Coastguard Worker 130*d9f75844SAndroid Build Coastguard Worker // Release a TURN allocation by sending a refresh with lifetime 0. 131*d9f75844SAndroid Build Coastguard Worker // Sets state to STATE_RECEIVEONLY. 132*d9f75844SAndroid Build Coastguard Worker void Release(); 133*d9f75844SAndroid Build Coastguard Worker 134*d9f75844SAndroid Build Coastguard Worker void PrepareAddress() override; 135*d9f75844SAndroid Build Coastguard Worker Connection* CreateConnection(const Candidate& c, 136*d9f75844SAndroid Build Coastguard Worker PortInterface::CandidateOrigin origin) override; 137*d9f75844SAndroid Build Coastguard Worker int SendTo(const void* data, 138*d9f75844SAndroid Build Coastguard Worker size_t size, 139*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& addr, 140*d9f75844SAndroid Build Coastguard Worker const rtc::PacketOptions& options, 141*d9f75844SAndroid Build Coastguard Worker bool payload) override; 142*d9f75844SAndroid Build Coastguard Worker int SetOption(rtc::Socket::Option opt, int value) override; 143*d9f75844SAndroid Build Coastguard Worker int GetOption(rtc::Socket::Option opt, int* value) override; 144*d9f75844SAndroid Build Coastguard Worker int GetError() override; 145*d9f75844SAndroid Build Coastguard Worker 146*d9f75844SAndroid Build Coastguard Worker bool HandleIncomingPacket(rtc::AsyncPacketSocket* socket, 147*d9f75844SAndroid Build Coastguard Worker const char* data, 148*d9f75844SAndroid Build Coastguard Worker size_t size, 149*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& remote_addr, 150*d9f75844SAndroid Build Coastguard Worker int64_t packet_time_us) override; 151*d9f75844SAndroid Build Coastguard Worker bool CanHandleIncomingPacketsFrom( 152*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& addr) const override; 153*d9f75844SAndroid Build Coastguard Worker virtual void OnReadPacket(rtc::AsyncPacketSocket* socket, 154*d9f75844SAndroid Build Coastguard Worker const char* data, 155*d9f75844SAndroid Build Coastguard Worker size_t size, 156*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& remote_addr, 157*d9f75844SAndroid Build Coastguard Worker const int64_t& packet_time_us); 158*d9f75844SAndroid Build Coastguard Worker 159*d9f75844SAndroid Build Coastguard Worker void OnSentPacket(rtc::AsyncPacketSocket* socket, 160*d9f75844SAndroid Build Coastguard Worker const rtc::SentPacket& sent_packet) override; 161*d9f75844SAndroid Build Coastguard Worker virtual void OnReadyToSend(rtc::AsyncPacketSocket* socket); 162*d9f75844SAndroid Build Coastguard Worker bool SupportsProtocol(absl::string_view protocol) const override; 163*d9f75844SAndroid Build Coastguard Worker 164*d9f75844SAndroid Build Coastguard Worker void OnSocketConnect(rtc::AsyncPacketSocket* socket); 165*d9f75844SAndroid Build Coastguard Worker void OnSocketClose(rtc::AsyncPacketSocket* socket, int error); 166*d9f75844SAndroid Build Coastguard Worker hash()167*d9f75844SAndroid Build Coastguard Worker const std::string& hash() const { return hash_; } nonce()168*d9f75844SAndroid Build Coastguard Worker const std::string& nonce() const { return nonce_; } 169*d9f75844SAndroid Build Coastguard Worker error()170*d9f75844SAndroid Build Coastguard Worker int error() const { return error_; } 171*d9f75844SAndroid Build Coastguard Worker 172*d9f75844SAndroid Build Coastguard Worker void OnAllocateMismatch(); 173*d9f75844SAndroid Build Coastguard Worker socket()174*d9f75844SAndroid Build Coastguard Worker rtc::AsyncPacketSocket* socket() const { return socket_; } request_manager()175*d9f75844SAndroid Build Coastguard Worker StunRequestManager& request_manager() { return request_manager_; } 176*d9f75844SAndroid Build Coastguard Worker HasRequests()177*d9f75844SAndroid Build Coastguard Worker bool HasRequests() { return !request_manager_.empty(); } set_credentials(const RelayCredentials & credentials)178*d9f75844SAndroid Build Coastguard Worker void set_credentials(const RelayCredentials& credentials) { 179*d9f75844SAndroid Build Coastguard Worker credentials_ = credentials; 180*d9f75844SAndroid Build Coastguard Worker } 181*d9f75844SAndroid Build Coastguard Worker // Finds the turn entry with `address` and sets its channel id. 182*d9f75844SAndroid Build Coastguard Worker // Returns true if the entry is found. 183*d9f75844SAndroid Build Coastguard Worker bool SetEntryChannelId(const rtc::SocketAddress& address, int channel_id); 184*d9f75844SAndroid Build Coastguard Worker 185*d9f75844SAndroid Build Coastguard Worker void HandleConnectionDestroyed(Connection* conn) override; 186*d9f75844SAndroid Build Coastguard Worker CloseForTest()187*d9f75844SAndroid Build Coastguard Worker void CloseForTest() { Close(); } 188*d9f75844SAndroid Build Coastguard Worker 189*d9f75844SAndroid Build Coastguard Worker // TODO(solenberg): Tests should be refactored to not peek at internal state. 190*d9f75844SAndroid Build Coastguard Worker class CallbacksForTest { 191*d9f75844SAndroid Build Coastguard Worker public: ~CallbacksForTest()192*d9f75844SAndroid Build Coastguard Worker virtual ~CallbacksForTest() {} 193*d9f75844SAndroid Build Coastguard Worker virtual void OnTurnCreatePermissionResult(int code) = 0; 194*d9f75844SAndroid Build Coastguard Worker virtual void OnTurnRefreshResult(int code) = 0; 195*d9f75844SAndroid Build Coastguard Worker virtual void OnTurnPortClosed() = 0; 196*d9f75844SAndroid Build Coastguard Worker }; 197*d9f75844SAndroid Build Coastguard Worker void SetCallbacksForTest(CallbacksForTest* callbacks); 198*d9f75844SAndroid Build Coastguard Worker 199*d9f75844SAndroid Build Coastguard Worker protected: 200*d9f75844SAndroid Build Coastguard Worker TurnPort(webrtc::TaskQueueBase* thread, 201*d9f75844SAndroid Build Coastguard Worker rtc::PacketSocketFactory* factory, 202*d9f75844SAndroid Build Coastguard Worker const rtc::Network* network, 203*d9f75844SAndroid Build Coastguard Worker rtc::AsyncPacketSocket* socket, 204*d9f75844SAndroid Build Coastguard Worker absl::string_view username, 205*d9f75844SAndroid Build Coastguard Worker absl::string_view password, 206*d9f75844SAndroid Build Coastguard Worker const ProtocolAddress& server_address, 207*d9f75844SAndroid Build Coastguard Worker const RelayCredentials& credentials, 208*d9f75844SAndroid Build Coastguard Worker int server_priority, 209*d9f75844SAndroid Build Coastguard Worker const std::vector<std::string>& tls_alpn_protocols, 210*d9f75844SAndroid Build Coastguard Worker const std::vector<std::string>& tls_elliptic_curves, 211*d9f75844SAndroid Build Coastguard Worker webrtc::TurnCustomizer* customizer, 212*d9f75844SAndroid Build Coastguard Worker rtc::SSLCertificateVerifier* tls_cert_verifier = nullptr, 213*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials = nullptr); 214*d9f75844SAndroid Build Coastguard Worker 215*d9f75844SAndroid Build Coastguard Worker TurnPort(webrtc::TaskQueueBase* thread, 216*d9f75844SAndroid Build Coastguard Worker rtc::PacketSocketFactory* factory, 217*d9f75844SAndroid Build Coastguard Worker const rtc::Network* network, 218*d9f75844SAndroid Build Coastguard Worker uint16_t min_port, 219*d9f75844SAndroid Build Coastguard Worker uint16_t max_port, 220*d9f75844SAndroid Build Coastguard Worker absl::string_view username, 221*d9f75844SAndroid Build Coastguard Worker absl::string_view password, 222*d9f75844SAndroid Build Coastguard Worker const ProtocolAddress& server_address, 223*d9f75844SAndroid Build Coastguard Worker const RelayCredentials& credentials, 224*d9f75844SAndroid Build Coastguard Worker int server_priority, 225*d9f75844SAndroid Build Coastguard Worker const std::vector<std::string>& tls_alpn_protocols, 226*d9f75844SAndroid Build Coastguard Worker const std::vector<std::string>& tls_elliptic_curves, 227*d9f75844SAndroid Build Coastguard Worker webrtc::TurnCustomizer* customizer, 228*d9f75844SAndroid Build Coastguard Worker rtc::SSLCertificateVerifier* tls_cert_verifier = nullptr, 229*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials = nullptr); 230*d9f75844SAndroid Build Coastguard Worker 231*d9f75844SAndroid Build Coastguard Worker // NOTE: This method needs to be accessible for StunPort 232*d9f75844SAndroid Build Coastguard Worker // return true if entry was created (i.e channel_number consumed). 233*d9f75844SAndroid Build Coastguard Worker bool CreateOrRefreshEntry(Connection* conn, int channel_number); 234*d9f75844SAndroid Build Coastguard Worker 235*d9f75844SAndroid Build Coastguard Worker rtc::DiffServCodePoint StunDscpValue() const override; 236*d9f75844SAndroid Build Coastguard Worker 237*d9f75844SAndroid Build Coastguard Worker // Shuts down the turn port, frees requests and deletes connections. 238*d9f75844SAndroid Build Coastguard Worker void Close(); 239*d9f75844SAndroid Build Coastguard Worker 240*d9f75844SAndroid Build Coastguard Worker private: 241*d9f75844SAndroid Build Coastguard Worker typedef std::map<rtc::Socket::Option, int> SocketOptionsMap; 242*d9f75844SAndroid Build Coastguard Worker typedef std::set<rtc::SocketAddress> AttemptedServerSet; 243*d9f75844SAndroid Build Coastguard Worker 244*d9f75844SAndroid Build Coastguard Worker static bool AllowedTurnPort(int port, 245*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView* field_trials); 246*d9f75844SAndroid Build Coastguard Worker void TryAlternateServer(); 247*d9f75844SAndroid Build Coastguard Worker 248*d9f75844SAndroid Build Coastguard Worker bool CreateTurnClientSocket(); 249*d9f75844SAndroid Build Coastguard Worker set_nonce(absl::string_view nonce)250*d9f75844SAndroid Build Coastguard Worker void set_nonce(absl::string_view nonce) { nonce_ = std::string(nonce); } set_realm(absl::string_view realm)251*d9f75844SAndroid Build Coastguard Worker void set_realm(absl::string_view realm) { 252*d9f75844SAndroid Build Coastguard Worker if (realm != realm_) { 253*d9f75844SAndroid Build Coastguard Worker realm_ = std::string(realm); 254*d9f75844SAndroid Build Coastguard Worker UpdateHash(); 255*d9f75844SAndroid Build Coastguard Worker } 256*d9f75844SAndroid Build Coastguard Worker } 257*d9f75844SAndroid Build Coastguard Worker 258*d9f75844SAndroid Build Coastguard Worker void OnRefreshError(); 259*d9f75844SAndroid Build Coastguard Worker void HandleRefreshError(); 260*d9f75844SAndroid Build Coastguard Worker bool SetAlternateServer(const rtc::SocketAddress& address); 261*d9f75844SAndroid Build Coastguard Worker void ResolveTurnAddress(const rtc::SocketAddress& address); 262*d9f75844SAndroid Build Coastguard Worker void OnResolveResult(rtc::AsyncResolverInterface* resolver); 263*d9f75844SAndroid Build Coastguard Worker 264*d9f75844SAndroid Build Coastguard Worker void AddRequestAuthInfo(StunMessage* msg); 265*d9f75844SAndroid Build Coastguard Worker void OnSendStunPacket(const void* data, size_t size, StunRequest* request); 266*d9f75844SAndroid Build Coastguard Worker // Stun address from allocate success response. 267*d9f75844SAndroid Build Coastguard Worker // Currently used only for testing. 268*d9f75844SAndroid Build Coastguard Worker void OnStunAddress(const rtc::SocketAddress& address); 269*d9f75844SAndroid Build Coastguard Worker void OnAllocateSuccess(const rtc::SocketAddress& address, 270*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& stun_address); 271*d9f75844SAndroid Build Coastguard Worker void OnAllocateError(int error_code, absl::string_view reason); 272*d9f75844SAndroid Build Coastguard Worker void OnAllocateRequestTimeout(); 273*d9f75844SAndroid Build Coastguard Worker 274*d9f75844SAndroid Build Coastguard Worker void HandleDataIndication(const char* data, 275*d9f75844SAndroid Build Coastguard Worker size_t size, 276*d9f75844SAndroid Build Coastguard Worker int64_t packet_time_us); 277*d9f75844SAndroid Build Coastguard Worker void HandleChannelData(int channel_id, 278*d9f75844SAndroid Build Coastguard Worker const char* data, 279*d9f75844SAndroid Build Coastguard Worker size_t size, 280*d9f75844SAndroid Build Coastguard Worker int64_t packet_time_us); 281*d9f75844SAndroid Build Coastguard Worker void DispatchPacket(const char* data, 282*d9f75844SAndroid Build Coastguard Worker size_t size, 283*d9f75844SAndroid Build Coastguard Worker const rtc::SocketAddress& remote_addr, 284*d9f75844SAndroid Build Coastguard Worker ProtocolType proto, 285*d9f75844SAndroid Build Coastguard Worker int64_t packet_time_us); 286*d9f75844SAndroid Build Coastguard Worker 287*d9f75844SAndroid Build Coastguard Worker bool ScheduleRefresh(uint32_t lifetime); 288*d9f75844SAndroid Build Coastguard Worker void SendRequest(StunRequest* request, int delay); 289*d9f75844SAndroid Build Coastguard Worker int Send(const void* data, size_t size, const rtc::PacketOptions& options); 290*d9f75844SAndroid Build Coastguard Worker void UpdateHash(); 291*d9f75844SAndroid Build Coastguard Worker bool UpdateNonce(StunMessage* response); 292*d9f75844SAndroid Build Coastguard Worker void ResetNonce(); 293*d9f75844SAndroid Build Coastguard Worker 294*d9f75844SAndroid Build Coastguard Worker bool HasPermission(const rtc::IPAddress& ipaddr) const; 295*d9f75844SAndroid Build Coastguard Worker TurnEntry* FindEntry(const rtc::SocketAddress& address) const; 296*d9f75844SAndroid Build Coastguard Worker TurnEntry* FindEntry(int channel_id) const; 297*d9f75844SAndroid Build Coastguard Worker 298*d9f75844SAndroid Build Coastguard Worker // Marks the connection with remote address `address` failed and 299*d9f75844SAndroid Build Coastguard Worker // pruned (a.k.a. write-timed-out). Returns true if a connection is found. 300*d9f75844SAndroid Build Coastguard Worker bool FailAndPruneConnection(const rtc::SocketAddress& address); 301*d9f75844SAndroid Build Coastguard Worker 302*d9f75844SAndroid Build Coastguard Worker // Reconstruct the URL of the server which the candidate is gathered from. 303*d9f75844SAndroid Build Coastguard Worker std::string ReconstructedServerUrl(); 304*d9f75844SAndroid Build Coastguard Worker 305*d9f75844SAndroid Build Coastguard Worker void MaybeAddTurnLoggingId(StunMessage* message); 306*d9f75844SAndroid Build Coastguard Worker 307*d9f75844SAndroid Build Coastguard Worker void TurnCustomizerMaybeModifyOutgoingStunMessage(StunMessage* message); 308*d9f75844SAndroid Build Coastguard Worker bool TurnCustomizerAllowChannelData(const void* data, 309*d9f75844SAndroid Build Coastguard Worker size_t size, 310*d9f75844SAndroid Build Coastguard Worker bool payload); 311*d9f75844SAndroid Build Coastguard Worker 312*d9f75844SAndroid Build Coastguard Worker ProtocolAddress server_address_; 313*d9f75844SAndroid Build Coastguard Worker TlsCertPolicy tls_cert_policy_ = TlsCertPolicy::TLS_CERT_POLICY_SECURE; 314*d9f75844SAndroid Build Coastguard Worker std::vector<std::string> tls_alpn_protocols_; 315*d9f75844SAndroid Build Coastguard Worker std::vector<std::string> tls_elliptic_curves_; 316*d9f75844SAndroid Build Coastguard Worker rtc::SSLCertificateVerifier* tls_cert_verifier_; 317*d9f75844SAndroid Build Coastguard Worker RelayCredentials credentials_; 318*d9f75844SAndroid Build Coastguard Worker AttemptedServerSet attempted_server_addresses_; 319*d9f75844SAndroid Build Coastguard Worker 320*d9f75844SAndroid Build Coastguard Worker rtc::AsyncPacketSocket* socket_; 321*d9f75844SAndroid Build Coastguard Worker SocketOptionsMap socket_options_; 322*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::AsyncDnsResolverInterface> resolver_; 323*d9f75844SAndroid Build Coastguard Worker int error_; 324*d9f75844SAndroid Build Coastguard Worker rtc::DiffServCodePoint stun_dscp_value_; 325*d9f75844SAndroid Build Coastguard Worker 326*d9f75844SAndroid Build Coastguard Worker StunRequestManager request_manager_; 327*d9f75844SAndroid Build Coastguard Worker std::string realm_; // From 401/438 response message. 328*d9f75844SAndroid Build Coastguard Worker std::string nonce_; // From 401/438 response message. 329*d9f75844SAndroid Build Coastguard Worker std::string hash_; // Digest of username:realm:password 330*d9f75844SAndroid Build Coastguard Worker 331*d9f75844SAndroid Build Coastguard Worker int next_channel_number_; 332*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<TurnEntry>> entries_; 333*d9f75844SAndroid Build Coastguard Worker 334*d9f75844SAndroid Build Coastguard Worker PortState state_; 335*d9f75844SAndroid Build Coastguard Worker // By default the value will be set to 0. This value will be used in 336*d9f75844SAndroid Build Coastguard Worker // calculating the candidate priority. 337*d9f75844SAndroid Build Coastguard Worker int server_priority_; 338*d9f75844SAndroid Build Coastguard Worker 339*d9f75844SAndroid Build Coastguard Worker // The number of retries made due to allocate mismatch error. 340*d9f75844SAndroid Build Coastguard Worker size_t allocate_mismatch_retries_; 341*d9f75844SAndroid Build Coastguard Worker 342*d9f75844SAndroid Build Coastguard Worker // Optional TurnCustomizer that can modify outgoing messages. Once set, this 343*d9f75844SAndroid Build Coastguard Worker // must outlive the TurnPort's lifetime. 344*d9f75844SAndroid Build Coastguard Worker webrtc::TurnCustomizer* turn_customizer_ = nullptr; 345*d9f75844SAndroid Build Coastguard Worker 346*d9f75844SAndroid Build Coastguard Worker // Optional TurnLoggingId. 347*d9f75844SAndroid Build Coastguard Worker // An identifier set by application that is added to TURN_ALLOCATE_REQUEST 348*d9f75844SAndroid Build Coastguard Worker // and can be used to match client/backend logs. 349*d9f75844SAndroid Build Coastguard Worker // TODO(jonaso): This should really be initialized in constructor, 350*d9f75844SAndroid Build Coastguard Worker // but that is currently so terrible. Fix once constructor is changed 351*d9f75844SAndroid Build Coastguard Worker // to be more easy to work with. 352*d9f75844SAndroid Build Coastguard Worker std::string turn_logging_id_; 353*d9f75844SAndroid Build Coastguard Worker 354*d9f75844SAndroid Build Coastguard Worker webrtc::ScopedTaskSafety task_safety_; 355*d9f75844SAndroid Build Coastguard Worker 356*d9f75844SAndroid Build Coastguard Worker CallbacksForTest* callbacks_for_test_ = nullptr; 357*d9f75844SAndroid Build Coastguard Worker 358*d9f75844SAndroid Build Coastguard Worker friend class TurnEntry; 359*d9f75844SAndroid Build Coastguard Worker friend class TurnAllocateRequest; 360*d9f75844SAndroid Build Coastguard Worker friend class TurnRefreshRequest; 361*d9f75844SAndroid Build Coastguard Worker friend class TurnCreatePermissionRequest; 362*d9f75844SAndroid Build Coastguard Worker friend class TurnChannelBindRequest; 363*d9f75844SAndroid Build Coastguard Worker }; 364*d9f75844SAndroid Build Coastguard Worker 365*d9f75844SAndroid Build Coastguard Worker } // namespace cricket 366*d9f75844SAndroid Build Coastguard Worker 367*d9f75844SAndroid Build Coastguard Worker #endif // P2P_BASE_TURN_PORT_H_ 368