Change RtpTransport and DsctTransport to receives packets through ReceivedPacketCallback

Instead of using PacketTransportInternal::SignalReadPacket.

Bug: webrtc:15368
Change-Id: Icdc2d7f85df6db944f0ba0232891e6c5a8986a66
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/340440
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41823}
This commit is contained in:
Per K 2024-02-27 09:01:15 +01:00 committed by WebRTC LUCI CQ
parent 524a06bc54
commit f4aadf3774
13 changed files with 170 additions and 139 deletions

View File

@ -622,6 +622,7 @@ if (rtc_build_dcsctp) {
"../rtc_base:stringutils", "../rtc_base:stringutils",
"../rtc_base:threading", "../rtc_base:threading",
"../rtc_base/containers:flat_map", "../rtc_base/containers:flat_map",
"../rtc_base/network:received_packet",
"../rtc_base/third_party/sigslot:sigslot", "../rtc_base/third_party/sigslot:sigslot",
"../system_wrappers", "../system_wrappers",
] ]

View File

@ -12,6 +12,7 @@
#include <string.h> #include <string.h>
#include <cstdint>
#include <vector> #include <vector>
// PacketTimeUpdateParams is defined in asyncpacketsocket.h. // PacketTimeUpdateParams is defined in asyncpacketsocket.h.
@ -172,12 +173,11 @@ absl::string_view RtpPacketTypeToString(RtpPacketType packet_type) {
RTC_CHECK_NOTREACHED(); RTC_CHECK_NOTREACHED();
} }
RtpPacketType InferRtpPacketType(rtc::ArrayView<const char> packet) { RtpPacketType InferRtpPacketType(rtc::ArrayView<const uint8_t> packet) {
if (webrtc::IsRtcpPacket( if (webrtc::IsRtcpPacket(packet)) {
rtc::reinterpret_array_view<const uint8_t>(packet))) {
return RtpPacketType::kRtcp; return RtpPacketType::kRtcp;
} }
if (webrtc::IsRtpPacket(rtc::reinterpret_array_view<const uint8_t>(packet))) { if (webrtc::IsRtpPacket(packet)) {
return RtpPacketType::kRtp; return RtpPacketType::kRtp;
} }
return RtpPacketType::kUnknown; return RtpPacketType::kUnknown;

View File

@ -11,6 +11,8 @@
#ifndef MEDIA_BASE_RTP_UTILS_H_ #ifndef MEDIA_BASE_RTP_UTILS_H_
#define MEDIA_BASE_RTP_UTILS_H_ #define MEDIA_BASE_RTP_UTILS_H_
#include <cstdint>
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include "api/array_view.h" #include "api/array_view.h"
#include "rtc_base/byte_order.h" #include "rtc_base/byte_order.h"
@ -46,7 +48,7 @@ bool GetRtcpType(const void* data, size_t len, int* value);
bool GetRtcpSsrc(const void* data, size_t len, uint32_t* value); bool GetRtcpSsrc(const void* data, size_t len, uint32_t* value);
// Checks the packet header to determine if it can be an RTP or RTCP packet. // Checks the packet header to determine if it can be an RTP or RTCP packet.
RtpPacketType InferRtpPacketType(rtc::ArrayView<const char> packet); RtpPacketType InferRtpPacketType(rtc::ArrayView<const uint8_t> packet);
// True if |payload type| is 0-127. // True if |payload type| is 0-127.
bool IsValidRtpPayloadType(int payload_type); bool IsValidRtpPayloadType(int payload_type);

View File

@ -72,15 +72,12 @@ static const int kAstIndexInOneByteRtpMsg = 21;
// and in message `kRtpMsgWithTwoByteAbsSendTimeExtension`. // and in message `kRtpMsgWithTwoByteAbsSendTimeExtension`.
static const int kAstIndexInTwoByteRtpMsg = 21; static const int kAstIndexInTwoByteRtpMsg = 21;
static const rtc::ArrayView<const char> kPcmuFrameArrayView = static const rtc::ArrayView<const uint8_t> kPcmuFrameArrayView =
rtc::MakeArrayView(reinterpret_cast<const char*>(kPcmuFrame), rtc::MakeArrayView(kPcmuFrame, sizeof(kPcmuFrame));
sizeof(kPcmuFrame)); static const rtc::ArrayView<const uint8_t> kRtcpReportArrayView =
static const rtc::ArrayView<const char> kRtcpReportArrayView = rtc::MakeArrayView(kRtcpReport, sizeof(kRtcpReport));
rtc::MakeArrayView(reinterpret_cast<const char*>(kRtcpReport), static const rtc::ArrayView<const uint8_t> kInvalidPacketArrayView =
sizeof(kRtcpReport)); rtc::MakeArrayView(kInvalidPacket, sizeof(kInvalidPacket));
static const rtc::ArrayView<const char> kInvalidPacketArrayView =
rtc::MakeArrayView(reinterpret_cast<const char*>(kInvalidPacket),
sizeof(kInvalidPacket));
TEST(RtpUtilsTest, GetRtcp) { TEST(RtpUtilsTest, GetRtcp) {
int pt; int pt;

View File

@ -27,6 +27,7 @@
#include "p2p/base/packet_transport_internal.h" #include "p2p/base/packet_transport_internal.h"
#include "rtc_base/checks.h" #include "rtc_base/checks.h"
#include "rtc_base/logging.h" #include "rtc_base/logging.h"
#include "rtc_base/network/received_packet.h"
#include "rtc_base/socket.h" #include "rtc_base/socket.h"
#include "rtc_base/strings/string_builder.h" #include "rtc_base/strings/string_builder.h"
#include "rtc_base/thread.h" #include "rtc_base/thread.h"
@ -605,8 +606,11 @@ void DcSctpTransport::ConnectTransportSignals() {
} }
transport_->SignalWritableState.connect( transport_->SignalWritableState.connect(
this, &DcSctpTransport::OnTransportWritableState); this, &DcSctpTransport::OnTransportWritableState);
transport_->SignalReadPacket.connect(this, transport_->RegisterReceivedPacketCallback(
&DcSctpTransport::OnTransportReadPacket); this, [&](rtc::PacketTransportInternal* transport,
const rtc::ReceivedPacket& packet) {
OnTransportReadPacket(transport, packet);
});
transport_->SignalClosed.connect(this, &DcSctpTransport::OnTransportClosed); transport_->SignalClosed.connect(this, &DcSctpTransport::OnTransportClosed);
} }
@ -616,7 +620,7 @@ void DcSctpTransport::DisconnectTransportSignals() {
return; return;
} }
transport_->SignalWritableState.disconnect(this); transport_->SignalWritableState.disconnect(this);
transport_->SignalReadPacket.disconnect(this); transport_->DeregisterReceivedPacketCallback(this);
transport_->SignalClosed.disconnect(this); transport_->SignalClosed.disconnect(this);
} }
@ -632,21 +636,17 @@ void DcSctpTransport::OnTransportWritableState(
void DcSctpTransport::OnTransportReadPacket( void DcSctpTransport::OnTransportReadPacket(
rtc::PacketTransportInternal* transport, rtc::PacketTransportInternal* transport,
const char* data, const rtc::ReceivedPacket& packet) {
size_t length,
const int64_t& /* packet_time_us */,
int flags) {
RTC_DCHECK_RUN_ON(network_thread_); RTC_DCHECK_RUN_ON(network_thread_);
if (flags) { if (packet.decryption_info() != rtc::ReceivedPacket::kDtlsDecrypted) {
// We are only interested in SCTP packets. // We are only interested in SCTP packets.
return; return;
} }
RTC_DLOG(LS_VERBOSE) << debug_name_ RTC_DLOG(LS_VERBOSE) << debug_name_ << "->OnTransportReadPacket(), length="
<< "->OnTransportReadPacket(), length=" << length; << packet.payload().size();
if (socket_) { if (socket_) {
socket_->ReceivePacket(rtc::ArrayView<const uint8_t>( socket_->ReceivePacket(packet.payload());
reinterpret_cast<const uint8_t*>(data), length));
} }
} }

View File

@ -27,6 +27,7 @@
#include "p2p/base/packet_transport_internal.h" #include "p2p/base/packet_transport_internal.h"
#include "rtc_base/containers/flat_map.h" #include "rtc_base/containers/flat_map.h"
#include "rtc_base/copy_on_write_buffer.h" #include "rtc_base/copy_on_write_buffer.h"
#include "rtc_base/network/received_packet.h"
#include "rtc_base/random.h" #include "rtc_base/random.h"
#include "rtc_base/third_party/sigslot/sigslot.h" #include "rtc_base/third_party/sigslot/sigslot.h"
#include "rtc_base/thread.h" #include "rtc_base/thread.h"
@ -94,10 +95,7 @@ class DcSctpTransport : public cricket::SctpTransportInternal,
void DisconnectTransportSignals(); void DisconnectTransportSignals();
void OnTransportWritableState(rtc::PacketTransportInternal* transport); void OnTransportWritableState(rtc::PacketTransportInternal* transport);
void OnTransportReadPacket(rtc::PacketTransportInternal* transport, void OnTransportReadPacket(rtc::PacketTransportInternal* transport,
const char* data, const rtc::ReceivedPacket& packet);
size_t length,
const int64_t& /* packet_time_us */,
int flags);
void OnTransportClosed(rtc::PacketTransportInternal* transport); void OnTransportClosed(rtc::PacketTransportInternal* transport);
void MaybeConnectSocket(); void MaybeConnectSocket();

View File

@ -1100,6 +1100,7 @@ if (rtc_include_tests) {
"../rtc_base:socket_server", "../rtc_base:socket_server",
"../rtc_base:ssl", "../rtc_base:ssl",
"../rtc_base:threading", "../rtc_base:threading",
"../rtc_base/network:received_packet",
"../rtc_base/third_party/sigslot", "../rtc_base/third_party/sigslot",
"../test:test_support", "../test:test_support",
] ]

View File

@ -22,6 +22,7 @@
#include "p2p/base/dtls_transport_internal.h" #include "p2p/base/dtls_transport_internal.h"
#include "p2p/base/fake_ice_transport.h" #include "p2p/base/fake_ice_transport.h"
#include "rtc_base/fake_ssl_identity.h" #include "rtc_base/fake_ssl_identity.h"
#include "rtc_base/network/received_packet.h"
#include "rtc_base/rtc_certificate.h" #include "rtc_base/rtc_certificate.h"
namespace cricket { namespace cricket {
@ -37,8 +38,11 @@ class FakeDtlsTransport : public DtlsTransportInternal {
component_(ice_transport->component()), component_(ice_transport->component()),
dtls_fingerprint_("", nullptr) { dtls_fingerprint_("", nullptr) {
RTC_DCHECK(ice_transport_); RTC_DCHECK(ice_transport_);
ice_transport_->SignalReadPacket.connect( ice_transport_->RegisterReceivedPacketCallback(
this, &FakeDtlsTransport::OnIceTransportReadPacket); this, [&](rtc::PacketTransportInternal* transport,
const rtc::ReceivedPacket& packet) {
OnIceTransportReadPacket(transport, packet);
});
ice_transport_->SignalNetworkRouteChanged.connect( ice_transport_->SignalNetworkRouteChanged.connect(
this, &FakeDtlsTransport::OnNetworkRouteChanged); this, &FakeDtlsTransport::OnNetworkRouteChanged);
} }
@ -49,8 +53,11 @@ class FakeDtlsTransport : public DtlsTransportInternal {
component_(owned_ice_transport_->component()), component_(owned_ice_transport_->component()),
dtls_fingerprint_("", rtc::ArrayView<const uint8_t>()) { dtls_fingerprint_("", rtc::ArrayView<const uint8_t>()) {
ice_transport_ = owned_ice_transport_.get(); ice_transport_ = owned_ice_transport_.get();
ice_transport_->SignalReadPacket.connect( ice_transport_->RegisterReceivedPacketCallback(
this, &FakeDtlsTransport::OnIceTransportReadPacket); this, [&](rtc::PacketTransportInternal* transport,
const rtc::ReceivedPacket& packet) {
OnIceTransportReadPacket(transport, packet);
});
ice_transport_->SignalNetworkRouteChanged.connect( ice_transport_->SignalNetworkRouteChanged.connect(
this, &FakeDtlsTransport::OnNetworkRouteChanged); this, &FakeDtlsTransport::OnNetworkRouteChanged);
} }
@ -71,6 +78,7 @@ class FakeDtlsTransport : public DtlsTransportInternal {
if (dest_ && dest_->dest_ == this) { if (dest_ && dest_->dest_ == this) {
dest_->dest_ = nullptr; dest_->dest_ = nullptr;
} }
ice_transport_->DeregisterReceivedPacketCallback(this);
} }
// Get inner fake ICE transport. // Get inner fake ICE transport.
@ -264,11 +272,8 @@ class FakeDtlsTransport : public DtlsTransportInternal {
private: private:
void OnIceTransportReadPacket(PacketTransportInternal* ice_, void OnIceTransportReadPacket(PacketTransportInternal* ice_,
const char* data, const rtc::ReceivedPacket& packet) {
size_t len, NotifyPacketReceived(packet);
const int64_t& packet_time_us,
int flags) {
SignalReadPacket(this, data, len, packet_time_us, flags);
} }
void set_receiving(bool receiving) { void set_receiving(bool receiving) {

View File

@ -2121,6 +2121,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../rtc_base:threading", "../rtc_base:threading",
"../rtc_base:unique_id_generator", "../rtc_base:unique_id_generator",
"../rtc_base/containers:flat_set", "../rtc_base/containers:flat_set",
"../rtc_base/network:received_packet",
"../rtc_base/third_party/sigslot", "../rtc_base/third_party/sigslot",
"../system_wrappers:metrics", "../system_wrappers:metrics",
"../test:explicit_key_value_config", "../test:explicit_key_value_config",

View File

@ -152,6 +152,19 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
SendTask(network_thread_, [this]() { SendTask(network_thread_, [this]() {
network_thread_safety_->SetNotAlive(); network_thread_safety_->SetNotAlive();
DeinitChannels(); DeinitChannels();
// Transports must be created and destroyed on the network thread.
fake_rtp_dtls_transport1_ = nullptr;
fake_rtcp_dtls_transport1_ = nullptr;
fake_rtp_dtls_transport2_ = nullptr;
fake_rtcp_dtls_transport2_ = nullptr;
fake_rtp_packet_transport1_ = nullptr;
fake_rtcp_packet_transport1_ = nullptr;
fake_rtp_packet_transport2_ = nullptr;
fake_rtcp_packet_transport2_ = nullptr;
rtp_transport1_ = nullptr;
rtp_transport2_ = nullptr;
new_rtp_transport_ = nullptr;
}); });
} }
} }
@ -187,66 +200,70 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
// channels. // channels.
RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT); RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
rtc::Thread* worker_thread = rtc::Thread::Current(); rtc::Thread* worker_thread = rtc::Thread::Current();
// Based on flags, create fake DTLS or raw packet transports.
if (flags1 & RAW_PACKET_TRANSPORT) { network_thread_->BlockingCall([&] {
fake_rtp_packet_transport1_.reset( // Based on flags, create fake DTLS or raw packet transports.
new rtc::FakePacketTransport("channel1_rtp"));
if (!(flags1 & RTCP_MUX)) { if (flags1 & RAW_PACKET_TRANSPORT) {
fake_rtcp_packet_transport1_.reset( fake_rtp_packet_transport1_.reset(
new rtc::FakePacketTransport("channel1_rtcp")); new rtc::FakePacketTransport("channel1_rtp"));
} if (!(flags1 & RTCP_MUX)) {
} else { fake_rtcp_packet_transport1_.reset(
// Confirmed to work with KT_RSA and KT_ECDSA. new rtc::FakePacketTransport("channel1_rtcp"));
fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport( }
"channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_)); } else {
if (!(flags1 & RTCP_MUX)) { // Confirmed to work with KT_RSA and KT_ECDSA.
fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport( fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
"channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP, "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
network_thread_)); if (!(flags1 & RTCP_MUX)) {
} fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
if (flags1 & DTLS) { "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
auto cert1 = rtc::RTCCertificate::Create( network_thread_));
rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT)); }
fake_rtp_dtls_transport1_->SetLocalCertificate(cert1); if (flags1 & DTLS) {
if (fake_rtcp_dtls_transport1_) { auto cert1 = rtc::RTCCertificate::Create(
fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1); rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
if (fake_rtcp_dtls_transport1_) {
fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
}
} }
} }
} // Based on flags, create fake DTLS or raw packet transports.
// Based on flags, create fake DTLS or raw packet transports. if (flags2 & RAW_PACKET_TRANSPORT) {
if (flags2 & RAW_PACKET_TRANSPORT) { fake_rtp_packet_transport2_.reset(
fake_rtp_packet_transport2_.reset( new rtc::FakePacketTransport("channel2_rtp"));
new rtc::FakePacketTransport("channel2_rtp")); if (!(flags2 & RTCP_MUX)) {
if (!(flags2 & RTCP_MUX)) { fake_rtcp_packet_transport2_.reset(
fake_rtcp_packet_transport2_.reset( new rtc::FakePacketTransport("channel2_rtcp"));
new rtc::FakePacketTransport("channel2_rtcp")); }
} } else {
} else { // Confirmed to work with KT_RSA and KT_ECDSA.
// Confirmed to work with KT_RSA and KT_ECDSA. fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport( "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_));
"channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP, network_thread_)); if (!(flags2 & RTCP_MUX)) {
if (!(flags2 & RTCP_MUX)) { fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport( "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
"channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP, network_thread_));
network_thread_)); }
} if (flags2 & DTLS) {
if (flags2 & DTLS) { auto cert2 = rtc::RTCCertificate::Create(
auto cert2 = rtc::RTCCertificate::Create( rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT));
rtc::SSLIdentity::Create("session2", rtc::KT_DEFAULT)); fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
fake_rtp_dtls_transport2_->SetLocalCertificate(cert2); if (fake_rtcp_dtls_transport2_) {
if (fake_rtcp_dtls_transport2_) { fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2); }
} }
} }
} rtp_transport1_ = CreateRtpTransportBasedOnFlags(
rtp_transport1_ = CreateRtpTransportBasedOnFlags( fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(),
fake_rtp_packet_transport1_.get(), fake_rtcp_packet_transport1_.get(), fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(),
fake_rtp_dtls_transport1_.get(), fake_rtcp_dtls_transport1_.get(), flags1);
flags1); rtp_transport2_ = CreateRtpTransportBasedOnFlags(
rtp_transport2_ = CreateRtpTransportBasedOnFlags( fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(),
fake_rtp_packet_transport2_.get(), fake_rtcp_packet_transport2_.get(), fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(),
fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get(), flags2);
flags2); });
channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1s), channel1_ = CreateChannel(worker_thread, network_thread_, std::move(ch1s),
std::move(ch1r), rtp_transport1_.get(), flags1); std::move(ch1r), rtp_transport1_.get(), flags1);
@ -1351,12 +1368,11 @@ class ChannelTest : public ::testing::Test, public sigslot::has_slots<> {
CreateChannels(DTLS, DTLS); CreateChannels(DTLS, DTLS);
new_rtp_transport_ = CreateDtlsSrtpTransport(
fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
bool rcv_success, send_success; bool rcv_success, send_success;
int rcv_buf, send_buf; int rcv_buf, send_buf;
SendTask(network_thread_, [&] { SendTask(network_thread_, [&] {
new_rtp_transport_ = CreateDtlsSrtpTransport(
fake_rtp_dtls_transport2_.get(), fake_rtcp_dtls_transport2_.get());
channel1_->SetOption(cricket::BaseChannel::ST_RTP, channel1_->SetOption(cricket::BaseChannel::ST_RTP,
rtc::Socket::Option::OPT_SNDBUF, kSndBufSize); rtc::Socket::Option::OPT_SNDBUF, kSndBufSize);
channel2_->SetOption(cricket::BaseChannel::ST_RTP, channel2_->SetOption(cricket::BaseChannel::ST_RTP,

View File

@ -31,6 +31,7 @@
#include "rtc_base/helpers.h" #include "rtc_base/helpers.h"
#include "rtc_base/logging.h" #include "rtc_base/logging.h"
#include "rtc_base/net_helper.h" #include "rtc_base/net_helper.h"
#include "rtc_base/network/received_packet.h"
#include "rtc_base/socket_address.h" #include "rtc_base/socket_address.h"
#include "rtc_base/ssl_certificate.h" #include "rtc_base/ssl_certificate.h"
#include "rtc_base/ssl_identity.h" #include "rtc_base/ssl_identity.h"
@ -1039,42 +1040,44 @@ class JsepTransport2HeaderExtensionTest
auto fake_dtls2 = auto fake_dtls2 =
static_cast<FakeDtlsTransport*>(jsep_transport2_->rtp_dtls_transport()); static_cast<FakeDtlsTransport*>(jsep_transport2_->rtp_dtls_transport());
fake_dtls1->fake_ice_transport()->SignalReadPacket.connect( fake_dtls1->fake_ice_transport()->RegisterReceivedPacketCallback(
this, &JsepTransport2HeaderExtensionTest::OnReadPacket1); this, [&](rtc::PacketTransportInternal* transport,
fake_dtls2->fake_ice_transport()->SignalReadPacket.connect( const rtc::ReceivedPacket& packet) {
this, &JsepTransport2HeaderExtensionTest::OnReadPacket2); OnReadPacket1(transport, packet);
});
fake_dtls2->fake_ice_transport()->RegisterReceivedPacketCallback(
this, [&](rtc::PacketTransportInternal* transport,
const rtc::ReceivedPacket& packet) {
OnReadPacket2(transport, packet);
});
auto cert1 = rtc::RTCCertificate::Create( auto cert1 = rtc::RTCCertificate::Create(
rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT)); rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
jsep_transport1_->rtp_dtls_transport()->SetLocalCertificate(cert1); jsep_transport1_->rtp_dtls_transport()->SetLocalCertificate(cert1);
auto cert2 = rtc::RTCCertificate::Create( auto cert2 = rtc::RTCCertificate::Create(
rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT)); rtc::SSLIdentity::Create("session1", rtc::KT_DEFAULT));
jsep_transport2_->rtp_dtls_transport()->SetLocalCertificate(cert2); jsep_transport2_->rtp_dtls_transport()->SetLocalCertificate(cert2);
} }
void OnReadPacket1(rtc::PacketTransportInternal* transport, void OnReadPacket1(rtc::PacketTransportInternal* transport,
const char* data, const rtc::ReceivedPacket& packet) {
size_t size,
const int64_t& /* packet_time_us */,
int flags) {
RTC_LOG(LS_INFO) << "JsepTransport 1 Received a packet."; RTC_LOG(LS_INFO) << "JsepTransport 1 Received a packet.";
CompareHeaderExtensions( CompareHeaderExtensions(
reinterpret_cast<const char*>(kPcmuFrameWithExtensions), reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
sizeof(kPcmuFrameWithExtensions), data, size, recv_encrypted_headers1_, sizeof(kPcmuFrameWithExtensions),
false); reinterpret_cast<const char*>(packet.payload().data()),
packet.payload().size(), recv_encrypted_headers1_, false);
received_packet_count_++; received_packet_count_++;
} }
void OnReadPacket2(rtc::PacketTransportInternal* transport, void OnReadPacket2(rtc::PacketTransportInternal* transport,
const char* data, const rtc::ReceivedPacket& packet) {
size_t size,
const int64_t& /* packet_time_us */,
int flags) {
RTC_LOG(LS_INFO) << "JsepTransport 2 Received a packet."; RTC_LOG(LS_INFO) << "JsepTransport 2 Received a packet.";
CompareHeaderExtensions( CompareHeaderExtensions(
reinterpret_cast<const char*>(kPcmuFrameWithExtensions), reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
sizeof(kPcmuFrameWithExtensions), data, size, recv_encrypted_headers2_, sizeof(kPcmuFrameWithExtensions),
false); reinterpret_cast<const char*>(packet.payload().data()),
packet.payload().size(), recv_encrypted_headers2_, false);
received_packet_count_++; received_packet_count_++;
} }

View File

@ -54,7 +54,7 @@ void RtpTransport::SetRtpPacketTransport(
} }
if (rtp_packet_transport_) { if (rtp_packet_transport_) {
rtp_packet_transport_->SignalReadyToSend.disconnect(this); rtp_packet_transport_->SignalReadyToSend.disconnect(this);
rtp_packet_transport_->SignalReadPacket.disconnect(this); rtp_packet_transport_->DeregisterReceivedPacketCallback(this);
rtp_packet_transport_->SignalNetworkRouteChanged.disconnect(this); rtp_packet_transport_->SignalNetworkRouteChanged.disconnect(this);
rtp_packet_transport_->SignalWritableState.disconnect(this); rtp_packet_transport_->SignalWritableState.disconnect(this);
rtp_packet_transport_->SignalSentPacket.disconnect(this); rtp_packet_transport_->SignalSentPacket.disconnect(this);
@ -64,8 +64,11 @@ void RtpTransport::SetRtpPacketTransport(
if (new_packet_transport) { if (new_packet_transport) {
new_packet_transport->SignalReadyToSend.connect( new_packet_transport->SignalReadyToSend.connect(
this, &RtpTransport::OnReadyToSend); this, &RtpTransport::OnReadyToSend);
new_packet_transport->SignalReadPacket.connect(this, new_packet_transport->RegisterReceivedPacketCallback(
&RtpTransport::OnReadPacket); this, [&](rtc::PacketTransportInternal* transport,
const rtc::ReceivedPacket& packet) {
OnReadPacket(transport, packet);
});
new_packet_transport->SignalNetworkRouteChanged.connect( new_packet_transport->SignalNetworkRouteChanged.connect(
this, &RtpTransport::OnNetworkRouteChanged); this, &RtpTransport::OnNetworkRouteChanged);
new_packet_transport->SignalWritableState.connect( new_packet_transport->SignalWritableState.connect(
@ -90,7 +93,7 @@ void RtpTransport::SetRtcpPacketTransport(
} }
if (rtcp_packet_transport_) { if (rtcp_packet_transport_) {
rtcp_packet_transport_->SignalReadyToSend.disconnect(this); rtcp_packet_transport_->SignalReadyToSend.disconnect(this);
rtcp_packet_transport_->SignalReadPacket.disconnect(this); rtcp_packet_transport_->DeregisterReceivedPacketCallback(this);
rtcp_packet_transport_->SignalNetworkRouteChanged.disconnect(this); rtcp_packet_transport_->SignalNetworkRouteChanged.disconnect(this);
rtcp_packet_transport_->SignalWritableState.disconnect(this); rtcp_packet_transport_->SignalWritableState.disconnect(this);
rtcp_packet_transport_->SignalSentPacket.disconnect(this); rtcp_packet_transport_->SignalSentPacket.disconnect(this);
@ -100,8 +103,11 @@ void RtpTransport::SetRtcpPacketTransport(
if (new_packet_transport) { if (new_packet_transport) {
new_packet_transport->SignalReadyToSend.connect( new_packet_transport->SignalReadyToSend.connect(
this, &RtpTransport::OnReadyToSend); this, &RtpTransport::OnReadyToSend);
new_packet_transport->SignalReadPacket.connect(this, new_packet_transport->RegisterReceivedPacketCallback(
&RtpTransport::OnReadPacket); this, [&](rtc::PacketTransportInternal* transport,
const rtc::ReceivedPacket& packet) {
OnReadPacket(transport, packet);
});
new_packet_transport->SignalNetworkRouteChanged.connect( new_packet_transport->SignalNetworkRouteChanged.connect(
this, &RtpTransport::OnNetworkRouteChanged); this, &RtpTransport::OnNetworkRouteChanged);
new_packet_transport->SignalWritableState.connect( new_packet_transport->SignalWritableState.connect(
@ -251,30 +257,34 @@ void RtpTransport::OnRtcpPacketReceived(rtc::CopyOnWriteBuffer packet,
} }
void RtpTransport::OnReadPacket(rtc::PacketTransportInternal* transport, void RtpTransport::OnReadPacket(rtc::PacketTransportInternal* transport,
const char* data, const rtc::ReceivedPacket& received_packet) {
size_t len,
const int64_t& packet_time_us,
int flags) {
TRACE_EVENT0("webrtc", "RtpTransport::OnReadPacket"); TRACE_EVENT0("webrtc", "RtpTransport::OnReadPacket");
// When using RTCP multiplexing we might get RTCP packets on the RTP // When using RTCP multiplexing we might get RTCP packets on the RTP
// transport. We check the RTP payload type to determine if it is RTCP. // transport. We check the RTP payload type to determine if it is RTCP.
auto array_view = rtc::MakeArrayView(data, len); cricket::RtpPacketType packet_type =
cricket::RtpPacketType packet_type = cricket::InferRtpPacketType(array_view); cricket::InferRtpPacketType(received_packet.payload());
// Filter out the packet that is neither RTP nor RTCP. // Filter out the packet that is neither RTP nor RTCP.
if (packet_type == cricket::RtpPacketType::kUnknown) { if (packet_type == cricket::RtpPacketType::kUnknown) {
return; return;
} }
// Protect ourselves against crazy data. // Protect ourselves against crazy data.
if (!cricket::IsValidRtpPacketSize(packet_type, len)) { if (!cricket::IsValidRtpPacketSize(packet_type,
received_packet.payload().size())) {
RTC_LOG(LS_ERROR) << "Dropping incoming " RTC_LOG(LS_ERROR) << "Dropping incoming "
<< cricket::RtpPacketTypeToString(packet_type) << cricket::RtpPacketTypeToString(packet_type)
<< " packet: wrong size=" << len; << " packet: wrong size="
<< received_packet.payload().size();
return; return;
} }
rtc::CopyOnWriteBuffer packet(data, len); rtc::CopyOnWriteBuffer packet(received_packet.payload());
int64_t packet_time_us = received_packet.arrival_time()
? received_packet.arrival_time()->us()
: -1;
// TODO(bugs.webrtc.org/15368): Propagate timestamp and received packet
// metadata further.
if (packet_type == cricket::RtpPacketType::kRtcp) { if (packet_type == cricket::RtpPacketType::kRtcp) {
OnRtcpPacketReceived(std::move(packet), packet_time_us); OnRtcpPacketReceived(std::move(packet), packet_time_us);
} else { } else {

View File

@ -113,10 +113,7 @@ class RtpTransport : public RtpTransportInternal {
void OnSentPacket(rtc::PacketTransportInternal* packet_transport, void OnSentPacket(rtc::PacketTransportInternal* packet_transport,
const rtc::SentPacket& sent_packet); const rtc::SentPacket& sent_packet);
void OnReadPacket(rtc::PacketTransportInternal* transport, void OnReadPacket(rtc::PacketTransportInternal* transport,
const char* data, const rtc::ReceivedPacket& received_packet);
size_t len,
const int64_t& packet_time_us,
int flags);
// Updates "ready to send" for an individual channel and fires // Updates "ready to send" for an individual channel and fires
// SignalReadyToSend. // SignalReadyToSend.