10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004--2005, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_P2P_BASE_RELAYPORT_H_ 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_P2P_BASE_RELAYPORT_H_ 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <deque> 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <utility> 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/port.h" 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/stunrequest.h" 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass RelayEntry; 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass RelayConnection; 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Communicates using an allocated port on the relay server. For each 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// remote candidate that we try to send data to a RelayEntry instance 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// is created. The RelayEntry will try to reach the remote destination 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// by connecting to all available server addresses in a pre defined 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// order with a small delay in between. When a connection is 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// successful all other connection attemts are aborted. 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass RelayPort : public Port { 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org typedef std::pair<rtc::Socket::Option, int> OptionValue; 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // RelayPort doesn't yet do anything fancy in the ctor. 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static RelayPort* Create( 562a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* thread, rtc::PacketSocketFactory* factory, 572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Network* network, const rtc::IPAddress& ip, 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int min_port, int max_port, const std::string& username, 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& password) { 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return new RelayPort(thread, factory, network, ip, min_port, max_port, 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org username, password); 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual ~RelayPort(); 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddServerAddress(const ProtocolAddress& addr); 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddExternalAddress(const ProtocolAddress& addr); 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<OptionValue>& options() const { return options_; } 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool HasMagicCookie(const char* data, size_t size); 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void PrepareAddress(); 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual Connection* CreateConnection(const Candidate& address, 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CandidateOrigin origin); 742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual int SetOption(rtc::Socket::Option opt, int value); 752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual int GetOption(rtc::Socket::Option opt, int* value); 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual int GetError(); 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const ProtocolAddress * ServerAddress(size_t index) const; 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool IsReady() { return ready_; } 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Used for testing. 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<const ProtocolAddress*> SignalConnectFailure; 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<const ProtocolAddress*> SignalSoftTimeout; 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 862a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org RelayPort(rtc::Thread* thread, rtc::PacketSocketFactory* factory, 872a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Network*, const rtc::IPAddress& ip, 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int min_port, int max_port, const std::string& username, 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& password); 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool Init(); 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetReady(); 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual int SendTo(const void* data, size_t size, 952a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::SocketAddress& addr, 962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::PacketOptions& options, 97391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org bool payload); 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Dispatches the given packet to the port or connection as appropriate. 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnReadPacket(const char* data, size_t size, 1012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::SocketAddress& remote_addr, 102f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org ProtocolType proto, 1032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org const rtc::PacketTime& packet_time); 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org friend class RelayEntry; 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::deque<ProtocolAddress> server_addr_; 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<ProtocolAddress> external_addr_; 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ready_; 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<RelayEntry*> entries_; 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<OptionValue> options_; 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int error_; 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif // TALK_P2P_BASE_RELAYPORT_H_ 119