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

Side by Side Diff: webrtc/p2p/base/transportcontroller.h

Issue 2517883002: Refactoring that removes P2PTransport and DtlsTransport classes. (Closed)
Patch Set: Leaving comments about what we'd need to do to support QUIC again. Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2015 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 #ifndef WEBRTC_P2P_BASE_TRANSPORTCONTROLLER_H_ 11 #ifndef WEBRTC_P2P_BASE_TRANSPORTCONTROLLER_H_
12 #define WEBRTC_P2P_BASE_TRANSPORTCONTROLLER_H_ 12 #define WEBRTC_P2P_BASE_TRANSPORTCONTROLLER_H_
13 13
14 #include <map> 14 #include <map>
15 #include <memory> 15 #include <memory>
16 #include <string> 16 #include <string>
17 #include <vector> 17 #include <vector>
18 18
19 #include "webrtc/base/asyncinvoker.h" 19 #include "webrtc/base/asyncinvoker.h"
20 #include "webrtc/base/sigslot.h" 20 #include "webrtc/base/sigslot.h"
21 #include "webrtc/base/sslstreamadapter.h" 21 #include "webrtc/base/sslstreamadapter.h"
22 #include "webrtc/p2p/base/candidate.h" 22 #include "webrtc/p2p/base/candidate.h"
23 #include "webrtc/p2p/base/dtlstransportchannel.h"
24 #include "webrtc/p2p/base/p2ptransportchannel.h"
23 #include "webrtc/p2p/base/transport.h" 25 #include "webrtc/p2p/base/transport.h"
24 26
25 namespace rtc { 27 namespace rtc {
26 class Thread; 28 class Thread;
27 class PacketTransportInterface; 29 class PacketTransportInterface;
28 } 30 }
29 namespace webrtc { 31 namespace webrtc {
30 class MetricsObserverInterface; 32 class MetricsObserverInterface;
31 } 33 }
32 34
(...skipping 22 matching lines...) Expand all
55 PortAllocator* port_allocator() const { return port_allocator_; } 57 PortAllocator* port_allocator() const { return port_allocator_; }
56 58
57 // Can only be set before transports are created. 59 // Can only be set before transports are created.
58 // TODO(deadbeef): Make this an argument to the constructor once BaseSession 60 // TODO(deadbeef): Make this an argument to the constructor once BaseSession
59 // and WebRtcSession are combined 61 // and WebRtcSession are combined
60 bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version); 62 bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version);
61 63
62 void SetIceConfig(const IceConfig& config); 64 void SetIceConfig(const IceConfig& config);
63 void SetIceRole(IceRole ice_role); 65 void SetIceRole(IceRole ice_role);
64 66
65 bool GetSslRole(const std::string& transport_name, rtc::SSLRole* role); 67 bool GetSslRole(const std::string& transport_name, rtc::SSLRole* role) const;
66 68
67 // Specifies the identity to use in this session. 69 // Specifies the identity to use in this session.
68 // Can only be called once. 70 // Can only be called once.
69 bool SetLocalCertificate( 71 bool SetLocalCertificate(
70 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate); 72 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
71 bool GetLocalCertificate( 73 bool GetLocalCertificate(
72 const std::string& transport_name, 74 const std::string& transport_name,
73 rtc::scoped_refptr<rtc::RTCCertificate>* certificate); 75 rtc::scoped_refptr<rtc::RTCCertificate>* certificate) const;
74 // Caller owns returned certificate 76 // Caller owns returned certificate. This method mainly exists for stats
77 // reporting.
75 std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate( 78 std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate(
76 const std::string& transport_name); 79 const std::string& transport_name) const;
77 bool SetLocalTransportDescription(const std::string& transport_name, 80 bool SetLocalTransportDescription(const std::string& transport_name,
78 const TransportDescription& tdesc, 81 const TransportDescription& tdesc,
79 ContentAction action, 82 ContentAction action,
80 std::string* err); 83 std::string* err);
81 bool SetRemoteTransportDescription(const std::string& transport_name, 84 bool SetRemoteTransportDescription(const std::string& transport_name,
82 const TransportDescription& tdesc, 85 const TransportDescription& tdesc,
83 ContentAction action, 86 ContentAction action,
84 std::string* err); 87 std::string* err);
85 // Start gathering candidates for any new transports, or transports doing an 88 // Start gathering candidates for any new transports, or transports doing an
86 // ICE restart. 89 // ICE restart.
87 void MaybeStartGathering(); 90 void MaybeStartGathering();
88 bool AddRemoteCandidates(const std::string& transport_name, 91 bool AddRemoteCandidates(const std::string& transport_name,
89 const Candidates& candidates, 92 const Candidates& candidates,
90 std::string* err); 93 std::string* err);
91 bool RemoveRemoteCandidates(const Candidates& candidates, std::string* err); 94 bool RemoveRemoteCandidates(const Candidates& candidates, std::string* err);
92 bool ReadyForRemoteCandidates(const std::string& transport_name); 95 bool ReadyForRemoteCandidates(const std::string& transport_name) const;
93 bool GetStats(const std::string& transport_name, TransportStats* stats); 96 bool GetStats(const std::string& transport_name, TransportStats* stats) const;
97 void SetMetricsObserver(webrtc::MetricsObserverInterface* metrics_observer);
94 98
95 // Creates a channel if it doesn't exist. Otherwise, increments a reference 99 // Creates a channel if it doesn't exist. Otherwise, increments a reference
96 // count and returns an existing channel. 100 // count and returns an existing channel.
97 virtual TransportChannel* CreateTransportChannel_n( 101 virtual TransportChannel* CreateTransportChannel_n(
98 const std::string& transport_name, 102 const std::string& transport_name,
99 int component); 103 int component);
100 104
101 // Decrements a channel's reference count, and destroys the channel if 105 // Decrements a channel's reference count, and destroys the channel if
102 // nothing is referencing it. 106 // nothing is referencing it.
103 virtual void DestroyTransportChannel_n(const std::string& transport_name, 107 virtual void DestroyTransportChannel_n(const std::string& transport_name,
104 int component); 108 int component);
105 109
106 void use_quic() { quic_ = true; } 110 void use_quic() { quic_ = true; }
107 bool quic() const { return quic_; } 111 bool quic() const { return quic_; }
108 112
113 // TODO(deadbeef): Remove all for_testing methods!
114 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate_for_testing()
115 const {
116 return certificate_;
117 }
118 std::vector<std::string> transport_names_for_testing();
119 std::vector<TransportChannelImpl*> channels_for_testing();
120 TransportChannelImpl* get_channel_for_testing(
121 const std::string& transport_name,
122 int component);
123
109 // All of these signals are fired on the signalling thread. 124 // All of these signals are fired on the signalling thread.
110 125
111 // If any transport failed => failed, 126 // If any transport failed => failed,
112 // Else if all completed => completed, 127 // Else if all completed => completed,
113 // Else if all connected => connected, 128 // Else if all connected => connected,
114 // Else => connecting 129 // Else => connecting
115 sigslot::signal1<IceConnectionState> SignalConnectionState; 130 sigslot::signal1<IceConnectionState> SignalConnectionState;
116 131
117 // Receiving if any transport is receiving 132 // Receiving if any transport is receiving
118 sigslot::signal1<bool> SignalReceiving; 133 sigslot::signal1<bool> SignalReceiving;
119 134
120 // If all transports done gathering => complete, 135 // If all transports done gathering => complete,
121 // Else if any are gathering => gathering, 136 // Else if any are gathering => gathering,
122 // Else => new 137 // Else => new
123 sigslot::signal1<IceGatheringState> SignalGatheringState; 138 sigslot::signal1<IceGatheringState> SignalGatheringState;
124 139
125 // (transport_name, candidates) 140 // (transport_name, candidates)
126 sigslot::signal2<const std::string&, const Candidates&> 141 sigslot::signal2<const std::string&, const Candidates&>
127 SignalCandidatesGathered; 142 SignalCandidatesGathered;
128 143
129 sigslot::signal1<const Candidates&> SignalCandidatesRemoved; 144 sigslot::signal1<const Candidates&> SignalCandidatesRemoved;
130 145
131 // for unit test
132 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate_for_testing();
133
134 sigslot::signal1<rtc::SSLHandshakeError> SignalDtlsHandshakeError; 146 sigslot::signal1<rtc::SSLHandshakeError> SignalDtlsHandshakeError;
135 147
136 void SetMetricsObserver(webrtc::MetricsObserverInterface* metrics_observer);
137
138 protected: 148 protected:
139 // Protected and virtual so we can override it in unit tests. 149 // TODO(deadbeef): Get rid of these virtual methods. Used by
140 virtual Transport* CreateTransport_n(const std::string& transport_name); 150 // FakeTransportController currently, but FakeTransportController shouldn't
141 151 // even be functioning by subclassing TransportController.
142 // For unit tests 152 virtual TransportChannelImpl* CreateIceTransportChannel_n(
143 const std::map<std::string, Transport*>& transports() { return transports_; } 153 const std::string& transport_name,
144 Transport* GetTransport_n(const std::string& transport_name); 154 int component);
155 virtual TransportChannelImpl* CreateDtlsTransportChannel_n(
156 const std::string& transport_name,
157 int component,
158 TransportChannelImpl* ice);
pthatcher1 2016/11/30 01:34:35 Why don't we just change TransportController and t
Taylor Brandstetter 2016/11/30 20:31:39 TransportController already does call these. As fo
145 159
146 private: 160 private:
147 void OnMessage(rtc::Message* pmsg) override; 161 void OnMessage(rtc::Message* pmsg) override;
148 162
149 // It's the Transport that's currently responsible for creating/destroying 163 // This structure groups the DTLS and ICE channels, and helps keep track of
150 // channels, but the TransportController keeps track of how many external 164 // how many external objects (BaseChannels) reference each channel.
151 // objects (BaseChannels) reference each channel.
152 struct RefCountedChannel { 165 struct RefCountedChannel {
pthatcher1 2016/11/30 01:34:35 Would it make more sense to have a RefCounted<T> w
Taylor Brandstetter 2016/11/30 20:31:39 Maybe. But again, I don't think it's necessary for
153 RefCountedChannel() : impl_(nullptr), ref_(0) {} 166 RefCountedChannel() = default;
154 explicit RefCountedChannel(TransportChannelImpl* impl) 167 // TODO(deadbeef): Change the types of |dtls| and |ice| to
155 : impl_(impl), ref_(0) {} 168 // DtlsTransportChannelWrapper and P2PTransportChannelWrapper,
169 // once TransportChannelImpl is removed.
170 explicit RefCountedChannel(TransportChannelImpl* dtls,
171 TransportChannelImpl* ice)
172 : ice_(ice), dtls_(dtls), ref_(0) {}
156 173
157 void AddRef() { ++ref_; } 174 void AddRef() { ++ref_; }
158 void DecRef() { 175 void DecRef() {
159 ASSERT(ref_ > 0); 176 ASSERT(ref_ > 0);
160 --ref_; 177 --ref_;
161 } 178 }
162 int ref() const { return ref_; } 179 int ref() const { return ref_; }
163 180
164 TransportChannelImpl* get() const { return impl_; } 181 // Currently, all ICE-related calls still go through this DTLS channel. But
165 TransportChannelImpl* operator->() const { return impl_; } 182 // that will change once we get rid of TransportChannelImpl, and the DTLS
183 // channel interface no longer includes ICE-specific methods.
184 const TransportChannelImpl* dtls() const { return dtls_.get(); }
185 TransportChannelImpl* dtls() { return dtls_.get(); }
186 const TransportChannelImpl* ice() const { return ice_.get(); }
187 TransportChannelImpl* ice() { return ice_.get(); }
166 188
167 private: 189 private:
168 TransportChannelImpl* impl_; 190 std::unique_ptr<TransportChannelImpl> ice_;
169 int ref_; 191 std::unique_ptr<TransportChannelImpl> dtls_;
192 int ref_ = 0;
170 }; 193 };
171 194
172 std::vector<RefCountedChannel>::iterator FindChannel_n( 195 // Helper functions to get a channel or transport, or iterator to it (in case
196 // it needs to be erased).
197 std::vector<RefCountedChannel>::iterator GetChannelIterator_n(
173 const std::string& transport_name, 198 const std::string& transport_name,
174 int component); 199 int component);
200 std::vector<RefCountedChannel>::const_iterator GetChannelIterator_n(
201 const std::string& transport_name,
202 int component) const;
203 const Transport* GetTransport_n(const std::string& transport_name) const;
204 Transport* GetTransport_n(const std::string& transport_name);
205 const RefCountedChannel* GetChannel_n(const std::string& transport_name,
206 int component) const;
207 RefCountedChannel* GetChannel_n(const std::string& transport_name,
208 int component);
175 209
176 Transport* GetOrCreateTransport_n(const std::string& transport_name); 210 Transport* GetOrCreateTransport_n(const std::string& transport_name);
177 void DestroyTransport_n(const std::string& transport_name); 211 void DestroyAllChannels_n();
178 void DestroyAllTransports_n();
179 212
180 bool SetSslMaxProtocolVersion_n(rtc::SSLProtocolVersion version); 213 bool SetSslMaxProtocolVersion_n(rtc::SSLProtocolVersion version);
181 void SetIceConfig_n(const IceConfig& config); 214 void SetIceConfig_n(const IceConfig& config);
182 void SetIceRole_n(IceRole ice_role); 215 void SetIceRole_n(IceRole ice_role);
183 bool GetSslRole_n(const std::string& transport_name, rtc::SSLRole* role); 216 bool GetSslRole_n(const std::string& transport_name,
217 rtc::SSLRole* role) const;
184 bool SetLocalCertificate_n( 218 bool SetLocalCertificate_n(
185 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate); 219 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
186 bool GetLocalCertificate_n( 220 bool GetLocalCertificate_n(
187 const std::string& transport_name, 221 const std::string& transport_name,
188 rtc::scoped_refptr<rtc::RTCCertificate>* certificate); 222 rtc::scoped_refptr<rtc::RTCCertificate>* certificate) const;
189 std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate_n( 223 std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate_n(
190 const std::string& transport_name); 224 const std::string& transport_name) const;
191 bool SetLocalTransportDescription_n(const std::string& transport_name, 225 bool SetLocalTransportDescription_n(const std::string& transport_name,
192 const TransportDescription& tdesc, 226 const TransportDescription& tdesc,
193 ContentAction action, 227 ContentAction action,
194 std::string* err); 228 std::string* err);
195 bool SetRemoteTransportDescription_n(const std::string& transport_name, 229 bool SetRemoteTransportDescription_n(const std::string& transport_name,
196 const TransportDescription& tdesc, 230 const TransportDescription& tdesc,
197 ContentAction action, 231 ContentAction action,
198 std::string* err); 232 std::string* err);
199 void MaybeStartGathering_n(); 233 void MaybeStartGathering_n();
200 bool AddRemoteCandidates_n(const std::string& transport_name, 234 bool AddRemoteCandidates_n(const std::string& transport_name,
201 const Candidates& candidates, 235 const Candidates& candidates,
202 std::string* err); 236 std::string* err);
203 bool RemoveRemoteCandidates_n(const Candidates& candidates, std::string* err); 237 bool RemoveRemoteCandidates_n(const Candidates& candidates, std::string* err);
204 bool ReadyForRemoteCandidates_n(const std::string& transport_name); 238 bool ReadyForRemoteCandidates_n(const std::string& transport_name) const;
205 bool GetStats_n(const std::string& transport_name, TransportStats* stats); 239 bool GetStats_n(const std::string& transport_name,
240 TransportStats* stats) const;
241 void SetMetricsObserver_n(webrtc::MetricsObserverInterface* metrics_observer);
206 242
207 // Handlers for signals from Transport. 243 // Handlers for signals from Transport.
208 void OnChannelWritableState_n(rtc::PacketTransportInterface* transport); 244 void OnChannelWritableState_n(rtc::PacketTransportInterface* transport);
209 void OnChannelReceivingState_n(rtc::PacketTransportInterface* transport); 245 void OnChannelReceivingState_n(rtc::PacketTransportInterface* transport);
210 void OnChannelGatheringState_n(TransportChannelImpl* channel); 246 void OnChannelGatheringState_n(TransportChannelImpl* channel);
211 void OnChannelCandidateGathered_n(TransportChannelImpl* channel, 247 void OnChannelCandidateGathered_n(TransportChannelImpl* channel,
212 const Candidate& candidate); 248 const Candidate& candidate);
213 void OnChannelCandidatesRemoved(const Candidates& candidates); 249 void OnChannelCandidatesRemoved(const Candidates& candidates);
214 void OnChannelCandidatesRemoved_n(TransportChannelImpl* channel, 250 void OnChannelCandidatesRemoved_n(TransportChannelImpl* channel,
215 const Candidates& candidates); 251 const Candidates& candidates);
216 void OnChannelRoleConflict_n(TransportChannelImpl* channel); 252 void OnChannelRoleConflict_n(TransportChannelImpl* channel);
217 void OnChannelStateChanged_n(TransportChannelImpl* channel); 253 void OnChannelStateChanged_n(TransportChannelImpl* channel);
218 254
219 void UpdateAggregateStates_n(); 255 void UpdateAggregateStates_n();
220 256
221 void OnDtlsHandshakeError(rtc::SSLHandshakeError error); 257 void OnDtlsHandshakeError(rtc::SSLHandshakeError error);
222 258
223 rtc::Thread* const signaling_thread_ = nullptr; 259 rtc::Thread* const signaling_thread_ = nullptr;
224 rtc::Thread* const network_thread_ = nullptr; 260 rtc::Thread* const network_thread_ = nullptr;
225 typedef std::map<std::string, Transport*> TransportMap; 261 PortAllocator* const port_allocator_ = nullptr;
226 TransportMap transports_;
227 262
263 std::map<std::string, std::unique_ptr<Transport>> transports_;
228 std::vector<RefCountedChannel> channels_; 264 std::vector<RefCountedChannel> channels_;
229 265
230 PortAllocator* const port_allocator_ = nullptr;
231 rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12;
232
233 // Aggregate state for TransportChannelImpls. 266 // Aggregate state for TransportChannelImpls.
234 IceConnectionState connection_state_ = kIceConnectionConnecting; 267 IceConnectionState connection_state_ = kIceConnectionConnecting;
235 bool receiving_ = false; 268 bool receiving_ = false;
236 IceGatheringState gathering_state_ = kIceGatheringNew; 269 IceGatheringState gathering_state_ = kIceGatheringNew;
237 270
238 // TODO(deadbeef): Move the fields below down to the transports themselves
239 IceConfig ice_config_; 271 IceConfig ice_config_;
240 IceRole ice_role_ = ICEROLE_CONTROLLING; 272 IceRole ice_role_ = ICEROLE_CONTROLLING;
241 bool redetermine_role_on_ice_restart_; 273 bool redetermine_role_on_ice_restart_;
242 uint64_t ice_tiebreaker_ = rtc::CreateRandomId64(); 274 uint64_t ice_tiebreaker_ = rtc::CreateRandomId64();
275 rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12;
243 rtc::scoped_refptr<rtc::RTCCertificate> certificate_; 276 rtc::scoped_refptr<rtc::RTCCertificate> certificate_;
244 rtc::AsyncInvoker invoker_; 277 rtc::AsyncInvoker invoker_;
245 // True if QUIC is used instead of DTLS. 278 // True if QUIC is used instead of DTLS.
246 bool quic_ = false; 279 bool quic_ = false;
247 280
248 webrtc::MetricsObserverInterface* metrics_observer_ = nullptr; 281 webrtc::MetricsObserverInterface* metrics_observer_ = nullptr;
249 }; 282 };
250 283
251 } // namespace cricket 284 } // namespace cricket
252 285
253 #endif // WEBRTC_P2P_BASE_TRANSPORTCONTROLLER_H_ 286 #endif // WEBRTC_P2P_BASE_TRANSPORTCONTROLLER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698