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

Side by Side Diff: webrtc/pc/channel.cc

Issue 2890263003: Move RTP/RTCP demuxing logic from BaseChannel to RtpTransport. (Closed)
Patch Set: Remove fixed TODO. Created 3 years, 6 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
« no previous file with comments | « webrtc/pc/channel.h ('k') | webrtc/pc/channel_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 }; 98 };
99 99
100 struct DataChannelErrorMessageData : public rtc::MessageData { 100 struct DataChannelErrorMessageData : public rtc::MessageData {
101 DataChannelErrorMessageData(uint32_t in_ssrc, 101 DataChannelErrorMessageData(uint32_t in_ssrc,
102 DataMediaChannel::Error in_error) 102 DataMediaChannel::Error in_error)
103 : ssrc(in_ssrc), error(in_error) {} 103 : ssrc(in_ssrc), error(in_error) {}
104 uint32_t ssrc; 104 uint32_t ssrc;
105 DataMediaChannel::Error error; 105 DataMediaChannel::Error error;
106 }; 106 };
107 107
108 static const char* PacketType(bool rtcp) {
109 return (!rtcp) ? "RTP" : "RTCP";
110 }
111
112 static bool ValidPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) { 108 static bool ValidPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) {
113 // Check the packet size. We could check the header too if needed. 109 // Check the packet size. We could check the header too if needed.
114 return (packet && 110 return packet && IsValidRtpRtcpPacketSize(rtcp, packet->size());
115 packet->size() >= (!rtcp ? kMinRtpPacketLen : kMinRtcpPacketLen) &&
116 packet->size() <= kMaxRtpPacketLen);
117 } 111 }
118 112
119 static bool IsReceiveContentDirection(MediaContentDirection direction) { 113 static bool IsReceiveContentDirection(MediaContentDirection direction) {
120 return direction == MD_SENDRECV || direction == MD_RECVONLY; 114 return direction == MD_SENDRECV || direction == MD_RECVONLY;
121 } 115 }
122 116
123 static bool IsSendContentDirection(MediaContentDirection direction) { 117 static bool IsSendContentDirection(MediaContentDirection direction) {
124 return direction == MD_SENDRECV || direction == MD_SENDONLY; 118 return direction == MD_SENDRECV || direction == MD_SENDONLY;
125 } 119 }
126 120
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 rtp_transport_(rtcp_mux_required), 166 rtp_transport_(rtcp_mux_required),
173 srtp_required_(srtp_required), 167 srtp_required_(srtp_required),
174 media_channel_(media_channel), 168 media_channel_(media_channel),
175 selected_candidate_pair_(nullptr) { 169 selected_candidate_pair_(nullptr) {
176 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); 170 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
177 #if defined(ENABLE_EXTERNAL_AUTH) 171 #if defined(ENABLE_EXTERNAL_AUTH)
178 srtp_filter_.EnableExternalAuth(); 172 srtp_filter_.EnableExternalAuth();
179 #endif 173 #endif
180 rtp_transport_.SignalReadyToSend.connect( 174 rtp_transport_.SignalReadyToSend.connect(
181 this, &BaseChannel::OnTransportReadyToSend); 175 this, &BaseChannel::OnTransportReadyToSend);
176 // TODO(zstein): RtpTransport::SignalPacketReceived will probably be replaced
177 // with a callback interface later so that the demuxer can select which
178 // channel to signal.
179 rtp_transport_.SignalPacketReceived.connect(this,
180 &BaseChannel::OnPacketReceived);
182 LOG(LS_INFO) << "Created channel for " << content_name; 181 LOG(LS_INFO) << "Created channel for " << content_name;
183 } 182 }
184 183
185 BaseChannel::~BaseChannel() { 184 BaseChannel::~BaseChannel() {
186 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel"); 185 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel");
187 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); 186 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
188 Deinit(); 187 Deinit();
189 StopConnectionMonitor(); 188 StopConnectionMonitor();
190 // Eats any outstanding messages or packets. 189 // Eats any outstanding messages or packets.
191 worker_thread_->Clear(&invoker_); 190 worker_thread_->Clear(&invoker_);
(...skipping 13 matching lines...) Expand all
205 // media_channel may use them from a different thread. 204 // media_channel may use them from a different thread.
206 if (rtp_dtls_transport_) { 205 if (rtp_dtls_transport_) {
207 DisconnectFromDtlsTransport(rtp_dtls_transport_); 206 DisconnectFromDtlsTransport(rtp_dtls_transport_);
208 } else if (rtp_transport_.rtp_packet_transport()) { 207 } else if (rtp_transport_.rtp_packet_transport()) {
209 DisconnectFromPacketTransport(rtp_transport_.rtp_packet_transport()); 208 DisconnectFromPacketTransport(rtp_transport_.rtp_packet_transport());
210 } 209 }
211 if (rtcp_dtls_transport_) { 210 if (rtcp_dtls_transport_) {
212 DisconnectFromDtlsTransport(rtcp_dtls_transport_); 211 DisconnectFromDtlsTransport(rtcp_dtls_transport_);
213 } else if (rtp_transport_.rtcp_packet_transport()) { 212 } else if (rtp_transport_.rtcp_packet_transport()) {
214 DisconnectFromPacketTransport(rtp_transport_.rtcp_packet_transport()); 213 DisconnectFromPacketTransport(rtp_transport_.rtcp_packet_transport());
215 } 214 }
pthatcher1 2017/06/01 18:49:17 I think you need rtp_transport_->SetRtpPacketTrans
Zach Stein 2017/06/01 19:56:54 Done. Thanks for helping me track this down. This
216 215
217 // Clear pending read packets/messages. 216 // Clear pending read packets/messages.
218 network_thread_->Clear(&invoker_); 217 network_thread_->Clear(&invoker_);
219 network_thread_->Clear(this); 218 network_thread_->Clear(this);
220 } 219 }
221 220
222 bool BaseChannel::Init_w(DtlsTransportInternal* rtp_dtls_transport, 221 bool BaseChannel::Init_w(DtlsTransportInternal* rtp_dtls_transport,
223 DtlsTransportInternal* rtcp_dtls_transport, 222 DtlsTransportInternal* rtcp_dtls_transport,
224 rtc::PacketTransportInternal* rtp_packet_transport, 223 rtc::PacketTransportInternal* rtp_packet_transport,
225 rtc::PacketTransportInternal* rtcp_packet_transport) { 224 rtc::PacketTransportInternal* rtcp_packet_transport) {
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 for (const auto& pair : socket_options) { 389 for (const auto& pair : socket_options) {
391 new_packet_transport->SetOption(pair.first, pair.second); 390 new_packet_transport->SetOption(pair.first, pair.second);
392 } 391 }
393 } 392 }
394 393
395 void BaseChannel::ConnectToDtlsTransport(DtlsTransportInternal* transport) { 394 void BaseChannel::ConnectToDtlsTransport(DtlsTransportInternal* transport) {
396 RTC_DCHECK(network_thread_->IsCurrent()); 395 RTC_DCHECK(network_thread_->IsCurrent());
397 396
398 // TODO(zstein): de-dup with ConnectToPacketTransport 397 // TODO(zstein): de-dup with ConnectToPacketTransport
399 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); 398 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
400 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead);
401 transport->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState); 399 transport->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState);
402 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); 400 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n);
403 transport->ice_transport()->SignalSelectedCandidatePairChanged.connect( 401 transport->ice_transport()->SignalSelectedCandidatePairChanged.connect(
404 this, &BaseChannel::OnSelectedCandidatePairChanged); 402 this, &BaseChannel::OnSelectedCandidatePairChanged);
405 } 403 }
406 404
407 void BaseChannel::DisconnectFromDtlsTransport( 405 void BaseChannel::DisconnectFromDtlsTransport(
408 DtlsTransportInternal* transport) { 406 DtlsTransportInternal* transport) {
409 RTC_DCHECK(network_thread_->IsCurrent()); 407 RTC_DCHECK(network_thread_->IsCurrent());
410 OnSelectedCandidatePairChanged(transport->ice_transport(), nullptr, -1, 408 OnSelectedCandidatePairChanged(transport->ice_transport(), nullptr, -1,
411 false); 409 false);
412 410
413 transport->SignalWritableState.disconnect(this); 411 transport->SignalWritableState.disconnect(this);
414 transport->SignalReadPacket.disconnect(this);
415 transport->SignalDtlsState.disconnect(this); 412 transport->SignalDtlsState.disconnect(this);
416 transport->SignalSentPacket.disconnect(this); 413 transport->SignalSentPacket.disconnect(this);
417 transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect( 414 transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect(
418 this); 415 this);
419 } 416 }
420 417
421 void BaseChannel::ConnectToPacketTransport( 418 void BaseChannel::ConnectToPacketTransport(
422 rtc::PacketTransportInternal* transport) { 419 rtc::PacketTransportInternal* transport) {
423 RTC_DCHECK_RUN_ON(network_thread_); 420 RTC_DCHECK_RUN_ON(network_thread_);
424 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); 421 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
425 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead);
426 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); 422 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n);
427 } 423 }
428 424
429 void BaseChannel::DisconnectFromPacketTransport( 425 void BaseChannel::DisconnectFromPacketTransport(
430 rtc::PacketTransportInternal* transport) { 426 rtc::PacketTransportInternal* transport) {
431 RTC_DCHECK_RUN_ON(network_thread_); 427 RTC_DCHECK_RUN_ON(network_thread_);
432 transport->SignalWritableState.disconnect(this); 428 transport->SignalWritableState.disconnect(this);
433 transport->SignalReadPacket.disconnect(this);
434 transport->SignalSentPacket.disconnect(this); 429 transport->SignalSentPacket.disconnect(this);
435 } 430 }
436 431
437 bool BaseChannel::Enable(bool enable) { 432 bool BaseChannel::Enable(bool enable) {
438 worker_thread_->Invoke<void>( 433 worker_thread_->Invoke<void>(
439 RTC_FROM_HERE, 434 RTC_FROM_HERE,
440 Bind(enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w, 435 Bind(enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w,
441 this)); 436 this));
442 return true; 437 return true;
443 } 438 }
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
569 return transport ? transport->SetOption(opt, value) : -1; 564 return transport ? transport->SetOption(opt, value) : -1;
570 } 565 }
571 566
572 void BaseChannel::OnWritableState(rtc::PacketTransportInternal* transport) { 567 void BaseChannel::OnWritableState(rtc::PacketTransportInternal* transport) {
573 RTC_DCHECK(transport == rtp_transport_.rtp_packet_transport() || 568 RTC_DCHECK(transport == rtp_transport_.rtp_packet_transport() ||
574 transport == rtp_transport_.rtcp_packet_transport()); 569 transport == rtp_transport_.rtcp_packet_transport());
575 RTC_DCHECK(network_thread_->IsCurrent()); 570 RTC_DCHECK(network_thread_->IsCurrent());
576 UpdateWritableState_n(); 571 UpdateWritableState_n();
577 } 572 }
578 573
579 void BaseChannel::OnPacketRead(rtc::PacketTransportInternal* transport,
580 const char* data,
581 size_t len,
582 const rtc::PacketTime& packet_time,
583 int flags) {
584 TRACE_EVENT0("webrtc", "BaseChannel::OnPacketRead");
585 // OnPacketRead gets called from P2PSocket; now pass data to MediaEngine
586 RTC_DCHECK(network_thread_->IsCurrent());
587
588 // When using RTCP multiplexing we might get RTCP packets on the RTP
589 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP.
590 bool rtcp = PacketIsRtcp(transport, data, len);
591 rtc::CopyOnWriteBuffer packet(data, len);
592 HandlePacket(rtcp, &packet, packet_time);
593 }
594
595 void BaseChannel::OnDtlsState(DtlsTransportInternal* transport, 574 void BaseChannel::OnDtlsState(DtlsTransportInternal* transport,
596 DtlsTransportState state) { 575 DtlsTransportState state) {
597 if (!ShouldSetupDtlsSrtp_n()) { 576 if (!ShouldSetupDtlsSrtp_n()) {
598 return; 577 return;
599 } 578 }
600 579
601 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED 580 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED
602 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to 581 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to
603 // cover other scenarios like the whole transport is writable (not just this 582 // cover other scenarios like the whole transport is writable (not just this
604 // TransportChannel) or when TransportChannel is attached after DTLS is 583 // TransportChannel) or when TransportChannel is attached after DTLS is
(...skipping 29 matching lines...) Expand all
634 Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name, 613 Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name,
635 network_route)); 614 network_route));
636 } 615 }
637 616
638 void BaseChannel::OnTransportReadyToSend(bool ready) { 617 void BaseChannel::OnTransportReadyToSend(bool ready) {
639 invoker_.AsyncInvoke<void>( 618 invoker_.AsyncInvoke<void>(
640 RTC_FROM_HERE, worker_thread_, 619 RTC_FROM_HERE, worker_thread_,
641 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready)); 620 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready));
642 } 621 }
643 622
644 bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInternal* transport,
645 const char* data,
646 size_t len) {
647 return (transport == rtp_transport_.rtcp_packet_transport() ||
648 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len)));
649 }
650
651 bool BaseChannel::SendPacket(bool rtcp, 623 bool BaseChannel::SendPacket(bool rtcp,
652 rtc::CopyOnWriteBuffer* packet, 624 rtc::CopyOnWriteBuffer* packet,
653 const rtc::PacketOptions& options) { 625 const rtc::PacketOptions& options) {
654 // SendPacket gets called from MediaEngine, on a pacer or an encoder thread. 626 // SendPacket gets called from MediaEngine, on a pacer or an encoder thread.
655 // If the thread is not our network thread, we will post to our network 627 // If the thread is not our network thread, we will post to our network
656 // so that the real work happens on our network. This avoids us having to 628 // so that the real work happens on our network. This avoids us having to
657 // synchronize access to all the pieces of the send path, including 629 // synchronize access to all the pieces of the send path, including
658 // SRTP and the inner workings of the transport channels. 630 // SRTP and the inner workings of the transport channels.
659 // The only downside is that we can't return a proper failure code if 631 // The only downside is that we can't return a proper failure code if
660 // needed. Since UDP is unreliable anyway, this should be a non-issue. 632 // needed. Since UDP is unreliable anyway, this should be a non-issue.
(...skipping 12 matching lines...) Expand all
673 // packet before doing anything. (We might get RTCP packets that we don't 645 // packet before doing anything. (We might get RTCP packets that we don't
674 // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP 646 // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP
675 // transport. 647 // transport.
676 if (!rtp_transport_.IsWritable(rtcp)) { 648 if (!rtp_transport_.IsWritable(rtcp)) {
677 return false; 649 return false;
678 } 650 }
679 651
680 // Protect ourselves against crazy data. 652 // Protect ourselves against crazy data.
681 if (!ValidPacket(rtcp, packet)) { 653 if (!ValidPacket(rtcp, packet)) {
682 LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " " 654 LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " "
683 << PacketType(rtcp) 655 << RtpRtcpStringLiteral(rtcp)
684 << " packet: wrong size=" << packet->size(); 656 << " packet: wrong size=" << packet->size();
685 return false; 657 return false;
686 } 658 }
687 659
688 rtc::PacketOptions updated_options; 660 rtc::PacketOptions updated_options;
689 updated_options = options; 661 updated_options = options;
690 // Protect if needed. 662 // Protect if needed.
691 if (srtp_filter_.IsActive()) { 663 if (srtp_filter_.IsActive()) {
692 TRACE_EVENT0("webrtc", "SRTP Encode"); 664 TRACE_EVENT0("webrtc", "SRTP Encode");
693 bool res; 665 bool res;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 << " and crypto is required"; 737 << " and crypto is required";
766 RTC_NOTREACHED(); 738 RTC_NOTREACHED();
767 return false; 739 return false;
768 } 740 }
769 741
770 // Bon voyage. 742 // Bon voyage.
771 int flags = (secure() && secure_dtls()) ? PF_SRTP_BYPASS : PF_NORMAL; 743 int flags = (secure() && secure_dtls()) ? PF_SRTP_BYPASS : PF_NORMAL;
772 return rtp_transport_.SendPacket(rtcp, packet, updated_options, flags); 744 return rtp_transport_.SendPacket(rtcp, packet, updated_options, flags);
773 } 745 }
774 746
775 bool BaseChannel::WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) { 747 bool BaseChannel::HandlesPayloadType(int packet_type) const {
776 // Protect ourselves against crazy data. 748 return rtp_transport_.HandlesPayloadType(packet_type);
777 if (!ValidPacket(rtcp, packet)) {
778 LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " "
779 << PacketType(rtcp)
780 << " packet: wrong size=" << packet->size();
781 return false;
782 }
783 if (rtcp) {
784 // Permit all (seemingly valid) RTCP packets.
785 return true;
786 }
787 // Check whether we handle this payload.
788 return bundle_filter_.DemuxPacket(packet->data(), packet->size());
789 } 749 }
790 750
791 void BaseChannel::HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet, 751 void BaseChannel::OnPacketReceived(bool rtcp,
792 const rtc::PacketTime& packet_time) { 752 rtc::CopyOnWriteBuffer& packet,
793 RTC_DCHECK(network_thread_->IsCurrent()); 753 const rtc::PacketTime& packet_time) {
794 if (!WantsPacket(rtcp, packet)) {
795 return;
796 }
797
798 // We are only interested in the first rtp packet because that
799 // indicates the media has started flowing.
800 if (!has_received_packet_ && !rtcp) { 754 if (!has_received_packet_ && !rtcp) {
801 has_received_packet_ = true; 755 has_received_packet_ = true;
802 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FIRSTPACKETRECEIVED); 756 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FIRSTPACKETRECEIVED);
803 } 757 }
804 758
805 // Unprotect the packet, if needed. 759 // Unprotect the packet, if needed.
806 if (srtp_filter_.IsActive()) { 760 if (srtp_filter_.IsActive()) {
807 TRACE_EVENT0("webrtc", "SRTP Decode"); 761 TRACE_EVENT0("webrtc", "SRTP Decode");
808 char* data = packet->data<char>(); 762 char* data = packet.data<char>();
809 int len = static_cast<int>(packet->size()); 763 int len = static_cast<int>(packet.size());
810 bool res; 764 bool res;
811 if (!rtcp) { 765 if (!rtcp) {
812 res = srtp_filter_.UnprotectRtp(data, len, &len); 766 res = srtp_filter_.UnprotectRtp(data, len, &len);
813 if (!res) { 767 if (!res) {
814 int seq_num = -1; 768 int seq_num = -1;
815 uint32_t ssrc = 0; 769 uint32_t ssrc = 0;
816 GetRtpSeqNum(data, len, &seq_num); 770 GetRtpSeqNum(data, len, &seq_num);
817 GetRtpSsrc(data, len, &ssrc); 771 GetRtpSsrc(data, len, &ssrc);
818 LOG(LS_ERROR) << "Failed to unprotect " << content_name_ 772 LOG(LS_ERROR) << "Failed to unprotect " << content_name_
819 << " RTP packet: size=" << len 773 << " RTP packet: size=" << len << ", seqnum=" << seq_num
820 << ", seqnum=" << seq_num << ", SSRC=" << ssrc; 774 << ", SSRC=" << ssrc;
821 return; 775 return;
822 } 776 }
823 } else { 777 } else {
824 res = srtp_filter_.UnprotectRtcp(data, len, &len); 778 res = srtp_filter_.UnprotectRtcp(data, len, &len);
825 if (!res) { 779 if (!res) {
826 int type = -1; 780 int type = -1;
827 GetRtcpType(data, len, &type); 781 GetRtcpType(data, len, &type);
828 LOG(LS_ERROR) << "Failed to unprotect " << content_name_ 782 LOG(LS_ERROR) << "Failed to unprotect " << content_name_
829 << " RTCP packet: size=" << len << ", type=" << type; 783 << " RTCP packet: size=" << len << ", type=" << type;
830 return; 784 return;
831 } 785 }
832 } 786 }
833 787
834 packet->SetSize(len); 788 packet.SetSize(len);
835 } else if (srtp_required_) { 789 } else if (srtp_required_) {
836 // Our session description indicates that SRTP is required, but we got a 790 // Our session description indicates that SRTP is required, but we got a
837 // packet before our SRTP filter is active. This means either that 791 // packet before our SRTP filter is active. This means either that
838 // a) we got SRTP packets before we received the SDES keys, in which case 792 // a) we got SRTP packets before we received the SDES keys, in which case
839 // we can't decrypt it anyway, or 793 // we can't decrypt it anyway, or
840 // b) we got SRTP packets before DTLS completed on both the RTP and RTCP 794 // b) we got SRTP packets before DTLS completed on both the RTP and RTCP
841 // transports, so we haven't yet extracted keys, even if DTLS did 795 // transports, so we haven't yet extracted keys, even if DTLS did
842 // complete on the transport that the packets are being sent on. It's 796 // complete on the transport that the packets are being sent on. It's
843 // really good practice to wait for both RTP and RTCP to be good to go 797 // really good practice to wait for both RTP and RTCP to be good to go
844 // before sending media, to prevent weird failure modes, so it's fine 798 // before sending media, to prevent weird failure modes, so it's fine
845 // for us to just eat packets here. This is all sidestepped if RTCP mux 799 // for us to just eat packets here. This is all sidestepped if RTCP mux
846 // is used anyway. 800 // is used anyway.
847 LOG(LS_WARNING) << "Can't process incoming " << PacketType(rtcp) 801 LOG(LS_WARNING) << "Can't process incoming " << RtpRtcpStringLiteral(rtcp)
848 << " packet when SRTP is inactive and crypto is required"; 802 << " packet when SRTP is inactive and crypto is required";
849 return; 803 return;
850 } 804 }
851 805
852 invoker_.AsyncInvoke<void>( 806 invoker_.AsyncInvoke<void>(
853 RTC_FROM_HERE, worker_thread_, 807 RTC_FROM_HERE, worker_thread_,
854 Bind(&BaseChannel::OnPacketReceived, this, rtcp, *packet, packet_time)); 808 Bind(&BaseChannel::ProcessPacket, this, rtcp, packet, packet_time));
855 } 809 }
856 810
857 void BaseChannel::OnPacketReceived(bool rtcp, 811 void BaseChannel::ProcessPacket(bool rtcp,
858 const rtc::CopyOnWriteBuffer& packet, 812 const rtc::CopyOnWriteBuffer& packet,
859 const rtc::PacketTime& packet_time) { 813 const rtc::PacketTime& packet_time) {
860 RTC_DCHECK(worker_thread_->IsCurrent()); 814 RTC_DCHECK(worker_thread_->IsCurrent());
815
861 // Need to copy variable because OnRtcpReceived/OnPacketReceived 816 // Need to copy variable because OnRtcpReceived/OnPacketReceived
862 // requires non-const pointer to buffer. This doesn't memcpy the actual data. 817 // requires non-const pointer to buffer. This doesn't memcpy the actual data.
863 rtc::CopyOnWriteBuffer data(packet); 818 rtc::CopyOnWriteBuffer data(packet);
864 if (rtcp) { 819 if (rtcp) {
865 media_channel_->OnRtcpReceived(&data, packet_time); 820 media_channel_->OnRtcpReceived(&data, packet_time);
866 } else { 821 } else {
867 media_channel_->OnPacketReceived(&data, packet_time); 822 media_channel_->OnPacketReceived(&data, packet_time);
868 } 823 }
869 } 824 }
870 825
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 RTC_DCHECK(transport->IsDtlsActive()); 935 RTC_DCHECK(transport->IsDtlsActive());
981 936
982 int selected_crypto_suite; 937 int selected_crypto_suite;
983 938
984 if (!transport->GetSrtpCryptoSuite(&selected_crypto_suite)) { 939 if (!transport->GetSrtpCryptoSuite(&selected_crypto_suite)) {
985 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite"; 940 LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite";
986 return false; 941 return false;
987 } 942 }
988 943
989 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " << content_name() << " " 944 LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " << content_name() << " "
990 << PacketType(rtcp); 945 << RtpRtcpStringLiteral(rtcp);
991 946
992 int key_len; 947 int key_len;
993 int salt_len; 948 int salt_len;
994 if (!rtc::GetSrtpKeyAndSaltLengths(selected_crypto_suite, &key_len, 949 if (!rtc::GetSrtpKeyAndSaltLengths(selected_crypto_suite, &key_len,
995 &salt_len)) { 950 &salt_len)) {
996 LOG(LS_ERROR) << "Unknown DTLS-SRTP crypto suite" << selected_crypto_suite; 951 LOG(LS_ERROR) << "Unknown DTLS-SRTP crypto suite" << selected_crypto_suite;
997 return false; 952 return false;
998 } 953 }
999 954
1000 // OK, we're now doing DTLS (RFC 5764) 955 // OK, we're now doing DTLS (RFC 5764)
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
1441 delete data; 1396 delete data;
1442 break; 1397 break;
1443 } 1398 }
1444 case MSG_FIRSTPACKETRECEIVED: { 1399 case MSG_FIRSTPACKETRECEIVED: {
1445 SignalFirstPacketReceived(this); 1400 SignalFirstPacketReceived(this);
1446 break; 1401 break;
1447 } 1402 }
1448 } 1403 }
1449 } 1404 }
1450 1405
1406 void BaseChannel::AddHandledPayloadType(int payload_type) {
1407 rtp_transport_.AddHandledPayloadType(payload_type);
1408 }
1409
1451 void BaseChannel::FlushRtcpMessages_n() { 1410 void BaseChannel::FlushRtcpMessages_n() {
1452 // Flush all remaining RTCP messages. This should only be called in 1411 // Flush all remaining RTCP messages. This should only be called in
1453 // destructor. 1412 // destructor.
1454 RTC_DCHECK(network_thread_->IsCurrent()); 1413 RTC_DCHECK(network_thread_->IsCurrent());
1455 rtc::MessageList rtcp_messages; 1414 rtc::MessageList rtcp_messages;
1456 network_thread_->Clear(this, MSG_SEND_RTCP_PACKET, &rtcp_messages); 1415 network_thread_->Clear(this, MSG_SEND_RTCP_PACKET, &rtcp_messages);
1457 for (const auto& message : rtcp_messages) { 1416 for (const auto& message : rtcp_messages) {
1458 network_thread_->Send(RTC_FROM_HERE, this, MSG_SEND_RTCP_PACKET, 1417 network_thread_->Send(RTC_FROM_HERE, this, MSG_SEND_RTCP_PACKET,
1459 message.pdata); 1418 message.pdata);
1460 } 1419 }
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1652 } 1611 }
1653 1612
1654 int VoiceChannel::GetOutputLevel_w() { 1613 int VoiceChannel::GetOutputLevel_w() {
1655 return media_channel()->GetOutputLevel(); 1614 return media_channel()->GetOutputLevel();
1656 } 1615 }
1657 1616
1658 void VoiceChannel::GetActiveStreams_w(AudioInfo::StreamList* actives) { 1617 void VoiceChannel::GetActiveStreams_w(AudioInfo::StreamList* actives) {
1659 media_channel()->GetActiveStreams(actives); 1618 media_channel()->GetActiveStreams(actives);
1660 } 1619 }
1661 1620
1662 void VoiceChannel::OnPacketRead(rtc::PacketTransportInternal* transport, 1621 void VoiceChannel::OnPacketReceived(bool rtcp,
1663 const char* data, 1622 rtc::CopyOnWriteBuffer& packet,
1664 size_t len, 1623 const rtc::PacketTime& packet_time) {
1665 const rtc::PacketTime& packet_time, 1624 BaseChannel::OnPacketReceived(rtcp, packet, packet_time);
1666 int flags) {
1667 BaseChannel::OnPacketRead(transport, data, len, packet_time, flags);
1668 // Set a flag when we've received an RTP packet. If we're waiting for early 1625 // Set a flag when we've received an RTP packet. If we're waiting for early
1669 // media, this will disable the timeout. 1626 // media, this will disable the timeout.
1670 if (!received_media_ && !PacketIsRtcp(transport, data, len)) { 1627 if (!received_media_ && !rtcp) {
1671 received_media_ = true; 1628 received_media_ = true;
1672 } 1629 }
1673 } 1630 }
1674 1631
1675 void BaseChannel::UpdateMediaSendRecvState() { 1632 void BaseChannel::UpdateMediaSendRecvState() {
1676 RTC_DCHECK(network_thread_->IsCurrent()); 1633 RTC_DCHECK(network_thread_->IsCurrent());
1677 invoker_.AsyncInvoke<void>( 1634 invoker_.AsyncInvoke<void>(
1678 RTC_FROM_HERE, worker_thread_, 1635 RTC_FROM_HERE, worker_thread_,
1679 Bind(&BaseChannel::UpdateMediaSendRecvState_w, this)); 1636 Bind(&BaseChannel::UpdateMediaSendRecvState_w, this));
1680 } 1637 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1759 } 1716 }
1760 1717
1761 AudioRecvParameters recv_params = last_recv_params_; 1718 AudioRecvParameters recv_params = last_recv_params_;
1762 RtpParametersFromMediaDescription(audio, &recv_params); 1719 RtpParametersFromMediaDescription(audio, &recv_params);
1763 if (!media_channel()->SetRecvParameters(recv_params)) { 1720 if (!media_channel()->SetRecvParameters(recv_params)) {
1764 SafeSetError("Failed to set local audio description recv parameters.", 1721 SafeSetError("Failed to set local audio description recv parameters.",
1765 error_desc); 1722 error_desc);
1766 return false; 1723 return false;
1767 } 1724 }
1768 for (const AudioCodec& codec : audio->codecs()) { 1725 for (const AudioCodec& codec : audio->codecs()) {
1769 bundle_filter()->AddPayloadType(codec.id); 1726 AddHandledPayloadType(codec.id);
1770 } 1727 }
1771 last_recv_params_ = recv_params; 1728 last_recv_params_ = recv_params;
1772 1729
1773 // TODO(pthatcher): Move local streams into AudioSendParameters, and 1730 // TODO(pthatcher): Move local streams into AudioSendParameters, and
1774 // only give it to the media channel once we have a remote 1731 // only give it to the media channel once we have a remote
1775 // description too (without a remote description, we won't be able 1732 // description too (without a remote description, we won't be able
1776 // to send them anyway). 1733 // to send them anyway).
1777 if (!UpdateLocalStreams_w(audio->streams(), action, error_desc)) { 1734 if (!UpdateLocalStreams_w(audio->streams(), action, error_desc)) {
1778 SafeSetError("Failed to set local audio description streams.", error_desc); 1735 SafeSetError("Failed to set local audio description streams.", error_desc);
1779 return false; 1736 return false;
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
2032 } 1989 }
2033 1990
2034 VideoRecvParameters recv_params = last_recv_params_; 1991 VideoRecvParameters recv_params = last_recv_params_;
2035 RtpParametersFromMediaDescription(video, &recv_params); 1992 RtpParametersFromMediaDescription(video, &recv_params);
2036 if (!media_channel()->SetRecvParameters(recv_params)) { 1993 if (!media_channel()->SetRecvParameters(recv_params)) {
2037 SafeSetError("Failed to set local video description recv parameters.", 1994 SafeSetError("Failed to set local video description recv parameters.",
2038 error_desc); 1995 error_desc);
2039 return false; 1996 return false;
2040 } 1997 }
2041 for (const VideoCodec& codec : video->codecs()) { 1998 for (const VideoCodec& codec : video->codecs()) {
2042 bundle_filter()->AddPayloadType(codec.id); 1999 AddHandledPayloadType(codec.id);
2043 } 2000 }
2044 last_recv_params_ = recv_params; 2001 last_recv_params_ = recv_params;
2045 2002
2046 // TODO(pthatcher): Move local streams into VideoSendParameters, and 2003 // TODO(pthatcher): Move local streams into VideoSendParameters, and
2047 // only give it to the media channel once we have a remote 2004 // only give it to the media channel once we have a remote
2048 // description too (without a remote description, we won't be able 2005 // description too (without a remote description, we won't be able
2049 // to send them anyway). 2006 // to send them anyway).
2050 if (!UpdateLocalStreams_w(video->streams(), action, error_desc)) { 2007 if (!UpdateLocalStreams_w(video->streams(), action, error_desc)) {
2051 SafeSetError("Failed to set local video description streams.", error_desc); 2008 SafeSetError("Failed to set local video description streams.", error_desc);
2052 return false; 2009 return false;
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
2227 } 2184 }
2228 2185
2229 DataRecvParameters recv_params = last_recv_params_; 2186 DataRecvParameters recv_params = last_recv_params_;
2230 RtpParametersFromMediaDescription(data, &recv_params); 2187 RtpParametersFromMediaDescription(data, &recv_params);
2231 if (!media_channel()->SetRecvParameters(recv_params)) { 2188 if (!media_channel()->SetRecvParameters(recv_params)) {
2232 SafeSetError("Failed to set remote data description recv parameters.", 2189 SafeSetError("Failed to set remote data description recv parameters.",
2233 error_desc); 2190 error_desc);
2234 return false; 2191 return false;
2235 } 2192 }
2236 for (const DataCodec& codec : data->codecs()) { 2193 for (const DataCodec& codec : data->codecs()) {
2237 bundle_filter()->AddPayloadType(codec.id); 2194 AddHandledPayloadType(codec.id);
2238 } 2195 }
2239 last_recv_params_ = recv_params; 2196 last_recv_params_ = recv_params;
2240 2197
2241 // TODO(pthatcher): Move local streams into DataSendParameters, and 2198 // TODO(pthatcher): Move local streams into DataSendParameters, and
2242 // only give it to the media channel once we have a remote 2199 // only give it to the media channel once we have a remote
2243 // description too (without a remote description, we won't be able 2200 // description too (without a remote description, we won't be able
2244 // to send them anyway). 2201 // to send them anyway).
2245 if (!UpdateLocalStreams_w(data->streams(), action, error_desc)) { 2202 if (!UpdateLocalStreams_w(data->streams(), action, error_desc)) {
2246 SafeSetError("Failed to set local data description streams.", error_desc); 2203 SafeSetError("Failed to set local data description streams.", error_desc);
2247 return false; 2204 return false;
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
2400 2357
2401 void RtpDataChannel::OnDataChannelReadyToSend(bool writable) { 2358 void RtpDataChannel::OnDataChannelReadyToSend(bool writable) {
2402 // This is usded for congestion control to indicate that the stream is ready 2359 // This is usded for congestion control to indicate that the stream is ready
2403 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates 2360 // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates
2404 // that the transport channel is ready. 2361 // that the transport channel is ready.
2405 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA, 2362 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA,
2406 new DataChannelReadyToSendMessageData(writable)); 2363 new DataChannelReadyToSendMessageData(writable));
2407 } 2364 }
2408 2365
2409 } // namespace cricket 2366 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/pc/channel.h ('k') | webrtc/pc/channel_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698