xref: /aosp_15_r20/external/webrtc/p2p/base/turn_port.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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