blob: fdbb5284e46dc0635b13f213b7d36502f17fc114 [file] [log] [blame]
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001/*
2 * Copyright 2012 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef P2P_BASE_TURN_SERVER_H_
12#define P2P_BASE_TURN_SERVER_H_
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000013
14#include <list>
15#include <map>
kwiberg3ec46792016-04-27 07:22:53 -070016#include <memory>
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000017#include <set>
18#include <string>
Steve Anton6c38cc72017-11-29 10:25:58 -080019#include <utility>
deadbeef824f5862016-08-24 15:06:53 -070020#include <vector>
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000021
Ali Tofighde2ac5a2022-06-30 11:58:26 +020022#include "absl/strings/string_view.h"
Artem Titovd15a5752021-02-10 14:31:24 +010023#include "api/sequence_checker.h"
Steve Anton10542f22019-01-11 09:11:00 -080024#include "p2p/base/port_interface.h"
Steve Anton10542f22019-01-11 09:11:00 -080025#include "rtc_base/async_packet_socket.h"
Steve Anton10542f22019-01-11 09:11:00 -080026#include "rtc_base/socket_address.h"
Niels Möllerac9a2882021-10-20 15:25:09 +020027#include "rtc_base/ssl_adapter.h"
Artem Titove41c4332018-07-25 15:04:28 +020028#include "rtc_base/third_party/sigslot/sigslot.h"
Sebastian Jansson4db28b52020-01-08 14:07:15 +010029#include "rtc_base/thread.h"
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000030
31namespace rtc {
jbauchf1f87202016-03-30 06:43:37 -070032class ByteBufferWriter;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000033class PacketSocketFactory;
Jonas Olssona4d87372019-07-05 19:08:33 +020034} // namespace rtc
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000035
36namespace cricket {
37
38class StunMessage;
39class TurnMessage;
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +000040class TurnServer;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000041
42// The default server port for TURN, as specified in RFC5766.
43const int TURN_SERVER_PORT = 3478;
44
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +000045// Encapsulates the client's connection to the server.
46class TurnServerConnection {
47 public:
48 TurnServerConnection() : proto_(PROTO_UDP), socket_(NULL) {}
49 TurnServerConnection(const rtc::SocketAddress& src,
50 ProtocolType proto,
51 rtc::AsyncPacketSocket* socket);
52 const rtc::SocketAddress& src() const { return src_; }
53 rtc::AsyncPacketSocket* socket() { return socket_; }
54 bool operator==(const TurnServerConnection& t) const;
55 bool operator<(const TurnServerConnection& t) const;
56 std::string ToString() const;
57
58 private:
59 rtc::SocketAddress src_;
60 rtc::SocketAddress dst_;
61 cricket::ProtocolType proto_;
62 rtc::AsyncPacketSocket* socket_;
63};
64
65// Encapsulates a TURN allocation.
66// The object is created when an allocation request is received, and then
67// handles TURN messages (via HandleTurnMessage) and channel data messages
68// (via HandleChannelData) for this allocation when received by the server.
69// The object self-deletes and informs the server if its lifetime timer expires.
Tomas Gunnarssonabdb4702020-09-05 18:43:36 +020070class TurnServerAllocation : public rtc::MessageHandlerAutoCleanup,
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +000071 public sigslot::has_slots<> {
72 public:
73 TurnServerAllocation(TurnServer* server_,
74 rtc::Thread* thread,
75 const TurnServerConnection& conn,
76 rtc::AsyncPacketSocket* server_socket,
Ali Tofighde2ac5a2022-06-30 11:58:26 +020077 absl::string_view key);
Steve Antonf2737d22017-10-31 16:27:34 -070078 ~TurnServerAllocation() override;
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +000079
80 TurnServerConnection* conn() { return &conn_; }
81 const std::string& key() const { return key_; }
82 const std::string& transaction_id() const { return transaction_id_; }
83 const std::string& username() const { return username_; }
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +000084 const std::string& last_nonce() const { return last_nonce_; }
Tommie83500e2022-06-03 14:28:59 +020085 void set_last_nonce(absl::string_view nonce) {
86 last_nonce_ = std::string(nonce);
87 }
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +000088
89 std::string ToString() const;
90
91 void HandleTurnMessage(const TurnMessage* msg);
92 void HandleChannelData(const char* data, size_t size);
93
94 sigslot::signal1<TurnServerAllocation*> SignalDestroyed;
95
96 private:
97 class Channel;
98 class Permission;
99 typedef std::list<Permission*> PermissionList;
100 typedef std::list<Channel*> ChannelList;
101
102 void HandleAllocateRequest(const TurnMessage* msg);
103 void HandleRefreshRequest(const TurnMessage* msg);
104 void HandleSendIndication(const TurnMessage* msg);
105 void HandleCreatePermissionRequest(const TurnMessage* msg);
106 void HandleChannelBindRequest(const TurnMessage* msg);
107
108 void OnExternalPacket(rtc::AsyncPacketSocket* socket,
Niels Möllere6933812018-11-05 13:01:41 +0100109 const char* data,
110 size_t size,
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000111 const rtc::SocketAddress& addr,
Niels Möllere6933812018-11-05 13:01:41 +0100112 const int64_t& packet_time_us);
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000113
Tommi408143d2022-06-01 15:29:31 +0200114 static int ComputeLifetime(const TurnMessage& msg);
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000115 bool HasPermission(const rtc::IPAddress& addr);
116 void AddPermission(const rtc::IPAddress& addr);
117 Permission* FindPermission(const rtc::IPAddress& addr) const;
118 Channel* FindChannel(int channel_id) const;
119 Channel* FindChannel(const rtc::SocketAddress& addr) const;
120
121 void SendResponse(TurnMessage* msg);
122 void SendBadRequestResponse(const TurnMessage* req);
Jonas Olssona4d87372019-07-05 19:08:33 +0200123 void SendErrorResponse(const TurnMessage* req,
124 int code,
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200125 absl::string_view reason);
Jonas Olssona4d87372019-07-05 19:08:33 +0200126 void SendExternal(const void* data,
127 size_t size,
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000128 const rtc::SocketAddress& peer);
129
130 void OnPermissionDestroyed(Permission* perm);
131 void OnChannelDestroyed(Channel* channel);
Steve Antonf2737d22017-10-31 16:27:34 -0700132 void OnMessage(rtc::Message* msg) override;
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000133
Niels Möller76b51e22021-03-18 15:44:24 +0100134 TurnServer* const server_;
135 rtc::Thread* const thread_;
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000136 TurnServerConnection conn_;
kwiberg3ec46792016-04-27 07:22:53 -0700137 std::unique_ptr<rtc::AsyncPacketSocket> external_socket_;
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000138 std::string key_;
139 std::string transaction_id_;
140 std::string username_;
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000141 std::string last_nonce_;
142 PermissionList perms_;
143 ChannelList channels_;
144};
145
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000146// An interface through which the MD5 credential hash can be retrieved.
147class TurnAuthInterface {
148 public:
149 // Gets HA1 for the specified user and realm.
150 // HA1 = MD5(A1) = MD5(username:realm:password).
151 // Return true if the given username and realm are valid, or false if not.
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200152 virtual bool GetKey(absl::string_view username,
153 absl::string_view realm,
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000154 std::string* key) = 0;
Henrik Kjellander3fe372d2016-05-12 08:10:52 +0200155 virtual ~TurnAuthInterface() = default;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000156};
157
158// An interface enables Turn Server to control redirection behavior.
159class TurnRedirectInterface {
160 public:
161 virtual bool ShouldRedirect(const rtc::SocketAddress& address,
162 rtc::SocketAddress* out) = 0;
163 virtual ~TurnRedirectInterface() {}
164};
165
Jonas Orelandbdcee282017-10-10 14:01:40 +0200166class StunMessageObserver {
167 public:
168 virtual void ReceivedMessage(const TurnMessage* msg) = 0;
169 virtual void ReceivedChannelData(const char* data, size_t size) = 0;
170 virtual ~StunMessageObserver() {}
171};
172
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000173// The core TURN server class. Give it a socket to listen on via
174// AddInternalServerSocket, and a factory to create external sockets via
175// SetExternalSocketFactory, and it's ready to go.
176// Not yet wired up: TCP support.
177class TurnServer : public sigslot::has_slots<> {
178 public:
deadbeef97943662016-07-12 11:04:50 -0700179 typedef std::map<TurnServerConnection, std::unique_ptr<TurnServerAllocation>>
180 AllocationMap;
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000181
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000182 explicit TurnServer(rtc::Thread* thread);
Steve Antonf2737d22017-10-31 16:27:34 -0700183 ~TurnServer() override;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000184
185 // Gets/sets the realm value to use for the server.
Seth Hampsonaed71642018-06-11 07:41:32 -0700186 const std::string& realm() const {
Niels Möller76b51e22021-03-18 15:44:24 +0100187 RTC_DCHECK_RUN_ON(thread_);
Seth Hampsonaed71642018-06-11 07:41:32 -0700188 return realm_;
189 }
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200190 void set_realm(absl::string_view realm) {
Niels Möller76b51e22021-03-18 15:44:24 +0100191 RTC_DCHECK_RUN_ON(thread_);
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200192 realm_ = std::string(realm);
Seth Hampsonaed71642018-06-11 07:41:32 -0700193 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000194
195 // Gets/sets the value for the SOFTWARE attribute for TURN messages.
Seth Hampsonaed71642018-06-11 07:41:32 -0700196 const std::string& software() const {
Niels Möller76b51e22021-03-18 15:44:24 +0100197 RTC_DCHECK_RUN_ON(thread_);
Seth Hampsonaed71642018-06-11 07:41:32 -0700198 return software_;
199 }
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200200 void set_software(absl::string_view software) {
Niels Möller76b51e22021-03-18 15:44:24 +0100201 RTC_DCHECK_RUN_ON(thread_);
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200202 software_ = std::string(software);
Seth Hampsonaed71642018-06-11 07:41:32 -0700203 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000204
Seth Hampsonaed71642018-06-11 07:41:32 -0700205 const AllocationMap& allocations() const {
Niels Möller76b51e22021-03-18 15:44:24 +0100206 RTC_DCHECK_RUN_ON(thread_);
Seth Hampsonaed71642018-06-11 07:41:32 -0700207 return allocations_;
208 }
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000209
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000210 // Sets the authentication callback; does not take ownership.
Seth Hampsonaed71642018-06-11 07:41:32 -0700211 void set_auth_hook(TurnAuthInterface* auth_hook) {
Niels Möller76b51e22021-03-18 15:44:24 +0100212 RTC_DCHECK_RUN_ON(thread_);
Seth Hampsonaed71642018-06-11 07:41:32 -0700213 auth_hook_ = auth_hook;
214 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000215
216 void set_redirect_hook(TurnRedirectInterface* redirect_hook) {
Niels Möller76b51e22021-03-18 15:44:24 +0100217 RTC_DCHECK_RUN_ON(thread_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000218 redirect_hook_ = redirect_hook;
219 }
220
Seth Hampsonaed71642018-06-11 07:41:32 -0700221 void set_enable_otu_nonce(bool enable) {
Niels Möller76b51e22021-03-18 15:44:24 +0100222 RTC_DCHECK_RUN_ON(thread_);
Seth Hampsonaed71642018-06-11 07:41:32 -0700223 enable_otu_nonce_ = enable;
224 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000225
deadbeef376e1232015-11-25 09:00:08 -0800226 // If set to true, reject CreatePermission requests to RFC1918 addresses.
227 void set_reject_private_addresses(bool filter) {
Niels Möller76b51e22021-03-18 15:44:24 +0100228 RTC_DCHECK_RUN_ON(thread_);
deadbeef376e1232015-11-25 09:00:08 -0800229 reject_private_addresses_ = filter;
230 }
231
Taylor Brandstetteref184702016-06-23 17:35:47 -0700232 void set_enable_permission_checks(bool enable) {
Niels Möller76b51e22021-03-18 15:44:24 +0100233 RTC_DCHECK_RUN_ON(thread_);
Taylor Brandstetteref184702016-06-23 17:35:47 -0700234 enable_permission_checks_ = enable;
235 }
236
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000237 // Starts listening for packets from internal clients.
Jonas Olssona4d87372019-07-05 19:08:33 +0200238 void AddInternalSocket(rtc::AsyncPacketSocket* socket, ProtocolType proto);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000239 // Starts listening for the connections on this socket. When someone tries
240 // to connect, the connection will be accepted and a new internal socket
241 // will be added.
Niels Möllerac9a2882021-10-20 15:25:09 +0200242 void AddInternalServerSocket(
243 rtc::Socket* socket,
244 ProtocolType proto,
245 std::unique_ptr<rtc::SSLAdapterFactory> ssl_adapter_factory = nullptr);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000246 // Specifies the factory to use for creating external sockets.
247 void SetExternalSocketFactory(rtc::PacketSocketFactory* factory,
248 const rtc::SocketAddress& address);
honghaizc463e202016-02-01 15:19:08 -0800249 // For testing only.
honghaiz34b11eb2016-03-16 08:55:44 -0700250 std::string SetTimestampForNextNonce(int64_t timestamp) {
Niels Möller76b51e22021-03-18 15:44:24 +0100251 RTC_DCHECK_RUN_ON(thread_);
honghaizc463e202016-02-01 15:19:08 -0800252 ts_for_next_nonce_ = timestamp;
253 return GenerateNonce(timestamp);
254 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000255
Jonas Olssona4d87372019-07-05 19:08:33 +0200256 void SetStunMessageObserver(std::unique_ptr<StunMessageObserver> observer) {
Niels Möller76b51e22021-03-18 15:44:24 +0100257 RTC_DCHECK_RUN_ON(thread_);
Jonas Orelandbdcee282017-10-10 14:01:40 +0200258 stun_message_observer_ = std::move(observer);
259 }
260
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000261 private:
Niels Möller76b51e22021-03-18 15:44:24 +0100262 // All private member functions and variables should have access restricted to
263 // thread_. But compile-time annotations are missing for members access from
264 // TurnServerAllocation (via friend declaration), and the On* methods, which
265 // are called via sigslot.
266 std::string GenerateNonce(int64_t now) const RTC_RUN_ON(thread_);
Niels Möllere6933812018-11-05 13:01:41 +0100267 void OnInternalPacket(rtc::AsyncPacketSocket* socket,
268 const char* data,
269 size_t size,
270 const rtc::SocketAddress& address,
271 const int64_t& packet_time_us);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000272
Niels Möllerd0b88792021-08-12 10:32:30 +0200273 void OnNewInternalConnection(rtc::Socket* socket);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000274
275 // Accept connections on this server socket.
Niels Möllerd0b88792021-08-12 10:32:30 +0200276 void AcceptConnection(rtc::Socket* server_socket) RTC_RUN_ON(thread_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000277 void OnInternalSocketClose(rtc::AsyncPacketSocket* socket, int err);
278
Jonas Olssona4d87372019-07-05 19:08:33 +0200279 void HandleStunMessage(TurnServerConnection* conn,
280 const char* data,
Niels Möller76b51e22021-03-18 15:44:24 +0100281 size_t size) RTC_RUN_ON(thread_);
282 void HandleBindingRequest(TurnServerConnection* conn, const StunMessage* msg)
283 RTC_RUN_ON(thread_);
Jonas Olssona4d87372019-07-05 19:08:33 +0200284 void HandleAllocateRequest(TurnServerConnection* conn,
285 const TurnMessage* msg,
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200286 absl::string_view key) RTC_RUN_ON(thread_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000287
Niels Möller76b51e22021-03-18 15:44:24 +0100288 bool GetKey(const StunMessage* msg, std::string* key) RTC_RUN_ON(thread_);
Jonas Olssona4d87372019-07-05 19:08:33 +0200289 bool CheckAuthorization(TurnServerConnection* conn,
Harald Alvestrand07d83c82021-03-02 08:09:53 +0000290 StunMessage* msg,
Jonas Olssona4d87372019-07-05 19:08:33 +0200291 const char* data,
292 size_t size,
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200293 absl::string_view key) RTC_RUN_ON(thread_);
Tommie83500e2022-06-03 14:28:59 +0200294 bool ValidateNonce(absl::string_view nonce) const RTC_RUN_ON(thread_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000295
Niels Möller76b51e22021-03-18 15:44:24 +0100296 TurnServerAllocation* FindAllocation(TurnServerConnection* conn)
297 RTC_RUN_ON(thread_);
Jonas Olssona4d87372019-07-05 19:08:33 +0200298 TurnServerAllocation* CreateAllocation(TurnServerConnection* conn,
299 int proto,
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200300 absl::string_view key)
Niels Möller76b51e22021-03-18 15:44:24 +0100301 RTC_RUN_ON(thread_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000302
Jonas Olssona4d87372019-07-05 19:08:33 +0200303 void SendErrorResponse(TurnServerConnection* conn,
304 const StunMessage* req,
305 int code,
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200306 absl::string_view reason);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000307
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000308 void SendErrorResponseWithRealmAndNonce(TurnServerConnection* conn,
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000309 const StunMessage* req,
310 int code,
Ali Tofighde2ac5a2022-06-30 11:58:26 +0200311 absl::string_view reason)
Niels Möller76b51e22021-03-18 15:44:24 +0100312 RTC_RUN_ON(thread_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000313
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000314 void SendErrorResponseWithAlternateServer(TurnServerConnection* conn,
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000315 const StunMessage* req,
Niels Möller76b51e22021-03-18 15:44:24 +0100316 const rtc::SocketAddress& addr)
317 RTC_RUN_ON(thread_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000318
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000319 void SendStun(TurnServerConnection* conn, StunMessage* msg);
jbauchf1f87202016-03-30 06:43:37 -0700320 void Send(TurnServerConnection* conn, const rtc::ByteBufferWriter& buf);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000321
Niels Möller76b51e22021-03-18 15:44:24 +0100322 void OnAllocationDestroyed(TurnServerAllocation* allocation)
323 RTC_RUN_ON(thread_);
324 void DestroyInternalSocket(rtc::AsyncPacketSocket* socket)
325 RTC_RUN_ON(thread_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000326
Jonas Olssona4d87372019-07-05 19:08:33 +0200327 typedef std::map<rtc::AsyncPacketSocket*, ProtocolType> InternalSocketMap;
Niels Möllerac9a2882021-10-20 15:25:09 +0200328 struct ServerSocketInfo {
329 ProtocolType proto;
330 // If non-null, used to wrap accepted sockets.
331 std::unique_ptr<rtc::SSLAdapterFactory> ssl_adapter_factory;
332 };
333 typedef std::map<rtc::Socket*, ServerSocketInfo> ServerSocketMap;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000334
Niels Möller76b51e22021-03-18 15:44:24 +0100335 rtc::Thread* const thread_;
336 const std::string nonce_key_;
337 std::string realm_ RTC_GUARDED_BY(thread_);
338 std::string software_ RTC_GUARDED_BY(thread_);
339 TurnAuthInterface* auth_hook_ RTC_GUARDED_BY(thread_);
340 TurnRedirectInterface* redirect_hook_ RTC_GUARDED_BY(thread_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000341 // otu - one-time-use. Server will respond with 438 if it's
342 // sees the same nonce in next transaction.
Niels Möller76b51e22021-03-18 15:44:24 +0100343 bool enable_otu_nonce_ RTC_GUARDED_BY(thread_);
deadbeef376e1232015-11-25 09:00:08 -0800344 bool reject_private_addresses_ = false;
Taylor Brandstetteref184702016-06-23 17:35:47 -0700345 // Check for permission when receiving an external packet.
346 bool enable_permission_checks_ = true;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000347
Niels Möller76b51e22021-03-18 15:44:24 +0100348 InternalSocketMap server_sockets_ RTC_GUARDED_BY(thread_);
349 ServerSocketMap server_listen_sockets_ RTC_GUARDED_BY(thread_);
Niels Möller76b51e22021-03-18 15:44:24 +0100350 std::unique_ptr<rtc::PacketSocketFactory> external_socket_factory_
351 RTC_GUARDED_BY(thread_);
352 rtc::SocketAddress external_addr_ RTC_GUARDED_BY(thread_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000353
Niels Möller76b51e22021-03-18 15:44:24 +0100354 AllocationMap allocations_ RTC_GUARDED_BY(thread_);
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000355
honghaizc463e202016-02-01 15:19:08 -0800356 // For testing only. If this is non-zero, the next NONCE will be generated
357 // from this value, and it will be reset to 0 after generating the NONCE.
Niels Möller76b51e22021-03-18 15:44:24 +0100358 int64_t ts_for_next_nonce_ RTC_GUARDED_BY(thread_) = 0;
honghaizc463e202016-02-01 15:19:08 -0800359
Jonas Orelandbdcee282017-10-10 14:01:40 +0200360 // For testing only. Used to observe STUN messages received.
Niels Möller76b51e22021-03-18 15:44:24 +0100361 std::unique_ptr<StunMessageObserver> stun_message_observer_
362 RTC_GUARDED_BY(thread_);
Jonas Orelandbdcee282017-10-10 14:01:40 +0200363
pthatcher@webrtc.org0ba15332015-01-10 00:47:02 +0000364 friend class TurnServerAllocation;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +0000365};
366
367} // namespace cricket
368
Steve Anton10542f22019-01-11 09:11:00 -0800369#endif // P2P_BASE_TURN_SERVER_H_