mediasoup 3.28.0 → 3.29.0
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 +12 -0
- package/node/lib/PipeTransportTypes.d.ts +6 -1
- package/node/lib/PipeTransportTypes.d.ts.map +1 -1
- package/node/lib/PlainTransportTypes.d.ts +6 -1
- package/node/lib/PlainTransportTypes.d.ts.map +1 -1
- package/node/lib/Router.d.ts +4 -4
- package/node/lib/Router.d.ts.map +1 -1
- package/node/lib/Router.js +10 -7
- package/node/lib/RouterTypes.d.ts +7 -1
- package/node/lib/RouterTypes.d.ts.map +1 -1
- package/node/lib/Transport.d.ts +2 -1
- package/node/lib/Transport.d.ts.map +1 -1
- package/node/lib/Transport.js +17 -6
- package/node/lib/TransportTypes.d.ts +12 -2
- package/node/lib/TransportTypes.d.ts.map +1 -1
- package/node/lib/WebRtcTransportTypes.d.ts +6 -1
- package/node/lib/WebRtcTransportTypes.d.ts.map +1 -1
- package/node/lib/fbs/transport/options.d.ts +6 -2
- package/node/lib/fbs/transport/options.d.ts.map +1 -1
- package/node/lib/fbs/transport/options.js +19 -7
- package/node/lib/fbs/transport/sctp-zero-checksum.d.ts +6 -0
- package/node/lib/fbs/transport/sctp-zero-checksum.d.ts.map +1 -0
- package/node/lib/fbs/transport/sctp-zero-checksum.js +11 -0
- package/node/lib/fbs/transport/stats.d.ts +2 -8
- package/node/lib/fbs/transport/stats.d.ts.map +1 -1
- package/node/lib/fbs/transport/stats.js +5 -29
- package/node/lib/fbs/transport.d.ts +1 -0
- package/node/lib/fbs/transport.d.ts.map +1 -1
- package/node/lib/fbs/transport.js +4 -2
- package/npm-scripts.mjs +35 -44
- package/package.json +10 -6
- package/worker/fbs/transport.fbs +9 -2
- package/worker/fuzzer/src/RTC/RTP/FuzzerRetransmissionBuffer.cpp +14 -1
- package/worker/fuzzer/src/RTC/RTP/FuzzerRtpStreamSend.cpp +17 -4
- package/worker/include/RTC/BWE/AimdRateControl.hpp +9 -9
- package/worker/include/RTC/BWE/BweTypes.hpp +54 -17
- package/worker/include/RTC/BWE/DelayBasedBwe.hpp +3 -3
- package/worker/include/RTC/BWE/FeedbackAdapter.hpp +2 -2
- package/worker/include/RTC/BWE/LossBasedController.hpp +4 -4
- package/worker/include/RTC/BWE/OveruseDetector.hpp +5 -4
- package/worker/include/RTC/BWE/ProbeBitrateEstimator.hpp +1 -1
- package/worker/include/RTC/BWE/ProbeController.hpp +6 -6
- package/worker/include/RTC/BWE/ProbePacketGenerator.hpp +2 -6
- package/worker/include/RTC/BWE/ProbingScheduler.hpp +3 -7
- package/worker/include/RTC/BWE/ReceiverTransportCongestionController.hpp +148 -0
- package/worker/include/RTC/BWE/RembGenerator.hpp +4 -3
- package/worker/include/RTC/BWE/RemoteBitrateEstimatorAbsSendTime.hpp +1 -1
- package/worker/include/RTC/BWE/SenderTransportCongestionController.hpp +343 -0
- package/worker/include/RTC/BWE/TargetRateController.hpp +4 -1
- package/worker/include/RTC/BWE/TransportWideCcFeedbackGenerator.hpp +5 -4
- package/worker/include/RTC/BWE/TrendlineEstimator.hpp +3 -3
- package/worker/include/RTC/Consumer.hpp +8 -1
- package/worker/include/RTC/RTP/RetransmissionBuffer.hpp +36 -10
- package/worker/include/RTC/RTP/RtpStream.hpp +21 -0
- package/worker/include/RTC/RTP/RtpStreamRecv.hpp +1 -0
- package/worker/include/RTC/RTP/RtpStreamSend.hpp +122 -9
- package/worker/include/RTC/SCTP/packet/parameters/ZeroChecksumAcceptableParameter.hpp +12 -3
- package/worker/include/RTC/TransportCongestionControlClient.hpp +0 -5
- package/worker/include/RTC/TransportCongestionControlServer.hpp +0 -5
- package/worker/include/Utils.hpp +9 -2
- package/worker/meson.build +4 -0
- package/worker/src/RTC/BWE/AimdRateControl.cpp +22 -22
- package/worker/src/RTC/BWE/DelayBasedBwe.cpp +16 -20
- package/worker/src/RTC/BWE/FeedbackAdapter.cpp +1 -1
- package/worker/src/RTC/BWE/OveruseDetector.cpp +8 -8
- package/worker/src/RTC/BWE/ProbeBitrateEstimator.cpp +2 -2
- package/worker/src/RTC/BWE/ProbeController.cpp +1 -1
- package/worker/src/RTC/BWE/ProbePacketGenerator.cpp +1 -6
- package/worker/src/RTC/BWE/ProbingScheduler.cpp +2 -7
- package/worker/src/RTC/BWE/ReceiverTransportCongestionController.cpp +207 -0
- package/worker/src/RTC/BWE/RembGenerator.cpp +1 -1
- package/worker/src/RTC/BWE/RemoteBitrateEstimatorAbsSendTime.cpp +1 -1
- package/worker/src/RTC/BWE/SenderTransportCongestionController.cpp +599 -0
- package/worker/src/RTC/BWE/TransportWideCcFeedbackGenerator.cpp +2 -3
- package/worker/src/RTC/BWE/TrendlineEstimator.cpp +5 -5
- package/worker/src/RTC/Consumer.cpp +3 -2
- package/worker/src/RTC/DataConsumer.cpp +2 -2
- package/worker/src/RTC/RTP/RetransmissionBuffer.cpp +21 -8
- package/worker/src/RTC/RTP/RtpStream.cpp +0 -3
- package/worker/src/RTC/RTP/RtpStreamRecv.cpp +57 -71
- package/worker/src/RTC/RTP/RtpStreamSend.cpp +428 -244
- package/worker/src/RTC/RTP/RtxStream.cpp +14 -19
- package/worker/src/RTC/SCTP/association/Association.cpp +3 -2
- package/worker/src/RTC/SCTP/association/StateCookie.cpp +26 -6
- package/worker/src/RTC/SCTP/packet/parameters/ZeroChecksumAcceptableParameter.cpp +4 -3
- package/worker/src/RTC/SCTP/rx/ReassemblyQueue.cpp +2 -1
- package/worker/src/RTC/SCTP/tx/RetransmissionQueue.cpp +4 -2
- package/worker/src/RTC/Transport.cpp +49 -20
- package/worker/src/RTC/TransportCongestionControlClient.cpp +0 -66
- package/worker/src/RTC/TransportCongestionControlServer.cpp +0 -55
- package/worker/src/Utils/Crypto.cpp +114 -98
- package/worker/subprojects/catch2.wrap +6 -6
- package/worker/subprojects/openssl.wrap +11 -12
- package/worker/subprojects/packagefiles/ankerl-unordered-dense/meson.build +1 -1
- package/worker/subprojects/unordered-dense.wrap +4 -4
- package/worker/test/src/RTC/BWE/TestDelayBasedBwe.cpp +5 -5
- package/worker/test/src/RTC/BWE/TestFeedbackAdapter.cpp +26 -23
- package/worker/test/src/RTC/BWE/TestInterArrivalDelta.cpp +8 -8
- package/worker/test/src/RTC/BWE/TestOveruseDetector.cpp +4 -4
- package/worker/test/src/RTC/BWE/TestProbeController.cpp +35 -32
- package/worker/test/src/RTC/BWE/TestProbePacketGenerator.cpp +2 -17
- package/worker/test/src/RTC/BWE/TestProbingScheduler.cpp +1 -25
- package/worker/test/src/RTC/BWE/TestReceiverTransportCongestionController.cpp +346 -0
- package/worker/test/src/RTC/BWE/TestRembGenerator.cpp +1 -1
- package/worker/test/src/RTC/BWE/TestRemoteBitrateEstimatorAbsSendTime.cpp +9 -9
- package/worker/test/src/RTC/BWE/TestSenderTransportCongestionController.cpp +510 -0
- package/worker/test/src/RTC/BWE/TestTransportWideCcFeedbackGenerator.cpp +16 -14
- package/worker/test/src/RTC/BWE/TestTrendlineEstimator.cpp +6 -6
- package/worker/test/src/RTC/BWE/helpers/RemoteBitrateEstimatorAbsSendTimeTestHelper.cpp +1 -2
- package/worker/test/src/RTC/RTCP/TestBye.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackPsAfb.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackPsFir.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackPsLei.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackPsPli.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackPsRemb.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackPsRpsi.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackPsSli.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackPsTst.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackPsVbcm.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackRtpEcn.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackRtpNack.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackRtpSrReq.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackRtpTllei.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackRtpTmmb.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestFeedbackRtpTransport.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestReceiverReport.cpp +1 -1
- package/worker/test/src/RTC/RTCP/TestSenderReport.cpp +1 -1
- package/worker/test/src/RTC/RTP/TestRetransmissionBuffer.cpp +60 -28
- package/worker/test/src/RTC/RTP/TestRtpStreamRecv.cpp +1 -1
- package/worker/test/src/RTC/RTP/TestRtpStreamSend.cpp +746 -24
- package/worker/test/src/RTC/RTP/TestSharedPacket.cpp +1 -1
- package/worker/test/src/RTC/SCTP/association/TestAssociation.cpp +42 -0
- package/worker/test/src/RTC/SCTP/association/TestNegotiatedCapabilities.cpp +54 -5
- package/worker/test/src/RTC/SCTP/association/TestStateCookie.cpp +80 -15
- package/worker/test/src/RTC/SCTP/association/TestStreamResetHandler.cpp +410 -3
- package/worker/test/src/RTC/SCTP/association/TestTransmissionControlBlock.cpp +1 -1
- package/worker/test/src/RTC/SCTP/packet/parameters/TestZeroChecksumAcceptableParameter.cpp +37 -5
- package/worker/test/src/RTC/SCTP/rx/TestDataTracker.cpp +5 -4
- package/worker/test/src/RTC/SCTP/rx/TestInterleavedReassemblyStreams.cpp +1 -1
- package/worker/test/src/RTC/SCTP/rx/TestReassemblyQueue.cpp +1 -1
- package/worker/test/src/RTC/SCTP/rx/TestTraditionalReassemblyStreams.cpp +1 -1
- package/worker/test/src/RTC/SCTP/tx/TestOutstandingData.cpp +1 -1
- package/worker/test/src/RTC/SCTP/tx/TestRetransmissionQueue.cpp +11 -10
- package/worker/test/src/RTC/SCTP/tx/TestRetransmissionTimeout.cpp +1 -1
- package/worker/test/src/RTC/TestNackGenerator.cpp +1 -1
- package/worker/test/src/RTC/TestPortManager.cpp +2 -2
- package/worker/test/src/RTC/TestRateCalculator.cpp +1 -1
- package/worker/test/src/RTC/TestRemoteCaptureTimeEstimator.cpp +21 -15
- package/worker/test/src/RTC/TestRemoteClockOffsetEstimator.cpp +13 -13
- package/worker/test/src/RTC/TestRtpEncodingParameters.cpp +1 -1
- package/worker/test/src/RTC/TestSubchannelsCodec.cpp +2 -2
- package/worker/test/src/RTC/TestTransportCongestionControlServer.cpp +1 -1
- package/worker/test/src/RTC/TestTransportTuple.cpp +3 -2
- package/worker/test/src/Utils/TestCrypto.cpp +71 -2
- package/worker/test/src/Utils/TestTime.cpp +2 -2
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
#include "RTC/SCTP/association/AssociationListenerDeferrer.hpp"
|
|
4
4
|
#include "RTC/SCTP/association/StreamResetHandler.hpp"
|
|
5
5
|
#include "RTC/SCTP/packet/Packet.hpp"
|
|
6
|
+
#include "RTC/SCTP/packet/UserData.hpp"
|
|
6
7
|
#include "RTC/SCTP/packet/chunks/AnyForwardTsnChunk.hpp"
|
|
7
8
|
#include "RTC/SCTP/packet/chunks/ReConfigChunk.hpp"
|
|
8
9
|
#include "RTC/SCTP/packet/parameters/IncomingSsnResetRequestParameter.hpp"
|
|
@@ -27,6 +28,7 @@ namespace
|
|
|
27
28
|
constexpr uint32_t RemoteInitialTsn{ 0 };
|
|
28
29
|
constexpr int64_t InitialNowUs{ 10000 * 1000 };
|
|
29
30
|
constexpr int64_t RtoMs{ 250 };
|
|
31
|
+
const std::vector<uint8_t> ShortPayload{ 1, 2, 3, 4 };
|
|
30
32
|
|
|
31
33
|
/**
|
|
32
34
|
* A RTC::SCTP::StreamResetHandler under test, together with all the (real)
|
|
@@ -374,6 +376,411 @@ SCENARIO("SCTP RTC::SCTP::StreamResetHandler", "[sctp][streamresethandler]")
|
|
|
374
376
|
RTC::SCTP::ReconfigurationResponseParameter::Result::SUCCESS_NOTHING_TO_DO);
|
|
375
377
|
}
|
|
376
378
|
|
|
379
|
+
SECTION("a reset request with no stream ids defers all streams")
|
|
380
|
+
{
|
|
381
|
+
// https://datatracker.ietf.org/doc/html/rfc6525#section-5.2.2
|
|
382
|
+
//
|
|
383
|
+
// E3) "If no stream numbers are listed in the parameter, then all incoming
|
|
384
|
+
// streams MUST be reset to 0 as the next expected SSN."
|
|
385
|
+
//
|
|
386
|
+
// So a request with an empty stream id list must defer incoming data of
|
|
387
|
+
// every stream, not of none.
|
|
388
|
+
|
|
389
|
+
TestStreamResetHandler test;
|
|
390
|
+
|
|
391
|
+
// Makes the peer request an outgoing stream reset of all streams (no stream
|
|
392
|
+
// ids listed) with the given sender's last assigned TSN.
|
|
393
|
+
const auto handleReceivedOutgoingSsnResetRequestForAllStreams =
|
|
394
|
+
[&test](uint32_t reqSeqNbr, uint32_t senderLastAssignedTsn) -> void
|
|
395
|
+
{
|
|
396
|
+
std::vector<uint8_t> buffer(test.sctpOptions.mtu);
|
|
397
|
+
|
|
398
|
+
const std::unique_ptr<RTC::SCTP::ReConfigChunk> reConfigChunk{
|
|
399
|
+
RTC::SCTP::ReConfigChunk::Factory(buffer.data(), buffer.size())
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
auto* parameter =
|
|
403
|
+
reConfigChunk->BuildParameterInPlace<RTC::SCTP::OutgoingSsnResetRequestParameter>();
|
|
404
|
+
|
|
405
|
+
parameter->SetReconfigurationRequestSequenceNumber(reqSeqNbr);
|
|
406
|
+
parameter->SetReconfigurationResponseSequenceNumber(0);
|
|
407
|
+
parameter->SetSenderLastAssignedTsn(senderLastAssignedTsn);
|
|
408
|
+
|
|
409
|
+
// NOTE: No AddStreamId() call here, which is what means "all streams".
|
|
410
|
+
parameter->Consolidate();
|
|
411
|
+
|
|
412
|
+
test.HandleReceivedReConfigChunk(reConfigChunk.get());
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
// Returns the result of the RE-CONFIG response sent back to the peer.
|
|
416
|
+
const auto consumeSentReConfigResponseResult =
|
|
417
|
+
[&test]() -> RTC::SCTP::ReconfigurationResponseParameter::Result
|
|
418
|
+
{
|
|
419
|
+
const auto sentBuffer = test.associationListener.ConsumeFirstSentPacket();
|
|
420
|
+
|
|
421
|
+
REQUIRE(!sentBuffer.empty());
|
|
422
|
+
|
|
423
|
+
const std::unique_ptr<RTC::SCTP::Packet> sentPacket{ RTC::SCTP::Packet::Parse(
|
|
424
|
+
sentBuffer.data(), sentBuffer.size()) };
|
|
425
|
+
|
|
426
|
+
REQUIRE(sentPacket);
|
|
427
|
+
|
|
428
|
+
const auto* response =
|
|
429
|
+
sentPacket->GetFirstChunkOfType<RTC::SCTP::ReConfigChunk>()
|
|
430
|
+
->GetFirstParameterOfType<RTC::SCTP::ReconfigurationResponseParameter>();
|
|
431
|
+
|
|
432
|
+
REQUIRE(response);
|
|
433
|
+
|
|
434
|
+
return response->GetResult();
|
|
435
|
+
};
|
|
436
|
+
|
|
437
|
+
// Feeds a received ordered chunk, complete in itself, to the receive side.
|
|
438
|
+
const auto handleReceivedOrderedData = [&test](uint32_t tsn, uint16_t ssn, uint32_t ppid) -> void
|
|
439
|
+
{
|
|
440
|
+
test.dataTracker.Observe(tsn);
|
|
441
|
+
|
|
442
|
+
test.reassemblyQueue.AddData(
|
|
443
|
+
tsn,
|
|
444
|
+
RTC::SCTP::UserData(
|
|
445
|
+
/*streamId*/ 1,
|
|
446
|
+
/*ssn*/ ssn,
|
|
447
|
+
/*mid*/ 0,
|
|
448
|
+
/*fsn*/ 0,
|
|
449
|
+
/*ppid*/ ppid,
|
|
450
|
+
/*payload*/ ShortPayload,
|
|
451
|
+
/*isBeginning*/ true,
|
|
452
|
+
/*isEnd*/ true,
|
|
453
|
+
/*isUnordered*/ false));
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
// Takes the next reassembled message and requires it to be the expected one.
|
|
457
|
+
const auto requireNextMessageIs = [&test](uint16_t streamId, uint32_t ppid) -> void
|
|
458
|
+
{
|
|
459
|
+
const auto message = test.reassemblyQueue.GetNextMessage();
|
|
460
|
+
|
|
461
|
+
REQUIRE(message.has_value());
|
|
462
|
+
REQUIRE(message->GetStreamId() == streamId);
|
|
463
|
+
REQUIRE(message->GetPayloadProtocolId() == ppid);
|
|
464
|
+
|
|
465
|
+
const auto payload = message->GetPayload();
|
|
466
|
+
|
|
467
|
+
REQUIRE(std::vector<uint8_t>(payload.begin(), payload.end()) == ShortPayload);
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
// A first message is received and delivered, so stream 1 now expects SSN 1.
|
|
471
|
+
handleReceivedOrderedData(
|
|
472
|
+
/*tsn*/ RemoteInitialTsn, /*ssn*/ 0, /*ppid*/ 1001);
|
|
473
|
+
|
|
474
|
+
requireNextMessageIs(/*streamId*/ 1, /*ppid*/ 1001);
|
|
475
|
+
|
|
476
|
+
// The peer requests a reset of all streams with a sender's last assigned TSN
|
|
477
|
+
// that has not been reached yet, so the receive side enters deferred reset
|
|
478
|
+
// processing and replies "in progress".
|
|
479
|
+
handleReceivedOutgoingSsnResetRequestForAllStreams(
|
|
480
|
+
/*reqSeqNbr*/ RemoteInitialTsn, /*senderLastAssignedTsn*/ RemoteInitialTsn + 1);
|
|
481
|
+
|
|
482
|
+
REQUIRE(
|
|
483
|
+
consumeSentReConfigResponseResult() ==
|
|
484
|
+
RTC::SCTP::ReconfigurationResponseParameter::Result::IN_PROGRESS);
|
|
485
|
+
|
|
486
|
+
// A post-reset message arrives before the pre-reset one. Its TSN is beyond
|
|
487
|
+
// the sender's last assigned TSN, so it must be deferred even though the
|
|
488
|
+
// request listed no stream ids.
|
|
489
|
+
handleReceivedOrderedData(
|
|
490
|
+
/*tsn*/ RemoteInitialTsn + 2, /*ssn*/ 0, /*ppid*/ 1003);
|
|
491
|
+
|
|
492
|
+
REQUIRE(test.reassemblyQueue.HasMessages() == false);
|
|
493
|
+
|
|
494
|
+
// The delayed pre-reset message arrives and is delivered.
|
|
495
|
+
handleReceivedOrderedData(
|
|
496
|
+
/*tsn*/ RemoteInitialTsn + 1, /*ssn*/ 1, /*ppid*/ 1002);
|
|
497
|
+
|
|
498
|
+
requireNextMessageIs(/*streamId*/ 1, /*ppid*/ 1002);
|
|
499
|
+
|
|
500
|
+
// The peer retransmits the reset request now that its sender's last assigned
|
|
501
|
+
// TSN has been reached, so the reset is performed.
|
|
502
|
+
handleReceivedOutgoingSsnResetRequestForAllStreams(
|
|
503
|
+
/*reqSeqNbr*/ RemoteInitialTsn, /*senderLastAssignedTsn*/ RemoteInitialTsn + 1);
|
|
504
|
+
|
|
505
|
+
REQUIRE(
|
|
506
|
+
consumeSentReConfigResponseResult() ==
|
|
507
|
+
RTC::SCTP::ReconfigurationResponseParameter::Result::SUCCESS_PERFORMED);
|
|
508
|
+
|
|
509
|
+
// The inbound streams reset is reported with an empty stream id list, which
|
|
510
|
+
// is what tells the application that all of them were reset.
|
|
511
|
+
REQUIRE(test.associationListener.CountOnInboundStreamsResetCalls() == 1);
|
|
512
|
+
REQUIRE(test.associationListener.HasInboundStreamsResetForStreamId(1) == false);
|
|
513
|
+
|
|
514
|
+
// And the deferred post-reset message is now reassembled and delivered.
|
|
515
|
+
requireNextMessageIs(/*streamId*/ 1, /*ppid*/ 1003);
|
|
516
|
+
|
|
517
|
+
REQUIRE(test.reassemblyQueue.HasMessages() == false);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
SECTION("a reset request with stream ids defers only those streams")
|
|
521
|
+
{
|
|
522
|
+
// https://datatracker.ietf.org/doc/html/rfc6525#section-5.2.2
|
|
523
|
+
//
|
|
524
|
+
// E3) "If specific stream numbers are listed, then only these specific
|
|
525
|
+
// streams MUST be reset to 0, and all other non-listed SSNs remain
|
|
526
|
+
// unchanged."
|
|
527
|
+
|
|
528
|
+
TestStreamResetHandler test;
|
|
529
|
+
|
|
530
|
+
// Makes the peer request an outgoing stream reset of the given streams with
|
|
531
|
+
// the given sender's last assigned TSN.
|
|
532
|
+
const auto handleReceivedOutgoingSsnResetRequest = [&test](
|
|
533
|
+
uint32_t reqSeqNbr,
|
|
534
|
+
uint32_t senderLastAssignedTsn,
|
|
535
|
+
std::span<const uint16_t> streamIds) -> void
|
|
536
|
+
{
|
|
537
|
+
std::vector<uint8_t> buffer(test.sctpOptions.mtu);
|
|
538
|
+
|
|
539
|
+
const std::unique_ptr<RTC::SCTP::ReConfigChunk> reConfigChunk{
|
|
540
|
+
RTC::SCTP::ReConfigChunk::Factory(buffer.data(), buffer.size())
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
auto* parameter =
|
|
544
|
+
reConfigChunk->BuildParameterInPlace<RTC::SCTP::OutgoingSsnResetRequestParameter>();
|
|
545
|
+
|
|
546
|
+
parameter->SetReconfigurationRequestSequenceNumber(reqSeqNbr);
|
|
547
|
+
parameter->SetReconfigurationResponseSequenceNumber(0);
|
|
548
|
+
parameter->SetSenderLastAssignedTsn(senderLastAssignedTsn);
|
|
549
|
+
|
|
550
|
+
for (const auto streamId : streamIds)
|
|
551
|
+
{
|
|
552
|
+
parameter->AddStreamId(streamId);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
parameter->Consolidate();
|
|
556
|
+
|
|
557
|
+
test.HandleReceivedReConfigChunk(reConfigChunk.get());
|
|
558
|
+
};
|
|
559
|
+
|
|
560
|
+
// Returns the result of the RE-CONFIG response sent back to the peer.
|
|
561
|
+
const auto consumeSentReConfigResponseResult =
|
|
562
|
+
[&test]() -> RTC::SCTP::ReconfigurationResponseParameter::Result
|
|
563
|
+
{
|
|
564
|
+
const auto sentBuffer = test.associationListener.ConsumeFirstSentPacket();
|
|
565
|
+
|
|
566
|
+
REQUIRE(!sentBuffer.empty());
|
|
567
|
+
|
|
568
|
+
const std::unique_ptr<RTC::SCTP::Packet> sentPacket{ RTC::SCTP::Packet::Parse(
|
|
569
|
+
sentBuffer.data(), sentBuffer.size()) };
|
|
570
|
+
|
|
571
|
+
REQUIRE(sentPacket);
|
|
572
|
+
|
|
573
|
+
const auto* response =
|
|
574
|
+
sentPacket->GetFirstChunkOfType<RTC::SCTP::ReConfigChunk>()
|
|
575
|
+
->GetFirstParameterOfType<RTC::SCTP::ReconfigurationResponseParameter>();
|
|
576
|
+
|
|
577
|
+
REQUIRE(response);
|
|
578
|
+
|
|
579
|
+
return response->GetResult();
|
|
580
|
+
};
|
|
581
|
+
|
|
582
|
+
// Feeds a received ordered chunk, complete in itself, to the receive side.
|
|
583
|
+
const auto handleReceivedOrderedData =
|
|
584
|
+
[&test](uint32_t tsn, uint16_t streamId, uint16_t ssn, uint32_t ppid) -> void
|
|
585
|
+
{
|
|
586
|
+
test.dataTracker.Observe(tsn);
|
|
587
|
+
|
|
588
|
+
test.reassemblyQueue.AddData(
|
|
589
|
+
tsn,
|
|
590
|
+
RTC::SCTP::UserData(
|
|
591
|
+
/*streamId*/ streamId,
|
|
592
|
+
/*ssn*/ ssn,
|
|
593
|
+
/*mid*/ 0,
|
|
594
|
+
/*fsn*/ 0,
|
|
595
|
+
/*ppid*/ ppid,
|
|
596
|
+
/*payload*/ ShortPayload,
|
|
597
|
+
/*isBeginning*/ true,
|
|
598
|
+
/*isEnd*/ true,
|
|
599
|
+
/*isUnordered*/ false));
|
|
600
|
+
};
|
|
601
|
+
|
|
602
|
+
// Takes the next reassembled message and requires it to be the expected one.
|
|
603
|
+
const auto requireNextMessageIs = [&test](uint16_t streamId, uint32_t ppid) -> void
|
|
604
|
+
{
|
|
605
|
+
const auto message = test.reassemblyQueue.GetNextMessage();
|
|
606
|
+
|
|
607
|
+
REQUIRE(message.has_value());
|
|
608
|
+
REQUIRE(message->GetStreamId() == streamId);
|
|
609
|
+
REQUIRE(message->GetPayloadProtocolId() == ppid);
|
|
610
|
+
|
|
611
|
+
const auto payload = message->GetPayload();
|
|
612
|
+
|
|
613
|
+
REQUIRE(std::vector<uint8_t>(payload.begin(), payload.end()) == ShortPayload);
|
|
614
|
+
};
|
|
615
|
+
|
|
616
|
+
const std::vector<uint16_t> resetStreamIds{ 1, 2 };
|
|
617
|
+
|
|
618
|
+
// The peer requests a reset of streams 1 and 2 only, with a sender's last
|
|
619
|
+
// assigned TSN that has not been reached yet.
|
|
620
|
+
handleReceivedOutgoingSsnResetRequest(
|
|
621
|
+
/*reqSeqNbr*/ 0, /*senderLastAssignedTsn*/ RemoteInitialTsn + 2, resetStreamIds);
|
|
622
|
+
|
|
623
|
+
REQUIRE(
|
|
624
|
+
consumeSentReConfigResponseResult() ==
|
|
625
|
+
RTC::SCTP::ReconfigurationResponseParameter::Result::IN_PROGRESS);
|
|
626
|
+
|
|
627
|
+
// Before the sender's last assigned TSN, so all of them are delivered.
|
|
628
|
+
handleReceivedOrderedData(
|
|
629
|
+
/*tsn*/ RemoteInitialTsn, /*streamId*/ 1, /*ssn*/ 0, /*ppid*/ 1001);
|
|
630
|
+
handleReceivedOrderedData(
|
|
631
|
+
/*tsn*/ RemoteInitialTsn + 1, /*streamId*/ 2, /*ssn*/ 0, /*ppid*/ 1002);
|
|
632
|
+
|
|
633
|
+
// At the sender's last assigned TSN, not beyond it, so delivered too.
|
|
634
|
+
handleReceivedOrderedData(
|
|
635
|
+
/*tsn*/ RemoteInitialTsn + 2, /*streamId*/ 3, /*ssn*/ 0, /*ppid*/ 1003);
|
|
636
|
+
|
|
637
|
+
// Beyond the sender's last assigned TSN and on a listed stream, so deferred.
|
|
638
|
+
handleReceivedOrderedData(
|
|
639
|
+
/*tsn*/ RemoteInitialTsn + 3, /*streamId*/ 1, /*ssn*/ 0, /*ppid*/ 1004);
|
|
640
|
+
handleReceivedOrderedData(
|
|
641
|
+
/*tsn*/ RemoteInitialTsn + 4, /*streamId*/ 2, /*ssn*/ 0, /*ppid*/ 1005);
|
|
642
|
+
|
|
643
|
+
// Beyond it as well, but stream 3 is not listed, so it is delivered.
|
|
644
|
+
handleReceivedOrderedData(
|
|
645
|
+
/*tsn*/ RemoteInitialTsn + 5, /*streamId*/ 3, /*ssn*/ 1, /*ppid*/ 1006);
|
|
646
|
+
|
|
647
|
+
requireNextMessageIs(/*streamId*/ 1, /*ppid*/ 1001);
|
|
648
|
+
requireNextMessageIs(/*streamId*/ 2, /*ppid*/ 1002);
|
|
649
|
+
requireNextMessageIs(/*streamId*/ 3, /*ppid*/ 1003);
|
|
650
|
+
requireNextMessageIs(/*streamId*/ 3, /*ppid*/ 1006);
|
|
651
|
+
|
|
652
|
+
REQUIRE(test.reassemblyQueue.HasMessages() == false);
|
|
653
|
+
|
|
654
|
+
// The peer requests the reset again now that its sender's last assigned TSN
|
|
655
|
+
// has been reached, so the reset is performed.
|
|
656
|
+
handleReceivedOutgoingSsnResetRequest(
|
|
657
|
+
/*reqSeqNbr*/ 1, /*senderLastAssignedTsn*/ RemoteInitialTsn + 3, resetStreamIds);
|
|
658
|
+
|
|
659
|
+
REQUIRE(
|
|
660
|
+
consumeSentReConfigResponseResult() ==
|
|
661
|
+
RTC::SCTP::ReconfigurationResponseParameter::Result::SUCCESS_PERFORMED);
|
|
662
|
+
|
|
663
|
+
// Only the listed streams are reported as reset.
|
|
664
|
+
REQUIRE(test.associationListener.CountOnInboundStreamsResetCalls() == 1);
|
|
665
|
+
REQUIRE(test.associationListener.HasInboundStreamsResetForStreamId(1) == true);
|
|
666
|
+
REQUIRE(test.associationListener.HasInboundStreamsResetForStreamId(2) == true);
|
|
667
|
+
REQUIRE(test.associationListener.HasInboundStreamsResetForStreamId(3) == false);
|
|
668
|
+
|
|
669
|
+
// And the deferred messages of the listed streams are now delivered.
|
|
670
|
+
requireNextMessageIs(/*streamId*/ 1, /*ppid*/ 1004);
|
|
671
|
+
requireNextMessageIs(/*streamId*/ 2, /*ppid*/ 1005);
|
|
672
|
+
|
|
673
|
+
REQUIRE(test.reassemblyQueue.HasMessages() == false);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
// @see https://github.com/versatica/mediasoup/security/advisories/GHSA-rq7g-r9qr-rwpq
|
|
677
|
+
SECTION("deferred reset processing with no stream ids ends on the cumulative ack")
|
|
678
|
+
{
|
|
679
|
+
// Same as the section above that bounds received Forward-TSN chunks, but
|
|
680
|
+
// with a request that lists no stream ids, so that leaving deferred reset
|
|
681
|
+
// processing on the cumulative ack condition is also covered for the "all
|
|
682
|
+
// streams" case.
|
|
683
|
+
|
|
684
|
+
TestStreamResetHandler test;
|
|
685
|
+
|
|
686
|
+
// Makes the peer request an outgoing stream reset of all streams (no stream
|
|
687
|
+
// ids listed) with the given sender's last assigned TSN.
|
|
688
|
+
const auto handleReceivedOutgoingSsnResetRequestForAllStreams =
|
|
689
|
+
[&test](uint32_t reqSeqNbr, uint32_t senderLastAssignedTsn) -> void
|
|
690
|
+
{
|
|
691
|
+
std::vector<uint8_t> buffer(test.sctpOptions.mtu);
|
|
692
|
+
|
|
693
|
+
const std::unique_ptr<RTC::SCTP::ReConfigChunk> reConfigChunk{
|
|
694
|
+
RTC::SCTP::ReConfigChunk::Factory(buffer.data(), buffer.size())
|
|
695
|
+
};
|
|
696
|
+
|
|
697
|
+
auto* parameter =
|
|
698
|
+
reConfigChunk->BuildParameterInPlace<RTC::SCTP::OutgoingSsnResetRequestParameter>();
|
|
699
|
+
|
|
700
|
+
parameter->SetReconfigurationRequestSequenceNumber(reqSeqNbr);
|
|
701
|
+
parameter->SetReconfigurationResponseSequenceNumber(0);
|
|
702
|
+
parameter->SetSenderLastAssignedTsn(senderLastAssignedTsn);
|
|
703
|
+
|
|
704
|
+
// NOTE: No AddStreamId() call here, which is what means "all streams".
|
|
705
|
+
parameter->Consolidate();
|
|
706
|
+
|
|
707
|
+
test.HandleReceivedReConfigChunk(reConfigChunk.get());
|
|
708
|
+
};
|
|
709
|
+
|
|
710
|
+
// Feeds a received ordered chunk, complete in itself, to the receive side.
|
|
711
|
+
const auto handleReceivedOrderedData = [&test](uint32_t tsn, uint16_t ssn, uint32_t ppid) -> void
|
|
712
|
+
{
|
|
713
|
+
test.dataTracker.Observe(tsn);
|
|
714
|
+
|
|
715
|
+
test.reassemblyQueue.AddData(
|
|
716
|
+
tsn,
|
|
717
|
+
RTC::SCTP::UserData(
|
|
718
|
+
/*streamId*/ 1,
|
|
719
|
+
/*ssn*/ ssn,
|
|
720
|
+
/*mid*/ 0,
|
|
721
|
+
/*fsn*/ 0,
|
|
722
|
+
/*ppid*/ ppid,
|
|
723
|
+
/*payload*/ ShortPayload,
|
|
724
|
+
/*isBeginning*/ true,
|
|
725
|
+
/*isEnd*/ true,
|
|
726
|
+
/*isUnordered*/ false));
|
|
727
|
+
};
|
|
728
|
+
|
|
729
|
+
// Takes the next reassembled message and requires it to be the expected one.
|
|
730
|
+
const auto requireNextMessageIs = [&test](uint16_t streamId, uint32_t ppid) -> void
|
|
731
|
+
{
|
|
732
|
+
const auto message = test.reassemblyQueue.GetNextMessage();
|
|
733
|
+
|
|
734
|
+
REQUIRE(message.has_value());
|
|
735
|
+
REQUIRE(message->GetStreamId() == streamId);
|
|
736
|
+
REQUIRE(message->GetPayloadProtocolId() == ppid);
|
|
737
|
+
|
|
738
|
+
const auto payload = message->GetPayload();
|
|
739
|
+
|
|
740
|
+
REQUIRE(std::vector<uint8_t>(payload.begin(), payload.end()) == ShortPayload);
|
|
741
|
+
};
|
|
742
|
+
|
|
743
|
+
handleReceivedOrderedData(
|
|
744
|
+
/*tsn*/ RemoteInitialTsn, /*ssn*/ 0, /*ppid*/ 1001);
|
|
745
|
+
|
|
746
|
+
requireNextMessageIs(/*streamId*/ 1, /*ppid*/ 1001);
|
|
747
|
+
|
|
748
|
+
// The peer enters deferred reset processing and then never retransmits its
|
|
749
|
+
// request.
|
|
750
|
+
handleReceivedOutgoingSsnResetRequestForAllStreams(
|
|
751
|
+
/*reqSeqNbr*/ RemoteInitialTsn, /*senderLastAssignedTsn*/ RemoteInitialTsn + 1);
|
|
752
|
+
|
|
753
|
+
handleReceivedOrderedData(
|
|
754
|
+
/*tsn*/ RemoteInitialTsn + 2, /*ssn*/ 0, /*ppid*/ 1003);
|
|
755
|
+
|
|
756
|
+
REQUIRE(test.reassemblyQueue.HasMessages() == false);
|
|
757
|
+
REQUIRE(test.reassemblyQueue.GetQueuedBytes() > 0);
|
|
758
|
+
|
|
759
|
+
// The cumulative ack TSN now reaches the sender's last assigned TSN, which
|
|
760
|
+
// is what must end deferred reset processing.
|
|
761
|
+
handleReceivedOrderedData(
|
|
762
|
+
/*tsn*/ RemoteInitialTsn + 1, /*ssn*/ 1, /*ppid*/ 1002);
|
|
763
|
+
|
|
764
|
+
requireNextMessageIs(/*streamId*/ 1, /*ppid*/ 1002);
|
|
765
|
+
|
|
766
|
+
{
|
|
767
|
+
const RTC::SCTP::AssociationListenerDeferrer::ScopedDeferrer deferrer(
|
|
768
|
+
test.associationListenerDeferrer);
|
|
769
|
+
|
|
770
|
+
REQUIRE(test.streamResetHandler.MayLeaveDeferredReset() == true);
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
// All streams are reset, so the reported stream id list is empty.
|
|
774
|
+
REQUIRE(test.associationListener.CountOnInboundStreamsResetCalls() == 1);
|
|
775
|
+
REQUIRE(test.associationListener.HasInboundStreamsResetForStreamId(1) == false);
|
|
776
|
+
|
|
777
|
+
// And the deferred message is released rather than held forever.
|
|
778
|
+
requireNextMessageIs(/*streamId*/ 1, /*ppid*/ 1003);
|
|
779
|
+
|
|
780
|
+
REQUIRE(test.reassemblyQueue.HasMessages() == false);
|
|
781
|
+
REQUIRE(test.reassemblyQueue.GetQueuedBytes() == 0);
|
|
782
|
+
}
|
|
783
|
+
|
|
377
784
|
// @see https://github.com/versatica/mediasoup/security/advisories/GHSA-rq7g-r9qr-rwpq
|
|
378
785
|
SECTION("received Forward-TSN chunks are bounded during deferred reset processing")
|
|
379
786
|
{
|
|
@@ -381,7 +788,7 @@ SCENARIO("SCTP RTC::SCTP::StreamResetHandler", "[sctp][streamresethandler]")
|
|
|
381
788
|
|
|
382
789
|
// Makes the peer request an outgoing stream reset with the given sender's
|
|
383
790
|
// last assigned TSN.
|
|
384
|
-
auto handleReceivedOutgoingSsnResetRequest =
|
|
791
|
+
const auto handleReceivedOutgoingSsnResetRequest =
|
|
385
792
|
[&test](uint32_t reqSeqNbr, uint32_t senderLastAssignedTsn) -> void
|
|
386
793
|
{
|
|
387
794
|
std::vector<uint8_t> buffer(test.sctpOptions.mtu);
|
|
@@ -403,7 +810,7 @@ SCENARIO("SCTP RTC::SCTP::StreamResetHandler", "[sctp][streamresethandler]")
|
|
|
403
810
|
};
|
|
404
811
|
|
|
405
812
|
// Returns the result of the RE-CONFIG response sent back to the peer.
|
|
406
|
-
auto consumeSentReConfigResponseResult =
|
|
813
|
+
const auto consumeSentReConfigResponseResult =
|
|
407
814
|
[&test]() -> RTC::SCTP::ReconfigurationResponseParameter::Result
|
|
408
815
|
{
|
|
409
816
|
const auto sentBuffer = test.associationListener.ConsumeFirstSentPacket();
|
|
@@ -427,7 +834,7 @@ SCENARIO("SCTP RTC::SCTP::StreamResetHandler", "[sctp][streamresethandler]")
|
|
|
427
834
|
// Feeds a received packet carrying a single FORWARD-TSN chunk to the receive
|
|
428
835
|
// side, doing exactly what RTC::SCTP::Association::HandleReceivedAnyForwardTsnChunk()
|
|
429
836
|
// and then RTC::SCTP::Association::ReceiveSctpData() do.
|
|
430
|
-
auto handleReceivedForwardTsn =
|
|
837
|
+
const auto handleReceivedForwardTsn =
|
|
431
838
|
[&test](
|
|
432
839
|
uint32_t newCumulativeTsn,
|
|
433
840
|
std::span<const RTC::SCTP::AnyForwardTsnChunk::SkippedStream> skippedStreams) -> void
|
|
@@ -54,7 +54,7 @@ SCENARIO("SCTP TransmissionControlBlock", "[sctp][transmissioncontrolblock]")
|
|
|
54
54
|
RTC::SCTP::PacketSender packetSender(std::addressof(packetSenderListener), associationListener);
|
|
55
55
|
MockTcbContextListener tcbContextListener;
|
|
56
56
|
|
|
57
|
-
auto isAssociationEstablished = []()
|
|
57
|
+
const auto isAssociationEstablished = []()
|
|
58
58
|
{
|
|
59
59
|
return true;
|
|
60
60
|
};
|
|
@@ -17,7 +17,7 @@ SCENARIO("Zero Checksum Acceptable Parameter (32769)", "[serializable][sctp][par
|
|
|
17
17
|
{
|
|
18
18
|
// Type:32769 (ZERO-CHECKSUM-ACCEPTABLE), Length: 8
|
|
19
19
|
0x80, 0x01, 0x00, 0x08,
|
|
20
|
-
// Alternate Error Detection Method (EDMID) :
|
|
20
|
+
// Alternate Error Detection Method (EDMID) : 0x00000001
|
|
21
21
|
0x00, 0x00, 0x00, 0x01,
|
|
22
22
|
// Extra bytes that should be ignored
|
|
23
23
|
0xAA, 0xBB, 0xCC, 0xDD,
|
|
@@ -25,7 +25,7 @@ SCENARIO("Zero Checksum Acceptable Parameter (32769)", "[serializable][sctp][par
|
|
|
25
25
|
};
|
|
26
26
|
// clang-format on
|
|
27
27
|
|
|
28
|
-
auto* parameter = RTC::SCTP::ZeroChecksumAcceptableParameter::Parse(buffer, sizeof(buffer));
|
|
28
|
+
auto* const parameter = RTC::SCTP::ZeroChecksumAcceptableParameter::Parse(buffer, sizeof(buffer));
|
|
29
29
|
|
|
30
30
|
CHECK_SCTP_PARAMETER(
|
|
31
31
|
/*parameter*/ parameter,
|
|
@@ -61,7 +61,7 @@ SCENARIO("Zero Checksum Acceptable Parameter (32769)", "[serializable][sctp][par
|
|
|
61
61
|
|
|
62
62
|
/* Clone it. */
|
|
63
63
|
|
|
64
|
-
auto* clonedParameter =
|
|
64
|
+
auto* const clonedParameter =
|
|
65
65
|
parameter->Clone(sctpCommon::CloneBuffer, sizeof(sctpCommon::CloneBuffer));
|
|
66
66
|
|
|
67
67
|
std::memset(sctpCommon::SerializeBuffer, 0x00, sizeof(sctpCommon::SerializeBuffer));
|
|
@@ -84,9 +84,41 @@ SCENARIO("Zero Checksum Acceptable Parameter (32769)", "[serializable][sctp][par
|
|
|
84
84
|
delete clonedParameter;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
SECTION("ZeroChecksumAcceptableParameter::GetAlternateErrorDetectionMethod() succeeds")
|
|
88
|
+
{
|
|
89
|
+
// clang-format off
|
|
90
|
+
alignas(4) uint8_t buffer[] =
|
|
91
|
+
{
|
|
92
|
+
// Type:32769 (ZERO-CHECKSUM-ACCEPTABLE), Length: 8
|
|
93
|
+
0x80, 0x01, 0x00, 0x08,
|
|
94
|
+
// Alternate Error Detection Method (EDMID) : 0xFFFFFFFE
|
|
95
|
+
0xFF, 0xFF, 0xFF, 0xFE
|
|
96
|
+
};
|
|
97
|
+
// clang-format on
|
|
98
|
+
|
|
99
|
+
auto* const parameter = RTC::SCTP::ZeroChecksumAcceptableParameter::Parse(buffer, sizeof(buffer));
|
|
100
|
+
|
|
101
|
+
REQUIRE(parameter);
|
|
102
|
+
REQUIRE(
|
|
103
|
+
parameter->GetAlternateErrorDetectionMethod() ==
|
|
104
|
+
RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod::TRUSTED_NETWORK);
|
|
105
|
+
|
|
106
|
+
// Unknown Alternate Error Detection Method (0x00000002).
|
|
107
|
+
parameter->SetAlternateErrorDetectionMethod(
|
|
108
|
+
// NOLINTNEXTLINE(clang-analyzer-optin.core.EnumCastOutOfRange)
|
|
109
|
+
static_cast<RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod>(
|
|
110
|
+
0x00000002));
|
|
111
|
+
|
|
112
|
+
REQUIRE(
|
|
113
|
+
parameter->GetAlternateErrorDetectionMethod() ==
|
|
114
|
+
RTC::SCTP::ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod::NONE);
|
|
115
|
+
|
|
116
|
+
delete parameter;
|
|
117
|
+
}
|
|
118
|
+
|
|
87
119
|
SECTION("ZeroChecksumAcceptableParameter::Factory() succeeds")
|
|
88
120
|
{
|
|
89
|
-
auto* parameter = RTC::SCTP::ZeroChecksumAcceptableParameter::Factory(
|
|
121
|
+
auto* const parameter = RTC::SCTP::ZeroChecksumAcceptableParameter::Factory(
|
|
90
122
|
sctpCommon::FactoryBuffer, sizeof(sctpCommon::FactoryBuffer));
|
|
91
123
|
|
|
92
124
|
CHECK_SCTP_PARAMETER(
|
|
@@ -122,7 +154,7 @@ SCENARIO("Zero Checksum Acceptable Parameter (32769)", "[serializable][sctp][par
|
|
|
122
154
|
|
|
123
155
|
/* Parse itself and compare. */
|
|
124
156
|
|
|
125
|
-
auto* parsedParameter = RTC::SCTP::ZeroChecksumAcceptableParameter::Parse(
|
|
157
|
+
auto* const parsedParameter = RTC::SCTP::ZeroChecksumAcceptableParameter::Parse(
|
|
126
158
|
parameter->GetBuffer(), parameter->GetLength());
|
|
127
159
|
|
|
128
160
|
delete parameter;
|
|
@@ -45,13 +45,13 @@ SCENARIO("SCTP DataTracker", "[sctp][datatracker]")
|
|
|
45
45
|
|
|
46
46
|
RTC::SCTP::DataTracker dataTracker(delayedAckTimer, InitialTsn);
|
|
47
47
|
|
|
48
|
-
auto createPacket = []()
|
|
48
|
+
const auto createPacket = []()
|
|
49
49
|
{
|
|
50
50
|
return std::unique_ptr<RTC::SCTP::Packet>{ RTC::SCTP::Packet::Factory(
|
|
51
51
|
sctpCommon::FactoryBuffer, Mtu) };
|
|
52
52
|
};
|
|
53
53
|
|
|
54
|
-
auto addSackChunk = [&dataTracker](RTC::SCTP::Packet* packet, size_t aRwnd)
|
|
54
|
+
const auto addSackChunk = [&dataTracker](RTC::SCTP::Packet* packet, size_t aRwnd)
|
|
55
55
|
{
|
|
56
56
|
dataTracker.AddSackSelectiveAck(packet, aRwnd);
|
|
57
57
|
|
|
@@ -60,7 +60,8 @@ SCENARIO("SCTP DataTracker", "[sctp][datatracker]")
|
|
|
60
60
|
return sackChunk;
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
auto observe =
|
|
63
|
+
const auto observe =
|
|
64
|
+
[&dataTracker](std::initializer_list<uint32_t> tsns, bool expectAsDuplicate = false)
|
|
64
65
|
{
|
|
65
66
|
for (const uint32_t tsn : tsns)
|
|
66
67
|
{
|
|
@@ -746,7 +747,7 @@ SCENARIO("SCTP DataTracker", "[sctp][datatracker]")
|
|
|
746
747
|
|
|
747
748
|
SECTION("gap-ack-block merges many blocks into one")
|
|
748
749
|
{
|
|
749
|
-
auto getGapAckBlocks = [&]()
|
|
750
|
+
const auto getGapAckBlocks = [&]()
|
|
750
751
|
{
|
|
751
752
|
const auto packet = createPacket();
|
|
752
753
|
const auto* sackChunk = addSackChunk(packet.get(), Arwnd);
|
|
@@ -75,7 +75,7 @@ SCENARIO("SCTP InterleavedReassemblyStreams", "[sctp][interleavedreassemblystrea
|
|
|
75
75
|
|
|
76
76
|
RTC::SCTP::Types::UnwrappedTsn::Unwrapper tsn;
|
|
77
77
|
|
|
78
|
-
auto getTsn = [&tsn](uint32_t value)
|
|
78
|
+
const auto getTsn = [&tsn](uint32_t value)
|
|
79
79
|
{
|
|
80
80
|
return tsn.Unwrap(value);
|
|
81
81
|
};
|
|
@@ -24,7 +24,7 @@ SCENARIO("SCTP ReassemblyQueue", "[sctp][reassemblyqueue]")
|
|
|
24
24
|
constexpr std::array<uint8_t, 16> LongPayload = { 1, 2, 3, 4, 5, 6, 7, 8,
|
|
25
25
|
9, 10, 11, 12, 13, 14, 15, 16 };
|
|
26
26
|
|
|
27
|
-
auto flushMessages = [](RTC::SCTP::ReassemblyQueue& reassemblyQueue)
|
|
27
|
+
const auto flushMessages = [](RTC::SCTP::ReassemblyQueue& reassemblyQueue)
|
|
28
28
|
{
|
|
29
29
|
std::vector<RTC::SCTP::Message> messages;
|
|
30
30
|
|
|
@@ -75,7 +75,7 @@ SCENARIO("SCTP TraditionalReassemblyStreams", "[sctp][traditionalreassemblystrea
|
|
|
75
75
|
|
|
76
76
|
RTC::SCTP::Types::UnwrappedTsn::Unwrapper tsn;
|
|
77
77
|
|
|
78
|
-
auto getTsn = [&tsn](uint32_t value)
|
|
78
|
+
const auto getTsn = [&tsn](uint32_t value)
|
|
79
79
|
{
|
|
80
80
|
return tsn.Unwrap(value);
|
|
81
81
|
};
|
|
@@ -77,7 +77,7 @@ SCENARIO("SCTP OutstandingData", "[sctp][outstandingdata]")
|
|
|
77
77
|
RTC::SCTP::Types::UnwrappedTsn::Unwrapper unwrapper;
|
|
78
78
|
DiscardFromSendQueueTester discardFromSendQueueTester;
|
|
79
79
|
|
|
80
|
-
auto discardFromSendQueue =
|
|
80
|
+
const auto discardFromSendQueue =
|
|
81
81
|
[&discardFromSendQueueTester](uint16_t streamId, uint32_t outgoingMessageId)
|
|
82
82
|
{
|
|
83
83
|
return discardFromSendQueueTester.Called(streamId, outgoingMessageId);
|
|
@@ -81,7 +81,7 @@ SCENARIO("SCTP RetransmissionQueue", "[sctp][retransmissionqueue]")
|
|
|
81
81
|
|
|
82
82
|
auto* t3RtxTimer = t3RtxTimerUniquePtr.get();
|
|
83
83
|
|
|
84
|
-
auto createRetransmissionQueue =
|
|
84
|
+
const auto createRetransmissionQueue =
|
|
85
85
|
[&retransmissionQueueListener, &associationListener, &sendQueue, &t3RtxTimer, &sctpOptions](
|
|
86
86
|
bool supportsPartialReliability = true, bool useMessageInterleaving = false)
|
|
87
87
|
{
|
|
@@ -97,9 +97,8 @@ SCENARIO("SCTP RetransmissionQueue", "[sctp][retransmissionqueue]")
|
|
|
97
97
|
useMessageInterleaving);
|
|
98
98
|
};
|
|
99
99
|
|
|
100
|
-
auto createDataToSend =
|
|
101
|
-
|
|
102
|
-
uint16_t maxRetransmissions = RTC::SCTP::Types::MaxRetransmitsNoLimit)
|
|
100
|
+
const auto createDataToSend =
|
|
101
|
+
[](uint32_t outgoingMessageId, uint16_t maxRetransmissions = RTC::SCTP::Types::MaxRetransmitsNoLimit)
|
|
103
102
|
{
|
|
104
103
|
return [outgoingMessageId, maxRetransmissions](int64_t /*nowUs*/, size_t /*maxLength*/)
|
|
105
104
|
{
|
|
@@ -122,10 +121,11 @@ SCENARIO("SCTP RetransmissionQueue", "[sctp][retransmissionqueue]")
|
|
|
122
121
|
};
|
|
123
122
|
};
|
|
124
123
|
|
|
125
|
-
auto createSackChunk =
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
124
|
+
const auto createSackChunk =
|
|
125
|
+
[sctpOptions](
|
|
126
|
+
uint32_t tsn,
|
|
127
|
+
uint32_t arwnd,
|
|
128
|
+
const std::vector<RTC::SCTP::SackChunk::GapAckBlock>&& gapAckBlocks = {})
|
|
129
129
|
{
|
|
130
130
|
std::unique_ptr<RTC::SCTP::SackChunk> chunk{ RTC::SCTP::SackChunk::Factory(
|
|
131
131
|
sctpCommon::FactoryBuffer, sctpOptions.mtu) };
|
|
@@ -141,7 +141,7 @@ SCENARIO("SCTP RetransmissionQueue", "[sctp][retransmissionqueue]")
|
|
|
141
141
|
return chunk;
|
|
142
142
|
};
|
|
143
143
|
|
|
144
|
-
auto getTSNsForFastRetransmit = [](RTC::SCTP::RetransmissionQueue& queue)
|
|
144
|
+
const auto getTSNsForFastRetransmit = [](RTC::SCTP::RetransmissionQueue& queue)
|
|
145
145
|
{
|
|
146
146
|
std::vector<uint32_t> tsns;
|
|
147
147
|
|
|
@@ -153,7 +153,8 @@ SCENARIO("SCTP RetransmissionQueue", "[sctp][retransmissionqueue]")
|
|
|
153
153
|
return tsns;
|
|
154
154
|
};
|
|
155
155
|
|
|
156
|
-
auto getSentPacketTSNs =
|
|
156
|
+
const auto getSentPacketTSNs =
|
|
157
|
+
[&nowUs](RTC::SCTP::RetransmissionQueue& queue, size_t maxLength = 10000)
|
|
157
158
|
{
|
|
158
159
|
std::vector<uint32_t> tsns;
|
|
159
160
|
|
|
@@ -14,7 +14,7 @@ SCENARIO("SCTP RetransmissionTimeout", "[sctp][retransmissiontimeout]")
|
|
|
14
14
|
constexpr int64_t MinRttVarianceMs{ 220 };
|
|
15
15
|
|
|
16
16
|
// NOTE: No need to pass const integers to the lambda.
|
|
17
|
-
auto makeSctpOptions = []()
|
|
17
|
+
const auto makeSctpOptions = []()
|
|
18
18
|
{
|
|
19
19
|
RTC::SCTP::SctpOptions sctpOptions{ .maxRttMs = MaxRttMs,
|
|
20
20
|
.initialRtoMs = InitialRtoMs,
|