Send and parse SCTP max-message-size in SDP
This also changes the default when no max-message-size is set
to the protocol defined value of 64K, and prevents messages
from being sent when they are too large to send.
Bug: webrtc:10358
Change-Id: Iacc1dd774d1554d9f27315378fbea6351300b5cc
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/135948
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27945}
diff --git a/media/sctp/sctp_transport_unittest.cc b/media/sctp/sctp_transport_unittest.cc
index 86cb416..d7ccd58 100644
--- a/media/sctp/sctp_transport_unittest.cc
+++ b/media/sctp/sctp_transport_unittest.cc
@@ -151,8 +151,8 @@
<< "Connect the transports -----------------------------";
// Both transports need to have started (with matching ports) for an
// association to be formed.
- transport1_->Start(port1, port2);
- transport2_->Start(port2, port1);
+ transport1_->Start(port1, port2, kSctpSendBufferSize);
+ transport2_->Start(port2, port1, kSctpSendBufferSize);
}
bool AddStream(int sid) {
@@ -251,8 +251,8 @@
transport2->OpenStream(1);
// Tell them both to start (though transport1_ is connected to black_hole).
- transport1->Start(kTransport1Port, kTransport2Port);
- transport2->Start(kTransport2Port, kTransport1Port);
+ transport1->Start(kTransport1Port, kTransport2Port, kSctpSendBufferSize);
+ transport2->Start(kTransport2Port, kTransport1Port, kSctpSendBufferSize);
// Switch transport1_ to the normal fake_dtls1_ transport.
transport1->SetDtlsTransport(&fake_dtls1);
@@ -276,7 +276,8 @@
// Calling Start twice shouldn't do anything bad, if with the same parameters.
TEST_F(SctpTransportTest, DuplicateStartCallsIgnored) {
SetupConnectedTransportsWithTwoStreams();
- EXPECT_TRUE(transport1()->Start(kTransport1Port, kTransport2Port));
+ EXPECT_TRUE(transport1()->Start(kTransport1Port, kTransport2Port,
+ kSctpSendBufferSize));
// Make sure we can still send/recv data.
SendDataResult result;
@@ -289,8 +290,8 @@
// Calling Start a second time with a different port should fail.
TEST_F(SctpTransportTest, CallingStartWithDifferentPortFails) {
SetupConnectedTransportsWithTwoStreams();
- EXPECT_FALSE(transport1()->Start(kTransport1Port, 1234));
- EXPECT_FALSE(transport1()->Start(1234, kTransport2Port));
+ EXPECT_FALSE(transport1()->Start(kTransport1Port, 1234, kSctpSendBufferSize));
+ EXPECT_FALSE(transport1()->Start(1234, kTransport2Port, kSctpSendBufferSize));
}
// A value of -1 for the local/remote port should be treated as the default
@@ -311,8 +312,8 @@
// Tell them both to start, giving one transport the default port and the
// other transport -1.
- transport1->Start(kSctpDefaultPort, kSctpDefaultPort);
- transport2->Start(-1, -1);
+ transport1->Start(kSctpDefaultPort, kSctpDefaultPort, kSctpSendBufferSize);
+ transport2->Start(-1, -1, kSctpSendBufferSize);
// Connect the two fake DTLS transports.
bool asymmetric = false;
@@ -351,7 +352,7 @@
std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv));
SctpTransportObserver observer(transport.get());
- transport->Start(kSctpDefaultPort, kSctpDefaultPort);
+ transport->Start(kSctpDefaultPort, kSctpDefaultPort, kSctpSendBufferSize);
fake_dtls.SetWritable(true);
EXPECT_TRUE_WAIT(observer.ReadyToSend(), kDefaultTimeout);
}
@@ -564,4 +565,31 @@
EXPECT_EQ_WAIT(2, transport2_observer.StreamCloseCount(1), kDefaultTimeout);
}
+TEST_F(SctpTransportTest, RejectsTooLargeMessageSize) {
+ FakeDtlsTransport fake_dtls("fake dtls", 0);
+ SctpFakeDataReceiver recv;
+ std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv));
+
+ EXPECT_FALSE(transport->Start(kSctpDefaultPort, kSctpDefaultPort,
+ kSctpSendBufferSize + 1));
+}
+
+TEST_F(SctpTransportTest, RejectsTooSmallMessageSize) {
+ FakeDtlsTransport fake_dtls("fake dtls", 0);
+ SctpFakeDataReceiver recv;
+ std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv));
+
+ EXPECT_FALSE(transport->Start(kSctpDefaultPort, kSctpDefaultPort, 0));
+}
+
+TEST_F(SctpTransportTest, RejectsSendTooLargeMessages) {
+ SetupConnectedTransportsWithTwoStreams();
+ // Use "Start" to reduce the max message size
+ transport1()->Start(kTransport1Port, kTransport2Port, 10);
+ EXPECT_EQ(10, transport1()->max_message_size());
+ const char eleven_characters[] = "12345678901";
+ SendDataResult result;
+ EXPECT_FALSE(SendData(transport1(), 1, eleven_characters, &result));
+}
+
} // namespace cricket