| Index: webrtc/p2p/base/transportdescriptionfactory.cc
|
| diff --git a/webrtc/p2p/base/transportdescriptionfactory.cc b/webrtc/p2p/base/transportdescriptionfactory.cc
|
| index 7654fdfcf504a1abd5f4e97ed8db4c75eee8548f..1230ba52c18dee87447875245c289e048a47f21a 100644
|
| --- a/webrtc/p2p/base/transportdescriptionfactory.cc
|
| +++ b/webrtc/p2p/base/transportdescriptionfactory.cc
|
| @@ -19,8 +19,11 @@
|
|
|
| namespace cricket {
|
|
|
| +static TransportProtocol kDefaultProtocol = ICEPROTO_RFC5245;
|
| +
|
| TransportDescriptionFactory::TransportDescriptionFactory()
|
| - : secure_(SEC_DISABLED),
|
| + : protocol_(kDefaultProtocol),
|
| + secure_(SEC_DISABLED),
|
| identity_(NULL) {
|
| }
|
|
|
| @@ -29,6 +32,16 @@ TransportDescription* TransportDescriptionFactory::CreateOffer(
|
| const TransportDescription* current_description) const {
|
| rtc::scoped_ptr<TransportDescription> desc(new TransportDescription());
|
|
|
| + // Set the transport type depending on the selected protocol.
|
| + if (protocol_ == ICEPROTO_RFC5245) {
|
| + desc->transport_type = NS_JINGLE_ICE_UDP;
|
| + } else if (protocol_ == ICEPROTO_HYBRID) {
|
| + desc->transport_type = NS_JINGLE_ICE_UDP;
|
| + desc->AddOption(ICE_OPTION_GICE);
|
| + } else if (protocol_ == ICEPROTO_GOOGLE) {
|
| + desc->transport_type = NS_GINGLE_P2P;
|
| + }
|
| +
|
| // Generate the ICE credentials if we don't already have them.
|
| if (!current_description || options.ice_restart) {
|
| desc->ice_ufrag = rtc::CreateRandomString(ICE_UFRAG_LENGTH);
|
| @@ -54,14 +67,33 @@ TransportDescription* TransportDescriptionFactory::CreateAnswer(
|
| const TransportDescription* offer,
|
| const TransportOptions& options,
|
| const TransportDescription* current_description) const {
|
| + // A NULL offer is treated as a GICE transport description.
|
| // TODO(juberti): Figure out why we get NULL offers, and fix this upstream.
|
| - if (!offer) {
|
| - LOG(LS_WARNING) << "Failed to create TransportDescription answer " <<
|
| - "because offer is NULL";
|
| + rtc::scoped_ptr<TransportDescription> desc(new TransportDescription());
|
| +
|
| + // Figure out which ICE variant to negotiate; prefer RFC 5245 ICE, but fall
|
| + // back to G-ICE if needed. Note that we never create a hybrid answer, since
|
| + // we know what the other side can support already.
|
| + if (offer && offer->transport_type == NS_JINGLE_ICE_UDP &&
|
| + (protocol_ == ICEPROTO_RFC5245 || protocol_ == ICEPROTO_HYBRID)) {
|
| + // Offer is ICE or hybrid, we support ICE or hybrid: use ICE.
|
| + desc->transport_type = NS_JINGLE_ICE_UDP;
|
| + } else if (offer && offer->transport_type == NS_JINGLE_ICE_UDP &&
|
| + offer->HasOption(ICE_OPTION_GICE) &&
|
| + protocol_ == ICEPROTO_GOOGLE) {
|
| + desc->transport_type = NS_GINGLE_P2P;
|
| + // Offer is hybrid, we support GICE: use GICE.
|
| + } else if ((!offer || offer->transport_type == NS_GINGLE_P2P) &&
|
| + (protocol_ == ICEPROTO_HYBRID || protocol_ == ICEPROTO_GOOGLE)) {
|
| + // Offer is GICE, we support hybrid or GICE: use GICE.
|
| + desc->transport_type = NS_GINGLE_P2P;
|
| + } else {
|
| + // Mismatch.
|
| + LOG(LS_WARNING) << "Failed to create TransportDescription answer "
|
| + "because of incompatible transport types";
|
| return NULL;
|
| }
|
|
|
| - rtc::scoped_ptr<TransportDescription> desc(new TransportDescription());
|
| // Generate the ICE credentials if we don't already have them or ice is
|
| // being restarted.
|
| if (!current_description || options.ice_restart) {
|
| @@ -125,3 +157,4 @@ bool TransportDescriptionFactory::SetSecurityInfo(
|
| }
|
|
|
| } // namespace cricket
|
| +
|
|
|