mediasoup 3.21.0 → 3.21.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1882 -0
- package/node/lib/test/test-Consumer.js +111 -0
- package/node/lib/test/test-Producer.js +54 -0
- package/npm-scripts.mjs +0 -5
- package/package.json +9 -8
- package/worker/fuzzer/src/RTC/SCTP/association/FuzzerStateCookie.cpp +4 -6
- package/worker/include/RTC/NEW_RTCP/packet/ByePacket.hpp +165 -0
- package/worker/include/RTC/NEW_RTCP/packet/CompoundPacket.hpp +183 -0
- package/worker/include/RTC/NEW_RTCP/packet/Packet.hpp +354 -0
- package/worker/include/RTC/NEW_RTCP/packet/TODO_NEW_RTCP.md +17 -0
- package/worker/include/RTC/RTP/Codecs/Tools.hpp +2 -0
- package/worker/include/RTC/Router.hpp +4 -4
- package/worker/include/RTC/SCTP/association/Capabilities.hpp +73 -0
- package/worker/include/RTC/SCTP/association/NegotiatedCapabilities.hpp +7 -9
- package/worker/include/RTC/SCTP/association/StateCookie.hpp +38 -28
- package/worker/include/RTC/SCTP/packet/Chunk.hpp +11 -7
- package/worker/include/RTC/SCTP/packet/ErrorCause.hpp +11 -4
- package/worker/include/RTC/SCTP/packet/Packet.hpp +1 -1
- package/worker/include/RTC/SCTP/packet/Parameter.hpp +11 -4
- package/worker/include/RTC/SCTP/packet/TLV.hpp +2 -2
- package/worker/include/RTC/SCTP/packet/parameters/StateCookieParameter.hpp +2 -2
- package/worker/include/RTC/Transport.hpp +10 -10
- package/worker/include/Worker.hpp +4 -4
- package/worker/meson.build +7 -0
- package/worker/scripts/clang-scripts.mjs +54 -0
- package/worker/src/RTC/Consumer.cpp +22 -4
- package/worker/src/RTC/NEW_RTCP/packet/ByePacket.cpp +266 -0
- package/worker/src/RTC/NEW_RTCP/packet/CompoundPacket.cpp +219 -0
- package/worker/src/RTC/NEW_RTCP/packet/Packet.cpp +222 -0
- package/worker/src/RTC/RTP/Codecs/H264.cpp +3 -0
- package/worker/src/RTC/RTP/Codecs/VP8.cpp +3 -0
- package/worker/src/RTC/Router.cpp +14 -14
- package/worker/src/RTC/SCTP/association/Association.cpp +23 -11
- package/worker/src/RTC/SCTP/association/Capabilities.cpp +87 -0
- package/worker/src/RTC/SCTP/association/NegotiatedCapabilities.cpp +20 -40
- package/worker/src/RTC/SCTP/association/StateCookie.cpp +54 -32
- package/worker/src/RTC/SCTP/packet/Chunk.cpp +18 -18
- package/worker/src/RTC/SCTP/packet/ErrorCause.cpp +18 -18
- package/worker/src/RTC/SCTP/packet/Packet.cpp +2 -0
- package/worker/src/RTC/SCTP/packet/Parameter.cpp +18 -18
- package/worker/src/RTC/SCTP/packet/TLV.cpp +27 -25
- package/worker/src/RTC/SCTP/packet/parameters/StateCookieParameter.cpp +2 -2
- package/worker/src/RTC/SvcProducerStreamManager.cpp +4 -1
- package/worker/src/RTC/Transport.cpp +42 -30
- package/worker/src/Worker.cpp +10 -10
- package/worker/test/include/RTC/ICE/iceCommon.hpp +1 -1
- package/worker/test/include/RTC/RTCP/rtcpCommon.hpp +58 -0
- package/worker/test/include/RTC/RTP/rtpCommon.hpp +1 -1
- package/worker/test/src/RTC/NEW_RTCP/packet/TestByePacket.cpp +302 -0
- package/worker/test/src/RTC/NEW_RTCP/rtcpCommon.cpp +29 -0
- package/worker/test/src/RTC/RTP/TestPacket.cpp +17 -15
- package/worker/test/src/RTC/SCTP/association/TestAssociation.cpp +3 -3
- package/worker/test/src/RTC/SCTP/association/TestCapabilities.cpp +99 -0
- package/worker/test/src/RTC/SCTP/association/TestNegotiatedCapabilities.cpp +14 -16
- package/worker/test/src/RTC/SCTP/association/TestStateCookie.cpp +198 -102
- package/worker/test/src/RTC/SCTP/packet/parameters/TestStateCookieParameter.cpp +11 -10
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#include "test/include/RTC/RTCP/rtcpCommon.hpp" // in worker/test/include/
|
|
2
|
+
#include <cstring> // std::memset
|
|
3
|
+
|
|
4
|
+
namespace rtcpCommon
|
|
5
|
+
{
|
|
6
|
+
// NOTE: Buffers must be 4-byte aligned since RTP packet parsing casts them
|
|
7
|
+
// to structs (e.g. FixedHeader, HeaderExtension) that require 4-byte
|
|
8
|
+
// alignment. Without this, accessing multi-byte fields would be undefined
|
|
9
|
+
// behavior on strict-alignment architectures.
|
|
10
|
+
alignas(4) thread_local uint8_t FactoryBuffer[];
|
|
11
|
+
alignas(4) thread_local uint8_t SerializeBuffer[];
|
|
12
|
+
alignas(4) thread_local uint8_t CloneBuffer[];
|
|
13
|
+
alignas(4) thread_local uint8_t DataBuffer[];
|
|
14
|
+
alignas(4) thread_local uint8_t ThrowBuffer[];
|
|
15
|
+
|
|
16
|
+
void ResetBuffers()
|
|
17
|
+
{
|
|
18
|
+
std::memset(FactoryBuffer, 0xAA, sizeof(FactoryBuffer));
|
|
19
|
+
std::memset(SerializeBuffer, 0xBB, sizeof(SerializeBuffer));
|
|
20
|
+
std::memset(CloneBuffer, 0xCC, sizeof(CloneBuffer));
|
|
21
|
+
std::memset(DataBuffer, 0xDD, sizeof(DataBuffer));
|
|
22
|
+
std::memset(ThrowBuffer, 0xEE, sizeof(ThrowBuffer));
|
|
23
|
+
|
|
24
|
+
for (size_t i = 0; i < 256; ++i)
|
|
25
|
+
{
|
|
26
|
+
DataBuffer[i] = static_cast<uint8_t>(i);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
} // namespace rtcpCommon
|
|
@@ -57,7 +57,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
57
57
|
|
|
58
58
|
packet->Serialize(rtpCommon::SerializeBuffer, sizeof(rtpCommon::SerializeBuffer));
|
|
59
59
|
|
|
60
|
-
std::memset(buffer,
|
|
60
|
+
std::memset(buffer, 0xAA, sizeof(buffer));
|
|
61
61
|
|
|
62
62
|
CHECK_RTP_PACKET(
|
|
63
63
|
/*packet*/ packet.get(),
|
|
@@ -83,7 +83,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
83
83
|
|
|
84
84
|
packet.reset(packet->Clone(rtpCommon::CloneBuffer, sizeof(rtpCommon::CloneBuffer)));
|
|
85
85
|
|
|
86
|
-
std::memset(rtpCommon::SerializeBuffer,
|
|
86
|
+
std::memset(rtpCommon::SerializeBuffer, 0xAA, sizeof(rtpCommon::SerializeBuffer));
|
|
87
87
|
|
|
88
88
|
CHECK_RTP_PACKET(
|
|
89
89
|
/*packet*/ packet.get(),
|
|
@@ -170,7 +170,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
170
170
|
|
|
171
171
|
packet->Serialize(rtpCommon::SerializeBuffer, sizeof(rtpCommon::SerializeBuffer));
|
|
172
172
|
|
|
173
|
-
std::memset(buffer,
|
|
173
|
+
std::memset(buffer, 0xAA, sizeof(buffer));
|
|
174
174
|
|
|
175
175
|
CHECK_RTP_PACKET(
|
|
176
176
|
/*packet*/ packet.get(),
|
|
@@ -196,7 +196,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
196
196
|
|
|
197
197
|
packet.reset(packet->Clone(rtpCommon::CloneBuffer, sizeof(rtpCommon::CloneBuffer)));
|
|
198
198
|
|
|
199
|
-
std::memset(rtpCommon::SerializeBuffer,
|
|
199
|
+
std::memset(rtpCommon::SerializeBuffer, 0xAA, sizeof(rtpCommon::SerializeBuffer));
|
|
200
200
|
|
|
201
201
|
CHECK_RTP_PACKET(
|
|
202
202
|
/*packet*/ packet.get(),
|
|
@@ -283,7 +283,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
283
283
|
|
|
284
284
|
packet->Serialize(rtpCommon::SerializeBuffer, sizeof(rtpCommon::SerializeBuffer));
|
|
285
285
|
|
|
286
|
-
std::memset(buffer,
|
|
286
|
+
std::memset(buffer, 0xAA, sizeof(buffer));
|
|
287
287
|
|
|
288
288
|
CHECK_RTP_PACKET(
|
|
289
289
|
/*packet*/ packet.get(),
|
|
@@ -309,7 +309,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
309
309
|
|
|
310
310
|
packet.reset(packet->Clone(rtpCommon::CloneBuffer, sizeof(rtpCommon::CloneBuffer)));
|
|
311
311
|
|
|
312
|
-
std::memset(rtpCommon::SerializeBuffer,
|
|
312
|
+
std::memset(rtpCommon::SerializeBuffer, 0xAA, sizeof(rtpCommon::SerializeBuffer));
|
|
313
313
|
|
|
314
314
|
CHECK_RTP_PACKET(
|
|
315
315
|
/*packet*/ packet.get(),
|
|
@@ -399,7 +399,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
399
399
|
|
|
400
400
|
packet->Serialize(rtpCommon::SerializeBuffer, sizeof(rtpCommon::SerializeBuffer));
|
|
401
401
|
|
|
402
|
-
std::memset(buffer,
|
|
402
|
+
std::memset(buffer, 0xAA, sizeof(buffer));
|
|
403
403
|
|
|
404
404
|
CHECK_RTP_PACKET(
|
|
405
405
|
/*packet*/ packet.get(),
|
|
@@ -427,7 +427,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
427
427
|
|
|
428
428
|
packet.reset(packet->Clone(rtpCommon::CloneBuffer, sizeof(rtpCommon::CloneBuffer)));
|
|
429
429
|
|
|
430
|
-
std::memset(rtpCommon::SerializeBuffer,
|
|
430
|
+
std::memset(rtpCommon::SerializeBuffer, 0xAA, sizeof(rtpCommon::SerializeBuffer));
|
|
431
431
|
|
|
432
432
|
CHECK_RTP_PACKET(
|
|
433
433
|
/*packet*/ packet.get(),
|
|
@@ -546,7 +546,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
546
546
|
|
|
547
547
|
packet->Serialize(rtpCommon::SerializeBuffer, sizeof(rtpCommon::SerializeBuffer));
|
|
548
548
|
|
|
549
|
-
std::memset(buffer,
|
|
549
|
+
std::memset(buffer, 0xAA, sizeof(buffer));
|
|
550
550
|
|
|
551
551
|
CHECK_RTP_PACKET(
|
|
552
552
|
/*packet*/ packet.get(),
|
|
@@ -592,7 +592,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
592
592
|
|
|
593
593
|
packet.reset(packet->Clone(rtpCommon::CloneBuffer, sizeof(rtpCommon::CloneBuffer)));
|
|
594
594
|
|
|
595
|
-
std::memset(rtpCommon::SerializeBuffer,
|
|
595
|
+
std::memset(rtpCommon::SerializeBuffer, 0xAA, sizeof(rtpCommon::SerializeBuffer));
|
|
596
596
|
|
|
597
597
|
CHECK_RTP_PACKET(
|
|
598
598
|
/*packet*/ packet.get(),
|
|
@@ -732,7 +732,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
732
732
|
|
|
733
733
|
packet->Serialize(rtpCommon::SerializeBuffer, sizeof(rtpCommon::SerializeBuffer));
|
|
734
734
|
|
|
735
|
-
std::memset(buffer,
|
|
735
|
+
std::memset(buffer, 0xAA, sizeof(buffer));
|
|
736
736
|
|
|
737
737
|
CHECK_RTP_PACKET(
|
|
738
738
|
/*packet*/ packet.get(),
|
|
@@ -781,7 +781,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
781
781
|
|
|
782
782
|
packet.reset(packet->Clone(rtpCommon::CloneBuffer, sizeof(rtpCommon::CloneBuffer)));
|
|
783
783
|
|
|
784
|
-
std::memset(rtpCommon::SerializeBuffer,
|
|
784
|
+
std::memset(rtpCommon::SerializeBuffer, 0xAA, sizeof(rtpCommon::SerializeBuffer));
|
|
785
785
|
|
|
786
786
|
CHECK_RTP_PACKET(
|
|
787
787
|
/*packet*/ packet.get(),
|
|
@@ -897,7 +897,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
897
897
|
|
|
898
898
|
packet->Serialize(rtpCommon::SerializeBuffer, sizeof(rtpCommon::SerializeBuffer));
|
|
899
899
|
|
|
900
|
-
std::memset(buffer,
|
|
900
|
+
std::memset(buffer, 0xAA, sizeof(buffer));
|
|
901
901
|
|
|
902
902
|
CHECK_RTP_PACKET(
|
|
903
903
|
/*packet*/ packet.get(),
|
|
@@ -925,7 +925,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
925
925
|
|
|
926
926
|
packet.reset(packet->Clone(rtpCommon::CloneBuffer, sizeof(rtpCommon::CloneBuffer)));
|
|
927
927
|
|
|
928
|
-
std::memset(rtpCommon::SerializeBuffer,
|
|
928
|
+
std::memset(rtpCommon::SerializeBuffer, 0xAA, sizeof(rtpCommon::SerializeBuffer));
|
|
929
929
|
|
|
930
930
|
CHECK_RTP_PACKET(
|
|
931
931
|
/*packet*/ packet.get(),
|
|
@@ -1161,6 +1161,8 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
1161
1161
|
|
|
1162
1162
|
packet->Serialize(rtpCommon::SerializeBuffer, sizeof(rtpCommon::SerializeBuffer));
|
|
1163
1163
|
|
|
1164
|
+
std::memset(rtpCommon::FactoryBuffer, 0xAA, sizeof(rtpCommon::FactoryBuffer));
|
|
1165
|
+
|
|
1164
1166
|
CHECK_RTP_PACKET(
|
|
1165
1167
|
/*packet*/ packet.get(),
|
|
1166
1168
|
/*buffer*/ rtpCommon::SerializeBuffer,
|
|
@@ -1207,7 +1209,7 @@ SCENARIO("RTP Packet", "[serializable][rtp][packet]")
|
|
|
1207
1209
|
|
|
1208
1210
|
packet.reset(packet->Clone(rtpCommon::CloneBuffer, sizeof(rtpCommon::CloneBuffer)));
|
|
1209
1211
|
|
|
1210
|
-
std::memset(rtpCommon::SerializeBuffer,
|
|
1212
|
+
std::memset(rtpCommon::SerializeBuffer, 0xAA, sizeof(rtpCommon::SerializeBuffer));
|
|
1211
1213
|
|
|
1212
1214
|
CHECK_RTP_PACKET(
|
|
1213
1215
|
/*packet*/ packet.get(),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#include "common.hpp"
|
|
2
2
|
#include "RTC/SCTP/association/Association.hpp"
|
|
3
|
-
#include "RTC/SCTP/association/
|
|
3
|
+
#include "RTC/SCTP/association/Capabilities.hpp"
|
|
4
4
|
#include "RTC/SCTP/association/StateCookie.hpp"
|
|
5
5
|
#include "RTC/SCTP/packet/ErrorCause.hpp"
|
|
6
6
|
#include "RTC/SCTP/packet/Packet.hpp"
|
|
@@ -1774,7 +1774,7 @@ SCENARIO("SCTP Association", "[sctp][association]")
|
|
|
1774
1774
|
// Forge a plain (unauthenticated) State Cookie with attacker-chosen values,
|
|
1775
1775
|
// as in the published PoC. It passes the magic checks but carries no MAC.
|
|
1776
1776
|
const uint32_t forgedTag = 0xDEADBEEF;
|
|
1777
|
-
const RTC::SCTP::
|
|
1777
|
+
const RTC::SCTP::Capabilities remoteCapabilities;
|
|
1778
1778
|
|
|
1779
1779
|
std::vector<uint8_t> cookieBuffer(RTC::SCTP::StateCookie::StateCookieLength);
|
|
1780
1780
|
|
|
@@ -1787,7 +1787,7 @@ SCENARIO("SCTP Association", "[sctp][association]")
|
|
|
1787
1787
|
/*remoteInitialTsn*/ 2000,
|
|
1788
1788
|
/*remoteAdvertisedReceiverWindowCredit*/ 65535,
|
|
1789
1789
|
/*tieTag*/ 0,
|
|
1790
|
-
|
|
1790
|
+
remoteCapabilities);
|
|
1791
1791
|
|
|
1792
1792
|
// Builds a COOKIE-ECHO packet carrying the forged cookie. `buffers` must
|
|
1793
1793
|
// outlive the returned packet.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#include "common.hpp"
|
|
2
|
+
#include "RTC/SCTP/association/Capabilities.hpp"
|
|
3
|
+
#include "RTC/SCTP/packet/Chunk.hpp"
|
|
4
|
+
#include "RTC/SCTP/packet/chunks/InitChunk.hpp"
|
|
5
|
+
#include "RTC/SCTP/packet/parameters/ForwardTsnSupportedParameter.hpp"
|
|
6
|
+
#include "RTC/SCTP/packet/parameters/SupportedExtensionsParameter.hpp"
|
|
7
|
+
#include "RTC/SCTP/packet/parameters/ZeroChecksumAcceptableParameter.hpp"
|
|
8
|
+
#include "test/include/RTC/SCTP/sctpCommon.hpp"
|
|
9
|
+
#include <catch2/catch_test_macros.hpp>
|
|
10
|
+
|
|
11
|
+
SCENARIO("SCTP Capabilities", "[sctp][capabilities]")
|
|
12
|
+
{
|
|
13
|
+
sctpCommon::ResetBuffers();
|
|
14
|
+
|
|
15
|
+
SECTION("Capabilities::Factory() succeeds (1)")
|
|
16
|
+
{
|
|
17
|
+
const std::unique_ptr<RTC::SCTP::InitChunk> remoteChunk{ RTC::SCTP::InitChunk::Factory(
|
|
18
|
+
sctpCommon::FactoryBuffer, sizeof(sctpCommon::FactoryBuffer)) };
|
|
19
|
+
|
|
20
|
+
remoteChunk->SetNumberOfOutboundStreams(4096);
|
|
21
|
+
remoteChunk->SetNumberOfInboundStreams(1024);
|
|
22
|
+
|
|
23
|
+
auto* remoteSupportedExtensionsParameter =
|
|
24
|
+
remoteChunk->BuildParameterInPlace<RTC::SCTP::SupportedExtensionsParameter>();
|
|
25
|
+
|
|
26
|
+
remoteSupportedExtensionsParameter->AddChunkType(RTC::SCTP::Chunk::ChunkType::FORWARD_TSN);
|
|
27
|
+
remoteSupportedExtensionsParameter->AddChunkType(RTC::SCTP::Chunk::ChunkType::RE_CONFIG);
|
|
28
|
+
remoteSupportedExtensionsParameter->AddChunkType(RTC::SCTP::Chunk::ChunkType::I_DATA);
|
|
29
|
+
remoteSupportedExtensionsParameter->AddChunkType(RTC::SCTP::Chunk::ChunkType::I_FORWARD_TSN);
|
|
30
|
+
remoteSupportedExtensionsParameter->Consolidate();
|
|
31
|
+
|
|
32
|
+
auto* remoteZeroChecksumAcceptableParameter =
|
|
33
|
+
remoteChunk->BuildParameterInPlace<RTC::SCTP::ZeroChecksumAcceptableParameter>();
|
|
34
|
+
|
|
35
|
+
remoteZeroChecksumAcceptableParameter->SetAlternateErrorDetectionMethod(
|
|
36
|
+
RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod::SCTP_OVER_DTLS);
|
|
37
|
+
remoteZeroChecksumAcceptableParameter->Consolidate();
|
|
38
|
+
|
|
39
|
+
const auto remoteCapabilities = RTC::SCTP::Capabilities::Factory(remoteChunk.get());
|
|
40
|
+
|
|
41
|
+
// Raw remote-announced values (no local option is applied).
|
|
42
|
+
REQUIRE(remoteCapabilities.maxOutboundStreams == 4096);
|
|
43
|
+
REQUIRE(remoteCapabilities.maxInboundStreams == 1024);
|
|
44
|
+
REQUIRE(remoteCapabilities.partialReliability == true);
|
|
45
|
+
REQUIRE(remoteCapabilities.messageInterleaving == true);
|
|
46
|
+
REQUIRE(remoteCapabilities.reConfig == true);
|
|
47
|
+
REQUIRE(
|
|
48
|
+
remoteCapabilities.zeroChecksumAlternateErrorDetectionMethod ==
|
|
49
|
+
RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod::SCTP_OVER_DTLS);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
SECTION("Capabilities::Factory() succeeds (2)")
|
|
53
|
+
{
|
|
54
|
+
const std::unique_ptr<RTC::SCTP::InitChunk> remoteChunk{ RTC::SCTP::InitChunk::Factory(
|
|
55
|
+
sctpCommon::FactoryBuffer, sizeof(sctpCommon::FactoryBuffer)) };
|
|
56
|
+
|
|
57
|
+
remoteChunk->SetNumberOfOutboundStreams(4000);
|
|
58
|
+
remoteChunk->SetNumberOfInboundStreams(3000);
|
|
59
|
+
|
|
60
|
+
auto* remoteSupportedExtensionsParameter =
|
|
61
|
+
remoteChunk->BuildParameterInPlace<RTC::SCTP::SupportedExtensionsParameter>();
|
|
62
|
+
|
|
63
|
+
// NOTE: Missing FORWARD-TSN, but remote announces support for it via
|
|
64
|
+
// Forward-TSN-Supported parameter.
|
|
65
|
+
// NOTE: Missing RE-CONFIG (needed for Stream Re-Configuration).
|
|
66
|
+
// NOTE: Missing I-FORWARD-TSN (needed for Message Interleaving).
|
|
67
|
+
remoteSupportedExtensionsParameter->AddChunkType(RTC::SCTP::Chunk::ChunkType::I_DATA);
|
|
68
|
+
remoteSupportedExtensionsParameter->Consolidate();
|
|
69
|
+
|
|
70
|
+
auto* remoteForwardTsnSupportedParameter =
|
|
71
|
+
remoteChunk->BuildParameterInPlace<RTC::SCTP::ForwardTsnSupportedParameter>();
|
|
72
|
+
|
|
73
|
+
remoteForwardTsnSupportedParameter->Consolidate();
|
|
74
|
+
|
|
75
|
+
auto* remoteZeroChecksumAcceptableParameter =
|
|
76
|
+
remoteChunk->BuildParameterInPlace<RTC::SCTP::ZeroChecksumAcceptableParameter>();
|
|
77
|
+
|
|
78
|
+
remoteZeroChecksumAcceptableParameter->SetAlternateErrorDetectionMethod(
|
|
79
|
+
// NOLINTNEXTLINE(clang-analyzer-optin.core.EnumCastOutOfRange)
|
|
80
|
+
static_cast<RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod>(666));
|
|
81
|
+
remoteZeroChecksumAcceptableParameter->Consolidate();
|
|
82
|
+
|
|
83
|
+
const auto remoteCapabilities = RTC::SCTP::Capabilities::Factory(remoteChunk.get());
|
|
84
|
+
|
|
85
|
+
// Raw remote-announced values (no local option is applied).
|
|
86
|
+
REQUIRE(remoteCapabilities.maxOutboundStreams == 4000);
|
|
87
|
+
REQUIRE(remoteCapabilities.maxInboundStreams == 3000);
|
|
88
|
+
// Announced via Forward-TSN-Supported parameter.
|
|
89
|
+
REQUIRE(remoteCapabilities.partialReliability == true);
|
|
90
|
+
// Not announced (missing I-FORWARD-TSN).
|
|
91
|
+
REQUIRE(remoteCapabilities.messageInterleaving == false);
|
|
92
|
+
// Not announced (missing RE-CONFIG).
|
|
93
|
+
REQUIRE(remoteCapabilities.reConfig == false);
|
|
94
|
+
// Unknown/invalid method is parsed as NONE.
|
|
95
|
+
REQUIRE(
|
|
96
|
+
remoteCapabilities.zeroChecksumAlternateErrorDetectionMethod ==
|
|
97
|
+
RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod::NONE);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -24,8 +24,8 @@ SCENARIO("SCTP Negotiated Capabilities", "[sctp][negotiatedcapabilities]")
|
|
|
24
24
|
sctpOptions.zeroChecksumAlternateErrorDetectionMethod =
|
|
25
25
|
RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod::SCTP_OVER_DTLS;
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const std::unique_ptr<RTC::SCTP::InitChunk> remoteChunk{ RTC::SCTP::InitChunk::Factory(
|
|
28
|
+
sctpCommon::FactoryBuffer, sizeof(sctpCommon::FactoryBuffer)) };
|
|
29
29
|
|
|
30
30
|
remoteChunk->SetNumberOfOutboundStreams(4096);
|
|
31
31
|
remoteChunk->SetNumberOfInboundStreams(1024);
|
|
@@ -46,13 +46,12 @@ SCENARIO("SCTP Negotiated Capabilities", "[sctp][negotiatedcapabilities]")
|
|
|
46
46
|
RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod::SCTP_OVER_DTLS);
|
|
47
47
|
remoteZeroChecksumAcceptableParameter->Consolidate();
|
|
48
48
|
|
|
49
|
-
auto
|
|
50
|
-
|
|
49
|
+
const auto remoteCapabilities = RTC::SCTP::Capabilities::Factory(remoteChunk.get());
|
|
50
|
+
const auto negotiatedCapabilities =
|
|
51
|
+
RTC::SCTP::NegotiatedCapabilities::Factory(sctpOptions, remoteCapabilities);
|
|
51
52
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
REQUIRE(negotiatedCapabilities.negotiatedMaxOutboundStreams == 1024);
|
|
55
|
-
REQUIRE(negotiatedCapabilities.negotiatedMaxInboundStreams == 2048);
|
|
53
|
+
REQUIRE(negotiatedCapabilities.maxOutboundStreams == 1024);
|
|
54
|
+
REQUIRE(negotiatedCapabilities.maxInboundStreams == 2048);
|
|
56
55
|
REQUIRE(negotiatedCapabilities.partialReliability == true);
|
|
57
56
|
REQUIRE(negotiatedCapabilities.messageInterleaving == true);
|
|
58
57
|
REQUIRE(negotiatedCapabilities.reConfig == true);
|
|
@@ -70,8 +69,8 @@ SCENARIO("SCTP Negotiated Capabilities", "[sctp][negotiatedcapabilities]")
|
|
|
70
69
|
sctpOptions.zeroChecksumAlternateErrorDetectionMethod =
|
|
71
70
|
RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod::SCTP_OVER_DTLS;
|
|
72
71
|
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
const std::unique_ptr<RTC::SCTP::InitChunk> remoteChunk{ RTC::SCTP::InitChunk::Factory(
|
|
73
|
+
sctpCommon::FactoryBuffer, sizeof(sctpCommon::FactoryBuffer)) };
|
|
75
74
|
|
|
76
75
|
remoteChunk->SetNumberOfOutboundStreams(4000);
|
|
77
76
|
remoteChunk->SetNumberOfInboundStreams(3000);
|
|
@@ -100,13 +99,12 @@ SCENARIO("SCTP Negotiated Capabilities", "[sctp][negotiatedcapabilities]")
|
|
|
100
99
|
static_cast<RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod>(666));
|
|
101
100
|
remoteZeroChecksumAcceptableParameter->Consolidate();
|
|
102
101
|
|
|
103
|
-
auto
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
delete remoteChunk;
|
|
102
|
+
const auto remoteCapabilities = RTC::SCTP::Capabilities::Factory(remoteChunk.get());
|
|
103
|
+
const auto negotiatedCapabilities =
|
|
104
|
+
RTC::SCTP::NegotiatedCapabilities::Factory(sctpOptions, remoteCapabilities);
|
|
107
105
|
|
|
108
|
-
REQUIRE(negotiatedCapabilities.
|
|
109
|
-
REQUIRE(negotiatedCapabilities.
|
|
106
|
+
REQUIRE(negotiatedCapabilities.maxOutboundStreams == 1000);
|
|
107
|
+
REQUIRE(negotiatedCapabilities.maxInboundStreams == 2000);
|
|
110
108
|
REQUIRE(negotiatedCapabilities.partialReliability == true);
|
|
111
109
|
REQUIRE(negotiatedCapabilities.messageInterleaving == false);
|
|
112
110
|
REQUIRE(negotiatedCapabilities.reConfig == false);
|