| Index: webrtc/p2p/base/p2ptransportchannel.cc
 | 
| diff --git a/webrtc/p2p/base/p2ptransportchannel.cc b/webrtc/p2p/base/p2ptransportchannel.cc
 | 
| index 94eb01754d459111533fa7f9a7c71e9e5e3223d1..732e527b789e9639a9525af5b92a35046c3a9e29 100644
 | 
| --- a/webrtc/p2p/base/p2ptransportchannel.cc
 | 
| +++ b/webrtc/p2p/base/p2ptransportchannel.cc
 | 
| @@ -124,14 +124,6 @@ class ConnectionCompare {
 | 
|      cricket::Connection* a = const_cast<cricket::Connection*>(ca);
 | 
|      cricket::Connection* b = const_cast<cricket::Connection*>(cb);
 | 
|  
 | 
| -    // The IceProtocol is initialized to ICEPROTO_HYBRID and can be updated to
 | 
| -    // GICE or RFC5245 when an answer SDP is set, or when a STUN message is
 | 
| -    // received. So the port receiving the STUN message may have a different
 | 
| -    // IceProtocol if the answer SDP is not set yet.
 | 
| -    ASSERT(a->port()->IceProtocol() == b->port()->IceProtocol() ||
 | 
| -           a->port()->IceProtocol() == cricket::ICEPROTO_HYBRID ||
 | 
| -           b->port()->IceProtocol() == cricket::ICEPROTO_HYBRID);
 | 
| -
 | 
|      // Compare first on writability and static preferences.
 | 
|      int cmp = CompareConnections(a, b);
 | 
|      if (cmp > 0)
 | 
| @@ -192,7 +184,6 @@ P2PTransportChannel::P2PTransportChannel(const std::string& content_name,
 | 
|      pending_best_connection_(NULL),
 | 
|      sort_dirty_(false),
 | 
|      was_writable_(false),
 | 
| -    protocol_type_(ICEPROTO_HYBRID),
 | 
|      remote_ice_mode_(ICEMODE_FULL),
 | 
|      ice_role_(ICEROLE_UNKNOWN),
 | 
|      tiebreaker_(0),
 | 
| @@ -294,21 +285,6 @@ TransportChannelState P2PTransportChannel::GetState() const {
 | 
|    return TransportChannelState::STATE_COMPLETED;
 | 
|  }
 | 
|  
 | 
| -bool P2PTransportChannel::GetIceProtocolType(IceProtocolType* type) const {
 | 
| -  *type = protocol_type_;
 | 
| -  return true;
 | 
| -}
 | 
| -
 | 
| -void P2PTransportChannel::SetIceProtocolType(IceProtocolType type) {
 | 
| -  ASSERT(worker_thread_ == rtc::Thread::Current());
 | 
| -
 | 
| -  protocol_type_ = type;
 | 
| -  for (std::vector<PortInterface *>::iterator it = ports_.begin();
 | 
| -       it != ports_.end(); ++it) {
 | 
| -    (*it)->SetIceProtocolType(protocol_type_);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
|  void P2PTransportChannel::SetIceCredentials(const std::string& ice_ufrag,
 | 
|                                              const std::string& ice_pwd) {
 | 
|    ASSERT(worker_thread_ == rtc::Thread::Current());
 | 
| @@ -348,9 +324,8 @@ void P2PTransportChannel::SetRemoteIceCredentials(const std::string& ice_ufrag,
 | 
|    }
 | 
|  
 | 
|    if (ice_restart) {
 | 
| -    // |candidate.generation()| is not signaled in ICEPROTO_RFC5245.
 | 
| -    // Therefore we need to keep track of the remote ice restart so
 | 
| -    // newer connections are prioritized over the older.
 | 
| +    // We need to keep track of the remote ice restart so newer
 | 
| +    // connections are prioritized over the older.
 | 
|      ++remote_candidate_generation_;
 | 
|    }
 | 
|  }
 | 
| @@ -411,7 +386,6 @@ void P2PTransportChannel::OnPortReady(PortAllocatorSession *session,
 | 
|    // The session will handle this, and send an initiate/accept/modify message
 | 
|    // if one is pending.
 | 
|  
 | 
| -  port->SetIceProtocolType(protocol_type_);
 | 
|    port->SetIceRole(ice_role_);
 | 
|    port->SetIceTiebreaker(tiebreaker_);
 | 
|    ports_.push_back(port);
 | 
| @@ -506,46 +480,30 @@ void P2PTransportChannel::OnUnknownAddress(
 | 
|      }
 | 
|    } else {
 | 
|      // Create a new candidate with this address.
 | 
| -    std::string type;
 | 
|      int remote_candidate_priority;
 | 
| -    if (port->IceProtocol() == ICEPROTO_RFC5245) {
 | 
| -      // RFC 5245
 | 
| -      // If the source transport address of the request does not match any
 | 
| -      // existing remote candidates, it represents a new peer reflexive remote
 | 
| -      // candidate.
 | 
| -      type = PRFLX_PORT_TYPE;
 | 
| -
 | 
| -      // The priority of the candidate is set to the PRIORITY attribute
 | 
| -      // from the request.
 | 
| -      const StunUInt32Attribute* priority_attr =
 | 
| -          stun_msg->GetUInt32(STUN_ATTR_PRIORITY);
 | 
| -      if (!priority_attr) {
 | 
| -        LOG(LS_WARNING) << "P2PTransportChannel::OnUnknownAddress - "
 | 
| -                        << "No STUN_ATTR_PRIORITY found in the "
 | 
| -                        << "stun request message";
 | 
| -        port->SendBindingErrorResponse(stun_msg, address,
 | 
| -                                       STUN_ERROR_BAD_REQUEST,
 | 
| -                                       STUN_ERROR_REASON_BAD_REQUEST);
 | 
| -        return;
 | 
| -      }
 | 
| -      remote_candidate_priority = priority_attr->value();
 | 
| -    } else {
 | 
| -      // G-ICE doesn't support prflx candidate.
 | 
| -      // We set candidate type to STUN_PORT_TYPE if the binding request comes
 | 
| -      // from a relay port or the shared socket is used. Otherwise we use the
 | 
| -      // port's type as the candidate type.
 | 
| -      if (port->Type() == RELAY_PORT_TYPE || port->SharedSocket()) {
 | 
| -        type = STUN_PORT_TYPE;
 | 
| -      } else {
 | 
| -        type = port->Type();
 | 
| -      }
 | 
| -      remote_candidate_priority = remote_candidate.GetPriority(
 | 
| -          ICE_TYPE_PREFERENCE_PRFLX, port->Network()->preference(), 0);
 | 
| +
 | 
| +    // The priority of the candidate is set to the PRIORITY attribute
 | 
| +    // from the request.
 | 
| +    const StunUInt32Attribute* priority_attr =
 | 
| +        stun_msg->GetUInt32(STUN_ATTR_PRIORITY);
 | 
| +    if (!priority_attr) {
 | 
| +      LOG(LS_WARNING) << "P2PTransportChannel::OnUnknownAddress - "
 | 
| +                      << "No STUN_ATTR_PRIORITY found in the "
 | 
| +                      << "stun request message";
 | 
| +      port->SendBindingErrorResponse(stun_msg, address,
 | 
| +                                     STUN_ERROR_BAD_REQUEST,
 | 
| +                                     STUN_ERROR_REASON_BAD_REQUEST);
 | 
| +      return;
 | 
|      }
 | 
| +    remote_candidate_priority = priority_attr->value();
 | 
|  
 | 
| +    // RFC 5245
 | 
| +    // If the source transport address of the request does not match any
 | 
| +    // existing remote candidates, it represents a new peer reflexive remote
 | 
| +    // candidate.
 | 
|      remote_candidate =
 | 
|          Candidate(component(), ProtoToString(proto), address, 0,
 | 
| -                  remote_username, remote_password, type, 0U, "");
 | 
| +                  remote_username, remote_password, PRFLX_PORT_TYPE, 0U, "");
 | 
|  
 | 
|      // From RFC 5245, section-7.2.1.3:
 | 
|      // The foundation of the candidate is set to an arbitrary value, different
 | 
| @@ -556,74 +514,49 @@ void P2PTransportChannel::OnUnknownAddress(
 | 
|      remote_candidate.set_priority(remote_candidate_priority);
 | 
|    }
 | 
|  
 | 
| -  if (port->IceProtocol() == ICEPROTO_RFC5245) {
 | 
| -    // RFC5245, the agent constructs a pair whose local candidate is equal to
 | 
| -    // the transport address on which the STUN request was received, and a
 | 
| -    // remote candidate equal to the source transport address where the
 | 
| -    // request came from.
 | 
| -
 | 
| -    // There shouldn't be an existing connection with this remote address.
 | 
| -    // When ports are muxed, this channel might get multiple unknown address
 | 
| -    // signals. In that case if the connection is already exists, we should
 | 
| -    // simply ignore the signal othewise send server error.
 | 
| -    if (port->GetConnection(remote_candidate.address())) {
 | 
| -      if (port_muxed) {
 | 
| -        LOG(LS_INFO) << "Connection already exists for peer reflexive "
 | 
| -                     << "candidate: " << remote_candidate.ToString();
 | 
| -        return;
 | 
| -      } else {
 | 
| -        ASSERT(false);
 | 
| -        port->SendBindingErrorResponse(stun_msg, address,
 | 
| -                                       STUN_ERROR_SERVER_ERROR,
 | 
| -                                       STUN_ERROR_REASON_SERVER_ERROR);
 | 
| -        return;
 | 
| -      }
 | 
| -    }
 | 
| +  // RFC5245, the agent constructs a pair whose local candidate is equal to
 | 
| +  // the transport address on which the STUN request was received, and a
 | 
| +  // remote candidate equal to the source transport address where the
 | 
| +  // request came from.
 | 
|  
 | 
| -    Connection* connection = port->CreateConnection(
 | 
| -        remote_candidate, cricket::PortInterface::ORIGIN_THIS_PORT);
 | 
| -    if (!connection) {
 | 
| +  // There shouldn't be an existing connection with this remote address.
 | 
| +  // When ports are muxed, this channel might get multiple unknown address
 | 
| +  // signals. In that case if the connection is already exists, we should
 | 
| +  // simply ignore the signal othewise send server error.
 | 
| +  if (port->GetConnection(remote_candidate.address())) {
 | 
| +    if (port_muxed) {
 | 
| +      LOG(LS_INFO) << "Connection already exists for peer reflexive "
 | 
| +                   << "candidate: " << remote_candidate.ToString();
 | 
| +      return;
 | 
| +    } else {
 | 
|        ASSERT(false);
 | 
|        port->SendBindingErrorResponse(stun_msg, address,
 | 
|                                       STUN_ERROR_SERVER_ERROR,
 | 
|                                       STUN_ERROR_REASON_SERVER_ERROR);
 | 
|        return;
 | 
|      }
 | 
| +  }
 | 
|  
 | 
| -    LOG(LS_INFO) << "Adding connection from "
 | 
| -                 << (remote_candidate_is_new ? "peer reflexive" : "resurrected")
 | 
| -                 << " candidate: " << remote_candidate.ToString();
 | 
| -    AddConnection(connection);
 | 
| -    connection->ReceivedPing();
 | 
| -
 | 
| -    // Send the pinger a successful stun response.
 | 
| -    port->SendBindingResponse(stun_msg, address);
 | 
| -
 | 
| -    // Update the list of connections since we just added another.  We do this
 | 
| -    // after sending the response since it could (in principle) delete the
 | 
| -    // connection in question.
 | 
| -    SortConnections();
 | 
| -  } else {
 | 
| -    // Check for connectivity to this address. Create connections
 | 
| -    // to this address across all local ports. First, add this as a new remote
 | 
| -    // address
 | 
| -    if (!CreateConnections(remote_candidate, port, true)) {
 | 
| -      // Hopefully this won't occur, because changing a destination address
 | 
| -      // shouldn't cause a new connection to fail
 | 
| -      ASSERT(false);
 | 
| -      port->SendBindingErrorResponse(stun_msg, address, STUN_ERROR_SERVER_ERROR,
 | 
| -          STUN_ERROR_REASON_SERVER_ERROR);
 | 
| -      return;
 | 
| -    }
 | 
| +  Connection* connection = port->CreateConnection(
 | 
| +      remote_candidate, cricket::PortInterface::ORIGIN_THIS_PORT);
 | 
| +  if (!connection) {
 | 
| +    ASSERT(false);
 | 
| +    port->SendBindingErrorResponse(stun_msg, address,
 | 
| +                                   STUN_ERROR_SERVER_ERROR,
 | 
| +                                   STUN_ERROR_REASON_SERVER_ERROR);
 | 
| +    return;
 | 
| +  }
 | 
|  
 | 
| -    // Send the pinger a successful stun response.
 | 
| -    port->SendBindingResponse(stun_msg, address);
 | 
| +  LOG(LS_INFO) << "Adding connection from "
 | 
| +               << (remote_candidate_is_new ? "peer reflexive" : "resurrected")
 | 
| +               << " candidate: " << remote_candidate.ToString();
 | 
| +  AddConnection(connection);
 | 
| +  connection->ReceivedPing();
 | 
|  
 | 
| -    // Update the list of connections since we just added another.  We do this
 | 
| -    // after sending the response since it could (in principle) delete the
 | 
| -    // connection in question.
 | 
| -    SortConnections();
 | 
| -  }
 | 
| +  // Update the list of connections since we just added another.  We do this
 | 
| +  // after sending the response since it could (in principle) delete the
 | 
| +  // connection in question.
 | 
| +  SortConnections();
 | 
|  }
 | 
|  
 | 
|  void P2PTransportChannel::OnRoleConflict(PortInterface* port) {
 | 
| @@ -644,7 +577,6 @@ void P2PTransportChannel::OnSignalingReady() {
 | 
|  void P2PTransportChannel::OnUseCandidate(Connection* conn) {
 | 
|    ASSERT(worker_thread_ == rtc::Thread::Current());
 | 
|    ASSERT(ice_role_ == ICEROLE_CONTROLLED);
 | 
| -  ASSERT(protocol_type_ == ICEPROTO_RFC5245);
 | 
|  
 | 
|    if (conn->write_state() == Connection::STATE_WRITABLE) {
 | 
|      if (best_connection_ != conn) {
 | 
| @@ -803,13 +735,8 @@ bool P2PTransportChannel::FindConnection(
 | 
|  
 | 
|  uint32 P2PTransportChannel::GetRemoteCandidateGeneration(
 | 
|      const Candidate& candidate) {
 | 
| -  if (protocol_type_ == ICEPROTO_GOOGLE) {
 | 
| -    // The Candidate.generation() can be trusted. Nothing needs to be done.
 | 
| -    return candidate.generation();
 | 
| -  }
 | 
| -  // |candidate.generation()| is not signaled in ICEPROTO_RFC5245.
 | 
| -  // Therefore we need to keep track of the remote ice restart so
 | 
| -  // newer connections are prioritized over the older.
 | 
| +  // We need to keep track of the remote ice restart so newer
 | 
| +  // connections are prioritized over the older.
 | 
|    ASSERT(candidate.generation() == 0 ||
 | 
|           candidate.generation() == remote_candidate_generation_);
 | 
|    return remote_candidate_generation_;
 | 
| @@ -987,15 +914,6 @@ void P2PTransportChannel::SortConnections() {
 | 
|    // will be sorted.
 | 
|    UpdateConnectionStates();
 | 
|  
 | 
| -  if (protocol_type_ == ICEPROTO_HYBRID) {
 | 
| -    // If we are in hybrid mode, we are not sending any ping requests, so there
 | 
| -    // is no point in sorting the connections. In hybrid state, ports can have
 | 
| -    // different protocol than hybrid and protocol may differ from one another.
 | 
| -    // Instead just update the state of this channel
 | 
| -    UpdateChannelState();
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
|    // Any changes after this point will require a re-sort.
 | 
|    sort_dirty_ = false;
 | 
|  
 | 
| @@ -1020,12 +938,12 @@ void P2PTransportChannel::SortConnections() {
 | 
|    if (connections_.size() > 0)
 | 
|      top_connection = connections_[0];
 | 
|  
 | 
| -  // We don't want to pick the best connections if channel is using RFC5245
 | 
| -  // and it's mode is CONTROLLED, as connections will be selected by the
 | 
| -  // CONTROLLING agent.
 | 
| +  // We don't want to pick the best connections if channel is
 | 
| +  // CONTROLLED, as connections will be selected by the CONTROLLING
 | 
| +  // agent.
 | 
|  
 | 
|    // If necessary, switch to the new choice.
 | 
| -  if (protocol_type_ != ICEPROTO_RFC5245 || ice_role_ == ICEROLE_CONTROLLING) {
 | 
| +  if (ice_role_ == ICEROLE_CONTROLLING) {
 | 
|      if (ShouldSwitch(best_connection_, top_connection)) {
 | 
|        LOG(LS_INFO) << "Switching best connection on controlling side: "
 | 
|                     << top_connection->ToString();
 | 
| @@ -1284,8 +1202,7 @@ Connection* P2PTransportChannel::FindNextPingableConnection() {
 | 
|        continue;
 | 
|      }
 | 
|      bool needs_triggered_check =
 | 
| -        (protocol_type_ == ICEPROTO_RFC5245 &&
 | 
| -         !conn->writable() &&
 | 
| +        (!conn->writable() &&
 | 
|           conn->last_ping_received() > conn->last_ping_sent());
 | 
|      if (needs_triggered_check &&
 | 
|          (!oldest_needing_triggered_check ||
 | 
| @@ -1320,15 +1237,13 @@ Connection* P2PTransportChannel::FindNextPingableConnection() {
 | 
|  //      b.2) |conn| is writable.
 | 
|  void P2PTransportChannel::PingConnection(Connection* conn) {
 | 
|    bool use_candidate = false;
 | 
| -  if (protocol_type_ == ICEPROTO_RFC5245) {
 | 
| -    if (remote_ice_mode_ == ICEMODE_FULL && ice_role_ == ICEROLE_CONTROLLING) {
 | 
| -      use_candidate = (conn == best_connection_) ||
 | 
| -                      (best_connection_ == NULL) ||
 | 
| -                      (!best_connection_->writable()) ||
 | 
| -                      (conn->priority() > best_connection_->priority());
 | 
| -    } else if (remote_ice_mode_ == ICEMODE_LITE && conn == best_connection_) {
 | 
| -      use_candidate = best_connection_->writable();
 | 
| -    }
 | 
| +  if (remote_ice_mode_ == ICEMODE_FULL && ice_role_ == ICEROLE_CONTROLLING) {
 | 
| +    use_candidate = (conn == best_connection_) ||
 | 
| +                    (best_connection_ == NULL) ||
 | 
| +                    (!best_connection_->writable()) ||
 | 
| +                    (conn->priority() > best_connection_->priority());
 | 
| +  } else if (remote_ice_mode_ == ICEMODE_LITE && conn == best_connection_) {
 | 
| +    use_candidate = best_connection_->writable();
 | 
|    }
 | 
|    conn->set_use_candidate_attr(use_candidate);
 | 
|    conn->Ping(rtc::Time());
 | 
| @@ -1341,7 +1256,7 @@ void P2PTransportChannel::OnConnectionStateChange(Connection* connection) {
 | 
|  
 | 
|    // Update the best connection if the state change is from pending best
 | 
|    // connection and role is controlled.
 | 
| -  if (protocol_type_ == ICEPROTO_RFC5245 && ice_role_ == ICEROLE_CONTROLLED) {
 | 
| +  if (ice_role_ == ICEROLE_CONTROLLED) {
 | 
|      if (connection == pending_best_connection_ && connection->writable()) {
 | 
|        pending_best_connection_ = NULL;
 | 
|        LOG(LS_INFO) << "Switching best connection on controlled side"
 | 
| 
 |