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.
Files changed (155) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/node/lib/PipeTransportTypes.d.ts +6 -1
  3. package/node/lib/PipeTransportTypes.d.ts.map +1 -1
  4. package/node/lib/PlainTransportTypes.d.ts +6 -1
  5. package/node/lib/PlainTransportTypes.d.ts.map +1 -1
  6. package/node/lib/Router.d.ts +4 -4
  7. package/node/lib/Router.d.ts.map +1 -1
  8. package/node/lib/Router.js +10 -7
  9. package/node/lib/RouterTypes.d.ts +7 -1
  10. package/node/lib/RouterTypes.d.ts.map +1 -1
  11. package/node/lib/Transport.d.ts +2 -1
  12. package/node/lib/Transport.d.ts.map +1 -1
  13. package/node/lib/Transport.js +17 -6
  14. package/node/lib/TransportTypes.d.ts +12 -2
  15. package/node/lib/TransportTypes.d.ts.map +1 -1
  16. package/node/lib/WebRtcTransportTypes.d.ts +6 -1
  17. package/node/lib/WebRtcTransportTypes.d.ts.map +1 -1
  18. package/node/lib/fbs/transport/options.d.ts +6 -2
  19. package/node/lib/fbs/transport/options.d.ts.map +1 -1
  20. package/node/lib/fbs/transport/options.js +19 -7
  21. package/node/lib/fbs/transport/sctp-zero-checksum.d.ts +6 -0
  22. package/node/lib/fbs/transport/sctp-zero-checksum.d.ts.map +1 -0
  23. package/node/lib/fbs/transport/sctp-zero-checksum.js +11 -0
  24. package/node/lib/fbs/transport/stats.d.ts +2 -8
  25. package/node/lib/fbs/transport/stats.d.ts.map +1 -1
  26. package/node/lib/fbs/transport/stats.js +5 -29
  27. package/node/lib/fbs/transport.d.ts +1 -0
  28. package/node/lib/fbs/transport.d.ts.map +1 -1
  29. package/node/lib/fbs/transport.js +4 -2
  30. package/npm-scripts.mjs +35 -44
  31. package/package.json +10 -6
  32. package/worker/fbs/transport.fbs +9 -2
  33. package/worker/fuzzer/src/RTC/RTP/FuzzerRetransmissionBuffer.cpp +14 -1
  34. package/worker/fuzzer/src/RTC/RTP/FuzzerRtpStreamSend.cpp +17 -4
  35. package/worker/include/RTC/BWE/AimdRateControl.hpp +9 -9
  36. package/worker/include/RTC/BWE/BweTypes.hpp +54 -17
  37. package/worker/include/RTC/BWE/DelayBasedBwe.hpp +3 -3
  38. package/worker/include/RTC/BWE/FeedbackAdapter.hpp +2 -2
  39. package/worker/include/RTC/BWE/LossBasedController.hpp +4 -4
  40. package/worker/include/RTC/BWE/OveruseDetector.hpp +5 -4
  41. package/worker/include/RTC/BWE/ProbeBitrateEstimator.hpp +1 -1
  42. package/worker/include/RTC/BWE/ProbeController.hpp +6 -6
  43. package/worker/include/RTC/BWE/ProbePacketGenerator.hpp +2 -6
  44. package/worker/include/RTC/BWE/ProbingScheduler.hpp +3 -7
  45. package/worker/include/RTC/BWE/ReceiverTransportCongestionController.hpp +148 -0
  46. package/worker/include/RTC/BWE/RembGenerator.hpp +4 -3
  47. package/worker/include/RTC/BWE/RemoteBitrateEstimatorAbsSendTime.hpp +1 -1
  48. package/worker/include/RTC/BWE/SenderTransportCongestionController.hpp +343 -0
  49. package/worker/include/RTC/BWE/TargetRateController.hpp +4 -1
  50. package/worker/include/RTC/BWE/TransportWideCcFeedbackGenerator.hpp +5 -4
  51. package/worker/include/RTC/BWE/TrendlineEstimator.hpp +3 -3
  52. package/worker/include/RTC/Consumer.hpp +8 -1
  53. package/worker/include/RTC/RTP/RetransmissionBuffer.hpp +36 -10
  54. package/worker/include/RTC/RTP/RtpStream.hpp +21 -0
  55. package/worker/include/RTC/RTP/RtpStreamRecv.hpp +1 -0
  56. package/worker/include/RTC/RTP/RtpStreamSend.hpp +122 -9
  57. package/worker/include/RTC/SCTP/packet/parameters/ZeroChecksumAcceptableParameter.hpp +12 -3
  58. package/worker/include/RTC/TransportCongestionControlClient.hpp +0 -5
  59. package/worker/include/RTC/TransportCongestionControlServer.hpp +0 -5
  60. package/worker/include/Utils.hpp +9 -2
  61. package/worker/meson.build +4 -0
  62. package/worker/src/RTC/BWE/AimdRateControl.cpp +22 -22
  63. package/worker/src/RTC/BWE/DelayBasedBwe.cpp +16 -20
  64. package/worker/src/RTC/BWE/FeedbackAdapter.cpp +1 -1
  65. package/worker/src/RTC/BWE/OveruseDetector.cpp +8 -8
  66. package/worker/src/RTC/BWE/ProbeBitrateEstimator.cpp +2 -2
  67. package/worker/src/RTC/BWE/ProbeController.cpp +1 -1
  68. package/worker/src/RTC/BWE/ProbePacketGenerator.cpp +1 -6
  69. package/worker/src/RTC/BWE/ProbingScheduler.cpp +2 -7
  70. package/worker/src/RTC/BWE/ReceiverTransportCongestionController.cpp +207 -0
  71. package/worker/src/RTC/BWE/RembGenerator.cpp +1 -1
  72. package/worker/src/RTC/BWE/RemoteBitrateEstimatorAbsSendTime.cpp +1 -1
  73. package/worker/src/RTC/BWE/SenderTransportCongestionController.cpp +599 -0
  74. package/worker/src/RTC/BWE/TransportWideCcFeedbackGenerator.cpp +2 -3
  75. package/worker/src/RTC/BWE/TrendlineEstimator.cpp +5 -5
  76. package/worker/src/RTC/Consumer.cpp +3 -2
  77. package/worker/src/RTC/DataConsumer.cpp +2 -2
  78. package/worker/src/RTC/RTP/RetransmissionBuffer.cpp +21 -8
  79. package/worker/src/RTC/RTP/RtpStream.cpp +0 -3
  80. package/worker/src/RTC/RTP/RtpStreamRecv.cpp +57 -71
  81. package/worker/src/RTC/RTP/RtpStreamSend.cpp +428 -244
  82. package/worker/src/RTC/RTP/RtxStream.cpp +14 -19
  83. package/worker/src/RTC/SCTP/association/Association.cpp +3 -2
  84. package/worker/src/RTC/SCTP/association/StateCookie.cpp +26 -6
  85. package/worker/src/RTC/SCTP/packet/parameters/ZeroChecksumAcceptableParameter.cpp +4 -3
  86. package/worker/src/RTC/SCTP/rx/ReassemblyQueue.cpp +2 -1
  87. package/worker/src/RTC/SCTP/tx/RetransmissionQueue.cpp +4 -2
  88. package/worker/src/RTC/Transport.cpp +49 -20
  89. package/worker/src/RTC/TransportCongestionControlClient.cpp +0 -66
  90. package/worker/src/RTC/TransportCongestionControlServer.cpp +0 -55
  91. package/worker/src/Utils/Crypto.cpp +114 -98
  92. package/worker/subprojects/catch2.wrap +6 -6
  93. package/worker/subprojects/openssl.wrap +11 -12
  94. package/worker/subprojects/packagefiles/ankerl-unordered-dense/meson.build +1 -1
  95. package/worker/subprojects/unordered-dense.wrap +4 -4
  96. package/worker/test/src/RTC/BWE/TestDelayBasedBwe.cpp +5 -5
  97. package/worker/test/src/RTC/BWE/TestFeedbackAdapter.cpp +26 -23
  98. package/worker/test/src/RTC/BWE/TestInterArrivalDelta.cpp +8 -8
  99. package/worker/test/src/RTC/BWE/TestOveruseDetector.cpp +4 -4
  100. package/worker/test/src/RTC/BWE/TestProbeController.cpp +35 -32
  101. package/worker/test/src/RTC/BWE/TestProbePacketGenerator.cpp +2 -17
  102. package/worker/test/src/RTC/BWE/TestProbingScheduler.cpp +1 -25
  103. package/worker/test/src/RTC/BWE/TestReceiverTransportCongestionController.cpp +346 -0
  104. package/worker/test/src/RTC/BWE/TestRembGenerator.cpp +1 -1
  105. package/worker/test/src/RTC/BWE/TestRemoteBitrateEstimatorAbsSendTime.cpp +9 -9
  106. package/worker/test/src/RTC/BWE/TestSenderTransportCongestionController.cpp +510 -0
  107. package/worker/test/src/RTC/BWE/TestTransportWideCcFeedbackGenerator.cpp +16 -14
  108. package/worker/test/src/RTC/BWE/TestTrendlineEstimator.cpp +6 -6
  109. package/worker/test/src/RTC/BWE/helpers/RemoteBitrateEstimatorAbsSendTimeTestHelper.cpp +1 -2
  110. package/worker/test/src/RTC/RTCP/TestBye.cpp +1 -1
  111. package/worker/test/src/RTC/RTCP/TestFeedbackPsAfb.cpp +1 -1
  112. package/worker/test/src/RTC/RTCP/TestFeedbackPsFir.cpp +1 -1
  113. package/worker/test/src/RTC/RTCP/TestFeedbackPsLei.cpp +1 -1
  114. package/worker/test/src/RTC/RTCP/TestFeedbackPsPli.cpp +1 -1
  115. package/worker/test/src/RTC/RTCP/TestFeedbackPsRemb.cpp +1 -1
  116. package/worker/test/src/RTC/RTCP/TestFeedbackPsRpsi.cpp +1 -1
  117. package/worker/test/src/RTC/RTCP/TestFeedbackPsSli.cpp +1 -1
  118. package/worker/test/src/RTC/RTCP/TestFeedbackPsTst.cpp +1 -1
  119. package/worker/test/src/RTC/RTCP/TestFeedbackPsVbcm.cpp +1 -1
  120. package/worker/test/src/RTC/RTCP/TestFeedbackRtpEcn.cpp +1 -1
  121. package/worker/test/src/RTC/RTCP/TestFeedbackRtpNack.cpp +1 -1
  122. package/worker/test/src/RTC/RTCP/TestFeedbackRtpSrReq.cpp +1 -1
  123. package/worker/test/src/RTC/RTCP/TestFeedbackRtpTllei.cpp +1 -1
  124. package/worker/test/src/RTC/RTCP/TestFeedbackRtpTmmb.cpp +1 -1
  125. package/worker/test/src/RTC/RTCP/TestFeedbackRtpTransport.cpp +1 -1
  126. package/worker/test/src/RTC/RTCP/TestReceiverReport.cpp +1 -1
  127. package/worker/test/src/RTC/RTCP/TestSenderReport.cpp +1 -1
  128. package/worker/test/src/RTC/RTP/TestRetransmissionBuffer.cpp +60 -28
  129. package/worker/test/src/RTC/RTP/TestRtpStreamRecv.cpp +1 -1
  130. package/worker/test/src/RTC/RTP/TestRtpStreamSend.cpp +746 -24
  131. package/worker/test/src/RTC/RTP/TestSharedPacket.cpp +1 -1
  132. package/worker/test/src/RTC/SCTP/association/TestAssociation.cpp +42 -0
  133. package/worker/test/src/RTC/SCTP/association/TestNegotiatedCapabilities.cpp +54 -5
  134. package/worker/test/src/RTC/SCTP/association/TestStateCookie.cpp +80 -15
  135. package/worker/test/src/RTC/SCTP/association/TestStreamResetHandler.cpp +410 -3
  136. package/worker/test/src/RTC/SCTP/association/TestTransmissionControlBlock.cpp +1 -1
  137. package/worker/test/src/RTC/SCTP/packet/parameters/TestZeroChecksumAcceptableParameter.cpp +37 -5
  138. package/worker/test/src/RTC/SCTP/rx/TestDataTracker.cpp +5 -4
  139. package/worker/test/src/RTC/SCTP/rx/TestInterleavedReassemblyStreams.cpp +1 -1
  140. package/worker/test/src/RTC/SCTP/rx/TestReassemblyQueue.cpp +1 -1
  141. package/worker/test/src/RTC/SCTP/rx/TestTraditionalReassemblyStreams.cpp +1 -1
  142. package/worker/test/src/RTC/SCTP/tx/TestOutstandingData.cpp +1 -1
  143. package/worker/test/src/RTC/SCTP/tx/TestRetransmissionQueue.cpp +11 -10
  144. package/worker/test/src/RTC/SCTP/tx/TestRetransmissionTimeout.cpp +1 -1
  145. package/worker/test/src/RTC/TestNackGenerator.cpp +1 -1
  146. package/worker/test/src/RTC/TestPortManager.cpp +2 -2
  147. package/worker/test/src/RTC/TestRateCalculator.cpp +1 -1
  148. package/worker/test/src/RTC/TestRemoteCaptureTimeEstimator.cpp +21 -15
  149. package/worker/test/src/RTC/TestRemoteClockOffsetEstimator.cpp +13 -13
  150. package/worker/test/src/RTC/TestRtpEncodingParameters.cpp +1 -1
  151. package/worker/test/src/RTC/TestSubchannelsCodec.cpp +2 -2
  152. package/worker/test/src/RTC/TestTransportCongestionControlServer.cpp +1 -1
  153. package/worker/test/src/RTC/TestTransportTuple.cpp +3 -2
  154. package/worker/test/src/Utils/TestCrypto.cpp +71 -2
  155. 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) : 0x0001
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 = [&dataTracker](std::initializer_list<uint32_t> tsns, bool expectAsDuplicate = false)
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
- uint32_t outgoingMessageId,
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 = [sctpOptions](
126
- uint32_t tsn,
127
- uint32_t arwnd,
128
- const std::vector<RTC::SCTP::SackChunk::GapAckBlock>&& gapAckBlocks = {})
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 = [&nowUs](RTC::SCTP::RetransmissionQueue& queue, size_t maxLength = 10000)
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,