| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2013 Google Inc. | 3 * Copyright 2013 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 JsepSessionDescription* offer(new JsepSessionDescription( | 385 JsepSessionDescription* offer(new JsepSessionDescription( |
| 386 JsepSessionDescription::kOffer)); | 386 JsepSessionDescription::kOffer)); |
| 387 if (!offer->Initialize(desc, session_id_, | 387 if (!offer->Initialize(desc, session_id_, |
| 388 rtc::ToString(session_version_++))) { | 388 rtc::ToString(session_version_++))) { |
| 389 delete offer; | 389 delete offer; |
| 390 PostCreateSessionDescriptionFailed(request.observer, | 390 PostCreateSessionDescriptionFailed(request.observer, |
| 391 "Failed to initialize the offer."); | 391 "Failed to initialize the offer."); |
| 392 return; | 392 return; |
| 393 } | 393 } |
| 394 if (session_->local_description() && | 394 if (session_->local_description() && |
| 395 !request.options.transport_options.ice_restart) { | 395 !request.options.audio_transport_options.ice_restart && |
| 396 !request.options.video_transport_options.ice_restart && |
| 397 !request.options.data_transport_options.ice_restart) { |
| 396 // Include all local ice candidates in the SessionDescription unless | 398 // Include all local ice candidates in the SessionDescription unless |
| 397 // the an ice restart has been requested. | 399 // the an ice restart has been requested. |
| 398 CopyCandidatesFromSessionDescription(session_->local_description(), offer); | 400 CopyCandidatesFromSessionDescription(session_->local_description(), offer); |
| 399 } | 401 } |
| 400 PostCreateSessionDescriptionSucceeded(request.observer, offer); | 402 PostCreateSessionDescriptionSucceeded(request.observer, offer); |
| 401 } | 403 } |
| 402 | 404 |
| 403 void WebRtcSessionDescriptionFactory::InternalCreateAnswer( | 405 void WebRtcSessionDescriptionFactory::InternalCreateAnswer( |
| 404 CreateSessionDescriptionRequest request) { | 406 CreateSessionDescriptionRequest request) { |
| 405 // According to http://tools.ietf.org/html/rfc5245#section-9.2.1.1 | 407 // According to http://tools.ietf.org/html/rfc5245#section-9.2.1.1 |
| 406 // an answer should also contain new ice ufrag and password if an offer has | 408 // an answer should also contain new ice ufrag and password if an offer has |
| 407 // been received with new ufrag and password. | 409 // been received with new ufrag and password. |
| 408 request.options.transport_options.ice_restart = session_->IceRestartPending(); | 410 request.options.audio_transport_options.ice_restart = |
| 411 session_->IceRestartPending(); |
| 412 request.options.video_transport_options.ice_restart = |
| 413 session_->IceRestartPending(); |
| 414 request.options.data_transport_options.ice_restart = |
| 415 session_->IceRestartPending(); |
| 409 // We should pass current ssl role to the transport description factory, if | 416 // We should pass current ssl role to the transport description factory, if |
| 410 // there is already an existing ongoing session. | 417 // there is already an existing ongoing session. |
| 411 rtc::SSLRole ssl_role; | 418 rtc::SSLRole ssl_role; |
| 412 if (session_->GetSslRole(&ssl_role)) { | 419 if (session_->voice_channel() && |
| 413 request.options.transport_options.prefer_passive_role = | 420 session_->GetSslRole(session_->voice_channel()->transport_name(), |
| 421 &ssl_role)) { |
| 422 request.options.audio_transport_options.prefer_passive_role = |
| 423 (rtc::SSL_SERVER == ssl_role); |
| 424 } |
| 425 if (session_->video_channel() && |
| 426 session_->GetSslRole(session_->video_channel()->transport_name(), |
| 427 &ssl_role)) { |
| 428 request.options.video_transport_options.prefer_passive_role = |
| 429 (rtc::SSL_SERVER == ssl_role); |
| 430 } |
| 431 if (session_->data_channel() && |
| 432 session_->GetSslRole(session_->data_channel()->transport_name(), |
| 433 &ssl_role)) { |
| 434 request.options.data_transport_options.prefer_passive_role = |
| 414 (rtc::SSL_SERVER == ssl_role); | 435 (rtc::SSL_SERVER == ssl_role); |
| 415 } | 436 } |
| 416 | 437 |
| 417 cricket::SessionDescription* desc(session_desc_factory_.CreateAnswer( | 438 cricket::SessionDescription* desc(session_desc_factory_.CreateAnswer( |
| 418 session_->remote_description() | 439 session_->remote_description() |
| 419 ? session_->remote_description()->description() | 440 ? session_->remote_description()->description() |
| 420 : nullptr, | 441 : nullptr, |
| 421 request.options, session_->local_description() | 442 request.options, session_->local_description() |
| 422 ? session_->local_description()->description() | 443 ? session_->local_description()->description() |
| 423 : nullptr)); | 444 : nullptr)); |
| 424 // RFC 3264 | 445 // RFC 3264 |
| 425 // If the answer is different from the offer in any way (different IP | 446 // If the answer is different from the offer in any way (different IP |
| 426 // addresses, ports, etc.), the origin line MUST be different in the answer. | 447 // addresses, ports, etc.), the origin line MUST be different in the answer. |
| 427 // In that case, the version number in the "o=" line of the answer is | 448 // In that case, the version number in the "o=" line of the answer is |
| 428 // unrelated to the version number in the o line of the offer. | 449 // unrelated to the version number in the o line of the offer. |
| 429 // Get a new version number by increasing the |session_version_answer_|. | 450 // Get a new version number by increasing the |session_version_answer_|. |
| 430 // The |session_version_| is a uint64_t, the wrap around should not happen. | 451 // The |session_version_| is a uint64_t, the wrap around should not happen. |
| 431 ASSERT(session_version_ + 1 > session_version_); | 452 ASSERT(session_version_ + 1 > session_version_); |
| 432 JsepSessionDescription* answer(new JsepSessionDescription( | 453 JsepSessionDescription* answer(new JsepSessionDescription( |
| 433 JsepSessionDescription::kAnswer)); | 454 JsepSessionDescription::kAnswer)); |
| 434 if (!answer->Initialize(desc, session_id_, | 455 if (!answer->Initialize(desc, session_id_, |
| 435 rtc::ToString(session_version_++))) { | 456 rtc::ToString(session_version_++))) { |
| 436 delete answer; | 457 delete answer; |
| 437 PostCreateSessionDescriptionFailed(request.observer, | 458 PostCreateSessionDescriptionFailed(request.observer, |
| 438 "Failed to initialize the answer."); | 459 "Failed to initialize the answer."); |
| 439 return; | 460 return; |
| 440 } | 461 } |
| 441 if (session_->local_description() && | 462 if (session_->local_description() && |
| 442 !request.options.transport_options.ice_restart) { | 463 !request.options.audio_transport_options.ice_restart && |
| 464 !request.options.video_transport_options.ice_restart && |
| 465 !request.options.data_transport_options.ice_restart) { |
| 443 // Include all local ice candidates in the SessionDescription unless | 466 // Include all local ice candidates in the SessionDescription unless |
| 444 // the remote peer has requested an ice restart. | 467 // the remote peer has requested an ice restart. |
| 445 CopyCandidatesFromSessionDescription(session_->local_description(), answer); | 468 CopyCandidatesFromSessionDescription(session_->local_description(), answer); |
| 446 } | 469 } |
| 447 session_->ResetIceRestartLatch(); | 470 session_->ResetIceRestartLatch(); |
| 448 PostCreateSessionDescriptionSucceeded(request.observer, answer); | 471 PostCreateSessionDescriptionSucceeded(request.observer, answer); |
| 449 } | 472 } |
| 450 | 473 |
| 451 void WebRtcSessionDescriptionFactory::FailPendingRequests( | 474 void WebRtcSessionDescriptionFactory::FailPendingRequests( |
| 452 const std::string& reason) { | 475 const std::string& reason) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 if (create_session_description_requests_.front().type == | 524 if (create_session_description_requests_.front().type == |
| 502 CreateSessionDescriptionRequest::kOffer) { | 525 CreateSessionDescriptionRequest::kOffer) { |
| 503 InternalCreateOffer(create_session_description_requests_.front()); | 526 InternalCreateOffer(create_session_description_requests_.front()); |
| 504 } else { | 527 } else { |
| 505 InternalCreateAnswer(create_session_description_requests_.front()); | 528 InternalCreateAnswer(create_session_description_requests_.front()); |
| 506 } | 529 } |
| 507 create_session_description_requests_.pop(); | 530 create_session_description_requests_.pop(); |
| 508 } | 531 } |
| 509 } | 532 } |
| 510 } // namespace webrtc | 533 } // namespace webrtc |
| OLD | NEW |