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

Side by Side Diff: remoting/protocol/libjingle_transport_factory.cc

Issue 1099203005: Revert of Use standard ICE in Chromoting. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/protocol/libjingle_transport_factory.h" 5 #include "remoting/protocol/libjingle_transport_factory.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 return TransportRoute::DIRECT; 50 return TransportRoute::DIRECT;
51 } 51 }
52 } 52 }
53 53
54 class LibjingleTransport 54 class LibjingleTransport
55 : public Transport, 55 : public Transport,
56 public base::SupportsWeakPtr<LibjingleTransport>, 56 public base::SupportsWeakPtr<LibjingleTransport>,
57 public sigslot::has_slots<> { 57 public sigslot::has_slots<> {
58 public: 58 public:
59 LibjingleTransport(cricket::PortAllocator* port_allocator, 59 LibjingleTransport(cricket::PortAllocator* port_allocator,
60 const NetworkSettings& network_settings, 60 const NetworkSettings& network_settings);
61 TransportRole role);
62 ~LibjingleTransport() override; 61 ~LibjingleTransport() override;
63 62
64 // Called by JingleTransportFactory when it has fresh Jingle info. 63 // Called by JingleTransportFactory when it has fresh Jingle info.
65 void OnCanStart(); 64 void OnCanStart();
66 65
67 // Transport interface. 66 // Transport interface.
68 void Connect(const std::string& name, 67 void Connect(const std::string& name,
69 Transport::EventHandler* event_handler, 68 Transport::EventHandler* event_handler,
70 const Transport::ConnectedCallback& callback) override; 69 const Transport::ConnectedCallback& callback) override;
71 void SetRemoteCredentials(const std::string& ufrag,
72 const std::string& password) override;
73 void AddRemoteCandidate(const cricket::Candidate& candidate) override; 70 void AddRemoteCandidate(const cricket::Candidate& candidate) override;
74 const std::string& name() const override; 71 const std::string& name() const override;
75 bool is_connected() const override; 72 bool is_connected() const override;
76 void SetUseStandardIce(bool use_standard_ice) override;
77 73
78 private: 74 private:
79 void DoStart(); 75 void DoStart();
80 void NotifyConnected(); 76 void NotifyConnected();
81 77
82 // Signal handlers for cricket::TransportChannel. 78 // Signal handlers for cricket::TransportChannel.
83 void OnRequestSignaling(cricket::TransportChannelImpl* channel); 79 void OnRequestSignaling(cricket::TransportChannelImpl* channel);
84 void OnCandidateReady(cricket::TransportChannelImpl* channel, 80 void OnCandidateReady(cricket::TransportChannelImpl* channel,
85 const cricket::Candidate& candidate); 81 const cricket::Candidate& candidate);
86 void OnRouteChange(cricket::TransportChannel* channel, 82 void OnRouteChange(cricket::TransportChannel* channel,
87 const cricket::Candidate& candidate); 83 const cricket::Candidate& candidate);
88 void OnWritableState(cricket::TransportChannel* channel); 84 void OnWritableState(cricket::TransportChannel* channel);
89 85
90 // Callback for jingle_glue::TransportChannelSocketAdapter to notify when the 86 // Callback for jingle_glue::TransportChannelSocketAdapter to notify when the
91 // socket is destroyed. 87 // socket is destroyed.
92 void OnChannelDestroyed(); 88 void OnChannelDestroyed();
93 89
94 void NotifyRouteChanged(); 90 void NotifyRouteChanged();
95 91
96 // Tries to connect by restarting ICE. Called by |reconnect_timer_|. 92 // Tries to connect by restarting ICE. Called by |reconnect_timer_|.
97 void TryReconnect(); 93 void TryReconnect();
98 94
99 cricket::PortAllocator* port_allocator_; 95 cricket::PortAllocator* port_allocator_;
100 NetworkSettings network_settings_; 96 NetworkSettings network_settings_;
101 TransportRole role_;
102
103 bool use_standard_ice_ = true;
104 97
105 std::string name_; 98 std::string name_;
106 EventHandler* event_handler_; 99 EventHandler* event_handler_;
107 Transport::ConnectedCallback callback_; 100 Transport::ConnectedCallback callback_;
108 std::string ice_username_fragment_; 101 std::string ice_username_fragment_;
102 std::string ice_password_;
109 103
110 bool can_start_; 104 bool can_start_;
111 105
112 std::string remote_ice_username_fragment_;
113 std::string remote_ice_password_;
114 std::list<cricket::Candidate> pending_candidates_; 106 std::list<cricket::Candidate> pending_candidates_;
115 scoped_ptr<cricket::P2PTransportChannel> channel_; 107 scoped_ptr<cricket::P2PTransportChannel> channel_;
116 int connect_attempts_left_; 108 int connect_attempts_left_;
117 base::RepeatingTimer<LibjingleTransport> reconnect_timer_; 109 base::RepeatingTimer<LibjingleTransport> reconnect_timer_;
118 110
119 base::WeakPtrFactory<LibjingleTransport> weak_factory_; 111 base::WeakPtrFactory<LibjingleTransport> weak_factory_;
120 112
121 DISALLOW_COPY_AND_ASSIGN(LibjingleTransport); 113 DISALLOW_COPY_AND_ASSIGN(LibjingleTransport);
122 }; 114 };
123 115
124 LibjingleTransport::LibjingleTransport(cricket::PortAllocator* port_allocator, 116 LibjingleTransport::LibjingleTransport(cricket::PortAllocator* port_allocator,
125 const NetworkSettings& network_settings, 117 const NetworkSettings& network_settings)
126 TransportRole role)
127 : port_allocator_(port_allocator), 118 : port_allocator_(port_allocator),
128 network_settings_(network_settings), 119 network_settings_(network_settings),
129 role_(role),
130 event_handler_(nullptr), 120 event_handler_(nullptr),
131 ice_username_fragment_( 121 ice_username_fragment_(
132 rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH)), 122 rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH)),
123 ice_password_(rtc::CreateRandomString(cricket::ICE_PWD_LENGTH)),
133 can_start_(false), 124 can_start_(false),
134 connect_attempts_left_(kMaxReconnectAttempts), 125 connect_attempts_left_(kMaxReconnectAttempts),
135 weak_factory_(this) { 126 weak_factory_(this) {
136 DCHECK(!ice_username_fragment_.empty()); 127 DCHECK(!ice_username_fragment_.empty());
128 DCHECK(!ice_password_.empty());
137 } 129 }
138 130
139 LibjingleTransport::~LibjingleTransport() { 131 LibjingleTransport::~LibjingleTransport() {
140 DCHECK(event_handler_); 132 DCHECK(event_handler_);
141 133
142 event_handler_->OnTransportDeleted(this); 134 event_handler_->OnTransportDeleted(this);
143 135
144 if (channel_.get()) { 136 if (channel_.get()) {
145 base::ThreadTaskRunnerHandle::Get()->DeleteSoon( 137 base::ThreadTaskRunnerHandle::Get()->DeleteSoon(
146 FROM_HERE, channel_.release()); 138 FROM_HERE, channel_.release());
147 } 139 }
148 } 140 }
149 141
150 void LibjingleTransport::OnCanStart() { 142 void LibjingleTransport::OnCanStart() {
151 DCHECK(CalledOnValidThread()); 143 DCHECK(CalledOnValidThread());
152 144
153 DCHECK(!can_start_); 145 DCHECK(!can_start_);
154 can_start_ = true; 146 can_start_ = true;
155 147
156 // If Connect() has been called then start connection. 148 // If Connect() has been called then start connection.
157 if (!callback_.is_null()) 149 if (!callback_.is_null())
158 DoStart(); 150 DoStart();
159 151
160 // Pass pending ICE credentials and candidates to the channel.
161 if (!remote_ice_username_fragment_.empty()) {
162 channel_->SetRemoteIceCredentials(remote_ice_username_fragment_,
163 remote_ice_password_);
164 }
165
166 while (!pending_candidates_.empty()) { 152 while (!pending_candidates_.empty()) {
167 if (!use_standard_ice_) { 153 channel_->SetRemoteIceCredentials(pending_candidates_.front().username(),
168 channel_->SetRemoteIceCredentials(pending_candidates_.front().username(), 154 pending_candidates_.front().password());
169 pending_candidates_.front().password());
170 }
171 channel_->OnCandidate(pending_candidates_.front()); 155 channel_->OnCandidate(pending_candidates_.front());
172 pending_candidates_.pop_front(); 156 pending_candidates_.pop_front();
173 } 157 }
174 } 158 }
175 159
176 void LibjingleTransport::Connect( 160 void LibjingleTransport::Connect(
177 const std::string& name, 161 const std::string& name,
178 Transport::EventHandler* event_handler, 162 Transport::EventHandler* event_handler,
179 const Transport::ConnectedCallback& callback) { 163 const Transport::ConnectedCallback& callback) {
180 DCHECK(CalledOnValidThread()); 164 DCHECK(CalledOnValidThread());
(...skipping 10 matching lines...) Expand all
191 DoStart(); 175 DoStart();
192 } 176 }
193 177
194 void LibjingleTransport::DoStart() { 178 void LibjingleTransport::DoStart() {
195 DCHECK(!channel_.get()); 179 DCHECK(!channel_.get());
196 180
197 // Create P2PTransportChannel, attach signal handlers and connect it. 181 // Create P2PTransportChannel, attach signal handlers and connect it.
198 // TODO(sergeyu): Specify correct component ID for the channel. 182 // TODO(sergeyu): Specify correct component ID for the channel.
199 channel_.reset(new cricket::P2PTransportChannel( 183 channel_.reset(new cricket::P2PTransportChannel(
200 std::string(), 0, nullptr, port_allocator_)); 184 std::string(), 0, nullptr, port_allocator_));
201 std::string ice_password = rtc::CreateRandomString(cricket::ICE_PWD_LENGTH); 185 channel_->SetIceProtocolType(cricket::ICEPROTO_GOOGLE);
202 if (use_standard_ice_) { 186 channel_->SetIceCredentials(ice_username_fragment_, ice_password_);
203 channel_->SetIceProtocolType(cricket::ICEPROTO_RFC5245);
204 channel_->SetIceRole((role_ == TransportRole::CLIENT)
205 ? cricket::ICEROLE_CONTROLLING
206 : cricket::ICEROLE_CONTROLLED);
207 event_handler_->OnTransportIceCredentials(this, ice_username_fragment_,
208 ice_password);
209 } else {
210 channel_->SetIceProtocolType(cricket::ICEPROTO_GOOGLE);
211 }
212 channel_->SetIceCredentials(ice_username_fragment_, ice_password);
213 channel_->SignalRequestSignaling.connect( 187 channel_->SignalRequestSignaling.connect(
214 this, &LibjingleTransport::OnRequestSignaling); 188 this, &LibjingleTransport::OnRequestSignaling);
215 channel_->SignalCandidateReady.connect( 189 channel_->SignalCandidateReady.connect(
216 this, &LibjingleTransport::OnCandidateReady); 190 this, &LibjingleTransport::OnCandidateReady);
217 channel_->SignalRouteChange.connect( 191 channel_->SignalRouteChange.connect(
218 this, &LibjingleTransport::OnRouteChange); 192 this, &LibjingleTransport::OnRouteChange);
219 channel_->SignalWritableState.connect( 193 channel_->SignalWritableState.connect(
220 this, &LibjingleTransport::OnWritableState); 194 this, &LibjingleTransport::OnWritableState);
221 channel_->set_incoming_only( 195 channel_->set_incoming_only(
222 !(network_settings_.flags & NetworkSettings::NAT_TRAVERSAL_OUTGOING)); 196 !(network_settings_.flags & NetworkSettings::NAT_TRAVERSAL_OUTGOING));
(...skipping 14 matching lines...) Expand all
237 211
238 void LibjingleTransport::NotifyConnected() { 212 void LibjingleTransport::NotifyConnected() {
239 // Create net::Socket adapter for the P2PTransportChannel. 213 // Create net::Socket adapter for the P2PTransportChannel.
240 scoped_ptr<jingle_glue::TransportChannelSocketAdapter> socket( 214 scoped_ptr<jingle_glue::TransportChannelSocketAdapter> socket(
241 new jingle_glue::TransportChannelSocketAdapter(channel_.get())); 215 new jingle_glue::TransportChannelSocketAdapter(channel_.get()));
242 socket->SetOnDestroyedCallback(base::Bind( 216 socket->SetOnDestroyedCallback(base::Bind(
243 &LibjingleTransport::OnChannelDestroyed, base::Unretained(this))); 217 &LibjingleTransport::OnChannelDestroyed, base::Unretained(this)));
244 base::ResetAndReturn(&callback_).Run(socket.Pass()); 218 base::ResetAndReturn(&callback_).Run(socket.Pass());
245 } 219 }
246 220
247 void LibjingleTransport::SetRemoteCredentials(const std::string& ufrag,
248 const std::string& password) {
249 DCHECK(CalledOnValidThread());
250
251 remote_ice_username_fragment_ = ufrag;
252 remote_ice_password_ = password;
253
254 if (channel_)
255 channel_->SetRemoteIceCredentials(ufrag, password);
256 }
257
258 void LibjingleTransport::AddRemoteCandidate( 221 void LibjingleTransport::AddRemoteCandidate(
259 const cricket::Candidate& candidate) { 222 const cricket::Candidate& candidate) {
260 DCHECK(CalledOnValidThread()); 223 DCHECK(CalledOnValidThread());
261 224
262 // To enforce the no-relay setting, it's not enough to not produce relay 225 // To enforce the no-relay setting, it's not enough to not produce relay
263 // candidates. It's also necessary to discard remote relay candidates. 226 // candidates. It's also necessary to discard remote relay candidates.
264 bool relay_allowed = (network_settings_.flags & 227 bool relay_allowed = (network_settings_.flags &
265 NetworkSettings::NAT_TRAVERSAL_RELAY) != 0; 228 NetworkSettings::NAT_TRAVERSAL_RELAY) != 0;
266 if (!relay_allowed && candidate.type() == cricket::RELAY_PORT_TYPE) 229 if (!relay_allowed && candidate.type() == cricket::RELAY_PORT_TYPE)
267 return; 230 return;
268 231
269 if (channel_) { 232 if (channel_) {
270 if (!use_standard_ice_) { 233 channel_->SetRemoteIceCredentials(candidate.username(),
271 channel_->SetRemoteIceCredentials(candidate.username(), 234 candidate.password());
272 candidate.password());
273 }
274 channel_->OnCandidate(candidate); 235 channel_->OnCandidate(candidate);
275 } else { 236 } else {
276 pending_candidates_.push_back(candidate); 237 pending_candidates_.push_back(candidate);
277 } 238 }
278 } 239 }
279 240
280 const std::string& LibjingleTransport::name() const { 241 const std::string& LibjingleTransport::name() const {
281 DCHECK(CalledOnValidThread()); 242 DCHECK(CalledOnValidThread());
282 return name_; 243 return name_;
283 } 244 }
284 245
285 bool LibjingleTransport::is_connected() const { 246 bool LibjingleTransport::is_connected() const {
286 DCHECK(CalledOnValidThread()); 247 DCHECK(CalledOnValidThread());
287 return callback_.is_null(); 248 return callback_.is_null();
288 } 249 }
289 250
290 void LibjingleTransport::SetUseStandardIce(bool use_standard_ice) {
291 DCHECK(CalledOnValidThread());
292 DCHECK(!channel_);
293 use_standard_ice_ = use_standard_ice;
294 }
295
296 void LibjingleTransport::OnRequestSignaling( 251 void LibjingleTransport::OnRequestSignaling(
297 cricket::TransportChannelImpl* channel) { 252 cricket::TransportChannelImpl* channel) {
298 DCHECK(CalledOnValidThread()); 253 DCHECK(CalledOnValidThread());
299 channel_->OnSignalingReady(); 254 channel_->OnSignalingReady();
300 } 255 }
301 256
302 void LibjingleTransport::OnCandidateReady( 257 void LibjingleTransport::OnCandidateReady(
303 cricket::TransportChannelImpl* channel, 258 cricket::TransportChannelImpl* channel,
304 const cricket::Candidate& candidate) { 259 const cricket::Candidate& candidate) {
305 DCHECK(CalledOnValidThread()); 260 DCHECK(CalledOnValidThread());
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 reconnect_timer_.Stop(); 332 reconnect_timer_.Stop();
378 333
379 // Notify the caller that ICE connection has failed - normally that will 334 // Notify the caller that ICE connection has failed - normally that will
380 // terminate Jingle connection (i.e. the transport will be destroyed). 335 // terminate Jingle connection (i.e. the transport will be destroyed).
381 event_handler_->OnTransportFailed(this); 336 event_handler_->OnTransportFailed(this);
382 return; 337 return;
383 } 338 }
384 --connect_attempts_left_; 339 --connect_attempts_left_;
385 340
386 // Restart ICE by resetting ICE password. 341 // Restart ICE by resetting ICE password.
387 std::string ice_password = rtc::CreateRandomString(cricket::ICE_PWD_LENGTH); 342 ice_password_ = rtc::CreateRandomString(cricket::ICE_PWD_LENGTH);
388 event_handler_->OnTransportIceCredentials(this, ice_username_fragment_, 343 channel_->SetIceCredentials(ice_username_fragment_, ice_password_);
389 ice_password);
390 channel_->SetIceCredentials(ice_username_fragment_, ice_password);
391 } 344 }
392 345
393 } // namespace 346 } // namespace
394 347
395 LibjingleTransportFactory::LibjingleTransportFactory( 348 LibjingleTransportFactory::LibjingleTransportFactory(
396 SignalStrategy* signal_strategy, 349 SignalStrategy* signal_strategy,
397 scoped_ptr<cricket::HttpPortAllocatorBase> port_allocator, 350 scoped_ptr<cricket::HttpPortAllocatorBase> port_allocator,
398 const NetworkSettings& network_settings, 351 const NetworkSettings& network_settings)
399 TransportRole role)
400 : signal_strategy_(signal_strategy), 352 : signal_strategy_(signal_strategy),
401 port_allocator_(port_allocator.Pass()), 353 port_allocator_(port_allocator.Pass()),
402 network_settings_(network_settings), 354 network_settings_(network_settings) {
403 role_(role) {
404 } 355 }
405 356
406 LibjingleTransportFactory::~LibjingleTransportFactory() { 357 LibjingleTransportFactory::~LibjingleTransportFactory() {
407 // This method may be called in response to a libjingle signal, so 358 // This method may be called in response to a libjingle signal, so
408 // libjingle objects must be deleted asynchronously. 359 // libjingle objects must be deleted asynchronously.
409 scoped_refptr<base::SingleThreadTaskRunner> task_runner = 360 scoped_refptr<base::SingleThreadTaskRunner> task_runner =
410 base::ThreadTaskRunnerHandle::Get(); 361 base::ThreadTaskRunnerHandle::Get();
411 task_runner->DeleteSoon(FROM_HERE, port_allocator_.release()); 362 task_runner->DeleteSoon(FROM_HERE, port_allocator_.release());
412 } 363 }
413 364
414 void LibjingleTransportFactory::PrepareTokens() { 365 void LibjingleTransportFactory::PrepareTokens() {
415 EnsureFreshJingleInfo(); 366 EnsureFreshJingleInfo();
416 } 367 }
417 368
418 scoped_ptr<Transport> LibjingleTransportFactory::CreateTransport() { 369 scoped_ptr<Transport> LibjingleTransportFactory::CreateTransport() {
419 scoped_ptr<LibjingleTransport> result( 370 scoped_ptr<LibjingleTransport> result(
420 new LibjingleTransport(port_allocator_.get(), network_settings_, role_)); 371 new LibjingleTransport(port_allocator_.get(), network_settings_));
421 372
422 EnsureFreshJingleInfo(); 373 EnsureFreshJingleInfo();
423 374
424 // If there is a pending |jingle_info_request_| delay starting the new 375 // If there is a pending |jingle_info_request_| delay starting the new
425 // transport until the request is finished. 376 // transport until the request is finished.
426 if (jingle_info_request_) { 377 if (jingle_info_request_) {
427 on_jingle_info_callbacks_.push_back( 378 on_jingle_info_callbacks_.push_back(
428 base::Bind(&LibjingleTransport::OnCanStart, 379 base::Bind(&LibjingleTransport::OnCanStart,
429 result->AsWeakPtr())); 380 result->AsWeakPtr()));
430 } else { 381 } else {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 last_jingle_info_update_time_ = base::TimeTicks::Now(); 418 last_jingle_info_update_time_ = base::TimeTicks::Now();
468 419
469 while (!on_jingle_info_callbacks_.empty()) { 420 while (!on_jingle_info_callbacks_.empty()) {
470 on_jingle_info_callbacks_.begin()->Run(); 421 on_jingle_info_callbacks_.begin()->Run();
471 on_jingle_info_callbacks_.pop_front(); 422 on_jingle_info_callbacks_.pop_front();
472 } 423 }
473 } 424 }
474 425
475 } // namespace protocol 426 } // namespace protocol
476 } // namespace remoting 427 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/protocol/libjingle_transport_factory.h ('k') | remoting/protocol/protocol_mock_objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698