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