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

Side by Side Diff: webrtc/api/webrtcsession.cc

Issue 2564333002: Reland of: Separating SCTP code from BaseChannel/MediaChannel. (Closed)
Patch Set: Another attempt. Created 3 years, 12 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 15 matching lines...) Expand all
26 #include "webrtc/base/basictypes.h" 26 #include "webrtc/base/basictypes.h"
27 #include "webrtc/base/bind.h" 27 #include "webrtc/base/bind.h"
28 #include "webrtc/base/checks.h" 28 #include "webrtc/base/checks.h"
29 #include "webrtc/base/helpers.h" 29 #include "webrtc/base/helpers.h"
30 #include "webrtc/base/logging.h" 30 #include "webrtc/base/logging.h"
31 #include "webrtc/base/stringencode.h" 31 #include "webrtc/base/stringencode.h"
32 #include "webrtc/base/stringutils.h" 32 #include "webrtc/base/stringutils.h"
33 #include "webrtc/call/call.h" 33 #include "webrtc/call/call.h"
34 #include "webrtc/media/base/mediaconstants.h" 34 #include "webrtc/media/base/mediaconstants.h"
35 #include "webrtc/media/base/videocapturer.h" 35 #include "webrtc/media/base/videocapturer.h"
36 #include "webrtc/media/sctp/sctptransportinternal.h"
36 #include "webrtc/p2p/base/portallocator.h" 37 #include "webrtc/p2p/base/portallocator.h"
37 #include "webrtc/p2p/base/transportchannel.h" 38 #include "webrtc/p2p/base/transportchannel.h"
38 #include "webrtc/pc/channel.h" 39 #include "webrtc/pc/channel.h"
39 #include "webrtc/pc/channelmanager.h" 40 #include "webrtc/pc/channelmanager.h"
40 #include "webrtc/pc/mediasession.h" 41 #include "webrtc/pc/mediasession.h"
41 42
42 #ifdef HAVE_QUIC 43 #ifdef HAVE_QUIC
43 #include "webrtc/p2p/quic/quictransportchannel.h" 44 #include "webrtc/p2p/quic/quictransportchannel.h"
44 #endif // HAVE_QUIC 45 #endif // HAVE_QUIC
45 46
(...skipping 21 matching lines...) Expand all
67 const char kPushDownTDFailed[] = 68 const char kPushDownTDFailed[] =
68 "Failed to push down transport description:"; 69 "Failed to push down transport description:";
69 const char kSdpWithoutDtlsFingerprint[] = 70 const char kSdpWithoutDtlsFingerprint[] =
70 "Called with SDP without DTLS fingerprint."; 71 "Called with SDP without DTLS fingerprint.";
71 const char kSdpWithoutSdesCrypto[] = 72 const char kSdpWithoutSdesCrypto[] =
72 "Called with SDP without SDES crypto."; 73 "Called with SDP without SDES crypto.";
73 const char kSdpWithoutIceUfragPwd[] = 74 const char kSdpWithoutIceUfragPwd[] =
74 "Called with SDP without ice-ufrag and ice-pwd."; 75 "Called with SDP without ice-ufrag and ice-pwd.";
75 const char kSessionError[] = "Session error code: "; 76 const char kSessionError[] = "Session error code: ";
76 const char kSessionErrorDesc[] = "Session error description: "; 77 const char kSessionErrorDesc[] = "Session error description: ";
77 const char kDtlsSetupFailureRtp[] = 78 const char kDtlsSrtpSetupFailureRtp[] =
78 "Couldn't set up DTLS-SRTP on RTP channel."; 79 "Couldn't set up DTLS-SRTP on RTP channel.";
79 const char kDtlsSetupFailureRtcp[] = 80 const char kDtlsSrtpSetupFailureRtcp[] =
80 "Couldn't set up DTLS-SRTP on RTCP channel."; 81 "Couldn't set up DTLS-SRTP on RTCP channel.";
81 const char kEnableBundleFailed[] = "Failed to enable BUNDLE."; 82 const char kEnableBundleFailed[] = "Failed to enable BUNDLE.";
82 83
83 IceCandidatePairType GetIceCandidatePairCounter( 84 IceCandidatePairType GetIceCandidatePairCounter(
84 const cricket::Candidate& local, 85 const cricket::Candidate& local,
85 const cricket::Candidate& remote) { 86 const cricket::Candidate& remote) {
86 const auto& l = local.type(); 87 const auto& l = local.type();
87 const auto& r = remote.type(); 88 const auto& r = remote.type();
88 const auto& host = LOCAL_PORT_TYPE; 89 const auto& host = LOCAL_PORT_TYPE;
89 const auto& srflx = STUN_PORT_TYPE; 90 const auto& srflx = STUN_PORT_TYPE;
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 const auto* found = 285 const auto* found =
285 cricket::GetStreamBySsrc(video_content->streams(), ssrc); 286 cricket::GetStreamBySsrc(video_content->streams(), ssrc);
286 if (found) { 287 if (found) {
287 *track_id = found->id; 288 *track_id = found->id;
288 return true; 289 return true;
289 } 290 }
290 } 291 }
291 return false; 292 return false;
292 } 293 }
293 294
295 // Get the SCTP port out of a SessionDescription.
296 // Return -1 if not found.
297 static int GetSctpPort(const SessionDescription* session_description) {
298 const ContentInfo* content_info = GetFirstDataContent(session_description);
299 RTC_DCHECK(content_info);
300 if (!content_info) {
301 return -1;
302 }
303 const cricket::DataContentDescription* data =
304 static_cast<const cricket::DataContentDescription*>(
305 (content_info->description));
306 std::string value;
307 cricket::DataCodec match_pattern(cricket::kGoogleSctpDataCodecPlType,
308 cricket::kGoogleSctpDataCodecName);
309 for (const cricket::DataCodec& codec : data->codecs()) {
310 if (!codec.Matches(match_pattern)) {
311 continue;
312 }
313 if (codec.GetParam(cricket::kCodecParamPort, &value)) {
314 return rtc::FromString<int>(value);
315 }
316 }
317 return -1;
318 }
319
294 static bool BadSdp(const std::string& source, 320 static bool BadSdp(const std::string& source,
295 const std::string& type, 321 const std::string& type,
296 const std::string& reason, 322 const std::string& reason,
297 std::string* err_desc) { 323 std::string* err_desc) {
298 std::ostringstream desc; 324 std::ostringstream desc;
299 desc << "Failed to set " << source; 325 desc << "Failed to set " << source;
300 if (!type.empty()) { 326 if (!type.empty()) {
301 desc << " " << type; 327 desc << " " << type;
302 } 328 }
303 desc << " sdp: " << reason; 329 desc << " sdp: " << reason;
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 } 459 }
434 return false; 460 return false;
435 } 461 }
436 462
437 WebRtcSession::WebRtcSession( 463 WebRtcSession::WebRtcSession(
438 webrtc::MediaControllerInterface* media_controller, 464 webrtc::MediaControllerInterface* media_controller,
439 rtc::Thread* network_thread, 465 rtc::Thread* network_thread,
440 rtc::Thread* worker_thread, 466 rtc::Thread* worker_thread,
441 rtc::Thread* signaling_thread, 467 rtc::Thread* signaling_thread,
442 cricket::PortAllocator* port_allocator, 468 cricket::PortAllocator* port_allocator,
443 std::unique_ptr<cricket::TransportController> transport_controller) 469 std::unique_ptr<cricket::TransportController> transport_controller,
470 std::unique_ptr<cricket::SctpTransportInternalFactory> sctp_factory)
444 : network_thread_(network_thread), 471 : network_thread_(network_thread),
445 worker_thread_(worker_thread), 472 worker_thread_(worker_thread),
446 signaling_thread_(signaling_thread), 473 signaling_thread_(signaling_thread),
447 // RFC 3264: The numeric value of the session id and version in the 474 // RFC 3264: The numeric value of the session id and version in the
448 // o line MUST be representable with a "64 bit signed integer". 475 // o line MUST be representable with a "64 bit signed integer".
449 // Due to this constraint session id |sid_| is max limited to LLONG_MAX. 476 // Due to this constraint session id |sid_| is max limited to LLONG_MAX.
450 sid_(rtc::ToString(rtc::CreateRandomId64() & LLONG_MAX)), 477 sid_(rtc::ToString(rtc::CreateRandomId64() & LLONG_MAX)),
451 transport_controller_(std::move(transport_controller)), 478 transport_controller_(std::move(transport_controller)),
479 sctp_factory_(std::move(sctp_factory)),
452 media_controller_(media_controller), 480 media_controller_(media_controller),
453 channel_manager_(media_controller_->channel_manager()), 481 channel_manager_(media_controller_->channel_manager()),
454 ice_observer_(NULL), 482 ice_observer_(NULL),
455 ice_connection_state_(PeerConnectionInterface::kIceConnectionNew), 483 ice_connection_state_(PeerConnectionInterface::kIceConnectionNew),
456 ice_connection_receiving_(true), 484 ice_connection_receiving_(true),
457 older_version_remote_peer_(false), 485 older_version_remote_peer_(false),
458 dtls_enabled_(false), 486 dtls_enabled_(false),
459 data_channel_type_(cricket::DCT_NONE), 487 data_channel_type_(cricket::DCT_NONE),
460 metrics_observer_(NULL) { 488 metrics_observer_(NULL) {
461 transport_controller_->SetIceRole(cricket::ICEROLE_CONTROLLED); 489 transport_controller_->SetIceRole(cricket::ICEROLE_CONTROLLED);
462 transport_controller_->SignalConnectionState.connect( 490 transport_controller_->SignalConnectionState.connect(
463 this, &WebRtcSession::OnTransportControllerConnectionState); 491 this, &WebRtcSession::OnTransportControllerConnectionState);
464 transport_controller_->SignalReceiving.connect( 492 transport_controller_->SignalReceiving.connect(
465 this, &WebRtcSession::OnTransportControllerReceiving); 493 this, &WebRtcSession::OnTransportControllerReceiving);
466 transport_controller_->SignalGatheringState.connect( 494 transport_controller_->SignalGatheringState.connect(
467 this, &WebRtcSession::OnTransportControllerGatheringState); 495 this, &WebRtcSession::OnTransportControllerGatheringState);
468 transport_controller_->SignalCandidatesGathered.connect( 496 transport_controller_->SignalCandidatesGathered.connect(
469 this, &WebRtcSession::OnTransportControllerCandidatesGathered); 497 this, &WebRtcSession::OnTransportControllerCandidatesGathered);
470 transport_controller_->SignalCandidatesRemoved.connect( 498 transport_controller_->SignalCandidatesRemoved.connect(
471 this, &WebRtcSession::OnTransportControllerCandidatesRemoved); 499 this, &WebRtcSession::OnTransportControllerCandidatesRemoved);
472 transport_controller_->SignalDtlsHandshakeError.connect( 500 transport_controller_->SignalDtlsHandshakeError.connect(
473 this, &WebRtcSession::OnDtlsHandshakeError); 501 this, &WebRtcSession::OnTransportControllerDtlsHandshakeError);
474 } 502 }
475 503
476 WebRtcSession::~WebRtcSession() { 504 WebRtcSession::~WebRtcSession() {
477 ASSERT(signaling_thread()->IsCurrent()); 505 ASSERT(signaling_thread()->IsCurrent());
478 // Destroy video_channel_ first since it may have a pointer to the 506 // Destroy video_channel_ first since it may have a pointer to the
479 // voice_channel_. 507 // voice_channel_.
480 if (video_channel_) { 508 if (video_channel_) {
481 SignalVideoChannelDestroyed(); 509 SignalVideoChannelDestroyed();
482 channel_manager_->DestroyVideoChannel(video_channel_.release()); 510 channel_manager_->DestroyVideoChannel(video_channel_.release());
483 } 511 }
484 if (voice_channel_) { 512 if (voice_channel_) {
485 SignalVoiceChannelDestroyed(); 513 SignalVoiceChannelDestroyed();
486 channel_manager_->DestroyVoiceChannel(voice_channel_.release()); 514 channel_manager_->DestroyVoiceChannel(voice_channel_.release());
487 } 515 }
488 if (data_channel_) { 516 if (rtp_data_channel_) {
489 SignalDataChannelDestroyed(); 517 SignalDataChannelDestroyed();
490 channel_manager_->DestroyDataChannel(data_channel_.release()); 518 channel_manager_->DestroyRtpDataChannel(rtp_data_channel_.release());
519 }
520 if (sctp_transport_) {
521 SignalDataChannelDestroyed();
pthatcher1 2016/12/23 01:39:31 Should this be SignalSctpTransportDestroyed()?
Taylor Brandstetter 2016/12/23 06:29:05 It could also be an RtpDataChannel though.
522 network_thread_->Invoke<void>(
523 RTC_FROM_HERE, rtc::Bind(&WebRtcSession::DestroySctpTransport_n, this));
491 } 524 }
492 #ifdef HAVE_QUIC 525 #ifdef HAVE_QUIC
493 if (quic_data_transport_) { 526 if (quic_data_transport_) {
494 quic_data_transport_.reset(); 527 quic_data_transport_.reset();
495 } 528 }
496 #endif 529 #endif
497 SignalDestroyed(); 530 SignalDestroyed();
498 531
499 LOG(LS_INFO) << "Session: " << id() << " is destroyed."; 532 LOG(LS_INFO) << "Session: " << id() << " is destroyed.";
500 } 533 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 if (options.disable_encryption) { 623 if (options.disable_encryption) {
591 webrtc_session_desc_factory_->SetSdesPolicy(cricket::SEC_DISABLED); 624 webrtc_session_desc_factory_->SetSdesPolicy(cricket::SEC_DISABLED);
592 } 625 }
593 626
594 return true; 627 return true;
595 } 628 }
596 629
597 void WebRtcSession::Close() { 630 void WebRtcSession::Close() {
598 SetState(STATE_CLOSED); 631 SetState(STATE_CLOSED);
599 RemoveUnusedChannels(nullptr); 632 RemoveUnusedChannels(nullptr);
600 ASSERT(!voice_channel_); 633 RTC_DCHECK(!voice_channel_);
601 ASSERT(!video_channel_); 634 RTC_DCHECK(!video_channel_);
602 ASSERT(!data_channel_); 635 RTC_DCHECK(!rtp_data_channel_);
636 RTC_DCHECK(!sctp_transport_);
603 media_controller_->Close(); 637 media_controller_->Close();
604 } 638 }
605 639
606 cricket::BaseChannel* WebRtcSession::GetChannel( 640 cricket::BaseChannel* WebRtcSession::GetChannel(
607 const std::string& content_name) { 641 const std::string& content_name) {
608 if (voice_channel() && voice_channel()->content_name() == content_name) { 642 if (voice_channel() && voice_channel()->content_name() == content_name) {
609 return voice_channel(); 643 return voice_channel();
610 } 644 }
611 if (video_channel() && video_channel()->content_name() == content_name) { 645 if (video_channel() && video_channel()->content_name() == content_name) {
612 return video_channel(); 646 return video_channel();
613 } 647 }
614 if (data_channel() && data_channel()->content_name() == content_name) { 648 if (rtp_data_channel() &&
615 return data_channel(); 649 rtp_data_channel()->content_name() == content_name) {
650 return rtp_data_channel();
616 } 651 }
617 return nullptr; 652 return nullptr;
618 } 653 }
619 654
620 cricket::SecurePolicy WebRtcSession::SdesPolicy() const { 655 cricket::SecurePolicy WebRtcSession::SdesPolicy() const {
621 return webrtc_session_desc_factory_->SdesPolicy(); 656 return webrtc_session_desc_factory_->SdesPolicy();
622 } 657 }
623 658
624 bool WebRtcSession::GetSslRole(const std::string& transport_name, 659 bool WebRtcSession::GetSctpSslRole(rtc::SSLRole* role) {
660 if (!local_description() || !remote_description()) {
661 LOG(LS_INFO) << "Local and Remote descriptions must be applied to get the "
662 << "SSL Role of the SCTP transport.";
663 return false;
664 }
665 if (!sctp_transport_) {
666 LOG(LS_INFO) << "Non-rejected SCTP m= section is needed to get the "
667 << "SSL Role of the SCTP transport.";
668 return false;
669 }
670
671 return transport_controller_->GetSslRole(sctp_transport_name_, role);
672 }
673
674 bool WebRtcSession::GetSslRole(const std::string& content_name,
625 rtc::SSLRole* role) { 675 rtc::SSLRole* role) {
626 if (!local_description() || !remote_description()) { 676 if (!local_description() || !remote_description()) {
627 LOG(LS_INFO) << "Local and Remote descriptions must be applied to get " 677 LOG(LS_INFO) << "Local and Remote descriptions must be applied to get the "
628 << "SSL Role of the session."; 678 << "SSL Role of the session.";
629 return false; 679 return false;
630 } 680 }
631 681
632 return transport_controller_->GetSslRole(transport_name, role); 682 return transport_controller_->GetSslRole(GetTransportName(content_name),
633 } 683 role);
634
635 bool WebRtcSession::GetSslRole(const cricket::BaseChannel* channel,
636 rtc::SSLRole* role) {
637 return channel && GetSslRole(channel->transport_name(), role);
638 } 684 }
639 685
640 void WebRtcSession::CreateOffer( 686 void WebRtcSession::CreateOffer(
641 CreateSessionDescriptionObserver* observer, 687 CreateSessionDescriptionObserver* observer,
642 const PeerConnectionInterface::RTCOfferAnswerOptions& options, 688 const PeerConnectionInterface::RTCOfferAnswerOptions& options,
643 const cricket::MediaSessionOptions& session_options) { 689 const cricket::MediaSessionOptions& session_options) {
644 webrtc_session_desc_factory_->CreateOffer(observer, options, session_options); 690 webrtc_session_desc_factory_->CreateOffer(observer, options, session_options);
645 } 691 }
646 692
647 void WebRtcSession::CreateAnswer( 693 void WebRtcSession::CreateAnswer(
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 return true; 957 return true;
912 } else if (source == cricket::CS_LOCAL) { 958 } else if (source == cricket::CS_LOCAL) {
913 return ch->PushdownLocalDescription(local_description()->description(), 959 return ch->PushdownLocalDescription(local_description()->description(),
914 action, err); 960 action, err);
915 } else { 961 } else {
916 return ch->PushdownRemoteDescription(remote_description()->description(), 962 return ch->PushdownRemoteDescription(remote_description()->description(),
917 action, err); 963 action, err);
918 } 964 }
919 }; 965 };
920 966
921 return (set_content(voice_channel()) && 967 bool ret = (set_content(voice_channel()) && set_content(video_channel()) &&
922 set_content(video_channel()) && 968 set_content(rtp_data_channel()));
923 set_content(data_channel())); 969 // Need complete offer/answer before starting SCTP, according to
970 // https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-19
971 if (sctp_transport_ && local_description() && remote_description()) {
972 ret &= network_thread_->Invoke<bool>(
973 RTC_FROM_HERE,
974 rtc::Bind(&WebRtcSession::PushdownSctpParameters_n, this, source));
975 }
976 return ret;
977 }
978
979 bool WebRtcSession::PushdownSctpParameters_n(cricket::ContentSource source) {
980 RTC_DCHECK(network_thread_->IsCurrent());
981 RTC_DCHECK(local_description());
982 RTC_DCHECK(remote_description());
983 // Apply the SCTP port (which is hidden inside a DataCodec structure...)
984 // When we support "max-message-size", that would also be pushed down here.
985 return sctp_transport_->Start(
986 GetSctpPort(local_description()->description()),
987 GetSctpPort(remote_description()->description()));
924 } 988 }
925 989
926 bool WebRtcSession::PushdownTransportDescription(cricket::ContentSource source, 990 bool WebRtcSession::PushdownTransportDescription(cricket::ContentSource source,
927 cricket::ContentAction action, 991 cricket::ContentAction action,
928 std::string* error_desc) { 992 std::string* error_desc) {
929 RTC_DCHECK(signaling_thread()->IsCurrent()); 993 RTC_DCHECK(signaling_thread()->IsCurrent());
930 994
931 if (source == cricket::CS_LOCAL) { 995 if (source == cricket::CS_LOCAL) {
932 return PushdownLocalTransportDescription(local_description()->description(), 996 return PushdownLocalTransportDescription(local_description()->description(),
933 action, error_desc); 997 action, error_desc);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 } 1049 }
986 const TransportInfo* transport_info = 1050 const TransportInfo* transport_info =
987 description->GetTransportInfoByName(content_name); 1051 description->GetTransportInfoByName(content_name);
988 if (!transport_info) { 1052 if (!transport_info) {
989 return false; 1053 return false;
990 } 1054 }
991 *tdesc = transport_info->description; 1055 *tdesc = transport_info->description;
992 return true; 1056 return true;
993 } 1057 }
994 1058
995 std::unique_ptr<SessionStats> WebRtcSession::GetStats_s() {
996 ASSERT(signaling_thread()->IsCurrent());
997 ChannelNamePairs channel_name_pairs;
998 if (voice_channel()) {
999 channel_name_pairs.voice = rtc::Optional<ChannelNamePair>(ChannelNamePair(
1000 voice_channel()->content_name(), voice_channel()->transport_name()));
1001 }
1002 if (video_channel()) {
1003 channel_name_pairs.video = rtc::Optional<ChannelNamePair>(ChannelNamePair(
1004 video_channel()->content_name(), video_channel()->transport_name()));
1005 }
1006 if (data_channel()) {
1007 channel_name_pairs.data = rtc::Optional<ChannelNamePair>(ChannelNamePair(
1008 data_channel()->content_name(), data_channel()->transport_name()));
1009 }
1010 return GetStats(channel_name_pairs);
1011 }
1012
1013 std::unique_ptr<SessionStats> WebRtcSession::GetStats(
1014 const ChannelNamePairs& channel_name_pairs) {
1015 if (network_thread()->IsCurrent()) {
1016 return GetStats_n(channel_name_pairs);
1017 }
1018 return network_thread()->Invoke<std::unique_ptr<SessionStats>>(
1019 RTC_FROM_HERE,
1020 rtc::Bind(&WebRtcSession::GetStats_n, this, channel_name_pairs));
1021 }
1022
1023 bool WebRtcSession::GetLocalCertificate(
1024 const std::string& transport_name,
1025 rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
1026 return transport_controller_->GetLocalCertificate(transport_name,
1027 certificate);
1028 }
1029
1030 std::unique_ptr<rtc::SSLCertificate> WebRtcSession::GetRemoteSSLCertificate(
1031 const std::string& transport_name) {
1032 return transport_controller_->GetRemoteSSLCertificate(transport_name);
1033 }
1034
1035 bool WebRtcSession::EnableBundle(const cricket::ContentGroup& bundle) { 1059 bool WebRtcSession::EnableBundle(const cricket::ContentGroup& bundle) {
1036 const std::string* first_content_name = bundle.FirstContentName(); 1060 const std::string* first_content_name = bundle.FirstContentName();
1037 if (!first_content_name) { 1061 if (!first_content_name) {
1038 LOG(LS_WARNING) << "Tried to BUNDLE with no contents."; 1062 LOG(LS_WARNING) << "Tried to BUNDLE with no contents.";
1039 return false; 1063 return false;
1040 } 1064 }
1041 const std::string& transport_name = *first_content_name; 1065 const std::string& transport_name = *first_content_name;
1042 cricket::BaseChannel* first_channel = GetChannel(transport_name);
1043 1066
1044 #ifdef HAVE_QUIC 1067 #ifdef HAVE_QUIC
1045 if (quic_data_transport_ && 1068 if (quic_data_transport_ &&
1046 bundle.HasContentName(quic_data_transport_->content_name()) && 1069 bundle.HasContentName(quic_data_transport_->content_name()) &&
1047 quic_data_transport_->transport_name() != transport_name) { 1070 quic_data_transport_->transport_name() != transport_name) {
1048 LOG(LS_ERROR) << "Unable to BUNDLE " << quic_data_transport_->content_name() 1071 LOG(LS_ERROR) << "Unable to BUNDLE " << quic_data_transport_->content_name()
1049 << " on " << transport_name << "with QUIC."; 1072 << " on " << transport_name << "with QUIC.";
1050 } 1073 }
1051 #endif 1074 #endif
1052 1075
1053 auto maybe_set_transport = [this, bundle, transport_name, 1076 auto maybe_set_transport = [this, bundle,
1054 first_channel](cricket::BaseChannel* ch) { 1077 transport_name](cricket::BaseChannel* ch) {
1055 if (!ch || !bundle.HasContentName(ch->content_name())) { 1078 if (!ch || !bundle.HasContentName(ch->content_name())) {
1056 return true; 1079 return true;
1057 } 1080 }
1058 1081
1059 if (ch->transport_name() == transport_name) { 1082 if (ch->transport_name() == transport_name) {
1060 LOG(LS_INFO) << "BUNDLE already enabled for " << ch->content_name() 1083 LOG(LS_INFO) << "BUNDLE already enabled for " << ch->content_name()
1061 << " on " << transport_name << "."; 1084 << " on " << transport_name << ".";
1062 return true; 1085 return true;
1063 } 1086 }
1064 1087
1065 if (!ch->SetTransport(transport_name)) { 1088 if (!ch->SetTransport(transport_name)) {
1066 LOG(LS_WARNING) << "Failed to enable BUNDLE for " << ch->content_name(); 1089 LOG(LS_WARNING) << "Failed to enable BUNDLE for " << ch->content_name();
1067 return false; 1090 return false;
1068 } 1091 }
1069 LOG(LS_INFO) << "Enabled BUNDLE for " << ch->content_name() << " on " 1092 LOG(LS_INFO) << "Enabled BUNDLE for " << ch->content_name() << " on "
1070 << transport_name << "."; 1093 << transport_name << ".";
1071 return true; 1094 return true;
1072 }; 1095 };
1073 1096
1074 if (!maybe_set_transport(voice_channel()) || 1097 if (!maybe_set_transport(voice_channel()) ||
1075 !maybe_set_transport(video_channel()) || 1098 !maybe_set_transport(video_channel()) ||
1076 !maybe_set_transport(data_channel())) { 1099 !maybe_set_transport(rtp_data_channel())) {
1077 return false; 1100 return false;
1078 } 1101 }
1102 // For SCTP, transport creation/deletion happens here instead of in the
1103 // object itself.
1104 if (sctp_transport_ && transport_name != sctp_transport_name_ &&
1105 bundle.HasContentName(sctp_content_name_)) {
1106 network_thread_->Invoke<void>(
1107 RTC_FROM_HERE,
1108 rtc::Bind(&WebRtcSession::ChangeSctpTransport_n, this, transport_name));
1109 }
1079 1110
1080 return true; 1111 return true;
1081 } 1112 }
1082 1113
1083 bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) { 1114 bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) {
1084 if (!remote_description()) { 1115 if (!remote_description()) {
1085 LOG(LS_ERROR) << "ProcessIceMessage: ICE candidates can't be added " 1116 LOG(LS_ERROR) << "ProcessIceMessage: ICE candidates can't be added "
1086 << "without any remote session description."; 1117 << "without any remote session description.";
1087 return false; 1118 return false;
1088 } 1119 }
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
1241 return true; 1272 return true;
1242 } 1273 }
1243 1274
1244 sigslot::signal0<>* WebRtcSession::GetOnDestroyedSignal() { 1275 sigslot::signal0<>* WebRtcSession::GetOnDestroyedSignal() {
1245 return &SignalDestroyed; 1276 return &SignalDestroyed;
1246 } 1277 }
1247 1278
1248 bool WebRtcSession::SendData(const cricket::SendDataParams& params, 1279 bool WebRtcSession::SendData(const cricket::SendDataParams& params,
1249 const rtc::CopyOnWriteBuffer& payload, 1280 const rtc::CopyOnWriteBuffer& payload,
1250 cricket::SendDataResult* result) { 1281 cricket::SendDataResult* result) {
1251 if (!data_channel_) { 1282 if (!rtp_data_channel_ && !sctp_transport_) {
1252 LOG(LS_ERROR) << "SendData called when data_channel_ is NULL."; 1283 LOG(LS_ERROR) << "SendData called when rtp_data_channel_ "
1284 << "and sctp_transport_ are NULL.";
1253 return false; 1285 return false;
1254 } 1286 }
1255 return data_channel_->SendData(params, payload, result); 1287 return rtp_data_channel_
1288 ? rtp_data_channel_->SendData(params, payload, result)
1289 : network_thread_->Invoke<bool>(
1290 RTC_FROM_HERE,
1291 Bind(&cricket::SctpTransportInternal::SendData,
1292 sctp_transport_.get(), params, payload, result));
pthatcher1 2016/12/23 01:39:31 Similar to passing a "fire events on this thread"
1256 } 1293 }
1257 1294
1258 bool WebRtcSession::ConnectDataChannel(DataChannel* webrtc_data_channel) { 1295 bool WebRtcSession::ConnectDataChannel(DataChannel* webrtc_data_channel) {
1259 if (!data_channel_) { 1296 if (!rtp_data_channel_ && !sctp_transport_) {
1260 // Don't log an error here, because DataChannels are expected to call 1297 // Don't log an error here, because DataChannels are expected to call
1261 // ConnectDataChannel in this state. It's the only way to initially tell 1298 // ConnectDataChannel in this state. It's the only way to initially tell
1262 // whether or not the underlying transport is ready. 1299 // whether or not the underlying transport is ready.
1263 return false; 1300 return false;
1264 } 1301 }
1265 data_channel_->SignalReadyToSendData.connect(webrtc_data_channel, 1302 if (rtp_data_channel_) {
1266 &DataChannel::OnChannelReady); 1303 rtp_data_channel_->SignalReadyToSendData.connect(
1267 data_channel_->SignalDataReceived.connect(webrtc_data_channel, 1304 webrtc_data_channel, &DataChannel::OnChannelReady);
1268 &DataChannel::OnDataReceived); 1305 rtp_data_channel_->SignalDataReceived.connect(webrtc_data_channel,
1269 data_channel_->SignalStreamClosedRemotely.connect( 1306 &DataChannel::OnDataReceived);
1270 webrtc_data_channel, &DataChannel::OnStreamClosedRemotely); 1307 } else {
1308 SignalSctpReadyToSendData.connect(webrtc_data_channel,
1309 &DataChannel::OnChannelReady);
1310 SignalSctpDataReceived.connect(webrtc_data_channel,
1311 &DataChannel::OnDataReceived);
1312 SignalSctpStreamClosedRemotely.connect(
1313 webrtc_data_channel, &DataChannel::OnStreamClosedRemotely);
1314 }
1271 return true; 1315 return true;
1272 } 1316 }
1273 1317
1274 void WebRtcSession::DisconnectDataChannel(DataChannel* webrtc_data_channel) { 1318 void WebRtcSession::DisconnectDataChannel(DataChannel* webrtc_data_channel) {
1275 if (!data_channel_) { 1319 if (!rtp_data_channel_ && !sctp_transport_) {
1276 LOG(LS_ERROR) << "DisconnectDataChannel called when data_channel_ is NULL."; 1320 LOG(LS_ERROR) << "DisconnectDataChannel called when rtp_data_channel_ and "
1321 "sctp_transport_ are NULL.";
1277 return; 1322 return;
1278 } 1323 }
1279 data_channel_->SignalReadyToSendData.disconnect(webrtc_data_channel); 1324 if (rtp_data_channel_) {
1280 data_channel_->SignalDataReceived.disconnect(webrtc_data_channel); 1325 rtp_data_channel_->SignalReadyToSendData.disconnect(webrtc_data_channel);
1281 data_channel_->SignalStreamClosedRemotely.disconnect(webrtc_data_channel); 1326 rtp_data_channel_->SignalDataReceived.disconnect(webrtc_data_channel);
1327 } else {
1328 SignalSctpReadyToSendData.disconnect(webrtc_data_channel);
1329 SignalSctpDataReceived.disconnect(webrtc_data_channel);
1330 SignalSctpStreamClosedRemotely.disconnect(webrtc_data_channel);
1331 }
1282 } 1332 }
1283 1333
1284 void WebRtcSession::AddSctpDataStream(int sid) { 1334 void WebRtcSession::AddSctpDataStream(int sid) {
1285 if (!data_channel_) { 1335 if (!sctp_transport_) {
1286 LOG(LS_ERROR) << "AddDataChannelStreams called when data_channel_ is NULL."; 1336 LOG(LS_ERROR) << "AddSctpDataStream called when sctp_transport_ is NULL.";
1287 return; 1337 return;
1288 } 1338 }
1289 data_channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(sid)); 1339 network_thread_->Invoke<void>(
1290 data_channel_->AddSendStream(cricket::StreamParams::CreateLegacy(sid)); 1340 RTC_FROM_HERE, rtc::Bind(&cricket::SctpTransportInternal::OpenStream,
1341 sctp_transport_.get(), sid));
1291 } 1342 }
1292 1343
1293 void WebRtcSession::RemoveSctpDataStream(int sid) { 1344 void WebRtcSession::RemoveSctpDataStream(int sid) {
1294 if (!data_channel_) { 1345 if (!sctp_transport_) {
1295 LOG(LS_ERROR) << "RemoveDataChannelStreams called when data_channel_ is " 1346 LOG(LS_ERROR) << "RemoveSctpDataStream called when sctp_transport_ is "
1296 << "NULL."; 1347 << "NULL.";
1297 return; 1348 return;
1298 } 1349 }
1299 data_channel_->RemoveRecvStream(sid); 1350 network_thread_->Invoke<void>(
1300 data_channel_->RemoveSendStream(sid); 1351 RTC_FROM_HERE, rtc::Bind(&cricket::SctpTransportInternal::ResetStream,
1352 sctp_transport_.get(), sid));
1301 } 1353 }
1302 1354
1303 bool WebRtcSession::ReadyToSendData() const { 1355 bool WebRtcSession::ReadyToSendData() const {
1304 return data_channel_ && data_channel_->ready_to_send_data(); 1356 return (rtp_data_channel_ && rtp_data_channel_->ready_to_send_data()) ||
1357 sctp_ready_to_send_data_;
1358 }
1359
1360 std::unique_ptr<SessionStats> WebRtcSession::GetStats_s() {
1361 ASSERT(signaling_thread()->IsCurrent());
1362 ChannelNamePairs channel_name_pairs;
1363 if (voice_channel()) {
1364 channel_name_pairs.voice = rtc::Optional<ChannelNamePair>(ChannelNamePair(
1365 voice_channel()->content_name(), voice_channel()->transport_name()));
1366 }
1367 if (video_channel()) {
1368 channel_name_pairs.video = rtc::Optional<ChannelNamePair>(ChannelNamePair(
1369 video_channel()->content_name(), video_channel()->transport_name()));
1370 }
1371 if (rtp_data_channel()) {
1372 channel_name_pairs.data = rtc::Optional<ChannelNamePair>(
1373 ChannelNamePair(rtp_data_channel()->content_name(),
1374 rtp_data_channel()->transport_name()));
1375 }
1376 if (sctp_transport_) {
1377 channel_name_pairs.data = rtc::Optional<ChannelNamePair>(
1378 ChannelNamePair(sctp_content_name_, sctp_transport_name_));
1379 }
1380 return GetStats(channel_name_pairs);
1381 }
1382
1383 std::unique_ptr<SessionStats> WebRtcSession::GetStats(
1384 const ChannelNamePairs& channel_name_pairs) {
1385 if (network_thread()->IsCurrent()) {
1386 return GetStats_n(channel_name_pairs);
1387 }
1388 return network_thread()->Invoke<std::unique_ptr<SessionStats>>(
1389 RTC_FROM_HERE,
1390 rtc::Bind(&WebRtcSession::GetStats_n, this, channel_name_pairs));
1391 }
1392
1393 bool WebRtcSession::GetLocalCertificate(
1394 const std::string& transport_name,
1395 rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
1396 return transport_controller_->GetLocalCertificate(transport_name,
1397 certificate);
1398 }
1399
1400 std::unique_ptr<rtc::SSLCertificate> WebRtcSession::GetRemoteSSLCertificate(
1401 const std::string& transport_name) {
1402 return transport_controller_->GetRemoteSSLCertificate(transport_name);
1305 } 1403 }
1306 1404
1307 cricket::DataChannelType WebRtcSession::data_channel_type() const { 1405 cricket::DataChannelType WebRtcSession::data_channel_type() const {
1308 return data_channel_type_; 1406 return data_channel_type_;
1309 } 1407 }
1310 1408
1311 bool WebRtcSession::IceRestartPending(const std::string& content_name) const { 1409 bool WebRtcSession::IceRestartPending(const std::string& content_name) const {
1312 return pending_ice_restarts_.find(content_name) != 1410 return pending_ice_restarts_.find(content_name) !=
1313 pending_ice_restarts_.end(); 1411 pending_ice_restarts_.end();
1314 } 1412 }
1315 1413
1316 void WebRtcSession::SetNeedsIceRestartFlag() { 1414 void WebRtcSession::SetNeedsIceRestartFlag() {
1317 transport_controller_->SetNeedsIceRestartFlag(); 1415 transport_controller_->SetNeedsIceRestartFlag();
1318 } 1416 }
1319 1417
1320 bool WebRtcSession::NeedsIceRestart(const std::string& content_name) const { 1418 bool WebRtcSession::NeedsIceRestart(const std::string& content_name) const {
1321 return transport_controller_->NeedsIceRestart(content_name); 1419 return transport_controller_->NeedsIceRestart(content_name);
1322 } 1420 }
1323 1421
1324 void WebRtcSession::OnCertificateReady( 1422 void WebRtcSession::OnCertificateReady(
1325 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) { 1423 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
1326 transport_controller_->SetLocalCertificate(certificate); 1424 transport_controller_->SetLocalCertificate(certificate);
1327 } 1425 }
1328 1426
1427 void WebRtcSession::OnDtlsSrtpSetupFailure(cricket::BaseChannel*, bool rtcp) {
1428 SetError(ERROR_TRANSPORT,
1429 rtcp ? kDtlsSrtpSetupFailureRtcp : kDtlsSrtpSetupFailureRtp);
1430 }
1431
1329 bool WebRtcSession::waiting_for_certificate_for_testing() const { 1432 bool WebRtcSession::waiting_for_certificate_for_testing() const {
1330 return webrtc_session_desc_factory_->waiting_for_certificate_for_testing(); 1433 return webrtc_session_desc_factory_->waiting_for_certificate_for_testing();
1331 } 1434 }
1332 1435
1333 const rtc::scoped_refptr<rtc::RTCCertificate>& 1436 const rtc::scoped_refptr<rtc::RTCCertificate>&
1334 WebRtcSession::certificate_for_testing() { 1437 WebRtcSession::certificate_for_testing() {
1335 return transport_controller_->certificate_for_testing(); 1438 return transport_controller_->certificate_for_testing();
1336 } 1439 }
1337 1440
1338 void WebRtcSession::SetIceConnectionState( 1441 void WebRtcSession::SetIceConnectionState(
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1448 } 1551 }
1449 1552
1450 if (local_description()) { 1553 if (local_description()) {
1451 mutable_local_description()->RemoveCandidates(candidates); 1554 mutable_local_description()->RemoveCandidates(candidates);
1452 } 1555 }
1453 if (ice_observer_) { 1556 if (ice_observer_) {
1454 ice_observer_->OnIceCandidatesRemoved(candidates); 1557 ice_observer_->OnIceCandidatesRemoved(candidates);
1455 } 1558 }
1456 } 1559 }
1457 1560
1458 // Enabling voice and video channel. 1561 void WebRtcSession::OnTransportControllerDtlsHandshakeError(
1562 rtc::SSLHandshakeError error) {
1563 if (metrics_observer_) {
1564 metrics_observer_->IncrementEnumCounter(
1565 webrtc::kEnumCounterDtlsHandshakeError, static_cast<int>(error),
1566 static_cast<int>(rtc::SSLHandshakeError::MAX_VALUE));
1567 }
1568 }
1569
1570 // Enabling voice and video (and RTP data) channel.
1459 void WebRtcSession::EnableChannels() { 1571 void WebRtcSession::EnableChannels() {
1460 if (voice_channel_ && !voice_channel_->enabled()) 1572 if (voice_channel_ && !voice_channel_->enabled())
1461 voice_channel_->Enable(true); 1573 voice_channel_->Enable(true);
1462 1574
1463 if (video_channel_ && !video_channel_->enabled()) 1575 if (video_channel_ && !video_channel_->enabled())
1464 video_channel_->Enable(true); 1576 video_channel_->Enable(true);
1465 1577
1466 if (data_channel_ && !data_channel_->enabled()) 1578 if (rtp_data_channel_ && !rtp_data_channel_->enabled())
1467 data_channel_->Enable(true); 1579 rtp_data_channel_->Enable(true);
1468 } 1580 }
1469 1581
1470 // Returns the media index for a local ice candidate given the content name. 1582 // Returns the media index for a local ice candidate given the content name.
1471 bool WebRtcSession::GetLocalCandidateMediaIndex(const std::string& content_name, 1583 bool WebRtcSession::GetLocalCandidateMediaIndex(const std::string& content_name,
1472 int* sdp_mline_index) { 1584 int* sdp_mline_index) {
1473 if (!local_description() || !sdp_mline_index) { 1585 if (!local_description() || !sdp_mline_index) {
1474 return false; 1586 return false;
1475 } 1587 }
1476 1588
1477 bool content_found = false; 1589 bool content_found = false;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1567 const cricket::ContentInfo* voice_info = 1679 const cricket::ContentInfo* voice_info =
1568 cricket::GetFirstAudioContent(desc); 1680 cricket::GetFirstAudioContent(desc);
1569 if ((!voice_info || voice_info->rejected) && voice_channel_) { 1681 if ((!voice_info || voice_info->rejected) && voice_channel_) {
1570 SignalVoiceChannelDestroyed(); 1682 SignalVoiceChannelDestroyed();
1571 channel_manager_->DestroyVoiceChannel(voice_channel_.release()); 1683 channel_manager_->DestroyVoiceChannel(voice_channel_.release());
1572 } 1684 }
1573 1685
1574 const cricket::ContentInfo* data_info = 1686 const cricket::ContentInfo* data_info =
1575 cricket::GetFirstDataContent(desc); 1687 cricket::GetFirstDataContent(desc);
1576 if (!data_info || data_info->rejected) { 1688 if (!data_info || data_info->rejected) {
1577 if (data_channel_) { 1689 if (rtp_data_channel_) {
1578 SignalDataChannelDestroyed(); 1690 SignalDataChannelDestroyed();
1579 channel_manager_->DestroyDataChannel(data_channel_.release()); 1691 channel_manager_->DestroyRtpDataChannel(rtp_data_channel_.release());
1692 }
1693 if (sctp_transport_) {
1694 SignalDataChannelDestroyed();
1695 network_thread_->Invoke<void>(
1696 RTC_FROM_HERE,
1697 rtc::Bind(&WebRtcSession::DestroySctpTransport_n, this));
1580 } 1698 }
1581 #ifdef HAVE_QUIC 1699 #ifdef HAVE_QUIC
1582 // Clean up the existing QuicDataTransport and its QuicTransportChannels. 1700 // Clean up the existing QuicDataTransport and its QuicTransportChannels.
1583 if (quic_data_transport_) { 1701 if (quic_data_transport_) {
1584 quic_data_transport_.reset(); 1702 quic_data_transport_.reset();
1585 } 1703 }
1586 #endif 1704 #endif
1587 } 1705 }
1588 } 1706 }
1589 1707
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1630 const cricket::ContentInfo* video = cricket::GetFirstVideoContent(desc); 1748 const cricket::ContentInfo* video = cricket::GetFirstVideoContent(desc);
1631 if (video && !video->rejected && !video_channel_) { 1749 if (video && !video->rejected && !video_channel_) {
1632 if (!CreateVideoChannel(video, 1750 if (!CreateVideoChannel(video,
1633 GetBundleTransportName(video, bundle_group))) { 1751 GetBundleTransportName(video, bundle_group))) {
1634 LOG(LS_ERROR) << "Failed to create video channel."; 1752 LOG(LS_ERROR) << "Failed to create video channel.";
1635 return false; 1753 return false;
1636 } 1754 }
1637 } 1755 }
1638 1756
1639 const cricket::ContentInfo* data = cricket::GetFirstDataContent(desc); 1757 const cricket::ContentInfo* data = cricket::GetFirstDataContent(desc);
1640 if (data_channel_type_ != cricket::DCT_NONE && 1758 if (data_channel_type_ != cricket::DCT_NONE && data && !data->rejected &&
1641 data && !data->rejected && !data_channel_) { 1759 !rtp_data_channel_ && !sctp_transport_) {
1642 if (!CreateDataChannel(data, GetBundleTransportName(data, bundle_group))) { 1760 if (!CreateDataChannel(data, GetBundleTransportName(data, bundle_group))) {
1643 LOG(LS_ERROR) << "Failed to create data channel."; 1761 LOG(LS_ERROR) << "Failed to create data channel.";
1644 return false; 1762 return false;
1645 } 1763 }
1646 } 1764 }
1647 1765
1648 return true; 1766 return true;
1649 } 1767 }
1650 1768
1651 bool WebRtcSession::CreateVoiceChannel(const cricket::ContentInfo* content, 1769 bool WebRtcSession::CreateVoiceChannel(const cricket::ContentInfo* content,
1652 const std::string* bundle_transport) { 1770 const std::string* bundle_transport) {
1653 bool require_rtcp_mux = 1771 bool require_rtcp_mux =
1654 rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire; 1772 rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire;
1655 bool create_rtcp_transport_channel = !require_rtcp_mux; 1773 bool create_rtcp_transport_channel = !require_rtcp_mux;
1656 voice_channel_.reset(channel_manager_->CreateVoiceChannel( 1774 voice_channel_.reset(channel_manager_->CreateVoiceChannel(
1657 media_controller_, transport_controller_.get(), content->name, 1775 media_controller_, transport_controller_.get(), content->name,
1658 bundle_transport, create_rtcp_transport_channel, SrtpRequired(), 1776 bundle_transport, create_rtcp_transport_channel, SrtpRequired(),
1659 audio_options_)); 1777 audio_options_));
1660 if (!voice_channel_) { 1778 if (!voice_channel_) {
1661 return false; 1779 return false;
1662 } 1780 }
1663 if (require_rtcp_mux) { 1781 if (require_rtcp_mux) {
1664 voice_channel_->ActivateRtcpMux(); 1782 voice_channel_->ActivateRtcpMux();
1665 } 1783 }
1666 1784
1667 voice_channel_->SignalDtlsSetupFailure.connect( 1785 voice_channel_->SignalDtlsSrtpSetupFailure.connect(
1668 this, &WebRtcSession::OnDtlsSetupFailure); 1786 this, &WebRtcSession::OnDtlsSrtpSetupFailure);
1669 1787
1670 SignalVoiceChannelCreated(); 1788 SignalVoiceChannelCreated();
1671 voice_channel_->SignalSentPacket.connect(this, 1789 voice_channel_->SignalSentPacket.connect(this,
1672 &WebRtcSession::OnSentPacket_w); 1790 &WebRtcSession::OnSentPacket_w);
1673 return true; 1791 return true;
1674 } 1792 }
1675 1793
1676 bool WebRtcSession::CreateVideoChannel(const cricket::ContentInfo* content, 1794 bool WebRtcSession::CreateVideoChannel(const cricket::ContentInfo* content,
1677 const std::string* bundle_transport) { 1795 const std::string* bundle_transport) {
1678 bool require_rtcp_mux = 1796 bool require_rtcp_mux =
1679 rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire; 1797 rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire;
1680 bool create_rtcp_transport_channel = !require_rtcp_mux; 1798 bool create_rtcp_transport_channel = !require_rtcp_mux;
1681 video_channel_.reset(channel_manager_->CreateVideoChannel( 1799 video_channel_.reset(channel_manager_->CreateVideoChannel(
1682 media_controller_, transport_controller_.get(), content->name, 1800 media_controller_, transport_controller_.get(), content->name,
1683 bundle_transport, create_rtcp_transport_channel, SrtpRequired(), 1801 bundle_transport, create_rtcp_transport_channel, SrtpRequired(),
1684 video_options_)); 1802 video_options_));
1685 if (!video_channel_) { 1803 if (!video_channel_) {
1686 return false; 1804 return false;
1687 } 1805 }
1688 if (require_rtcp_mux) { 1806 if (require_rtcp_mux) {
1689 video_channel_->ActivateRtcpMux(); 1807 video_channel_->ActivateRtcpMux();
1690 } 1808 }
1691 video_channel_->SignalDtlsSetupFailure.connect( 1809 video_channel_->SignalDtlsSrtpSetupFailure.connect(
1692 this, &WebRtcSession::OnDtlsSetupFailure); 1810 this, &WebRtcSession::OnDtlsSrtpSetupFailure);
1693 1811
1694 SignalVideoChannelCreated(); 1812 SignalVideoChannelCreated();
1695 video_channel_->SignalSentPacket.connect(this, 1813 video_channel_->SignalSentPacket.connect(this,
1696 &WebRtcSession::OnSentPacket_w); 1814 &WebRtcSession::OnSentPacket_w);
1697 return true; 1815 return true;
1698 } 1816 }
1699 1817
1700 bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content, 1818 bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content,
1701 const std::string* bundle_transport) { 1819 const std::string* bundle_transport) {
1820 const std::string transport_name =
1821 bundle_transport ? *bundle_transport : content->name;
1702 #ifdef HAVE_QUIC 1822 #ifdef HAVE_QUIC
1703 if (data_channel_type_ == cricket::DCT_QUIC) { 1823 if (data_channel_type_ == cricket::DCT_QUIC) {
1704 RTC_DCHECK(transport_controller_->quic()); 1824 RTC_DCHECK(transport_controller_->quic());
1705 const std::string transport_name =
1706 bundle_transport ? *bundle_transport : content->name;
1707 quic_data_transport_->SetTransport(transport_name); 1825 quic_data_transport_->SetTransport(transport_name);
1708 return true; 1826 return true;
1709 } 1827 }
1710 #endif // HAVE_QUIC 1828 #endif // HAVE_QUIC
1711 bool sctp = (data_channel_type_ == cricket::DCT_SCTP); 1829 bool sctp = (data_channel_type_ == cricket::DCT_SCTP);
1712 bool require_rtcp_mux = 1830 if (sctp) {
1713 rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire; 1831 if (!sctp_factory_) {
1714 bool create_rtcp_transport_channel = !sctp && !require_rtcp_mux; 1832 LOG(LS_ERROR)
1715 data_channel_.reset(channel_manager_->CreateDataChannel( 1833 << "Trying to create SCTP transport, but didn't compile with "
1716 media_controller_, transport_controller_.get(), content->name, 1834 "SCTP support (HAVE_SCTP)";
1717 bundle_transport, create_rtcp_transport_channel, SrtpRequired(), 1835 return false;
1718 data_channel_type_)); 1836 }
1719 if (!data_channel_) { 1837 if (!network_thread_->Invoke<bool>(
1720 return false; 1838 RTC_FROM_HERE, rtc::Bind(&WebRtcSession::CreateSctpTransport_n,
1721 } 1839 this, content->name, transport_name))) {
1722 if (require_rtcp_mux) { 1840 return false;
1723 data_channel_->ActivateRtcpMux(); 1841 };
1842 } else {
1843 bool require_rtcp_mux =
1844 rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire;
1845 bool create_rtcp_transport_channel = !sctp && !require_rtcp_mux;
1846 rtp_data_channel_.reset(channel_manager_->CreateRtpDataChannel(
1847 media_controller_, transport_controller_.get(), content->name,
1848 bundle_transport, create_rtcp_transport_channel, SrtpRequired()));
1849 if (!rtp_data_channel_) {
1850 return false;
1851 }
1852 if (require_rtcp_mux) {
1853 rtp_data_channel_->ActivateRtcpMux();
1854 }
1855 rtp_data_channel_->SignalDtlsSrtpSetupFailure.connect(
1856 this, &WebRtcSession::OnDtlsSrtpSetupFailure);
1857 rtp_data_channel_->SignalSentPacket.connect(this,
1858 &WebRtcSession::OnSentPacket_w);
1724 } 1859 }
1725 1860
1726 if (sctp) {
1727 data_channel_->SignalDataReceived.connect(
1728 this, &WebRtcSession::OnDataChannelMessageReceived);
1729 }
1730
1731 data_channel_->SignalDtlsSetupFailure.connect(
1732 this, &WebRtcSession::OnDtlsSetupFailure);
1733
1734 SignalDataChannelCreated(); 1861 SignalDataChannelCreated();
1735 data_channel_->SignalSentPacket.connect(this, &WebRtcSession::OnSentPacket_w);
1736 return true; 1862 return true;
1737 } 1863 }
1738 1864
1739 std::unique_ptr<SessionStats> WebRtcSession::GetStats_n( 1865 std::unique_ptr<SessionStats> WebRtcSession::GetStats_n(
1740 const ChannelNamePairs& channel_name_pairs) { 1866 const ChannelNamePairs& channel_name_pairs) {
1741 ASSERT(network_thread()->IsCurrent()); 1867 ASSERT(network_thread()->IsCurrent());
1742 std::unique_ptr<SessionStats> session_stats(new SessionStats()); 1868 std::unique_ptr<SessionStats> session_stats(new SessionStats());
1743 for (const auto channel_name_pair : { &channel_name_pairs.voice, 1869 for (const auto channel_name_pair : { &channel_name_pairs.voice,
1744 &channel_name_pairs.video, 1870 &channel_name_pairs.video,
1745 &channel_name_pairs.data }) { 1871 &channel_name_pairs.data }) {
1746 if (*channel_name_pair) { 1872 if (*channel_name_pair) {
1747 cricket::TransportStats transport_stats; 1873 cricket::TransportStats transport_stats;
1748 if (!transport_controller_->GetStats((*channel_name_pair)->transport_name, 1874 if (!transport_controller_->GetStats((*channel_name_pair)->transport_name,
1749 &transport_stats)) { 1875 &transport_stats)) {
1750 return nullptr; 1876 return nullptr;
1751 } 1877 }
1752 session_stats->proxy_to_transport[(*channel_name_pair)->content_name] = 1878 session_stats->proxy_to_transport[(*channel_name_pair)->content_name] =
1753 (*channel_name_pair)->transport_name; 1879 (*channel_name_pair)->transport_name;
1754 session_stats->transport_stats[(*channel_name_pair)->transport_name] = 1880 session_stats->transport_stats[(*channel_name_pair)->transport_name] =
1755 std::move(transport_stats); 1881 std::move(transport_stats);
1756 } 1882 }
1757 } 1883 }
1758 return session_stats; 1884 return session_stats;
1759 } 1885 }
1760 1886
1761 void WebRtcSession::OnDtlsSetupFailure(cricket::BaseChannel*, bool rtcp) { 1887 bool WebRtcSession::CreateSctpTransport_n(const std::string& content_name,
1762 SetError(ERROR_TRANSPORT, 1888 const std::string& transport_name) {
1763 rtcp ? kDtlsSetupFailureRtcp : kDtlsSetupFailureRtp); 1889 RTC_DCHECK(network_thread_->IsCurrent());
1890 RTC_DCHECK(sctp_factory_);
1891 cricket::TransportChannel* tc =
1892 transport_controller_->CreateTransportChannel_n(
1893 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
1894 sctp_transport_ = sctp_factory_->CreateSctpTransport(tc);
1895 RTC_DCHECK(sctp_transport_);
1896 sctp_invoker_.reset(new rtc::AsyncInvoker());
1897 sctp_transport_->SignalReadyToSendData.connect(
1898 this, &WebRtcSession::OnSctpTransportReadyToSendData_n);
1899 sctp_transport_->SignalDataReceived.connect(
1900 this, &WebRtcSession::OnSctpTransportDataReceived_n);
1901 sctp_transport_->SignalStreamClosedRemotely.connect(
1902 this, &WebRtcSession::OnSctpStreamClosedRemotely_n);
1903 sctp_transport_name_ = transport_name;
1904 sctp_content_name_ = content_name;
1905 return true;
1764 } 1906 }
1765 1907
1766 void WebRtcSession::OnDataChannelMessageReceived( 1908 void WebRtcSession::ChangeSctpTransport_n(const std::string& transport_name) {
1767 cricket::DataChannel* channel, 1909 RTC_DCHECK(network_thread_->IsCurrent());
1910 RTC_DCHECK(sctp_transport_);
1911 std::string old_sctp_transport_name = sctp_transport_name_;
1912 sctp_transport_name_ = transport_name;
1913 cricket::TransportChannel* tc =
1914 transport_controller_->CreateTransportChannel_n(
1915 sctp_transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP);
1916 sctp_transport_->SetTransportChannel(tc);
1917 transport_controller_->DestroyTransportChannel_n(
1918 old_sctp_transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
1919 }
1920
1921 void WebRtcSession::DestroySctpTransport_n() {
1922 RTC_DCHECK(network_thread_->IsCurrent());
1923 sctp_transport_.reset(nullptr);
1924 sctp_invoker_.reset(nullptr);
1925 sctp_ready_to_send_data_ = false;
1926 }
1927
1928 void WebRtcSession::OnSctpTransportReadyToSendData_n() {
1929 RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP);
1930 RTC_DCHECK(network_thread_->IsCurrent());
1931 sctp_invoker_->AsyncInvoke<void>(
1932 RTC_FROM_HERE, signaling_thread_,
1933 rtc::Bind(&WebRtcSession::OnSctpTransportReadyToSendData_s, this, true));
1934 }
1935
1936 void WebRtcSession::OnSctpTransportReadyToSendData_s(bool ready) {
1937 RTC_DCHECK(signaling_thread_->IsCurrent());
1938 sctp_ready_to_send_data_ = ready;
1939 SignalSctpReadyToSendData(ready);
1940 }
1941
1942 void WebRtcSession::OnSctpTransportDataReceived_n(
1768 const cricket::ReceiveDataParams& params, 1943 const cricket::ReceiveDataParams& params,
1769 const rtc::CopyOnWriteBuffer& payload) { 1944 const rtc::CopyOnWriteBuffer& payload) {
1770 RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP); 1945 RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP);
1946 RTC_DCHECK(network_thread_->IsCurrent());
1947 sctp_invoker_->AsyncInvoke<void>(
1948 RTC_FROM_HERE, signaling_thread_,
1949 rtc::Bind(&WebRtcSession::OnSctpTransportDataReceived_s, this, params,
1950 payload));
1951 }
1952
1953 void WebRtcSession::OnSctpTransportDataReceived_s(
1954 const cricket::ReceiveDataParams& params,
1955 const rtc::CopyOnWriteBuffer& payload) {
1956 RTC_DCHECK(signaling_thread_->IsCurrent());
1771 if (params.type == cricket::DMT_CONTROL && IsOpenMessage(payload)) { 1957 if (params.type == cricket::DMT_CONTROL && IsOpenMessage(payload)) {
1772 // Received OPEN message; parse and signal that a new data channel should 1958 // Received OPEN message; parse and signal that a new data channel should
1773 // be created. 1959 // be created.
1774 std::string label; 1960 std::string label;
1775 InternalDataChannelInit config; 1961 InternalDataChannelInit config;
1776 config.id = params.ssrc; 1962 config.id = params.ssrc;
1777 if (!ParseDataChannelOpenMessage(payload, &label, &config)) { 1963 if (!ParseDataChannelOpenMessage(payload, &label, &config)) {
1778 LOG(LS_WARNING) << "Failed to parse the OPEN message for sid " 1964 LOG(LS_WARNING) << "Failed to parse the OPEN message for sid "
1779 << params.ssrc; 1965 << params.ssrc;
1780 return; 1966 return;
1781 } 1967 }
1782 config.open_handshake_role = InternalDataChannelInit::kAcker; 1968 config.open_handshake_role = InternalDataChannelInit::kAcker;
1783 SignalDataChannelOpenMessage(label, config); 1969 SignalDataChannelOpenMessage(label, config);
1970 } else {
1971 // Otherwise just forward the signal.
1972 SignalSctpDataReceived(params, payload);
1784 } 1973 }
1785 // Otherwise ignore the message. 1974 }
1975
1976 void WebRtcSession::OnSctpStreamClosedRemotely_n(int sid) {
1977 RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP);
1978 RTC_DCHECK(network_thread_->IsCurrent());
1979 sctp_invoker_->AsyncInvoke<void>(
1980 RTC_FROM_HERE, signaling_thread_,
1981 rtc::Bind(&sigslot::signal1<int>::operator(),
1982 &SignalSctpStreamClosedRemotely, sid));
1786 } 1983 }
1787 1984
1788 // Returns false if bundle is enabled and rtcp_mux is disabled. 1985 // Returns false if bundle is enabled and rtcp_mux is disabled.
1789 bool WebRtcSession::ValidateBundleSettings(const SessionDescription* desc) { 1986 bool WebRtcSession::ValidateBundleSettings(const SessionDescription* desc) {
1790 bool bundle_enabled = desc->HasGroup(cricket::GROUP_TYPE_BUNDLE); 1987 bool bundle_enabled = desc->HasGroup(cricket::GROUP_TYPE_BUNDLE);
1791 if (!bundle_enabled) 1988 if (!bundle_enabled)
1792 return true; 1989 return true;
1793 1990
1794 const cricket::ContentGroup* bundle_group = 1991 const cricket::ContentGroup* bundle_group =
1795 desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE); 1992 desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE);
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1969 void WebRtcSession::ReportTransportStats() { 2166 void WebRtcSession::ReportTransportStats() {
1970 // Use a set so we don't report the same stats twice if two channels share 2167 // Use a set so we don't report the same stats twice if two channels share
1971 // a transport. 2168 // a transport.
1972 std::set<std::string> transport_names; 2169 std::set<std::string> transport_names;
1973 if (voice_channel()) { 2170 if (voice_channel()) {
1974 transport_names.insert(voice_channel()->transport_name()); 2171 transport_names.insert(voice_channel()->transport_name());
1975 } 2172 }
1976 if (video_channel()) { 2173 if (video_channel()) {
1977 transport_names.insert(video_channel()->transport_name()); 2174 transport_names.insert(video_channel()->transport_name());
1978 } 2175 }
1979 if (data_channel()) { 2176 if (rtp_data_channel()) {
1980 transport_names.insert(data_channel()->transport_name()); 2177 transport_names.insert(rtp_data_channel()->transport_name());
2178 }
2179 if (sctp_transport_) {
2180 transport_names.insert(sctp_transport_name_);
1981 } 2181 }
1982 for (const auto& name : transport_names) { 2182 for (const auto& name : transport_names) {
1983 cricket::TransportStats stats; 2183 cricket::TransportStats stats;
1984 if (transport_controller_->GetStats(name, &stats)) { 2184 if (transport_controller_->GetStats(name, &stats)) {
1985 ReportBestConnectionState(stats); 2185 ReportBestConnectionState(stats);
1986 ReportNegotiatedCiphers(stats); 2186 ReportNegotiatedCiphers(stats);
1987 } 2187 }
1988 } 2188 }
1989 } 2189 }
1990 // Walk through the ConnectionInfos to gather best connection usage 2190 // Walk through the ConnectionInfos to gather best connection usage
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
2087 const std::string WebRtcSession::GetTransportName( 2287 const std::string WebRtcSession::GetTransportName(
2088 const std::string& content_name) { 2288 const std::string& content_name) {
2089 cricket::BaseChannel* channel = GetChannel(content_name); 2289 cricket::BaseChannel* channel = GetChannel(content_name);
2090 if (!channel) { 2290 if (!channel) {
2091 #ifdef HAVE_QUIC 2291 #ifdef HAVE_QUIC
2092 if (data_channel_type_ == cricket::DCT_QUIC && quic_data_transport_ && 2292 if (data_channel_type_ == cricket::DCT_QUIC && quic_data_transport_ &&
2093 content_name == quic_data_transport_->transport_name()) { 2293 content_name == quic_data_transport_->transport_name()) {
2094 return quic_data_transport_->transport_name(); 2294 return quic_data_transport_->transport_name();
2095 } 2295 }
2096 #endif 2296 #endif
2297 if (sctp_transport_ && content_name == sctp_content_name_) {
2298 return sctp_transport_name_;
2299 }
2097 // Return an empty string if failed to retrieve the transport name. 2300 // Return an empty string if failed to retrieve the transport name.
2098 return ""; 2301 return "";
2099 } 2302 }
2100 return channel->transport_name(); 2303 return channel->transport_name();
2101 } 2304 }
2102 2305
2103 void WebRtcSession::OnDtlsHandshakeError(rtc::SSLHandshakeError error) {
2104 if (metrics_observer_) {
2105 metrics_observer_->IncrementEnumCounter(
2106 webrtc::kEnumCounterDtlsHandshakeError, static_cast<int>(error),
2107 static_cast<int>(rtc::SSLHandshakeError::MAX_VALUE));
2108 }
2109 }
2110 } // namespace webrtc 2306 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698