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