Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2055)

Unified Diff: webrtc/p2p/base/transport.h

Issue 1350523003: TransportController refactoring. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixing Mac test. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/p2p/base/session_unittest.cc ('k') | webrtc/p2p/base/transport.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/p2p/base/transport.h
diff --git a/webrtc/p2p/base/transport.h b/webrtc/p2p/base/transport.h
index 72a089501e6007d51c61be121efbef1e1178fa25..cd763ab3bcf1404c441e29a6b326c1e5a9c0631d 100644
--- a/webrtc/p2p/base/transport.h
+++ b/webrtc/p2p/base/transport.h
@@ -15,15 +15,11 @@
// state changes (in order to update the manager's state), and forwards
// requests to begin connecting or to reset to each of the channels.
//
-// On Threading: Transport performs work on both the signaling and worker
-// threads. For subclasses, the rule is that all signaling related calls will
-// be made on the signaling thread and all channel related calls (including
-// signaling for a channel) will be made on the worker thread. When
-// information needs to be sent between the two threads, this class should do
-// the work (e.g., OnRemoteCandidate).
+// On Threading: Transport performs work solely on the worker thread, and so
+// its methods should only be called on the worker thread.
//
-// Note: Subclasses must call DestroyChannels() in their own constructors.
-// It is not possible to do so here because the subclass constructor will
+// Note: Subclasses must call DestroyChannels() in their own destructors.
+// It is not possible to do so here because the subclass destructor will
// already have run.
#ifndef WEBRTC_P2P_BASE_TRANSPORT_H_
@@ -36,16 +32,11 @@
#include "webrtc/p2p/base/constants.h"
#include "webrtc/p2p/base/sessiondescription.h"
#include "webrtc/p2p/base/transportinfo.h"
-#include "webrtc/base/criticalsection.h"
#include "webrtc/base/messagequeue.h"
#include "webrtc/base/rtccertificate.h"
#include "webrtc/base/sigslot.h"
#include "webrtc/base/sslstreamadapter.h"
-namespace rtc {
-class Thread;
-}
-
namespace cricket {
class PortAllocator;
@@ -54,6 +45,26 @@ class TransportChannelImpl;
typedef std::vector<Candidate> Candidates;
+// TODO(deadbeef): Unify with PeerConnectionInterface::IceConnectionState
+// once /talk/ and /webrtc/ are combined, and also switch to ENUM_NAME naming
+// style.
+enum IceConnectionState {
+ kIceConnectionConnecting = 0,
+ kIceConnectionFailed,
+ kIceConnectionConnected, // Writable, but still checking one or more
+ // connections
+ kIceConnectionCompleted,
+};
+
+// TODO(deadbeef): Unify with PeerConnectionInterface::IceConnectionState
+// once /talk/ and /webrtc/ are combined, and also switch to ENUM_NAME naming
+// style.
+enum IceGatheringState {
+ kIceGatheringNew = 0,
+ kIceGatheringGathering,
+ kIceGatheringComplete,
+};
+
// For "writable" and "receiving", we need to differentiate between
// none, all, and some.
enum TransportState {
@@ -124,7 +135,7 @@ typedef std::vector<TransportChannelStats> TransportChannelStatsList;
// Information about the stats of a transport.
struct TransportStats {
- std::string content_name;
+ std::string transport_name;
TransportChannelStatsList channel_stats;
};
@@ -135,22 +146,13 @@ bool IceCredentialsChanged(const std::string& old_ufrag,
const std::string& new_ufrag,
const std::string& new_pwd);
-class Transport : public rtc::MessageHandler,
- public sigslot::has_slots<> {
+class Transport : public sigslot::has_slots<> {
public:
- Transport(rtc::Thread* signaling_thread,
- rtc::Thread* worker_thread,
- const std::string& content_name,
- PortAllocator* allocator);
+ Transport(const std::string& name, PortAllocator* allocator);
virtual ~Transport();
- // Returns the signaling thread. The app talks to Transport on this thread.
- rtc::Thread* signaling_thread() const { return signaling_thread_; }
- // Returns the worker thread. The actual networking is done on this thread.
- rtc::Thread* worker_thread() const { return worker_thread_; }
-
- // Returns the content_name of this transport.
- const std::string& content_name() const { return content_name_; }
+ // Returns the name of this transport.
+ const std::string& name() const { return name_; }
// Returns the port allocator object for this transport.
PortAllocator* port_allocator() { return allocator_; }
@@ -172,6 +174,14 @@ class Transport : public rtc::MessageHandler,
return (receiving_ == TRANSPORT_STATE_SOME ||
receiving_ == TRANSPORT_STATE_ALL);
}
+ bool ready_for_remote_candidates() const {
+ return local_description_set_ && remote_description_set_;
+ }
+
+ bool AllChannelsCompleted() const;
+ bool AnyChannelFailed() const;
+
+ IceGatheringState gathering_state() const { return gathering_state_; }
sigslot::signal1<Transport*> SignalWritableState;
sigslot::signal1<Transport*> SignalReceivingState;
@@ -190,21 +200,23 @@ class Transport : public rtc::MessageHandler,
void SetChannelReceivingTimeout(int timeout_ms);
// Must be called before applying local session description.
- void SetCertificate(
- const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
+ virtual void SetLocalCertificate(
+ const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {}
- // Get a copy of the local identity provided by SetIdentity.
- bool GetCertificate(rtc::scoped_refptr<rtc::RTCCertificate>* certificate);
+ // Get a copy of the local certificate provided by SetLocalCertificate.
+ virtual bool GetLocalCertificate(
+ rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
+ return false;
+ }
// Get a copy of the remote certificate in use by the specified channel.
bool GetRemoteSSLCertificate(rtc::SSLCertificate** cert);
// Create, destroy, and lookup the channels of this type by their components.
TransportChannelImpl* CreateChannel(int component);
- // Note: GetChannel may lead to race conditions, since the mutex is not held
- // after the pointer is returned.
+
TransportChannelImpl* GetChannel(int component);
- // Note: HasChannel does not lead to race conditions, unlike GetChannel.
+
bool HasChannel(int component) {
return (NULL != GetChannel(component));
}
@@ -212,7 +224,6 @@ class Transport : public rtc::MessageHandler,
void DestroyChannel(int component);
// Set the local TransportDescription to be used by TransportChannels.
- // This should be called before ConnectChannels().
bool SetLocalTransportDescription(const TransportDescription& description,
ContentAction action,
std::string* error_desc);
@@ -227,6 +238,11 @@ class Transport : public rtc::MessageHandler,
void ConnectChannels();
sigslot::signal1<Transport*> SignalConnecting;
+ // Tells channels to start gathering candidates if necessary.
+ // Should be called after ConnectChannels() has been called at least once,
+ // which will happen in SetLocalTransportDescription.
+ void MaybeStartGathering();
+
// Resets all of the channels back to their initial state. They are no
// longer connecting.
void ResetChannels();
@@ -236,20 +252,15 @@ class Transport : public rtc::MessageHandler,
bool GetStats(TransportStats* stats);
- // Before any stanza is sent, the manager will request signaling. Once
- // signaling is available, the client should call OnSignalingReady. Once
- // this occurs, the transport (or its channels) can send any waiting stanzas.
- // OnSignalingReady invokes OnTransportSignalingReady and then forwards this
- // signal to each channel.
- sigslot::signal1<Transport*> SignalRequestSignaling;
- void OnSignalingReady();
+ sigslot::signal1<Transport*> SignalGatheringState;
// Handles sending of ready candidates and receiving of remote candidates.
- sigslot::signal2<Transport*,
- const std::vector<Candidate>&> SignalCandidatesReady;
+ sigslot::signal2<Transport*, const std::vector<Candidate>&>
+ SignalCandidatesGathered;
- sigslot::signal1<Transport*> SignalCandidatesAllocationDone;
- void OnRemoteCandidates(const std::vector<Candidate>& candidates);
+ // Called when one or more candidates are ready from the remote peer.
+ bool AddRemoteCandidates(const std::vector<Candidate>& candidates,
+ std::string* error);
// If candidate is not acceptable, returns false and sets error.
// Call this before calling OnRemoteCandidates.
@@ -264,10 +275,12 @@ class Transport : public rtc::MessageHandler,
// Forwards the signal from TransportChannel to BaseSession.
sigslot::signal0<> SignalRoleConflict;
- virtual bool GetSslRole(rtc::SSLRole* ssl_role) const;
+ virtual bool GetSslRole(rtc::SSLRole* ssl_role) const { return false; }
// Must be called before channel is starting to connect.
- virtual bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version);
+ virtual bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version) {
+ return false;
+ }
protected:
// These are called by Create/DestroyChannel above in order to create or
@@ -275,9 +288,6 @@ class Transport : public rtc::MessageHandler,
virtual TransportChannelImpl* CreateTransportChannel(int component) = 0;
virtual void DestroyTransportChannel(TransportChannelImpl* channel) = 0;
- // Informs the subclass that we received the signaling ready message.
- virtual void OnTransportSignalingReady() {}
-
// The current local transport description, for use by derived classes
// when performing transport description negotiation.
const TransportDescription* local_description() const {
@@ -290,53 +300,37 @@ class Transport : public rtc::MessageHandler,
return remote_description_.get();
}
- virtual void SetCertificate_w(
- const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {}
-
- virtual bool GetCertificate_w(
- rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
- return false;
- }
-
// Pushes down the transport parameters from the local description, such
// as the ICE ufrag and pwd.
// Derived classes can override, but must call the base as well.
- virtual bool ApplyLocalTransportDescription_w(TransportChannelImpl* channel,
- std::string* error_desc);
+ virtual bool ApplyLocalTransportDescription(TransportChannelImpl* channel,
+ std::string* error_desc);
// Pushes down remote ice credentials from the remote description to the
// transport channel.
- virtual bool ApplyRemoteTransportDescription_w(TransportChannelImpl* ch,
- std::string* error_desc);
+ virtual bool ApplyRemoteTransportDescription(TransportChannelImpl* ch,
+ std::string* error_desc);
// Negotiates the transport parameters based on the current local and remote
// transport description, such as the ICE role to use, and whether DTLS
// should be activated.
// Derived classes can negotiate their specific parameters here, but must call
// the base as well.
- virtual bool NegotiateTransportDescription_w(ContentAction local_role,
- std::string* error_desc);
+ virtual bool NegotiateTransportDescription(ContentAction local_role,
+ std::string* error_desc);
// Pushes down the transport parameters obtained via negotiation.
// Derived classes can set their specific parameters here, but must call the
// base as well.
- virtual bool ApplyNegotiatedTransportDescription_w(
- TransportChannelImpl* channel, std::string* error_desc);
-
- virtual bool GetSslRole_w(rtc::SSLRole* ssl_role) const {
- return false;
- }
-
- virtual bool SetSslMaxProtocolVersion_w(rtc::SSLProtocolVersion version) {
- return false;
- }
+ virtual bool ApplyNegotiatedTransportDescription(
+ TransportChannelImpl* channel,
+ std::string* error_desc);
private:
struct ChannelMapEntry {
- ChannelMapEntry() : impl_(NULL), candidates_allocated_(false), ref_(0) {}
+ ChannelMapEntry() : impl_(NULL), ref_(0) {}
explicit ChannelMapEntry(TransportChannelImpl *impl)
: impl_(impl),
- candidates_allocated_(false),
ref_(0) {
}
@@ -349,14 +343,9 @@ class Transport : public rtc::MessageHandler,
TransportChannelImpl* get() const { return impl_; }
TransportChannelImpl* operator->() const { return impl_; }
- void set_candidates_allocated(bool status) {
- candidates_allocated_ = status;
- }
- bool candidates_allocated() const { return candidates_allocated_; }
- private:
- TransportChannelImpl *impl_;
- bool candidates_allocated_;
+ private:
+ TransportChannelImpl* impl_;
int ref_;
};
@@ -369,92 +358,55 @@ class Transport : public rtc::MessageHandler,
// Called when the receiving state of a channel changes.
void OnChannelReceivingState(TransportChannel* channel);
- // Called when a channel requests signaling.
- void OnChannelRequestSignaling(TransportChannelImpl* channel);
+ // Called when a channel starts finishes gathering candidates
+ void OnChannelGatheringState(TransportChannelImpl* channel);
- // Called when a candidate is ready from remote peer.
- void OnRemoteCandidate(const Candidate& candidate);
// Called when a candidate is ready from channel.
- void OnChannelCandidateReady(TransportChannelImpl* channel,
- const Candidate& candidate);
+ void OnChannelCandidateGathered(TransportChannelImpl* channel,
+ const Candidate& candidate);
void OnChannelRouteChange(TransportChannel* channel,
const Candidate& remote_candidate);
- void OnChannelCandidatesAllocationDone(TransportChannelImpl* channel);
// Called when there is ICE role change.
void OnRoleConflict(TransportChannelImpl* channel);
// Called when the channel removes a connection.
void OnChannelConnectionRemoved(TransportChannelImpl* channel);
- // Dispatches messages to the appropriate handler (below).
- void OnMessage(rtc::Message* msg);
-
- // These are versions of the above methods that are called only on a
- // particular thread (s = signaling, w = worker). The above methods post or
- // send a message to invoke this version.
- TransportChannelImpl* CreateChannel_w(int component);
- void DestroyChannel_w(int component);
- void ConnectChannels_w();
- void ResetChannels_w();
- void DestroyAllChannels_w();
- void OnRemoteCandidate_w(const Candidate& candidate);
- void OnChannelWritableState_s();
- void OnChannelReceivingState_s();
- void OnChannelRequestSignaling_s();
- void OnConnecting_s();
- void OnChannelRouteChange_s(const TransportChannel* channel,
- const Candidate& remote_candidate);
- void OnChannelCandidatesAllocationDone_s();
-
// Helper function that invokes the given function on every channel.
typedef void (TransportChannelImpl::* TransportChannelFunc)();
- void CallChannels_w(TransportChannelFunc func);
+ void CallChannels(TransportChannelFunc func);
// Computes the AND and OR of the channel's read/write/receiving state
// (argument picks the operation).
- TransportState GetTransportState_s(TransportStateType type);
-
- void OnChannelCandidateReady_s();
+ TransportState GetTransportState(TransportStateType type);
- void SetIceRole_w(IceRole role);
- void SetRemoteIceMode_w(IceMode mode);
- bool SetLocalTransportDescription_w(const TransportDescription& desc,
- ContentAction action,
- std::string* error_desc);
- bool SetRemoteTransportDescription_w(const TransportDescription& desc,
- ContentAction action,
- std::string* error_desc);
- bool GetStats_w(TransportStats* infos);
- bool GetRemoteSSLCertificate_w(rtc::SSLCertificate** cert);
+ // Sends SignalCompleted if we are now in that state.
+ void MaybeSignalCompleted();
- void SetChannelReceivingTimeout_w(int timeout_ms);
+ // Sends SignalGatheringState if gathering state changed
+ void UpdateGatheringState();
- // Sends SignalCompleted if we are now in that state.
- void MaybeCompleted_w();
+ void UpdateWritableState();
+ void UpdateReceivingState();
- rtc::Thread* const signaling_thread_;
- rtc::Thread* const worker_thread_;
- const std::string content_name_;
+ const std::string name_;
PortAllocator* const allocator_;
- bool destroyed_;
- TransportState readable_;
- TransportState writable_;
- TransportState receiving_;
- bool was_writable_;
- bool connect_requested_;
- IceRole ice_role_;
- uint64 tiebreaker_;
- IceMode remote_ice_mode_;
- int channel_receiving_timeout_;
+ bool channels_destroyed_ = false;
+ TransportState readable_ = TRANSPORT_STATE_NONE;
+ TransportState writable_ = TRANSPORT_STATE_NONE;
+ TransportState receiving_ = TRANSPORT_STATE_NONE;
+ bool was_writable_ = false;
+ bool connect_requested_ = false;
+ IceRole ice_role_ = ICEROLE_UNKNOWN;
+ uint64 tiebreaker_ = 0;
+ IceMode remote_ice_mode_ = ICEMODE_FULL;
+ int channel_receiving_timeout_ = -1;
rtc::scoped_ptr<TransportDescription> local_description_;
rtc::scoped_ptr<TransportDescription> remote_description_;
+ bool local_description_set_ = false;
+ bool remote_description_set_ = false;
+ IceGatheringState gathering_state_ = kIceGatheringNew;
- // TODO(tommi): Make sure we only use this on the worker thread.
ChannelMap channels_;
- // Buffers the ready_candidates so that SignalCanidatesReady can
- // provide them in multiples.
- std::vector<Candidate> ready_candidates_;
- // Protects changes to channels and messages
- rtc::CriticalSection crit_;
RTC_DISALLOW_COPY_AND_ASSIGN(Transport);
};
« no previous file with comments | « webrtc/p2p/base/session_unittest.cc ('k') | webrtc/p2p/base/transport.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698