| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. |    2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
|    3  * |    3  * | 
|    4  *  Use of this source code is governed by a BSD-style license |    4  *  Use of this source code is governed by a BSD-style license | 
|    5  *  that can be found in the LICENSE file in the root of the source |    5  *  that can be found in the LICENSE file in the root of the source | 
|    6  *  tree. An additional intellectual property rights grant can be found |    6  *  tree. An additional intellectual property rights grant can be found | 
|    7  *  in the file PATENTS.  All contributing project authors may |    7  *  in the file PATENTS.  All contributing project authors may | 
|    8  *  be found in the AUTHORS file in the root of the source tree. |    8  *  be found in the AUTHORS file in the root of the source tree. | 
|    9  */ |    9  */ | 
|   10  |   10  | 
|   11 // A Transport manages a set of named channels of the same type. |   11 // A Transport manages a set of named channels of the same type. | 
|   12 // |   12 // | 
|   13 // Subclasses choose the appropriate class to instantiate for each channel; |   13 // Subclasses choose the appropriate class to instantiate for each channel; | 
|   14 // however, this base class keeps track of the channels by name, watches their |   14 // however, this base class keeps track of the channels by name, watches their | 
|   15 // state changes (in order to update the manager's state), and forwards |   15 // state changes (in order to update the manager's state), and forwards | 
|   16 // requests to begin connecting or to reset to each of the channels. |   16 // requests to begin connecting or to reset to each of the channels. | 
|   17 // |   17 // | 
|   18 // On Threading:  Transport performs work solely on the worker thread, and so |   18 // On Threading:  Transport performs work on both the signaling and worker | 
|   19 // its methods should only be called on the worker thread. |   19 // threads.  For subclasses, the rule is that all signaling related calls will | 
 |   20 // be made on the signaling thread and all channel related calls (including | 
 |   21 // signaling for a channel) will be made on the worker thread.  When | 
 |   22 // information needs to be sent between the two threads, this class should do | 
 |   23 // the work (e.g., OnRemoteCandidate). | 
|   20 // |   24 // | 
|   21 // Note: Subclasses must call DestroyChannels() in their own destructors. |   25 // Note: Subclasses must call DestroyChannels() in their own constructors. | 
|   22 // It is not possible to do so here because the subclass destructor will |   26 // It is not possible to do so here because the subclass constructor will | 
|   23 // already have run. |   27 // already have run. | 
|   24  |   28  | 
|   25 #ifndef WEBRTC_P2P_BASE_TRANSPORT_H_ |   29 #ifndef WEBRTC_P2P_BASE_TRANSPORT_H_ | 
|   26 #define WEBRTC_P2P_BASE_TRANSPORT_H_ |   30 #define WEBRTC_P2P_BASE_TRANSPORT_H_ | 
|   27  |   31  | 
|   28 #include <map> |   32 #include <map> | 
|   29 #include <string> |   33 #include <string> | 
|   30 #include <vector> |   34 #include <vector> | 
|   31 #include "webrtc/p2p/base/candidate.h" |   35 #include "webrtc/p2p/base/candidate.h" | 
|   32 #include "webrtc/p2p/base/constants.h" |   36 #include "webrtc/p2p/base/constants.h" | 
|   33 #include "webrtc/p2p/base/sessiondescription.h" |   37 #include "webrtc/p2p/base/sessiondescription.h" | 
|   34 #include "webrtc/p2p/base/transportinfo.h" |   38 #include "webrtc/p2p/base/transportinfo.h" | 
 |   39 #include "webrtc/base/criticalsection.h" | 
|   35 #include "webrtc/base/messagequeue.h" |   40 #include "webrtc/base/messagequeue.h" | 
|   36 #include "webrtc/base/rtccertificate.h" |   41 #include "webrtc/base/rtccertificate.h" | 
|   37 #include "webrtc/base/sigslot.h" |   42 #include "webrtc/base/sigslot.h" | 
|   38 #include "webrtc/base/sslstreamadapter.h" |   43 #include "webrtc/base/sslstreamadapter.h" | 
|   39  |   44  | 
 |   45 namespace rtc { | 
 |   46 class Thread; | 
 |   47 } | 
 |   48  | 
|   40 namespace cricket { |   49 namespace cricket { | 
|   41  |   50  | 
|   42 class PortAllocator; |   51 class PortAllocator; | 
|   43 class TransportChannel; |   52 class TransportChannel; | 
|   44 class TransportChannelImpl; |   53 class TransportChannelImpl; | 
|   45  |   54  | 
|   46 typedef std::vector<Candidate> Candidates; |   55 typedef std::vector<Candidate> Candidates; | 
|   47  |   56  | 
|   48 // TODO(deadbeef): Unify with PeerConnectionInterface::IceConnectionState |  | 
|   49 // once /talk/ and /webrtc/ are combined, and also switch to ENUM_NAME naming |  | 
|   50 // style. |  | 
|   51 enum IceConnectionState { |  | 
|   52   kIceConnectionConnecting = 0, |  | 
|   53   kIceConnectionFailed, |  | 
|   54   kIceConnectionConnected,  // Writable, but still checking one or more |  | 
|   55                             // connections |  | 
|   56   kIceConnectionCompleted, |  | 
|   57 }; |  | 
|   58  |  | 
|   59 // TODO(deadbeef): Unify with PeerConnectionInterface::IceConnectionState |  | 
|   60 // once /talk/ and /webrtc/ are combined, and also switch to ENUM_NAME naming |  | 
|   61 // style. |  | 
|   62 enum IceGatheringState { |  | 
|   63   kIceGatheringNew = 0, |  | 
|   64   kIceGatheringGathering, |  | 
|   65   kIceGatheringComplete, |  | 
|   66 }; |  | 
|   67  |  | 
|   68 // For "writable" and "receiving", we need to differentiate between |   57 // For "writable" and "receiving", we need to differentiate between | 
|   69 // none, all, and some. |   58 // none, all, and some. | 
|   70 enum TransportState { |   59 enum TransportState { | 
|   71   TRANSPORT_STATE_NONE = 0, |   60   TRANSPORT_STATE_NONE = 0, | 
|   72   TRANSPORT_STATE_SOME, |   61   TRANSPORT_STATE_SOME, | 
|   73   TRANSPORT_STATE_ALL |   62   TRANSPORT_STATE_ALL | 
|   74 }; |   63 }; | 
|   75  |   64  | 
|   76 // When checking transport state, we need to differentiate between |   65 // When checking transport state, we need to differentiate between | 
|   77 // "writable" or "receiving" check. |   66 // "writable" or "receiving" check. | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  128   std::string srtp_cipher; |  117   std::string srtp_cipher; | 
|  129   std::string ssl_cipher; |  118   std::string ssl_cipher; | 
|  130 }; |  119 }; | 
|  131  |  120  | 
|  132 // Information about all the channels of a transport. |  121 // Information about all the channels of a transport. | 
|  133 // TODO(hta): Consider if a simple vector is as good as a map. |  122 // TODO(hta): Consider if a simple vector is as good as a map. | 
|  134 typedef std::vector<TransportChannelStats> TransportChannelStatsList; |  123 typedef std::vector<TransportChannelStats> TransportChannelStatsList; | 
|  135  |  124  | 
|  136 // Information about the stats of a transport. |  125 // Information about the stats of a transport. | 
|  137 struct TransportStats { |  126 struct TransportStats { | 
|  138   std::string transport_name; |  127   std::string content_name; | 
|  139   TransportChannelStatsList channel_stats; |  128   TransportChannelStatsList channel_stats; | 
|  140 }; |  129 }; | 
|  141  |  130  | 
|  142 bool BadTransportDescription(const std::string& desc, std::string* err_desc); |  131 bool BadTransportDescription(const std::string& desc, std::string* err_desc); | 
|  143  |  132  | 
|  144 bool IceCredentialsChanged(const std::string& old_ufrag, |  133 bool IceCredentialsChanged(const std::string& old_ufrag, | 
|  145                            const std::string& old_pwd, |  134                            const std::string& old_pwd, | 
|  146                            const std::string& new_ufrag, |  135                            const std::string& new_ufrag, | 
|  147                            const std::string& new_pwd); |  136                            const std::string& new_pwd); | 
|  148  |  137  | 
|  149 class Transport : public sigslot::has_slots<> { |  138 class Transport : public rtc::MessageHandler, | 
 |  139                   public sigslot::has_slots<> { | 
|  150  public: |  140  public: | 
|  151   Transport(const std::string& name, PortAllocator* allocator); |  141   Transport(rtc::Thread* signaling_thread, | 
 |  142             rtc::Thread* worker_thread, | 
 |  143             const std::string& content_name, | 
 |  144             PortAllocator* allocator); | 
|  152   virtual ~Transport(); |  145   virtual ~Transport(); | 
|  153  |  146  | 
|  154   // Returns the name of this transport. |  147   // Returns the signaling thread. The app talks to Transport on this thread. | 
|  155   const std::string& name() const { return name_; } |  148   rtc::Thread* signaling_thread() const { return signaling_thread_; } | 
 |  149   // Returns the worker thread. The actual networking is done on this thread. | 
 |  150   rtc::Thread* worker_thread() const { return worker_thread_; } | 
 |  151  | 
 |  152   // Returns the content_name of this transport. | 
 |  153   const std::string& content_name() const { return content_name_; } | 
|  156  |  154  | 
|  157   // Returns the port allocator object for this transport. |  155   // Returns the port allocator object for this transport. | 
|  158   PortAllocator* port_allocator() { return allocator_; } |  156   PortAllocator* port_allocator() { return allocator_; } | 
|  159  |  157  | 
|  160   // Returns the states of this manager.  These bits are the ORs |  158   // Returns the states of this manager.  These bits are the ORs | 
|  161   // of the corresponding bits on the managed channels.  Each time one of these |  159   // of the corresponding bits on the managed channels.  Each time one of these | 
|  162   // states changes, a signal is raised. |  160   // states changes, a signal is raised. | 
|  163   // TODO(honghaiz): Replace uses of writable() with any_channels_writable(). |  161   // TODO(honghaiz): Replace uses of writable() with any_channels_writable(). | 
|  164   bool writable() const { return any_channels_writable(); } |  162   bool writable() const { return any_channels_writable(); } | 
|  165   bool was_writable() const { return was_writable_; } |  163   bool was_writable() const { return was_writable_; } | 
|  166   bool any_channels_writable() const { |  164   bool any_channels_writable() const { | 
|  167     return (writable_ == TRANSPORT_STATE_SOME || |  165     return (writable_ == TRANSPORT_STATE_SOME || | 
|  168             writable_ == TRANSPORT_STATE_ALL); |  166             writable_ == TRANSPORT_STATE_ALL); | 
|  169   } |  167   } | 
|  170   bool all_channels_writable() const { |  168   bool all_channels_writable() const { | 
|  171     return (writable_ == TRANSPORT_STATE_ALL); |  169     return (writable_ == TRANSPORT_STATE_ALL); | 
|  172   } |  170   } | 
|  173   bool any_channel_receiving() const { |  171   bool any_channel_receiving() const { | 
|  174     return (receiving_ == TRANSPORT_STATE_SOME || |  172     return (receiving_ == TRANSPORT_STATE_SOME || | 
|  175             receiving_ == TRANSPORT_STATE_ALL); |  173             receiving_ == TRANSPORT_STATE_ALL); | 
|  176   } |  174   } | 
|  177   bool ready_for_remote_candidates() const { |  | 
|  178     return local_description_set_ && remote_description_set_; |  | 
|  179   } |  | 
|  180  |  | 
|  181   bool AllChannelsCompleted() const; |  | 
|  182   bool AnyChannelFailed() const; |  | 
|  183  |  | 
|  184   IceGatheringState gathering_state() const { return gathering_state_; } |  | 
|  185  |  175  | 
|  186   sigslot::signal1<Transport*> SignalWritableState; |  176   sigslot::signal1<Transport*> SignalWritableState; | 
|  187   sigslot::signal1<Transport*> SignalReceivingState; |  177   sigslot::signal1<Transport*> SignalReceivingState; | 
|  188   sigslot::signal1<Transport*> SignalCompleted; |  178   sigslot::signal1<Transport*> SignalCompleted; | 
|  189   sigslot::signal1<Transport*> SignalFailed; |  179   sigslot::signal1<Transport*> SignalFailed; | 
|  190  |  180  | 
|  191   // Returns whether the client has requested the channels to connect. |  181   // Returns whether the client has requested the channels to connect. | 
|  192   bool connect_requested() const { return connect_requested_; } |  182   bool connect_requested() const { return connect_requested_; } | 
|  193  |  183  | 
|  194   void SetIceRole(IceRole role); |  184   void SetIceRole(IceRole role); | 
|  195   IceRole ice_role() const { return ice_role_; } |  185   IceRole ice_role() const { return ice_role_; } | 
|  196  |  186  | 
|  197   void SetIceTiebreaker(uint64 IceTiebreaker) { tiebreaker_ = IceTiebreaker; } |  187   void SetIceTiebreaker(uint64 IceTiebreaker) { tiebreaker_ = IceTiebreaker; } | 
|  198   uint64 IceTiebreaker() { return tiebreaker_; } |  188   uint64 IceTiebreaker() { return tiebreaker_; } | 
|  199  |  189  | 
|  200   void SetChannelReceivingTimeout(int timeout_ms); |  190   void SetChannelReceivingTimeout(int timeout_ms); | 
|  201  |  191  | 
|  202   // Must be called before applying local session description. |  192   // Must be called before applying local session description. | 
|  203   virtual void SetLocalCertificate( |  193   void SetCertificate( | 
|  204       const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {} |  194       const rtc::scoped_refptr<rtc::RTCCertificate>& certificate); | 
|  205  |  195  | 
|  206   // Get a copy of the local certificate provided by SetLocalCertificate. |  196   // Get a copy of the local identity provided by SetIdentity. | 
|  207   virtual bool GetLocalCertificate( |  197   bool GetCertificate(rtc::scoped_refptr<rtc::RTCCertificate>* certificate); | 
|  208       rtc::scoped_refptr<rtc::RTCCertificate>* certificate) { |  | 
|  209     return false; |  | 
|  210   } |  | 
|  211  |  198  | 
|  212   // Get a copy of the remote certificate in use by the specified channel. |  199   // Get a copy of the remote certificate in use by the specified channel. | 
|  213   bool GetRemoteSSLCertificate(rtc::SSLCertificate** cert); |  200   bool GetRemoteSSLCertificate(rtc::SSLCertificate** cert); | 
|  214  |  201  | 
|  215   // Create, destroy, and lookup the channels of this type by their components. |  202   // Create, destroy, and lookup the channels of this type by their components. | 
|  216   TransportChannelImpl* CreateChannel(int component); |  203   TransportChannelImpl* CreateChannel(int component); | 
|  217  |  204   // Note: GetChannel may lead to race conditions, since the mutex is not held | 
 |  205   // after the pointer is returned. | 
|  218   TransportChannelImpl* GetChannel(int component); |  206   TransportChannelImpl* GetChannel(int component); | 
|  219  |  207   // Note: HasChannel does not lead to race conditions, unlike GetChannel. | 
|  220   bool HasChannel(int component) { |  208   bool HasChannel(int component) { | 
|  221     return (NULL != GetChannel(component)); |  209     return (NULL != GetChannel(component)); | 
|  222   } |  210   } | 
|  223   bool HasChannels(); |  211   bool HasChannels(); | 
|  224   void DestroyChannel(int component); |  212   void DestroyChannel(int component); | 
|  225  |  213  | 
|  226   // Set the local TransportDescription to be used by TransportChannels. |  214   // Set the local TransportDescription to be used by TransportChannels. | 
 |  215   // This should be called before ConnectChannels(). | 
|  227   bool SetLocalTransportDescription(const TransportDescription& description, |  216   bool SetLocalTransportDescription(const TransportDescription& description, | 
|  228                                     ContentAction action, |  217                                     ContentAction action, | 
|  229                                     std::string* error_desc); |  218                                     std::string* error_desc); | 
|  230  |  219  | 
|  231   // Set the remote TransportDescription to be used by TransportChannels. |  220   // Set the remote TransportDescription to be used by TransportChannels. | 
|  232   bool SetRemoteTransportDescription(const TransportDescription& description, |  221   bool SetRemoteTransportDescription(const TransportDescription& description, | 
|  233                                      ContentAction action, |  222                                      ContentAction action, | 
|  234                                      std::string* error_desc); |  223                                      std::string* error_desc); | 
|  235  |  224  | 
|  236   // Tells all current and future channels to start connecting.  When the first |  225   // Tells all current and future channels to start connecting.  When the first | 
|  237   // channel begins connecting, the following signal is raised. |  226   // channel begins connecting, the following signal is raised. | 
|  238   void ConnectChannels(); |  227   void ConnectChannels(); | 
|  239   sigslot::signal1<Transport*> SignalConnecting; |  228   sigslot::signal1<Transport*> SignalConnecting; | 
|  240  |  229  | 
|  241   // Tells channels to start gathering candidates if necessary. |  | 
|  242   // Should be called after ConnectChannels() has been called at least once, |  | 
|  243   // which will happen in SetLocalTransportDescription. |  | 
|  244   void MaybeStartGathering(); |  | 
|  245  |  | 
|  246   // Resets all of the channels back to their initial state.  They are no |  230   // Resets all of the channels back to their initial state.  They are no | 
|  247   // longer connecting. |  231   // longer connecting. | 
|  248   void ResetChannels(); |  232   void ResetChannels(); | 
|  249  |  233  | 
|  250   // Destroys every channel created so far. |  234   // Destroys every channel created so far. | 
|  251   void DestroyAllChannels(); |  235   void DestroyAllChannels(); | 
|  252  |  236  | 
|  253   bool GetStats(TransportStats* stats); |  237   bool GetStats(TransportStats* stats); | 
|  254  |  238  | 
|  255   sigslot::signal1<Transport*> SignalGatheringState; |  239   // Before any stanza is sent, the manager will request signaling.  Once | 
 |  240   // signaling is available, the client should call OnSignalingReady.  Once | 
 |  241   // this occurs, the transport (or its channels) can send any waiting stanzas. | 
 |  242   // OnSignalingReady invokes OnTransportSignalingReady and then forwards this | 
 |  243   // signal to each channel. | 
 |  244   sigslot::signal1<Transport*> SignalRequestSignaling; | 
 |  245   void OnSignalingReady(); | 
|  256  |  246  | 
|  257   // Handles sending of ready candidates and receiving of remote candidates. |  247   // Handles sending of ready candidates and receiving of remote candidates. | 
|  258   sigslot::signal2<Transport*, const std::vector<Candidate>&> |  248   sigslot::signal2<Transport*, | 
|  259       SignalCandidatesGathered; |  249                    const std::vector<Candidate>&> SignalCandidatesReady; | 
|  260  |  250  | 
|  261   // Called when one or more candidates are ready from the remote peer. |  251   sigslot::signal1<Transport*> SignalCandidatesAllocationDone; | 
|  262   bool AddRemoteCandidates(const std::vector<Candidate>& candidates, |  252   void OnRemoteCandidates(const std::vector<Candidate>& candidates); | 
|  263                            std::string* error); |  | 
|  264  |  253  | 
|  265   // If candidate is not acceptable, returns false and sets error. |  254   // If candidate is not acceptable, returns false and sets error. | 
|  266   // Call this before calling OnRemoteCandidates. |  255   // Call this before calling OnRemoteCandidates. | 
|  267   virtual bool VerifyCandidate(const Candidate& candidate, |  256   virtual bool VerifyCandidate(const Candidate& candidate, | 
|  268                                std::string* error); |  257                                std::string* error); | 
|  269  |  258  | 
|  270   // Signals when the best connection for a channel changes. |  259   // Signals when the best connection for a channel changes. | 
|  271   sigslot::signal3<Transport*, |  260   sigslot::signal3<Transport*, | 
|  272                    int,  // component |  261                    int,  // component | 
|  273                    const Candidate&> SignalRouteChange; |  262                    const Candidate&> SignalRouteChange; | 
|  274  |  263  | 
|  275   // Forwards the signal from TransportChannel to BaseSession. |  264   // Forwards the signal from TransportChannel to BaseSession. | 
|  276   sigslot::signal0<> SignalRoleConflict; |  265   sigslot::signal0<> SignalRoleConflict; | 
|  277  |  266  | 
|  278   virtual bool GetSslRole(rtc::SSLRole* ssl_role) const { return false; } |  267   virtual bool GetSslRole(rtc::SSLRole* ssl_role) const; | 
|  279  |  268  | 
|  280   // Must be called before channel is starting to connect. |  269   // Must be called before channel is starting to connect. | 
|  281   virtual bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version) { |  270   virtual bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version); | 
|  282     return false; |  | 
|  283   } |  | 
|  284  |  271  | 
|  285  protected: |  272  protected: | 
|  286   // These are called by Create/DestroyChannel above in order to create or |  273   // These are called by Create/DestroyChannel above in order to create or | 
|  287   // destroy the appropriate type of channel. |  274   // destroy the appropriate type of channel. | 
|  288   virtual TransportChannelImpl* CreateTransportChannel(int component) = 0; |  275   virtual TransportChannelImpl* CreateTransportChannel(int component) = 0; | 
|  289   virtual void DestroyTransportChannel(TransportChannelImpl* channel) = 0; |  276   virtual void DestroyTransportChannel(TransportChannelImpl* channel) = 0; | 
|  290  |  277  | 
 |  278   // Informs the subclass that we received the signaling ready message. | 
 |  279   virtual void OnTransportSignalingReady() {} | 
 |  280  | 
|  291   // The current local transport description, for use by derived classes |  281   // The current local transport description, for use by derived classes | 
|  292   // when performing transport description negotiation. |  282   // when performing transport description negotiation. | 
|  293   const TransportDescription* local_description() const { |  283   const TransportDescription* local_description() const { | 
|  294     return local_description_.get(); |  284     return local_description_.get(); | 
|  295   } |  285   } | 
|  296  |  286  | 
|  297   // The current remote transport description, for use by derived classes |  287   // The current remote transport description, for use by derived classes | 
|  298   // when performing transport description negotiation. |  288   // when performing transport description negotiation. | 
|  299   const TransportDescription* remote_description() const { |  289   const TransportDescription* remote_description() const { | 
|  300     return remote_description_.get(); |  290     return remote_description_.get(); | 
|  301   } |  291   } | 
|  302  |  292  | 
 |  293   virtual void SetCertificate_w( | 
 |  294       const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {} | 
 |  295  | 
 |  296   virtual bool GetCertificate_w( | 
 |  297       rtc::scoped_refptr<rtc::RTCCertificate>* certificate) { | 
 |  298     return false; | 
 |  299   } | 
 |  300  | 
|  303   // Pushes down the transport parameters from the local description, such |  301   // Pushes down the transport parameters from the local description, such | 
|  304   // as the ICE ufrag and pwd. |  302   // as the ICE ufrag and pwd. | 
|  305   // Derived classes can override, but must call the base as well. |  303   // Derived classes can override, but must call the base as well. | 
|  306   virtual bool ApplyLocalTransportDescription(TransportChannelImpl* channel, |  304   virtual bool ApplyLocalTransportDescription_w(TransportChannelImpl* channel, | 
|  307                                               std::string* error_desc); |  305                                                 std::string* error_desc); | 
|  308  |  306  | 
|  309   // Pushes down remote ice credentials from the remote description to the |  307   // Pushes down remote ice credentials from the remote description to the | 
|  310   // transport channel. |  308   // transport channel. | 
|  311   virtual bool ApplyRemoteTransportDescription(TransportChannelImpl* ch, |  309   virtual bool ApplyRemoteTransportDescription_w(TransportChannelImpl* ch, | 
|  312                                                std::string* error_desc); |  310                                                  std::string* error_desc); | 
|  313  |  311  | 
|  314   // Negotiates the transport parameters based on the current local and remote |  312   // Negotiates the transport parameters based on the current local and remote | 
|  315   // transport description, such as the ICE role to use, and whether DTLS |  313   // transport description, such as the ICE role to use, and whether DTLS | 
|  316   // should be activated. |  314   // should be activated. | 
|  317   // Derived classes can negotiate their specific parameters here, but must call |  315   // Derived classes can negotiate their specific parameters here, but must call | 
|  318   // the base as well. |  316   // the base as well. | 
|  319   virtual bool NegotiateTransportDescription(ContentAction local_role, |  317   virtual bool NegotiateTransportDescription_w(ContentAction local_role, | 
|  320                                              std::string* error_desc); |  318                                                std::string* error_desc); | 
|  321  |  319  | 
|  322   // Pushes down the transport parameters obtained via negotiation. |  320   // Pushes down the transport parameters obtained via negotiation. | 
|  323   // Derived classes can set their specific parameters here, but must call the |  321   // Derived classes can set their specific parameters here, but must call the | 
|  324   // base as well. |  322   // base as well. | 
|  325   virtual bool ApplyNegotiatedTransportDescription( |  323   virtual bool ApplyNegotiatedTransportDescription_w( | 
|  326       TransportChannelImpl* channel, |  324       TransportChannelImpl* channel, std::string* error_desc); | 
|  327       std::string* error_desc); |  325  | 
 |  326   virtual bool GetSslRole_w(rtc::SSLRole* ssl_role) const { | 
 |  327     return false; | 
 |  328   } | 
 |  329  | 
 |  330   virtual bool SetSslMaxProtocolVersion_w(rtc::SSLProtocolVersion version) { | 
 |  331     return false; | 
 |  332   } | 
|  328  |  333  | 
|  329  private: |  334  private: | 
|  330   struct ChannelMapEntry { |  335   struct ChannelMapEntry { | 
|  331     ChannelMapEntry() : impl_(NULL), ref_(0) {} |  336     ChannelMapEntry() : impl_(NULL), candidates_allocated_(false), ref_(0) {} | 
|  332     explicit ChannelMapEntry(TransportChannelImpl *impl) |  337     explicit ChannelMapEntry(TransportChannelImpl *impl) | 
|  333         : impl_(impl), |  338         : impl_(impl), | 
 |  339           candidates_allocated_(false), | 
|  334           ref_(0) { |  340           ref_(0) { | 
|  335     } |  341     } | 
|  336  |  342  | 
|  337     void AddRef() { ++ref_; } |  343     void AddRef() { ++ref_; } | 
|  338     void DecRef() { |  344     void DecRef() { | 
|  339       ASSERT(ref_ > 0); |  345       ASSERT(ref_ > 0); | 
|  340       --ref_; |  346       --ref_; | 
|  341     } |  347     } | 
|  342     int ref() const { return ref_; } |  348     int ref() const { return ref_; } | 
|  343  |  349  | 
|  344     TransportChannelImpl* get() const { return impl_; } |  350     TransportChannelImpl* get() const { return impl_; } | 
|  345     TransportChannelImpl* operator->() const  { return impl_; } |  351     TransportChannelImpl* operator->() const  { return impl_; } | 
 |  352     void set_candidates_allocated(bool status) { | 
 |  353       candidates_allocated_ = status; | 
 |  354     } | 
 |  355     bool candidates_allocated() const { return candidates_allocated_; } | 
|  346  |  356  | 
|  347    private: |  357   private: | 
|  348     TransportChannelImpl* impl_; |  358     TransportChannelImpl *impl_; | 
 |  359     bool candidates_allocated_; | 
|  349     int ref_; |  360     int ref_; | 
|  350   }; |  361   }; | 
|  351  |  362  | 
|  352   // Candidate component => ChannelMapEntry |  363   // Candidate component => ChannelMapEntry | 
|  353   typedef std::map<int, ChannelMapEntry> ChannelMap; |  364   typedef std::map<int, ChannelMapEntry> ChannelMap; | 
|  354  |  365  | 
|  355   // Called when the write state of a channel changes. |  366   // Called when the write state of a channel changes. | 
|  356   void OnChannelWritableState(TransportChannel* channel); |  367   void OnChannelWritableState(TransportChannel* channel); | 
|  357  |  368  | 
|  358   // Called when the receiving state of a channel changes. |  369   // Called when the receiving state of a channel changes. | 
|  359   void OnChannelReceivingState(TransportChannel* channel); |  370   void OnChannelReceivingState(TransportChannel* channel); | 
|  360  |  371  | 
|  361   // Called when a channel starts finishes gathering candidates |  372   // Called when a channel requests signaling. | 
|  362   void OnChannelGatheringState(TransportChannelImpl* channel); |  373   void OnChannelRequestSignaling(TransportChannelImpl* channel); | 
|  363  |  374  | 
 |  375   // Called when a candidate is ready from remote peer. | 
 |  376   void OnRemoteCandidate(const Candidate& candidate); | 
|  364   // Called when a candidate is ready from channel. |  377   // Called when a candidate is ready from channel. | 
|  365   void OnChannelCandidateGathered(TransportChannelImpl* channel, |  378   void OnChannelCandidateReady(TransportChannelImpl* channel, | 
|  366                                   const Candidate& candidate); |  379                                const Candidate& candidate); | 
|  367   void OnChannelRouteChange(TransportChannel* channel, |  380   void OnChannelRouteChange(TransportChannel* channel, | 
|  368                             const Candidate& remote_candidate); |  381                             const Candidate& remote_candidate); | 
 |  382   void OnChannelCandidatesAllocationDone(TransportChannelImpl* channel); | 
|  369   // Called when there is ICE role change. |  383   // Called when there is ICE role change. | 
|  370   void OnRoleConflict(TransportChannelImpl* channel); |  384   void OnRoleConflict(TransportChannelImpl* channel); | 
|  371   // Called when the channel removes a connection. |  385   // Called when the channel removes a connection. | 
|  372   void OnChannelConnectionRemoved(TransportChannelImpl* channel); |  386   void OnChannelConnectionRemoved(TransportChannelImpl* channel); | 
|  373  |  387  | 
 |  388   // Dispatches messages to the appropriate handler (below). | 
 |  389   void OnMessage(rtc::Message* msg); | 
 |  390  | 
 |  391   // These are versions of the above methods that are called only on a | 
 |  392   // particular thread (s = signaling, w = worker).  The above methods post or | 
 |  393   // send a message to invoke this version. | 
 |  394   TransportChannelImpl* CreateChannel_w(int component); | 
 |  395   void DestroyChannel_w(int component); | 
 |  396   void ConnectChannels_w(); | 
 |  397   void ResetChannels_w(); | 
 |  398   void DestroyAllChannels_w(); | 
 |  399   void OnRemoteCandidate_w(const Candidate& candidate); | 
 |  400   void OnChannelWritableState_s(); | 
 |  401   void OnChannelReceivingState_s(); | 
 |  402   void OnChannelRequestSignaling_s(); | 
 |  403   void OnConnecting_s(); | 
 |  404   void OnChannelRouteChange_s(const TransportChannel* channel, | 
 |  405                               const Candidate& remote_candidate); | 
 |  406   void OnChannelCandidatesAllocationDone_s(); | 
 |  407  | 
|  374   // Helper function that invokes the given function on every channel. |  408   // Helper function that invokes the given function on every channel. | 
|  375   typedef void (TransportChannelImpl::* TransportChannelFunc)(); |  409   typedef void (TransportChannelImpl::* TransportChannelFunc)(); | 
|  376   void CallChannels(TransportChannelFunc func); |  410   void CallChannels_w(TransportChannelFunc func); | 
|  377  |  411  | 
|  378   // Computes the AND and OR of the channel's read/write/receiving state |  412   // Computes the AND and OR of the channel's read/write/receiving state | 
|  379   // (argument picks the operation). |  413   // (argument picks the operation). | 
|  380   TransportState GetTransportState(TransportStateType type); |  414   TransportState GetTransportState_s(TransportStateType type); | 
 |  415  | 
 |  416   void OnChannelCandidateReady_s(); | 
 |  417  | 
 |  418   void SetIceRole_w(IceRole role); | 
 |  419   void SetRemoteIceMode_w(IceMode mode); | 
 |  420   bool SetLocalTransportDescription_w(const TransportDescription& desc, | 
 |  421                                       ContentAction action, | 
 |  422                                       std::string* error_desc); | 
 |  423   bool SetRemoteTransportDescription_w(const TransportDescription& desc, | 
 |  424                                        ContentAction action, | 
 |  425                                        std::string* error_desc); | 
 |  426   bool GetStats_w(TransportStats* infos); | 
 |  427   bool GetRemoteSSLCertificate_w(rtc::SSLCertificate** cert); | 
 |  428  | 
 |  429   void SetChannelReceivingTimeout_w(int timeout_ms); | 
|  381  |  430  | 
|  382   // Sends SignalCompleted if we are now in that state. |  431   // Sends SignalCompleted if we are now in that state. | 
|  383   void MaybeSignalCompleted(); |  432   void MaybeCompleted_w(); | 
|  384  |  433  | 
|  385   // Sends SignalGatheringState if gathering state changed |  434   rtc::Thread* const signaling_thread_; | 
|  386   void UpdateGatheringState(); |  435   rtc::Thread* const worker_thread_; | 
|  387  |  436   const std::string content_name_; | 
|  388   void UpdateWritableState(); |  | 
|  389   void UpdateReceivingState(); |  | 
|  390  |  | 
|  391   const std::string name_; |  | 
|  392   PortAllocator* const allocator_; |  437   PortAllocator* const allocator_; | 
|  393   bool channels_destroyed_ = false; |  438   bool destroyed_; | 
|  394   TransportState readable_ = TRANSPORT_STATE_NONE; |  439   TransportState readable_; | 
|  395   TransportState writable_ = TRANSPORT_STATE_NONE; |  440   TransportState writable_; | 
|  396   TransportState receiving_ = TRANSPORT_STATE_NONE; |  441   TransportState receiving_; | 
|  397   bool was_writable_ = false; |  442   bool was_writable_; | 
|  398   bool connect_requested_ = false; |  443   bool connect_requested_; | 
|  399   IceRole ice_role_ = ICEROLE_UNKNOWN; |  444   IceRole ice_role_; | 
|  400   uint64 tiebreaker_ = 0; |  445   uint64 tiebreaker_; | 
|  401   IceMode remote_ice_mode_ = ICEMODE_FULL; |  446   IceMode remote_ice_mode_; | 
|  402   int channel_receiving_timeout_ = -1; |  447   int channel_receiving_timeout_; | 
|  403   rtc::scoped_ptr<TransportDescription> local_description_; |  448   rtc::scoped_ptr<TransportDescription> local_description_; | 
|  404   rtc::scoped_ptr<TransportDescription> remote_description_; |  449   rtc::scoped_ptr<TransportDescription> remote_description_; | 
|  405   bool local_description_set_ = false; |  | 
|  406   bool remote_description_set_ = false; |  | 
|  407   IceGatheringState gathering_state_ = kIceGatheringNew; |  | 
|  408  |  450  | 
 |  451   // TODO(tommi): Make sure we only use this on the worker thread. | 
|  409   ChannelMap channels_; |  452   ChannelMap channels_; | 
 |  453   // Buffers the ready_candidates so that SignalCanidatesReady can | 
 |  454   // provide them in multiples. | 
 |  455   std::vector<Candidate> ready_candidates_; | 
 |  456   // Protects changes to channels and messages | 
 |  457   rtc::CriticalSection crit_; | 
|  410  |  458  | 
|  411   RTC_DISALLOW_COPY_AND_ASSIGN(Transport); |  459   RTC_DISALLOW_COPY_AND_ASSIGN(Transport); | 
|  412 }; |  460 }; | 
|  413  |  461  | 
|  414  |  462  | 
|  415 }  // namespace cricket |  463 }  // namespace cricket | 
|  416  |  464  | 
|  417 #endif  // WEBRTC_P2P_BASE_TRANSPORT_H_ |  465 #endif  // WEBRTC_P2P_BASE_TRANSPORT_H_ | 
| OLD | NEW |