OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2004 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 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
169 signaling_thread_(signaling_thread), | 169 signaling_thread_(signaling_thread), |
170 content_name_(content_name), | 170 content_name_(content_name), |
171 rtp_transport_(rtcp_mux_required), | 171 rtp_transport_(rtcp_mux_required), |
172 srtp_required_(srtp_required), | 172 srtp_required_(srtp_required), |
173 media_channel_(media_channel), | 173 media_channel_(media_channel), |
174 selected_candidate_pair_(nullptr) { | 174 selected_candidate_pair_(nullptr) { |
175 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); | 175 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); |
176 #if defined(ENABLE_EXTERNAL_AUTH) | 176 #if defined(ENABLE_EXTERNAL_AUTH) |
177 srtp_filter_.EnableExternalAuth(); | 177 srtp_filter_.EnableExternalAuth(); |
178 #endif | 178 #endif |
179 rtp_transport_.SignalReadyToSend.connect( | |
180 this, &BaseChannel::OnTransportReadyToSend); | |
179 LOG(LS_INFO) << "Created channel for " << content_name; | 181 LOG(LS_INFO) << "Created channel for " << content_name; |
180 } | 182 } |
181 | 183 |
182 BaseChannel::~BaseChannel() { | 184 BaseChannel::~BaseChannel() { |
183 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel"); | 185 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel"); |
184 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); | 186 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); |
185 Deinit(); | 187 Deinit(); |
186 StopConnectionMonitor(); | 188 StopConnectionMonitor(); |
187 // Eats any outstanding messages or packets. | 189 // Eats any outstanding messages or packets. |
188 worker_thread_->Clear(&invoker_); | 190 worker_thread_->Clear(&invoker_); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
370 : rtp_transport_.rtp_packet_transport(); | 372 : rtp_transport_.rtp_packet_transport(); |
371 | 373 |
372 if (!old_packet_transport && !new_packet_transport) { | 374 if (!old_packet_transport && !new_packet_transport) { |
373 // Nothing to do. | 375 // Nothing to do. |
374 return; | 376 return; |
375 } | 377 } |
376 | 378 |
377 RTC_DCHECK(old_packet_transport != new_packet_transport); | 379 RTC_DCHECK(old_packet_transport != new_packet_transport); |
378 if (old_dtls_transport) { | 380 if (old_dtls_transport) { |
379 DisconnectFromDtlsTransport(old_dtls_transport); | 381 DisconnectFromDtlsTransport(old_dtls_transport); |
382 rtp_transport_.Disconnect(rtcp); | |
380 } else if (old_packet_transport) { | 383 } else if (old_packet_transport) { |
381 DisconnectFromPacketTransport(old_packet_transport); | 384 DisconnectFromPacketTransport(old_packet_transport); |
385 rtp_transport_.Disconnect(rtcp); | |
Taylor Brandstetter
2017/04/14 18:05:33
Could the "disconnect"/"connect" happen implicitly
Zach Stein
2017/04/18 23:39:29
Done.
| |
382 } | 386 } |
383 | 387 |
384 if (rtcp) { | 388 if (rtcp) { |
385 rtp_transport_.set_rtcp_packet_transport(new_packet_transport); | 389 rtp_transport_.set_rtcp_packet_transport(new_packet_transport); |
386 } else { | 390 } else { |
387 rtp_transport_.set_rtp_packet_transport(new_packet_transport); | 391 rtp_transport_.set_rtp_packet_transport(new_packet_transport); |
388 } | 392 } |
389 old_dtls_transport = new_dtls_transport; | 393 old_dtls_transport = new_dtls_transport; |
390 | 394 |
391 // If there's no new transport, we're done after disconnecting from old one. | 395 // If there's no new transport, we're done after disconnecting from old one. |
392 if (!new_packet_transport) { | 396 if (!new_packet_transport) { |
393 return; | 397 return; |
394 } | 398 } |
395 | 399 |
396 if (rtcp && new_dtls_transport) { | 400 if (rtcp && new_dtls_transport) { |
397 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive())) | 401 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive())) |
398 << "Setting RTCP for DTLS/SRTP after SrtpFilter is active " | 402 << "Setting RTCP for DTLS/SRTP after SrtpFilter is active " |
399 << "should never happen."; | 403 << "should never happen."; |
400 } | 404 } |
405 | |
406 rtp_transport_.Connect(rtcp); | |
401 if (new_dtls_transport) { | 407 if (new_dtls_transport) { |
402 ConnectToDtlsTransport(new_dtls_transport); | 408 ConnectToDtlsTransport(new_dtls_transport); |
403 } else { | 409 } else { |
404 ConnectToPacketTransport(new_packet_transport); | 410 ConnectToPacketTransport(new_packet_transport); |
405 } | 411 } |
406 auto& socket_options = rtcp ? rtcp_socket_options_ : socket_options_; | 412 auto& socket_options = rtcp ? rtcp_socket_options_ : socket_options_; |
407 for (const auto& pair : socket_options) { | 413 for (const auto& pair : socket_options) { |
408 new_packet_transport->SetOption(pair.first, pair.second); | 414 new_packet_transport->SetOption(pair.first, pair.second); |
409 } | 415 } |
410 } | 416 } |
411 | 417 |
412 void BaseChannel::ConnectToDtlsTransport(DtlsTransportInternal* transport) { | 418 void BaseChannel::ConnectToDtlsTransport(DtlsTransportInternal* transport) { |
413 RTC_DCHECK(network_thread_->IsCurrent()); | 419 RTC_DCHECK(network_thread_->IsCurrent()); |
414 | 420 |
421 // TODO(zstein): de-dup with ConnectToPacketTransport | |
415 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); | 422 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); |
416 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); | 423 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); |
417 transport->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); | |
418 transport->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState); | 424 transport->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState); |
419 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); | 425 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); |
420 transport->ice_transport()->SignalSelectedCandidatePairChanged.connect( | 426 transport->ice_transport()->SignalSelectedCandidatePairChanged.connect( |
421 this, &BaseChannel::OnSelectedCandidatePairChanged); | 427 this, &BaseChannel::OnSelectedCandidatePairChanged); |
422 } | 428 } |
423 | 429 |
424 void BaseChannel::DisconnectFromDtlsTransport( | 430 void BaseChannel::DisconnectFromDtlsTransport( |
425 DtlsTransportInternal* transport) { | 431 DtlsTransportInternal* transport) { |
426 RTC_DCHECK(network_thread_->IsCurrent()); | 432 RTC_DCHECK(network_thread_->IsCurrent()); |
427 OnSelectedCandidatePairChanged(transport->ice_transport(), nullptr, -1, | 433 OnSelectedCandidatePairChanged(transport->ice_transport(), nullptr, -1, |
428 false); | 434 false); |
429 | 435 |
430 transport->SignalWritableState.disconnect(this); | 436 transport->SignalWritableState.disconnect(this); |
431 transport->SignalReadPacket.disconnect(this); | 437 transport->SignalReadPacket.disconnect(this); |
432 transport->SignalReadyToSend.disconnect(this); | |
433 transport->SignalDtlsState.disconnect(this); | 438 transport->SignalDtlsState.disconnect(this); |
434 transport->SignalSentPacket.disconnect(this); | 439 transport->SignalSentPacket.disconnect(this); |
435 transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect( | 440 transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect( |
436 this); | 441 this); |
437 } | 442 } |
438 | 443 |
439 void BaseChannel::ConnectToPacketTransport( | 444 void BaseChannel::ConnectToPacketTransport( |
440 rtc::PacketTransportInternal* transport) { | 445 rtc::PacketTransportInternal* transport) { |
441 RTC_DCHECK_RUN_ON(network_thread_); | 446 RTC_DCHECK_RUN_ON(network_thread_); |
442 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); | 447 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); |
443 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); | 448 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); |
444 transport->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); | |
445 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); | 449 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); |
446 } | 450 } |
447 | 451 |
448 void BaseChannel::DisconnectFromPacketTransport( | 452 void BaseChannel::DisconnectFromPacketTransport( |
449 rtc::PacketTransportInternal* transport) { | 453 rtc::PacketTransportInternal* transport) { |
450 RTC_DCHECK_RUN_ON(network_thread_); | 454 RTC_DCHECK_RUN_ON(network_thread_); |
451 transport->SignalWritableState.disconnect(this); | 455 transport->SignalWritableState.disconnect(this); |
452 transport->SignalReadPacket.disconnect(this); | 456 transport->SignalReadPacket.disconnect(this); |
453 transport->SignalReadyToSend.disconnect(this); | |
454 transport->SignalSentPacket.disconnect(this); | 457 transport->SignalSentPacket.disconnect(this); |
455 } | 458 } |
456 | 459 |
457 bool BaseChannel::Enable(bool enable) { | 460 bool BaseChannel::Enable(bool enable) { |
458 worker_thread_->Invoke<void>( | 461 worker_thread_->Invoke<void>( |
459 RTC_FROM_HERE, | 462 RTC_FROM_HERE, |
460 Bind(enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w, | 463 Bind(enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w, |
461 this)); | 464 this)); |
462 return true; | 465 return true; |
463 } | 466 } |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
611 // OnPacketRead gets called from P2PSocket; now pass data to MediaEngine | 614 // OnPacketRead gets called from P2PSocket; now pass data to MediaEngine |
612 RTC_DCHECK(network_thread_->IsCurrent()); | 615 RTC_DCHECK(network_thread_->IsCurrent()); |
613 | 616 |
614 // When using RTCP multiplexing we might get RTCP packets on the RTP | 617 // When using RTCP multiplexing we might get RTCP packets on the RTP |
615 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. | 618 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. |
616 bool rtcp = PacketIsRtcp(transport, data, len); | 619 bool rtcp = PacketIsRtcp(transport, data, len); |
617 rtc::CopyOnWriteBuffer packet(data, len); | 620 rtc::CopyOnWriteBuffer packet(data, len); |
618 HandlePacket(rtcp, &packet, packet_time); | 621 HandlePacket(rtcp, &packet, packet_time); |
619 } | 622 } |
620 | 623 |
621 void BaseChannel::OnReadyToSend(rtc::PacketTransportInternal* transport) { | |
622 RTC_DCHECK(transport == rtp_transport_.rtp_packet_transport() || | |
623 transport == rtp_transport_.rtcp_packet_transport()); | |
624 SetTransportChannelReadyToSend( | |
625 transport == rtp_transport_.rtcp_packet_transport(), true); | |
626 } | |
627 | |
628 void BaseChannel::OnDtlsState(DtlsTransportInternal* transport, | 624 void BaseChannel::OnDtlsState(DtlsTransportInternal* transport, |
629 DtlsTransportState state) { | 625 DtlsTransportState state) { |
630 if (!ShouldSetupDtlsSrtp_n()) { | 626 if (!ShouldSetupDtlsSrtp_n()) { |
631 return; | 627 return; |
632 } | 628 } |
633 | 629 |
634 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED | 630 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED |
635 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to | 631 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to |
636 // cover other scenarios like the whole transport is writable (not just this | 632 // cover other scenarios like the whole transport is writable (not just this |
637 // TransportChannel) or when TransportChannel is attached after DTLS is | 633 // TransportChannel) or when TransportChannel is attached after DTLS is |
(...skipping 23 matching lines...) Expand all Loading... | |
661 last_sent_packet_id); | 657 last_sent_packet_id); |
662 | 658 |
663 UpdateTransportOverhead(); | 659 UpdateTransportOverhead(); |
664 } | 660 } |
665 invoker_.AsyncInvoke<void>( | 661 invoker_.AsyncInvoke<void>( |
666 RTC_FROM_HERE, worker_thread_, | 662 RTC_FROM_HERE, worker_thread_, |
667 Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name, | 663 Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name, |
668 network_route)); | 664 network_route)); |
669 } | 665 } |
670 | 666 |
671 void BaseChannel::SetTransportChannelReadyToSend(bool rtcp, bool ready) { | 667 void BaseChannel::SetTransportChannelReadyToSend(bool rtcp, bool ready) { |
Taylor Brandstetter
2017/04/14 18:05:33
Can this method be removed, and the necessary logi
Zach Stein
2017/04/18 23:39:29
Done.
| |
672 RTC_DCHECK(network_thread_->IsCurrent()); | 668 RTC_DCHECK(network_thread_->IsCurrent()); |
673 if (rtcp) { | 669 rtp_transport_.SetReadyToSend(rtcp, ready); |
674 rtcp_ready_to_send_ = ready; | 670 } |
675 } else { | |
676 rtp_ready_to_send_ = ready; | |
677 } | |
678 | 671 |
679 bool ready_to_send = | 672 void BaseChannel::OnTransportReadyToSend(bool ready) { |
680 (rtp_ready_to_send_ && | |
681 // In the case of rtcp mux |rtcp_packet_transport_| will be null. | |
682 (rtcp_ready_to_send_ || !rtp_transport_.rtcp_packet_transport())); | |
683 | |
684 invoker_.AsyncInvoke<void>( | 673 invoker_.AsyncInvoke<void>( |
685 RTC_FROM_HERE, worker_thread_, | 674 RTC_FROM_HERE, worker_thread_, |
686 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready_to_send)); | 675 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready)); |
687 } | 676 } |
688 | 677 |
689 bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInternal* transport, | 678 bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInternal* transport, |
690 const char* data, | 679 const char* data, |
691 size_t len) { | 680 size_t len) { |
692 return (transport == rtp_transport_.rtcp_packet_transport() || | 681 return (transport == rtp_transport_.rtcp_packet_transport() || |
693 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); | 682 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); |
694 } | 683 } |
695 | 684 |
696 bool BaseChannel::SendPacket(bool rtcp, | 685 bool BaseChannel::SendPacket(bool rtcp, |
(...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2486 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA, | 2475 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA, |
2487 new DataChannelReadyToSendMessageData(writable)); | 2476 new DataChannelReadyToSendMessageData(writable)); |
2488 } | 2477 } |
2489 | 2478 |
2490 void RtpDataChannel::GetSrtpCryptoSuites_n( | 2479 void RtpDataChannel::GetSrtpCryptoSuites_n( |
2491 std::vector<int>* crypto_suites) const { | 2480 std::vector<int>* crypto_suites) const { |
2492 GetSupportedDataCryptoSuites(crypto_options(), crypto_suites); | 2481 GetSupportedDataCryptoSuites(crypto_options(), crypto_suites); |
2493 } | 2482 } |
2494 | 2483 |
2495 } // namespace cricket | 2484 } // namespace cricket |
OLD | NEW |