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

Unified Diff: remoting/protocol/libjingle_transport_factory.cc

Issue 1085703003: Use standard ICE in Chromoting. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix crash on memory bots 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/protocol/libjingle_transport_factory.h ('k') | remoting/protocol/protocol_mock_objects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/protocol/libjingle_transport_factory.cc
diff --git a/remoting/protocol/libjingle_transport_factory.cc b/remoting/protocol/libjingle_transport_factory.cc
index 151d329f85827c3aeb27ba02df9c58344b0f1790..10124bd0d1f95a368e1190edfc670b82bc18ced1 100644
--- a/remoting/protocol/libjingle_transport_factory.cc
+++ b/remoting/protocol/libjingle_transport_factory.cc
@@ -41,7 +41,7 @@ TransportRoute::RouteType CandidateTypeToTransportRouteType(
const std::string& candidate_type) {
if (candidate_type == "local") {
return TransportRoute::DIRECT;
- } else if (candidate_type == "stun") {
+ } else if (candidate_type == "stun" || candidate_type == "prflx") {
return TransportRoute::STUN;
} else if (candidate_type == "relay") {
return TransportRoute::RELAY;
@@ -57,7 +57,8 @@ class LibjingleTransport
public sigslot::has_slots<> {
public:
LibjingleTransport(cricket::PortAllocator* port_allocator,
- const NetworkSettings& network_settings);
+ const NetworkSettings& network_settings,
+ TransportRole role);
~LibjingleTransport() override;
// Called by JingleTransportFactory when it has fresh Jingle info.
@@ -67,9 +68,12 @@ class LibjingleTransport
void Connect(const std::string& name,
Transport::EventHandler* event_handler,
const Transport::ConnectedCallback& callback) override;
+ void SetRemoteCredentials(const std::string& ufrag,
+ const std::string& password) override;
void AddRemoteCandidate(const cricket::Candidate& candidate) override;
const std::string& name() const override;
bool is_connected() const override;
+ void SetUseStandardIce(bool use_standard_ice) override;
private:
void DoStart();
@@ -94,15 +98,19 @@ class LibjingleTransport
cricket::PortAllocator* port_allocator_;
NetworkSettings network_settings_;
+ TransportRole role_;
+
+ bool use_standard_ice_ = true;
std::string name_;
EventHandler* event_handler_;
Transport::ConnectedCallback callback_;
std::string ice_username_fragment_;
- std::string ice_password_;
bool can_start_;
+ std::string remote_ice_username_fragment_;
+ std::string remote_ice_password_;
std::list<cricket::Candidate> pending_candidates_;
scoped_ptr<cricket::P2PTransportChannel> channel_;
int connect_attempts_left_;
@@ -114,18 +122,18 @@ class LibjingleTransport
};
LibjingleTransport::LibjingleTransport(cricket::PortAllocator* port_allocator,
- const NetworkSettings& network_settings)
+ const NetworkSettings& network_settings,
+ TransportRole role)
: port_allocator_(port_allocator),
network_settings_(network_settings),
+ role_(role),
event_handler_(nullptr),
ice_username_fragment_(
rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH)),
- ice_password_(rtc::CreateRandomString(cricket::ICE_PWD_LENGTH)),
can_start_(false),
connect_attempts_left_(kMaxReconnectAttempts),
weak_factory_(this) {
DCHECK(!ice_username_fragment_.empty());
- DCHECK(!ice_password_.empty());
}
LibjingleTransport::~LibjingleTransport() {
@@ -149,9 +157,17 @@ void LibjingleTransport::OnCanStart() {
if (!callback_.is_null())
DoStart();
+ // Pass pending ICE credentials and candidates to the channel.
+ if (!remote_ice_username_fragment_.empty()) {
+ channel_->SetRemoteIceCredentials(remote_ice_username_fragment_,
+ remote_ice_password_);
+ }
+
while (!pending_candidates_.empty()) {
- channel_->SetRemoteIceCredentials(pending_candidates_.front().username(),
- pending_candidates_.front().password());
+ if (!use_standard_ice_) {
+ channel_->SetRemoteIceCredentials(pending_candidates_.front().username(),
+ pending_candidates_.front().password());
+ }
channel_->OnCandidate(pending_candidates_.front());
pending_candidates_.pop_front();
}
@@ -182,8 +198,18 @@ void LibjingleTransport::DoStart() {
// TODO(sergeyu): Specify correct component ID for the channel.
channel_.reset(new cricket::P2PTransportChannel(
std::string(), 0, nullptr, port_allocator_));
- channel_->SetIceProtocolType(cricket::ICEPROTO_GOOGLE);
- channel_->SetIceCredentials(ice_username_fragment_, ice_password_);
+ std::string ice_password = rtc::CreateRandomString(cricket::ICE_PWD_LENGTH);
+ if (use_standard_ice_) {
+ channel_->SetIceProtocolType(cricket::ICEPROTO_RFC5245);
+ channel_->SetIceRole((role_ == TransportRole::CLIENT)
+ ? cricket::ICEROLE_CONTROLLING
+ : cricket::ICEROLE_CONTROLLED);
+ event_handler_->OnTransportIceCredentials(this, ice_username_fragment_,
+ ice_password);
+ } else {
+ channel_->SetIceProtocolType(cricket::ICEPROTO_GOOGLE);
+ }
+ channel_->SetIceCredentials(ice_username_fragment_, ice_password);
channel_->SignalRequestSignaling.connect(
this, &LibjingleTransport::OnRequestSignaling);
channel_->SignalCandidateReady.connect(
@@ -218,6 +244,17 @@ void LibjingleTransport::NotifyConnected() {
base::ResetAndReturn(&callback_).Run(socket.Pass());
}
+void LibjingleTransport::SetRemoteCredentials(const std::string& ufrag,
+ const std::string& password) {
+ DCHECK(CalledOnValidThread());
+
+ remote_ice_username_fragment_ = ufrag;
+ remote_ice_password_ = password;
+
+ if (channel_)
+ channel_->SetRemoteIceCredentials(ufrag, password);
+}
+
void LibjingleTransport::AddRemoteCandidate(
const cricket::Candidate& candidate) {
DCHECK(CalledOnValidThread());
@@ -230,8 +267,10 @@ void LibjingleTransport::AddRemoteCandidate(
return;
if (channel_) {
- channel_->SetRemoteIceCredentials(candidate.username(),
- candidate.password());
+ if (!use_standard_ice_) {
+ channel_->SetRemoteIceCredentials(candidate.username(),
+ candidate.password());
+ }
channel_->OnCandidate(candidate);
} else {
pending_candidates_.push_back(candidate);
@@ -248,6 +287,12 @@ bool LibjingleTransport::is_connected() const {
return callback_.is_null();
}
+void LibjingleTransport::SetUseStandardIce(bool use_standard_ice) {
+ DCHECK(CalledOnValidThread());
+ DCHECK(!channel_);
+ use_standard_ice_ = use_standard_ice;
+}
+
void LibjingleTransport::OnRequestSignaling(
cricket::TransportChannelImpl* channel) {
DCHECK(CalledOnValidThread());
@@ -339,8 +384,10 @@ void LibjingleTransport::TryReconnect() {
--connect_attempts_left_;
// Restart ICE by resetting ICE password.
- ice_password_ = rtc::CreateRandomString(cricket::ICE_PWD_LENGTH);
- channel_->SetIceCredentials(ice_username_fragment_, ice_password_);
+ std::string ice_password = rtc::CreateRandomString(cricket::ICE_PWD_LENGTH);
+ event_handler_->OnTransportIceCredentials(this, ice_username_fragment_,
+ ice_password);
+ channel_->SetIceCredentials(ice_username_fragment_, ice_password);
}
} // namespace
@@ -348,10 +395,12 @@ void LibjingleTransport::TryReconnect() {
LibjingleTransportFactory::LibjingleTransportFactory(
SignalStrategy* signal_strategy,
scoped_ptr<cricket::HttpPortAllocatorBase> port_allocator,
- const NetworkSettings& network_settings)
+ const NetworkSettings& network_settings,
+ TransportRole role)
: signal_strategy_(signal_strategy),
port_allocator_(port_allocator.Pass()),
- network_settings_(network_settings) {
+ network_settings_(network_settings),
+ role_(role) {
}
LibjingleTransportFactory::~LibjingleTransportFactory() {
@@ -368,7 +417,7 @@ void LibjingleTransportFactory::PrepareTokens() {
scoped_ptr<Transport> LibjingleTransportFactory::CreateTransport() {
scoped_ptr<LibjingleTransport> result(
- new LibjingleTransport(port_allocator_.get(), network_settings_));
+ new LibjingleTransport(port_allocator_.get(), network_settings_, role_));
EnsureFreshJingleInfo();
« 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