| 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();
|
|
|
|
|