1269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org/*
2269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *
4269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org */
10269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
11269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef WEBRTC_P2P_BASE_RELAYSERVER_H_
12269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#define WEBRTC_P2P_BASE_RELAYSERVER_H_
13269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
14269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <map>
15269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <string>
16269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <vector>
17269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
18269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/p2p/base/port.h"
19269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/p2p/base/stun.h"
20269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/asyncudpsocket.h"
21269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/socketaddresspair.h"
22269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/thread.h"
23269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/timeutils.h"
24269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
25269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgnamespace cricket {
26269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
27269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass RelayServerBinding;
28269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass RelayServerConnection;
29269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
30269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// Relays traffic between connections to the server that are "bound" together.
31269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// All connections created with the same username/password are bound together.
32269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass RelayServer : public rtc::MessageHandler,
33269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                    public sigslot::has_slots<> {
34269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public:
35269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Creates a server, which will use this thread to post messages to itself.
36269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  explicit RelayServer(rtc::Thread* thread);
37269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  ~RelayServer();
38269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
39269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  rtc::Thread* thread() { return thread_; }
40269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
41269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Indicates whether we will print updates of the number of bindings.
42269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool log_bindings() const { return log_bindings_; }
43269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void set_log_bindings(bool log_bindings) { log_bindings_ = log_bindings; }
44269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
45269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Updates the set of sockets that the server uses to talk to "internal"
46269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // clients.  These are clients that do the "port allocations".
47269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void AddInternalSocket(rtc::AsyncPacketSocket* socket);
48269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void RemoveInternalSocket(rtc::AsyncPacketSocket* socket);
49269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
50269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Updates the set of sockets that the server uses to talk to "external"
51269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // clients.  These are the clients that do not do allocations.  They do not
52269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // know that these addresses represent a relay server.
53269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void AddExternalSocket(rtc::AsyncPacketSocket* socket);
54269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void RemoveExternalSocket(rtc::AsyncPacketSocket* socket);
55269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
56269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Starts listening for connections on this sockets. When someone
57269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // tries to connect, the connection will be accepted and a new
58269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // internal socket will be added.
59269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void AddInternalServerSocket(rtc::AsyncSocket* socket,
60269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                               cricket::ProtocolType proto);
61269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
62269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Removes this server socket from the list.
63269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void RemoveInternalServerSocket(rtc::AsyncSocket* socket);
64269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
65269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Methods for testing and debuging.
66269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  int GetConnectionCount() const;
67269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  rtc::SocketAddressPair GetConnection(int connection) const;
68269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool HasConnection(const rtc::SocketAddress& address) const;
69269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
70269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private:
71269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  typedef std::vector<rtc::AsyncPacketSocket*> SocketList;
72269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  typedef std::map<rtc::AsyncSocket*,
73269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                   cricket::ProtocolType> ServerSocketMap;
74269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  typedef std::map<std::string, RelayServerBinding*> BindingMap;
75269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  typedef std::map<rtc::SocketAddressPair,
76269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                   RelayServerConnection*> ConnectionMap;
77269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
78269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  rtc::Thread* thread_;
79269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool log_bindings_;
80269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  SocketList internal_sockets_;
81269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  SocketList external_sockets_;
82269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  SocketList removed_sockets_;
83269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  ServerSocketMap server_sockets_;
84269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  BindingMap bindings_;
85269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  ConnectionMap connections_;
86269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
87269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Called when a packet is received by the server on one of its sockets.
88269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void OnInternalPacket(rtc::AsyncPacketSocket* socket,
89269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                        const char* bytes, size_t size,
90269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                        const rtc::SocketAddress& remote_addr,
91269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                        const rtc::PacketTime& packet_time);
92269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void OnExternalPacket(rtc::AsyncPacketSocket* socket,
93269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                        const char* bytes, size_t size,
94269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                        const rtc::SocketAddress& remote_addr,
95269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                        const rtc::PacketTime& packet_time);
96269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
97269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void OnReadEvent(rtc::AsyncSocket* socket);
98269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
99269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Processes the relevant STUN request types from the client.
100269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool HandleStun(const char* bytes, size_t size,
101269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                  const rtc::SocketAddress& remote_addr,
102269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                  rtc::AsyncPacketSocket* socket,
103269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                  std::string* username, StunMessage* msg);
104269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void HandleStunAllocate(const char* bytes, size_t size,
105269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                          const rtc::SocketAddressPair& ap,
106269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                          rtc::AsyncPacketSocket* socket);
107269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void HandleStun(RelayServerConnection* int_conn, const char* bytes,
108269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                  size_t size);
109269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void HandleStunAllocate(RelayServerConnection* int_conn,
110269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                          const StunMessage& msg);
111269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void HandleStunSend(RelayServerConnection* int_conn, const StunMessage& msg);
112269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
113269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Adds/Removes the a connection or binding.
114269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void AddConnection(RelayServerConnection* conn);
115269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void RemoveConnection(RelayServerConnection* conn);
116269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void RemoveBinding(RelayServerBinding* binding);
117269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
118269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Handle messages in our worker thread.
119269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void OnMessage(rtc::Message *pmsg);
120269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
121269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Called when the timer for checking lifetime times out.
122269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void OnTimeout(RelayServerBinding* binding);
123269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
124269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Accept connections on this server socket.
125269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void AcceptConnection(rtc::AsyncSocket* server_socket);
126269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
127269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  friend class RelayServerConnection;
128269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  friend class RelayServerBinding;
129269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org};
130269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
131269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// Maintains information about a connection to the server.  Each connection is
132269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// part of one and only one binding.
133269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass RelayServerConnection {
134269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public:
135269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  RelayServerConnection(RelayServerBinding* binding,
136269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                        const rtc::SocketAddressPair& addrs,
137269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                        rtc::AsyncPacketSocket* socket);
138269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  ~RelayServerConnection();
139269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
140269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  RelayServerBinding* binding() { return binding_; }
141269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  rtc::AsyncPacketSocket* socket() { return socket_; }
142269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
143269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Returns a pair where the source is the remote address and the destination
144269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // is the local address.
145269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  const rtc::SocketAddressPair& addr_pair() { return addr_pair_; }
146269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
147269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Sends a packet to the connected client.  If an address is provided, then
148269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // we make sure the internal client receives it, wrapping if necessary.
149269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void Send(const char* data, size_t size);
150269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void Send(const char* data, size_t size,
151269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org            const rtc::SocketAddress& ext_addr);
152269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
153269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Sends a STUN message to the connected client with no wrapping.
154269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void SendStun(const StunMessage& msg);
155269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void SendStunError(const StunMessage& request, int code, const char* desc);
156269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
157269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // A locked connection is one for which we know the intended destination of
158269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // any raw packet received.
159269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool locked() const { return locked_; }
160269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void Lock();
161269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void Unlock();
162269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
163269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Records the address that raw packets should be forwarded to (for internal
164269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // packets only; for external, we already know where they go).
165269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  const rtc::SocketAddress& default_destination() const {
166269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    return default_dest_;
167269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  }
168269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void set_default_destination(const rtc::SocketAddress& addr) {
169269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    default_dest_ = addr;
170269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  }
171269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
172269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private:
173269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  RelayServerBinding* binding_;
174269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  rtc::SocketAddressPair addr_pair_;
175269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  rtc::AsyncPacketSocket* socket_;
176269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool locked_;
177269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  rtc::SocketAddress default_dest_;
178269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org};
179269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
180269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// Records a set of internal and external connections that we relay between,
181269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// or in other words, that are "bound" together.
182269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass RelayServerBinding : public rtc::MessageHandler {
183269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public:
1840c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  RelayServerBinding(RelayServer* server,
1850c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström                     const std::string& username,
1860c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström                     const std::string& password,
1870c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström                     uint32_t lifetime);
188269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  virtual ~RelayServerBinding();
189269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
190269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  RelayServer* server() { return server_; }
1910c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint32_t lifetime() { return lifetime_; }
192269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  const std::string& username() { return username_; }
193269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  const std::string& password() { return password_; }
194269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  const std::string& magic_cookie() { return magic_cookie_; }
195269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
196269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Adds/Removes a connection into the binding.
197269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void AddInternalConnection(RelayServerConnection* conn);
198269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void AddExternalConnection(RelayServerConnection* conn);
199269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
200269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // We keep track of the use of each binding.  If we detect that it was not
201269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // used for longer than the lifetime, then we send a signal.
202269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void NoteUsed();
203269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  sigslot::signal1<RelayServerBinding*> SignalTimeout;
204269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
205269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Determines whether the given packet has the magic cookie present (in the
206269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // right place).
207269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool HasMagicCookie(const char* bytes, size_t size) const;
208269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
209269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Determines the connection to use to send packets to or from the given
210269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // external address.
211269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  RelayServerConnection* GetInternalConnection(
212269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      const rtc::SocketAddress& ext_addr);
213269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  RelayServerConnection* GetExternalConnection(
214269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      const rtc::SocketAddress& ext_addr);
215269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
216269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // MessageHandler:
217269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void OnMessage(rtc::Message *pmsg);
218269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
219269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private:
220269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  RelayServer* server_;
221269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
222269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  std::string username_;
223269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  std::string password_;
224269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  std::string magic_cookie_;
225269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
226269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  std::vector<RelayServerConnection*> internal_connections_;
227269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  std::vector<RelayServerConnection*> external_connections_;
228269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
2290c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint32_t lifetime_;
2300c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint32_t last_used_;
231269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // TODO: bandwidth
232269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org};
233269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
234269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org}  // namespace cricket
235269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
236269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif  // WEBRTC_P2P_BASE_RELAYSERVER_H_
237