Fixed invalid filtering of SCTP datachannel packets on high ports.
Packets on source ports 32768-49151 got identified as RTP packets by
"IsRtpPacket" and were ignored by the SCTP transport.
This CL changes this to check the packet flags for "PF_SRTP_BYPASS".
BUG=webrtc:6959
Review-Url: https://codereview.webrtc.org/2743653005
Cr-Commit-Position: refs/heads/master@{#17179}
diff --git a/webrtc/media/sctp/sctptransport.cc b/webrtc/media/sctp/sctptransport.cc
index ae69628..45e8dec 100644
--- a/webrtc/media/sctp/sctptransport.cc
+++ b/webrtc/media/sctp/sctptransport.cc
@@ -37,7 +37,6 @@
#include "webrtc/base/trace_event.h"
#include "webrtc/media/base/codec.h"
#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/rtputils.h" // For IsRtpPacket
#include "webrtc/media/base/streamparams.h"
#include "webrtc/p2p/base/dtlstransportinternal.h" // For PF_NORMAL
@@ -828,9 +827,8 @@
RTC_DCHECK_EQ(transport_channel_, transport);
TRACE_EVENT0("webrtc", "SctpTransport::OnPacketRead");
- // TODO(pthatcher): Do this in a more robust way by checking for
- // SCTP or DTLS.
- if (IsRtpPacket(data, len)) {
+ if (flags & PF_SRTP_BYPASS) {
+ // We are only interested in SCTP packets.
return;
}
diff --git a/webrtc/media/sctp/sctptransport_unittest.cc b/webrtc/media/sctp/sctptransport_unittest.cc
index 7fcbd9c..b8495d0 100644
--- a/webrtc/media/sctp/sctptransport_unittest.cc
+++ b/webrtc/media/sctp/sctptransport_unittest.cc
@@ -130,6 +130,10 @@
static void SetUpTestCase() {}
void SetupConnectedTransportsWithTwoStreams() {
+ SetupConnectedTransportsWithTwoStreams(kTransport1Port, kTransport2Port);
+ }
+
+ void SetupConnectedTransportsWithTwoStreams(int port1, int port2) {
fake_dtls1_.reset(new FakeDtlsTransport("fake dtls 1", 0));
fake_dtls2_.reset(new FakeDtlsTransport("fake dtls 2", 0));
recv1_.reset(new SctpFakeDataReceiver());
@@ -153,8 +157,8 @@
LOG(LS_VERBOSE) << "Connect the transports -----------------------------";
// Both transports need to have started (with matching ports) for an
// association to be formed.
- transport1_->Start(kTransport1Port, kTransport2Port);
- transport2_->Start(kTransport2Port, kTransport1Port);
+ transport1_->Start(port1, port2);
+ transport2_->Start(port2, port1);
}
bool AddStream(int sid) {
@@ -451,6 +455,20 @@
EXPECT_EQ(SDR_ERROR, result);
}
+TEST_F(SctpTransportTest, SendDataHighPorts) {
+ SetupConnectedTransportsWithTwoStreams(32768, 32769);
+
+ SendDataResult result;
+ ASSERT_TRUE(SendData(transport1(), 1, "hello?", &result));
+ EXPECT_EQ(SDR_SUCCESS, result);
+ EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hello?"), kDefaultTimeout);
+
+ ASSERT_TRUE(SendData(transport2(), 2, "hi transport1", &result));
+ EXPECT_EQ(SDR_SUCCESS, result);
+ EXPECT_TRUE_WAIT(ReceivedData(receiver1(), 2, "hi transport1"),
+ kDefaultTimeout);
+}
+
TEST_F(SctpTransportTest, ClosesRemoteStream) {
SetupConnectedTransportsWithTwoStreams();
SignalTransportClosedObserver transport1_sig_receiver,