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// A Transport manages a set of named channels of the same type. 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Subclasses choose the appropriate class to instantiate for each channel; 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// however, this base class keeps track of the channels by name, watches their 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// state changes (in order to update the manager's state), and forwards 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// requests to begin connecting or to reset to each of the channels. 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// On Threading: Transport performs work on both the signaling and worker 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// threads. For subclasses, the rule is that all signaling related calls will 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// be made on the signaling thread and all channel related calls (including 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// signaling for a channel) will be made on the worker thread. When 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// information needs to be sent between the two threads, this class should do 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// the work (e.g., OnRemoteCandidate). 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Note: Subclasses must call DestroyChannels() in their own constructors. 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// It is not possible to do so here because the subclass constructor will 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// already have run. 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifndef TALK_P2P_BASE_TRANSPORT_H_ 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TALK_P2P_BASE_TRANSPORT_H_ 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <map> 50cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <string> 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/candidate.h" 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/constants.h" 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/sessiondescription.h" 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/transportinfo.h" 56cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/criticalsection.h" 57cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/messagequeue.h" 58cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/sigslot.h" 59cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/sslstreamadapter.h" 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 612a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgnamespace rtc { 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass Thread; 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace buzz { 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass QName; 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass XmlElement; 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct ParseError; 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct WriteError; 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass CandidateTranslator; 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass PortAllocator; 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass SessionManager; 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass Session; 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TransportChannel; 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TransportChannelImpl; 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtypedef std::vector<buzz::XmlElement*> XmlElements; 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtypedef std::vector<Candidate> Candidates; 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Used to parse and serialize (write) transport candidates. For 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// convenience of old code, Transports will implement TransportParser. 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Parse/Write seems better than Serialize/Deserialize or 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Create/Translate. 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TransportParser { 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The incoming Translator value may be null, in which case 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // ParseCandidates should return false if there are candidates to 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // parse (indicating a failure to parse). If the Translator is null 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // and there are no candidates to parse, then return true, 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // indicating a successful parse of 0 candidates. 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Parse or write a transport description, including ICE credentials and 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // any DTLS fingerprint. Since only Jingle has transport descriptions, these 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // functions are only used when serializing to Jingle. 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool ParseTransportDescription(const buzz::XmlElement* elem, 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const CandidateTranslator* translator, 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportDescription* tdesc, 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ParseError* error) = 0; 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool WriteTransportDescription(const TransportDescription& tdesc, 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const CandidateTranslator* translator, 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement** tdesc_elem, 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WriteError* error) = 0; 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Parse a single candidate. This must be used when parsing Gingle 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // candidates, since there is no enclosing transport description. 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool ParseGingleCandidate(const buzz::XmlElement* elem, 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const CandidateTranslator* translator, 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidate* candidates, 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ParseError* error) = 0; 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool WriteGingleCandidate(const Candidate& candidate, 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const CandidateTranslator* translator, 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement** candidate_elem, 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org WriteError* error) = 0; 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Helper function to parse an element describing an address. This 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // retrieves the IP and port from the given element and verifies 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // that they look like plausible values. 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool ParseAddress(const buzz::XmlElement* elem, 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const buzz::QName& address_name, 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const buzz::QName& port_name, 1262a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SocketAddress* address, 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ParseError* error); 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual ~TransportParser() {} 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// For "writable" and "readable", we need to differentiate between 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// none, all, and some. 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgenum TransportState { 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TRANSPORT_STATE_NONE = 0, 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TRANSPORT_STATE_SOME, 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TRANSPORT_STATE_ALL 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Stats that we can return about the connections for a transport channel. 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO(hta): Rename to ConnectionStats 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct ConnectionInfo { 1437162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org ConnectionInfo() 1447162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org : best_connection(false), 1457162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org writable(false), 1467162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org readable(false), 1477162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org timeout(false), 1487162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org new_connection(false), 1497162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org rtt(0), 1507162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org sent_total_bytes(0), 1517162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org sent_bytes_second(0), 1527162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org recv_total_bytes(0), 1537162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org recv_bytes_second(0), 1547162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org key(NULL) {} 1557162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool best_connection; // Is this the best connection we have? 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool writable; // Has this connection received a STUN response? 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool readable; // Has this connection received a STUN request? 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool timeout; // Has this connection timed out? 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool new_connection; // Is this a newly created connection? 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t rtt; // The STUN RTT for this connection. 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t sent_total_bytes; // Total bytes sent on this connection. 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t sent_bytes_second; // Bps over the last measurement interval. 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t recv_total_bytes; // Total bytes received on this connection. 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org size_t recv_bytes_second; // Bps over the last measurement interval. 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidate local_candidate; // The local candidate for this connection. 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Candidate remote_candidate; // The remote candidate for this connection. 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void* key; // A static value that identifies this conn. 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Information about all the connections of a channel. 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtypedef std::vector<ConnectionInfo> ConnectionInfos; 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Information about a specific channel 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct TransportChannelStats { 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int component; 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ConnectionInfos connection_infos; 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Information about all the channels of a transport. 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO(hta): Consider if a simple vector is as good as a map. 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgtypedef std::vector<TransportChannelStats> TransportChannelStatsList; 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Information about the stats of a transport. 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct TransportStats { 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string content_name; 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannelStatsList channel_stats; 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 190f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.orgbool BadTransportDescription(const std::string& desc, std::string* err_desc); 191f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org 19239c443b6209621f0e8537e14514cc4c8b1dd5fadjiayl@webrtc.orgbool IceCredentialsChanged(const std::string& old_ufrag, 19339c443b6209621f0e8537e14514cc4c8b1dd5fadjiayl@webrtc.org const std::string& old_pwd, 19439c443b6209621f0e8537e14514cc4c8b1dd5fadjiayl@webrtc.org const std::string& new_ufrag, 19539c443b6209621f0e8537e14514cc4c8b1dd5fadjiayl@webrtc.org const std::string& new_pwd); 19639c443b6209621f0e8537e14514cc4c8b1dd5fadjiayl@webrtc.org 1972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgclass Transport : public rtc::MessageHandler, 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public sigslot::has_slots<> { 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 2002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org Transport(rtc::Thread* signaling_thread, 2012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* worker_thread, 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name, 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& type, 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PortAllocator* allocator); 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual ~Transport(); 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Returns the signaling thread. The app talks to Transport on this thread. 2082a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* signaling_thread() { return signaling_thread_; } 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Returns the worker thread. The actual networking is done on this thread. 2102a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* worker_thread() { return worker_thread_; } 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Returns the content_name of this transport. 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& content_name() const { return content_name_; } 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Returns the type of this transport. 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& type() const { return type_; } 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Returns the port allocator object for this transport. 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PortAllocator* port_allocator() { return allocator_; } 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Returns the readable and states of this manager. These bits are the ORs 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // of the corresponding bits on the managed channels. Each time one of these 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // states changes, a signal is raised. 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO: Replace uses of readable() and writable() with 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // any_channels_readable() and any_channels_writable(). 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool readable() const { return any_channels_readable(); } 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool writable() const { return any_channels_writable(); } 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool was_writable() const { return was_writable_; } 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool any_channels_readable() const { 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (readable_ == TRANSPORT_STATE_SOME || 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org readable_ == TRANSPORT_STATE_ALL); 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool any_channels_writable() const { 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (writable_ == TRANSPORT_STATE_SOME || 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org writable_ == TRANSPORT_STATE_ALL); 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool all_channels_readable() const { 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (readable_ == TRANSPORT_STATE_ALL); 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool all_channels_writable() const { 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (writable_ == TRANSPORT_STATE_ALL); 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<Transport*> SignalReadableState; 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<Transport*> SignalWritableState; 244f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org sigslot::signal1<Transport*> SignalCompleted; 245f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org sigslot::signal1<Transport*> SignalFailed; 246f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Returns whether the client has requested the channels to connect. 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool connect_requested() const { return connect_requested_; } 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 250e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org void SetIceRole(IceRole role); 251e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org IceRole ice_role() const { return ice_role_; } 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 253e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org void SetIceTiebreaker(uint64 IceTiebreaker) { tiebreaker_ = IceTiebreaker; } 254e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org uint64 IceTiebreaker() { return tiebreaker_; } 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2565aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org // Must be called before applying local session description. 2572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void SetIdentity(rtc::SSLIdentity* identity); 2585aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 25962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org // Get a copy of the local identity provided by SetIdentity. 2602a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org bool GetIdentity(rtc::SSLIdentity** identity); 26162fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 26262fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org // Get a copy of the remote certificate in use by the specified channel. 2632a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org bool GetRemoteCertificate(rtc::SSLCertificate** cert); 26462fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportProtocol protocol() const { return protocol_; } 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Create, destroy, and lookup the channels of this type by their components. 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannelImpl* CreateChannel(int component); 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Note: GetChannel may lead to race conditions, since the mutex is not held 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // after the pointer is returned. 2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannelImpl* GetChannel(int component); 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Note: HasChannel does not lead to race conditions, unlike GetChannel. 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool HasChannel(int component) { 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (NULL != GetChannel(component)); 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool HasChannels(); 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void DestroyChannel(int component); 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Set the local TransportDescription to be used by TransportChannels. 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This should be called before ConnectChannels(). 2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetLocalTransportDescription(const TransportDescription& description, 282f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 283f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Set the remote TransportDescription to be used by TransportChannels. 2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetRemoteTransportDescription(const TransportDescription& description, 287f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 288f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Tells all current and future channels to start connecting. When the first 2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // channel begins connecting, the following signal is raised. 2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void ConnectChannels(); 2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<Transport*> SignalConnecting; 2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Resets all of the channels back to their initial state. They are no 2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // longer connecting. 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void ResetChannels(); 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Destroys every channel created so far. 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void DestroyAllChannels(); 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool GetStats(TransportStats* stats); 3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Before any stanza is sent, the manager will request signaling. Once 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // signaling is available, the client should call OnSignalingReady. Once 3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // this occurs, the transport (or its channels) can send any waiting stanzas. 3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // OnSignalingReady invokes OnTransportSignalingReady and then forwards this 3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // signal to each channel. 3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<Transport*> SignalRequestSignaling; 3100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnSignalingReady(); 3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Handles sending of ready candidates and receiving of remote candidates. 3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal2<Transport*, 3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<Candidate>&> SignalCandidatesReady; 3150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal1<Transport*> SignalCandidatesAllocationDone; 3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnRemoteCandidates(const std::vector<Candidate>& candidates); 3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // If candidate is not acceptable, returns false and sets error. 3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Call this before calling OnRemoteCandidates. 3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual bool VerifyCandidate(const Candidate& candidate, 3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string* error); 3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Signals when the best connection for a channel changes. 3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal3<Transport*, 3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int, // component 3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const Candidate&> SignalRouteChange; 3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // A transport message has generated an transport-specific error. The 3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // stanza that caused the error is available in session_msg. If false is 3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // returned, the error is considered unrecoverable, and the session is 3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // terminated. 3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(juberti): Remove these obsolete functions once Session no longer 3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // references them. 3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnTransportError(const buzz::XmlElement* error) {} 3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal6<Transport*, const buzz::XmlElement*, const buzz::QName&, 3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string&, const std::string&, 3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const buzz::XmlElement*> 3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SignalTransportError; 3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Forwards the signal from TransportChannel to BaseSession. 3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sigslot::signal0<> SignalRoleConflict; 3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool GetSslRole(rtc::SSLRole* ssl_role) const; 345a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // These are called by Create/DestroyChannel above in order to create or 3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // destroy the appropriate type of channel. 3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual TransportChannelImpl* CreateTransportChannel(int component) = 0; 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void DestroyTransportChannel(TransportChannelImpl* channel) = 0; 3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Informs the subclass that we received the signaling ready message. 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void OnTransportSignalingReady() {} 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The current local transport description, for use by derived classes 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // when performing transport description negotiation. 3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const TransportDescription* local_description() const { 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return local_description_.get(); 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The current remote transport description, for use by derived classes 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // when performing transport description negotiation. 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const TransportDescription* remote_description() const { 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return remote_description_.get(); 3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3672a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual void SetIdentity_w(rtc::SSLIdentity* identity) {} 3685aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org 3692a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool GetIdentity_w(rtc::SSLIdentity** identity) { 37062fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org return false; 37162fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org } 37262fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Pushes down the transport parameters from the local description, such 3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // as the ICE ufrag and pwd. 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Derived classes can override, but must call the base as well. 376f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org virtual bool ApplyLocalTransportDescription_w(TransportChannelImpl* channel, 377f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Pushes down remote ice credentials from the remote description to the 3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // transport channel. 381f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org virtual bool ApplyRemoteTransportDescription_w(TransportChannelImpl* ch, 382f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Negotiates the transport parameters based on the current local and remote 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // transport description, such at the version of ICE to use, and whether DTLS 3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // should be activated. 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Derived classes can negotiate their specific parameters here, but must call 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // the base as well. 389f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org virtual bool NegotiateTransportDescription_w(ContentAction local_role, 390f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Pushes down the transport parameters obtained via negotiation. 3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Derived classes can set their specific parameters here, but must call the 3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // base as well. 395a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org virtual bool ApplyNegotiatedTransportDescription_w( 396f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org TransportChannelImpl* channel, std::string* error_desc); 3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3982a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org virtual bool GetSslRole_w(rtc::SSLRole* ssl_role) const { 399a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org return false; 400a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org } 401a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org 4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org struct ChannelMapEntry { 4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ChannelMapEntry() : impl_(NULL), candidates_allocated_(false), ref_(0) {} 4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org explicit ChannelMapEntry(TransportChannelImpl *impl) 4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : impl_(impl), 4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_allocated_(false), 4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ref_(0) { 4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void AddRef() { ++ref_; } 4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void DecRef() { 4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT(ref_ > 0); 4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org --ref_; 4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int ref() const { return ref_; } 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannelImpl* get() const { return impl_; } 4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannelImpl* operator->() const { return impl_; } 4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void set_candidates_allocated(bool status) { 4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org candidates_allocated_ = status; 4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool candidates_allocated() const { return candidates_allocated_; } 4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannelImpl *impl_; 4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool candidates_allocated_; 4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int ref_; 4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org }; 4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Candidate component => ChannelMapEntry 4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org typedef std::map<int, ChannelMapEntry> ChannelMap; 4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Called when the state of a channel changes. 4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelReadableState(TransportChannel* channel); 4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelWritableState(TransportChannel* channel); 4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Called when a channel requests signaling. 4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelRequestSignaling(TransportChannelImpl* channel); 4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Called when a candidate is ready from remote peer. 4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnRemoteCandidate(const Candidate& candidate); 4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Called when a candidate is ready from channel. 4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelCandidateReady(TransportChannelImpl* channel, 4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const Candidate& candidate); 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelRouteChange(TransportChannel* channel, 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const Candidate& remote_candidate); 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelCandidatesAllocationDone(TransportChannelImpl* channel); 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Called when there is ICE role change. 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnRoleConflict(TransportChannelImpl* channel); 451f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org // Called when the channel removes a connection. 452f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org void OnChannelConnectionRemoved(TransportChannelImpl* channel); 4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Dispatches messages to the appropriate handler (below). 4552a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org void OnMessage(rtc::Message* msg); 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // These are versions of the above methods that are called only on a 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // particular thread (s = signaling, w = worker). The above methods post or 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // send a message to invoke this version. 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportChannelImpl* CreateChannel_w(int component); 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void DestroyChannel_w(int component); 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void ConnectChannels_w(); 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void ResetChannels_w(); 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void DestroyAllChannels_w(); 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnRemoteCandidate_w(const Candidate& candidate); 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelReadableState_s(); 4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelWritableState_s(); 4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelRequestSignaling_s(int component); 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnConnecting_s(); 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelRouteChange_s(const TransportChannel* channel, 4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const Candidate& remote_candidate); 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelCandidatesAllocationDone_s(); 4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Helper function that invokes the given function on every channel. 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org typedef void (TransportChannelImpl::* TransportChannelFunc)(); 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void CallChannels_w(TransportChannelFunc func); 4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Computes the OR of the channel's read or write state (argument picks). 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportState GetTransportState_s(bool read); 4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnChannelCandidateReady_s(); 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 483e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org void SetIceRole_w(IceRole role); 4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void SetRemoteIceMode_w(IceMode mode); 4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetLocalTransportDescription_w(const TransportDescription& desc, 486f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 487f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool SetRemoteTransportDescription_w(const TransportDescription& desc, 489f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org ContentAction action, 490f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org std::string* error_desc); 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool GetStats_w(TransportStats* infos); 4922a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org bool GetRemoteCertificate_w(rtc::SSLCertificate** cert); 49362fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org 494b1ad2cd39fca8ea62e7dc512e788a414b328db7dhenrike@webrtc.org // Sends SignalCompleted if we are now in that state. 495b1ad2cd39fca8ea62e7dc512e788a414b328db7dhenrike@webrtc.org void MaybeCompleted_w(); 4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* signaling_thread_; 4982a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread* worker_thread_; 4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string content_name_; 5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string type_; 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org PortAllocator* allocator_; 5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool destroyed_; 5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportState readable_; 5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportState writable_; 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool was_writable_; 5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool connect_requested_; 507e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org IceRole ice_role_; 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint64 tiebreaker_; 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TransportProtocol protocol_; 5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org IceMode remote_ice_mode_; 5112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<TransportDescription> local_description_; 5122a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<TransportDescription> remote_description_; 5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ChannelMap channels_; 5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Buffers the ready_candidates so that SignalCanidatesReady can 5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // provide them in multiples. 5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<Candidate> ready_candidates_; 5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Protects changes to channels and messages 5192a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::CriticalSection crit_; 5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(Transport); 5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Extract a TransportProtocol from a TransportDescription. 5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTransportProtocol TransportProtocolFromDescription( 5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const TransportDescription* desc); 5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif // TALK_P2P_BASE_TRANSPORT_H_ 531