mediasoup 3.20.5 → 3.20.7

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 (113) hide show
  1. package/node/lib/Worker.d.ts +1 -1
  2. package/node/lib/Worker.d.ts.map +1 -1
  3. package/node/lib/Worker.js +1 -11
  4. package/node/lib/WorkerTypes.d.ts +0 -9
  5. package/node/lib/WorkerTypes.d.ts.map +1 -1
  6. package/node/lib/fbs/plain-transport/connect-response.d.ts.map +1 -1
  7. package/node/lib/fbs/plain-transport/connect-response.js +0 -1
  8. package/node/lib/fbs/worker/dump-response.d.ts +1 -5
  9. package/node/lib/fbs/worker/dump-response.d.ts.map +1 -1
  10. package/node/lib/fbs/worker/dump-response.js +3 -16
  11. package/node/lib/index.d.ts +1 -1
  12. package/node/lib/index.d.ts.map +1 -1
  13. package/node/lib/index.js +1 -2
  14. package/node/lib/test/test-PlainTransport.js +30 -0
  15. package/node/lib/test/test-Worker.js +0 -1
  16. package/npm-scripts.mjs +13 -8
  17. package/package.json +8 -8
  18. package/worker/fbs/meson.build +0 -1
  19. package/worker/fbs/plainTransport.fbs +1 -1
  20. package/worker/fbs/worker.fbs +0 -2
  21. package/worker/include/RTC/Consumer.hpp +80 -45
  22. package/worker/include/RTC/ICE/StunPacket.hpp +8 -9
  23. package/worker/include/RTC/PipeProducerStreamManager.hpp +78 -0
  24. package/worker/include/RTC/ProducerStreamManager.hpp +181 -0
  25. package/worker/include/RTC/RTP/Packet.hpp +1 -1
  26. package/worker/include/RTC/RTP/ProbationGenerator.hpp +1 -1
  27. package/worker/include/RTC/SCTP/association/Association.hpp +24 -0
  28. package/worker/include/RTC/SCTP/association/StateCookie.hpp +104 -11
  29. package/worker/include/RTC/SCTP/packet/Chunk.hpp +1 -1
  30. package/worker/include/RTC/SCTP/packet/ErrorCause.hpp +1 -1
  31. package/worker/include/RTC/SCTP/packet/Packet.hpp +1 -2
  32. package/worker/include/RTC/SCTP/packet/Parameter.hpp +1 -1
  33. package/worker/include/RTC/SCTP/packet/TLV.hpp +1 -1
  34. package/worker/include/RTC/SCTP/packet/chunks/DataChunk.hpp +1 -1
  35. package/worker/include/RTC/SCTP/packet/chunks/ForwardTsnChunk.hpp +1 -1
  36. package/worker/include/RTC/SCTP/packet/chunks/IDataChunk.hpp +1 -1
  37. package/worker/include/RTC/SCTP/packet/chunks/IForwardTsnChunk.hpp +1 -1
  38. package/worker/include/RTC/SCTP/packet/chunks/InitAckChunk.hpp +1 -1
  39. package/worker/include/RTC/SCTP/packet/chunks/InitChunk.hpp +1 -1
  40. package/worker/include/RTC/SCTP/packet/chunks/SackChunk.hpp +1 -1
  41. package/worker/include/RTC/SCTP/packet/chunks/ShutdownChunk.hpp +1 -1
  42. package/worker/include/RTC/SCTP/packet/errorCauses/InvalidStreamIdentifierErrorCause.hpp +1 -1
  43. package/worker/include/RTC/SCTP/packet/errorCauses/MissingMandatoryParameterErrorCause.hpp +1 -1
  44. package/worker/include/RTC/SCTP/packet/errorCauses/NoUserDataErrorCause.hpp +1 -1
  45. package/worker/include/RTC/SCTP/packet/errorCauses/StaleCookieErrorCause.hpp +1 -1
  46. package/worker/include/RTC/SCTP/packet/parameters/AddIncomingStreamsRequestParameter.hpp +1 -1
  47. package/worker/include/RTC/SCTP/packet/parameters/AddOutgoingStreamsRequestParameter.hpp +1 -1
  48. package/worker/include/RTC/SCTP/packet/parameters/CookiePreservativeParameter.hpp +1 -1
  49. package/worker/include/RTC/SCTP/packet/parameters/IPv4AddressParameter.hpp +1 -1
  50. package/worker/include/RTC/SCTP/packet/parameters/IPv6AddressParameter.hpp +1 -1
  51. package/worker/include/RTC/SCTP/packet/parameters/IncomingSsnResetRequestParameter.hpp +1 -1
  52. package/worker/include/RTC/SCTP/packet/parameters/OutgoingSsnResetRequestParameter.hpp +1 -1
  53. package/worker/include/RTC/SCTP/packet/parameters/ReconfigurationResponseParameter.hpp +2 -2
  54. package/worker/include/RTC/SCTP/packet/parameters/SsnTsnResetRequestParameter.hpp +1 -1
  55. package/worker/include/RTC/SCTP/packet/parameters/StateCookieParameter.hpp +4 -1
  56. package/worker/include/RTC/SCTP/packet/parameters/ZeroChecksumAcceptableParameter.hpp +1 -1
  57. package/worker/include/RTC/SCTP/public/SctpOptions.hpp +13 -0
  58. package/worker/include/RTC/SimpleProducerStreamManager.hpp +72 -0
  59. package/worker/include/RTC/SimulcastProducerStreamManager.hpp +93 -0
  60. package/worker/include/RTC/SvcProducerStreamManager.hpp +72 -0
  61. package/worker/include/RTC/Transport.hpp +7 -1
  62. package/worker/include/Settings.hpp +0 -1
  63. package/worker/include/handles/TcpConnectionHandle.hpp +0 -4
  64. package/worker/include/handles/UdpSocketHandle.hpp +0 -4
  65. package/worker/meson.build +9 -39
  66. package/worker/meson_options.txt +0 -1
  67. package/worker/src/RTC/Consumer.cpp +1404 -30
  68. package/worker/src/RTC/DirectTransport.cpp +4 -1
  69. package/worker/src/RTC/PipeProducerStreamManager.cpp +266 -0
  70. package/worker/src/RTC/PipeTransport.cpp +9 -6
  71. package/worker/src/RTC/PlainTransport.cpp +9 -6
  72. package/worker/src/RTC/RTP/Packet.cpp +0 -2
  73. package/worker/src/RTC/RTP/RtpStreamSend.cpp +0 -20
  74. package/worker/src/RTC/Router.cpp +0 -37
  75. package/worker/src/RTC/SCTP/association/Association.cpp +150 -8
  76. package/worker/src/RTC/SCTP/association/StateCookie.cpp +96 -31
  77. package/worker/src/RTC/SCTP/packet/Packet.cpp +1 -1
  78. package/worker/src/RTC/SCTP/packet/parameters/StateCookieParameter.cpp +12 -3
  79. package/worker/src/RTC/SCTP/public/SctpOptions.cpp +4 -0
  80. package/worker/src/RTC/SimpleProducerStreamManager.cpp +343 -0
  81. package/worker/src/RTC/SimulcastProducerStreamManager.cpp +1068 -0
  82. package/worker/src/RTC/SrtpSession.cpp +0 -24
  83. package/worker/src/RTC/SvcProducerStreamManager.cpp +664 -0
  84. package/worker/src/RTC/Transport.cpp +10 -66
  85. package/worker/src/RTC/WebRtcTransport.cpp +13 -7
  86. package/worker/src/Settings.cpp +0 -14
  87. package/worker/src/Utils/Crypto.cpp +3 -3
  88. package/worker/src/Utils/String.cpp +1 -1
  89. package/worker/src/Worker.cpp +5 -38
  90. package/worker/src/handles/TcpConnectionHandle.cpp +1 -42
  91. package/worker/src/handles/UdpSocketHandle.cpp +1 -42
  92. package/worker/src/lib.cpp +1 -10
  93. package/worker/test/include/RTC/SCTP/sctpCommon.hpp +1 -1
  94. package/worker/test/src/RTC/SCTP/association/TestAssociation.cpp +115 -0
  95. package/worker/test/src/RTC/SCTP/association/TestStateCookie.cpp +123 -0
  96. package/worker/test/src/RTC/SCTP/packet/TestPacket.cpp +4 -4
  97. package/worker/test/src/RTC/{TestSimpleConsumer.cpp → TestConsumer.cpp} +6 -7
  98. package/worker/test/src/RTC/TestPipeProducerStreamManager.cpp +471 -0
  99. package/worker/test/src/RTC/TestSimpleProducerStreamManager.cpp +531 -0
  100. package/worker/test/src/RTC/TestSimulcastProducerStreamManager.cpp +1040 -0
  101. package/worker/test/src/RTC/TestSvcProducerStreamManager.cpp +1278 -0
  102. package/worker/fbs/liburing.fbs +0 -7
  103. package/worker/include/DepLibUring.hpp +0 -143
  104. package/worker/include/RTC/PipeConsumer.hpp +0 -95
  105. package/worker/include/RTC/SimpleConsumer.hpp +0 -102
  106. package/worker/include/RTC/SimulcastConsumer.hpp +0 -141
  107. package/worker/include/RTC/SvcConsumer.hpp +0 -118
  108. package/worker/src/DepLibUring.cpp +0 -638
  109. package/worker/src/RTC/PipeConsumer.cpp +0 -874
  110. package/worker/src/RTC/SimpleConsumer.cpp +0 -882
  111. package/worker/src/RTC/SimulcastConsumer.cpp +0 -1887
  112. package/worker/src/RTC/SvcConsumer.cpp +0 -1384
  113. package/worker/subprojects/liburing.wrap +0 -14
@@ -6,7 +6,6 @@
6
6
  #include "RTC/SCTP/public/SctpTypes.hpp"
7
7
  #include "RTC/Serializable.hpp"
8
8
  #include "Utils.hpp"
9
- #include <string_view>
10
9
 
11
10
  namespace RTC
12
11
  {
@@ -58,6 +57,28 @@ namespace RTC
58
57
  * Interleaving (I-DATA).
59
58
  * - Flag C (reconfig): Stream Reconfiguration.
60
59
  * - Flag D (zeroChecksum): Zero Checksum.
60
+ *
61
+ * When State Cookie authentication is enabled (see
62
+ * `SctpOptions::requireAuthenticatedCookie`), two extra fields are appended
63
+ * after the Negotiated Capabilities so the receiver can verify that the
64
+ * cookie was generated by itself and is not stale:
65
+ *
66
+ * 0 1 2 3
67
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
68
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69
+ * | Creation Timestamp |
70
+ * | |
71
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72
+ * \ \
73
+ * / MAC (HMAC-SHA1 over all preceding bytes) /
74
+ * \ \
75
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
76
+ *
77
+ * The MAC is keyed with a per-association secret that never leaves the
78
+ * worker, making the cookie unforgeable. The Creation Timestamp (in ms) is
79
+ * used to detect stale cookies.
80
+ *
81
+ * @see RFC 9260 sections 5.1.3 and 5.1.4.
61
82
  */
62
83
  class StateCookie : public Serializable
63
84
  {
@@ -84,7 +105,8 @@ namespace RTC
84
105
  };
85
106
 
86
107
  public:
87
- // Fixed total length of our generated State Cookies.
108
+ // Fixed length of our generated State Cookies when authentication is
109
+ // disabled.
88
110
  static constexpr size_t StateCookieLength{ 44 };
89
111
  // Offset in the State Cookie where the Negotiated Capabilitied are
90
112
  // located.
@@ -95,13 +117,27 @@ namespace RTC
95
117
  static constexpr size_t Magic1Length{ 8 };
96
118
  // Magic value used within the Negotiated Capabilities block.
97
119
  static constexpr uint16_t Magic2{ 0xAD81 };
120
+ // Offset of the creation timestamp present in authenticated State
121
+ // Cookies.
122
+ static constexpr size_t TimestampOffset{ StateCookie::StateCookieLength };
123
+ // Length of the creation timestamp field (a uint64_t with the time in
124
+ // milliseconds).
125
+ static constexpr size_t TimestampLength{ 8 };
126
+ // Offset of the MAC present in authenticated State Cookies.
127
+ static constexpr size_t MacOffset{ StateCookie::TimestampOffset + StateCookie::TimestampLength };
128
+ // Length of the MAC. We use HMAC-SHA1 so it's 20 bytes.
129
+ static constexpr size_t MacLength{ 20 };
130
+ // Fixed length of our generated State Cookies when authentication is
131
+ // enabled.
132
+ static constexpr size_t AuthenticatedStateCookieLength{ StateCookie::MacOffset +
133
+ StateCookie::MacLength };
134
+ // State Cookie lifespan (Valid.Cookie.Life) in milliseconds. Used to
135
+ // reject stale authenticated cookies.
136
+ //
137
+ // @see RFC 9260 section 16.
138
+ static constexpr uint64_t ValidCookieLifeMs{ 60000 };
98
139
 
99
140
  public:
100
- /**
101
- * Whether the given buffer is a StateCookie generated by mediasoup.
102
- */
103
- static bool IsMediasoupStateCookie(const uint8_t* buffer, size_t bufferLength);
104
-
105
141
  /**
106
142
  * Parse a StateCookie supposely generated by mediasoup.
107
143
  *
@@ -114,8 +150,11 @@ namespace RTC
114
150
  * Create a StateCookie.
115
151
  *
116
152
  * @remarks
117
- * `bufferLength` could be greater than the real length of the State
118
- * cookie.
153
+ * - `bufferLength` could be greater than the real length of the State
154
+ * cookie.
155
+ * - If `macKey` is not nullptr, an authenticated cookie (with creation
156
+ * timestamp and MAC) is generated. Otherwise a plain cookie is
157
+ * generated and `creationTimestampMs`/`macKey` are ignored.
119
158
  */
120
159
  static StateCookie* Factory(
121
160
  uint8_t* buffer,
@@ -126,10 +165,18 @@ namespace RTC
126
165
  uint32_t remoteInitialTsn,
127
166
  uint32_t remoteAdvertisedReceiverWindowCredit,
128
167
  uint64_t tieTag,
129
- const NegotiatedCapabilities& negotiatedCapabilities);
168
+ const NegotiatedCapabilities& negotiatedCapabilities,
169
+ uint64_t creationTimestampMs = 0,
170
+ const uint8_t* macKey = nullptr,
171
+ size_t macKeyLength = 0);
130
172
 
131
173
  /**
132
174
  * Serialize a StateCookie (based on given arguments) in the given buffer.
175
+ *
176
+ * @remarks
177
+ * - If `macKey` is not nullptr, an authenticated cookie (with creation
178
+ * timestamp and MAC) is generated. Otherwise a plain cookie is
179
+ * generated and `creationTimestampMs`/`macKey` are ignored.
133
180
  */
134
181
  static void Write(
135
182
  uint8_t* buffer,
@@ -140,7 +187,33 @@ namespace RTC
140
187
  uint32_t remoteInitialTsn,
141
188
  uint32_t remoteAdvertisedReceiverWindowCredit,
142
189
  uint64_t tieTag,
143
- const NegotiatedCapabilities& negotiatedCapabilities);
190
+ const NegotiatedCapabilities& negotiatedCapabilities,
191
+ uint64_t creationTimestampMs = 0,
192
+ const uint8_t* macKey = nullptr,
193
+ size_t macKeyLength = 0);
194
+
195
+ /**
196
+ * Whether the given buffer is a StateCookie generated by mediasoup.
197
+ *
198
+ * @remarks
199
+ * - This only checks magic values and length. It does NOT verify the
200
+ * MAC of authenticated cookies (which requires the per-association
201
+ * secret). Use `VerifyMac()` for that.
202
+ */
203
+ static bool IsMediasoupStateCookie(const uint8_t* buffer, size_t bufferLength);
204
+
205
+ /**
206
+ * Verify the MAC of an authenticated StateCookie generated by mediasoup.
207
+ *
208
+ * @remarks
209
+ * - Returns false if the buffer is not an authenticated cookie (i.e. its
210
+ * length is not `AuthenticatedStateCookieLength`) or if the MAC doesn't
211
+ * match the one computed with the given secret key.
212
+ *
213
+ * @see RFC 9260 section 5.1.4.
214
+ */
215
+ static bool VerifyMac(
216
+ const uint8_t* buffer, size_t bufferLength, const uint8_t* macKey, size_t macKeyLength);
144
217
 
145
218
  /**
146
219
  * Determine the SCTP implementation of the generator of State Cookie
@@ -218,6 +291,26 @@ namespace RTC
218
291
  */
219
292
  NegotiatedCapabilities GetNegotiatedCapabilities() const;
220
293
 
294
+ /**
295
+ * Whether this is an authenticated StateCookie (i.e. it carries a
296
+ * creation timestamp and a MAC).
297
+ */
298
+ bool IsAuthenticated() const
299
+ {
300
+ return GetLength() == StateCookie::AuthenticatedStateCookieLength;
301
+ }
302
+
303
+ /**
304
+ * The time (in milliseconds) at which this StateCookie was created.
305
+ *
306
+ * @remarks
307
+ * - Only meaningful in authenticated cookies (see `IsAuthenticated()`).
308
+ */
309
+ uint64_t GetCreationTimestampMs() const
310
+ {
311
+ return Utils::Byte::Get8Bytes(GetBuffer(), StateCookie::TimestampOffset);
312
+ }
313
+
221
314
  private:
222
315
  NegotiatedCapabilitiesField* GetNegotiatedCapabilitiesField() const
223
316
  {
@@ -145,7 +145,7 @@ namespace RTC
145
145
  };
146
146
 
147
147
  public:
148
- static const size_t ChunkHeaderLength{ 4 };
148
+ static constexpr size_t ChunkHeaderLength{ 4 };
149
149
 
150
150
  public:
151
151
  /**
@@ -85,7 +85,7 @@ namespace RTC
85
85
  };
86
86
 
87
87
  public:
88
- static const size_t ErrorCauseHeaderLength{ 4 };
88
+ static constexpr size_t ErrorCauseHeaderLength{ 4 };
89
89
 
90
90
  public:
91
91
  /**
@@ -70,7 +70,7 @@ namespace RTC
70
70
  };
71
71
 
72
72
  public:
73
- static const size_t CommonHeaderLength{ 12 };
73
+ static constexpr size_t CommonHeaderLength{ 12 };
74
74
 
75
75
  /**
76
76
  * Whether given buffer could be a valid SCTP packet.
@@ -94,7 +94,6 @@ namespace RTC
94
94
  * Create an SCTP packet.
95
95
  *
96
96
  * @remarks
97
- * - `bufferLength` must be the exact length of the STUN packet.
98
97
  * - If `transactionId` is not given then a random Transaction ID is
99
98
  * generated.
100
99
  */
@@ -99,7 +99,7 @@ namespace RTC
99
99
  };
100
100
 
101
101
  public:
102
- static const size_t ParameterHeaderLength{ 4 };
102
+ static constexpr size_t ParameterHeaderLength{ 4 };
103
103
 
104
104
  public:
105
105
  /**
@@ -33,7 +33,7 @@ namespace RTC
33
33
  class TLV : public Serializable
34
34
  {
35
35
  public:
36
- static const size_t TLVHeaderLength{ 4 };
36
+ static constexpr size_t TLVHeaderLength{ 4 };
37
37
 
38
38
  public:
39
39
  /**
@@ -77,7 +77,7 @@ namespace RTC
77
77
  friend class Packet;
78
78
 
79
79
  public:
80
- static const size_t DataChunkHeaderLength{ 16 };
80
+ static constexpr size_t DataChunkHeaderLength{ 16 };
81
81
 
82
82
  public:
83
83
  /**
@@ -48,7 +48,7 @@ namespace RTC
48
48
  friend class Packet;
49
49
 
50
50
  public:
51
- static const size_t ForwardTsnChunkHeaderLength{ 8 };
51
+ static constexpr size_t ForwardTsnChunkHeaderLength{ 8 };
52
52
 
53
53
  public:
54
54
  /**
@@ -74,7 +74,7 @@ namespace RTC
74
74
  friend class Packet;
75
75
 
76
76
  public:
77
- static const size_t IDataChunkHeaderLength{ 20 };
77
+ static constexpr size_t IDataChunkHeaderLength{ 20 };
78
78
 
79
79
  public:
80
80
  /**
@@ -60,7 +60,7 @@ namespace RTC
60
60
  friend class Packet;
61
61
 
62
62
  public:
63
- static const size_t IForwardTsnChunkHeaderLength{ 8 };
63
+ static constexpr size_t IForwardTsnChunkHeaderLength{ 8 };
64
64
 
65
65
  public:
66
66
  /**
@@ -71,7 +71,7 @@ namespace RTC
71
71
  friend class Packet;
72
72
 
73
73
  public:
74
- static const size_t InitAckChunkHeaderLength{ 20 };
74
+ static constexpr size_t InitAckChunkHeaderLength{ 20 };
75
75
 
76
76
  public:
77
77
  /**
@@ -71,7 +71,7 @@ namespace RTC
71
71
  friend class Packet;
72
72
 
73
73
  public:
74
- static const size_t InitChunkHeaderLength{ 20 };
74
+ static constexpr size_t InitChunkHeaderLength{ 20 };
75
75
 
76
76
  public:
77
77
  /**
@@ -97,7 +97,7 @@ namespace RTC
97
97
  };
98
98
 
99
99
  public:
100
- static const size_t SackChunkHeaderLength{ 16 };
100
+ static constexpr size_t SackChunkHeaderLength{ 16 };
101
101
 
102
102
  public:
103
103
  /**
@@ -39,7 +39,7 @@ namespace RTC
39
39
  friend class Packet;
40
40
 
41
41
  public:
42
- static const size_t ShutdownChunkHeaderLength{ 8 };
42
+ static constexpr size_t ShutdownChunkHeaderLength{ 8 };
43
43
 
44
44
  public:
45
45
  /**
@@ -33,7 +33,7 @@ namespace RTC
33
33
  friend class Chunk;
34
34
 
35
35
  public:
36
- static const size_t InvalidStreamIdentifierErrorCauseHeaderLength{ 8 };
36
+ static constexpr size_t InvalidStreamIdentifierErrorCauseHeaderLength{ 8 };
37
37
 
38
38
  public:
39
39
  /**
@@ -38,7 +38,7 @@ namespace RTC
38
38
  friend class Chunk;
39
39
 
40
40
  public:
41
- static const size_t MissingMandatoryParameterErrorCauseHeaderLength{ 8 };
41
+ static constexpr size_t MissingMandatoryParameterErrorCauseHeaderLength{ 8 };
42
42
 
43
43
  public:
44
44
  /**
@@ -32,7 +32,7 @@ namespace RTC
32
32
  friend class Chunk;
33
33
 
34
34
  public:
35
- static const size_t NoUserDataErrorCauseHeaderLength{ 8 };
35
+ static constexpr size_t NoUserDataErrorCauseHeaderLength{ 8 };
36
36
 
37
37
  public:
38
38
  /**
@@ -32,7 +32,7 @@ namespace RTC
32
32
  friend class Chunk;
33
33
 
34
34
  public:
35
- static const size_t StaleCookieErrorCauseHeaderLength{ 8 };
35
+ static constexpr size_t StaleCookieErrorCauseHeaderLength{ 8 };
36
36
 
37
37
  public:
38
38
  /**
@@ -35,7 +35,7 @@ namespace RTC
35
35
  friend class Chunk;
36
36
 
37
37
  public:
38
- static const size_t AddIncomingStreamsRequestParameterHeaderLength{ 12 };
38
+ static constexpr size_t AddIncomingStreamsRequestParameterHeaderLength{ 12 };
39
39
 
40
40
  public:
41
41
  /**
@@ -35,7 +35,7 @@ namespace RTC
35
35
  friend class Chunk;
36
36
 
37
37
  public:
38
- static const size_t AddOutgoingStreamsRequestParameterHeaderLength{ 12 };
38
+ static constexpr size_t AddOutgoingStreamsRequestParameterHeaderLength{ 12 };
39
39
 
40
40
  public:
41
41
  /**
@@ -32,7 +32,7 @@ namespace RTC
32
32
  friend class Chunk;
33
33
 
34
34
  public:
35
- static const size_t CookiePreservativeParameterHeaderLength{ 8 };
35
+ static constexpr size_t CookiePreservativeParameterHeaderLength{ 8 };
36
36
 
37
37
  public:
38
38
  /**
@@ -31,7 +31,7 @@ namespace RTC
31
31
  friend class Chunk;
32
32
 
33
33
  public:
34
- static const size_t IPv4AddressParameterHeaderLength{ 8 };
34
+ static constexpr size_t IPv4AddressParameterHeaderLength{ 8 };
35
35
 
36
36
  public:
37
37
  /**
@@ -34,7 +34,7 @@ namespace RTC
34
34
  friend class Chunk;
35
35
 
36
36
  public:
37
- static const size_t IPv6AddressParameterHeaderLength{ 20 };
37
+ static constexpr size_t IPv6AddressParameterHeaderLength{ 20 };
38
38
 
39
39
  public:
40
40
  /**
@@ -40,7 +40,7 @@ namespace RTC
40
40
  friend class Chunk;
41
41
 
42
42
  public:
43
- static const size_t IncomingSsnResetRequestParameterHeaderLength{ 8 };
43
+ static constexpr size_t IncomingSsnResetRequestParameterHeaderLength{ 8 };
44
44
 
45
45
  public:
46
46
  /**
@@ -44,7 +44,7 @@ namespace RTC
44
44
  friend class Chunk;
45
45
 
46
46
  public:
47
- static const size_t OutgoingSsnResetRequestParameterHeaderLength{ 16 };
47
+ static constexpr size_t OutgoingSsnResetRequestParameterHeaderLength{ 16 };
48
48
 
49
49
  public:
50
50
  /**
@@ -54,8 +54,8 @@ namespace RTC
54
54
  };
55
55
 
56
56
  public:
57
- static const size_t ReconfigurationResponseParameterHeaderLength{ 12 };
58
- static const size_t ReconfigurationResponseParameterHeaderLengthWithOptionalFields{ 20 };
57
+ static constexpr size_t ReconfigurationResponseParameterHeaderLength{ 12 };
58
+ static constexpr size_t ReconfigurationResponseParameterHeaderLengthWithOptionalFields{ 20 };
59
59
 
60
60
  public:
61
61
  /**
@@ -33,7 +33,7 @@ namespace RTC
33
33
  friend class Chunk;
34
34
 
35
35
  public:
36
- static const size_t SsnTsnResetRequestParameterHeaderLength{ 8 };
36
+ static constexpr size_t SsnTsnResetRequestParameterHeaderLength{ 8 };
37
37
 
38
38
  public:
39
39
  /**
@@ -104,7 +104,10 @@ namespace RTC
104
104
  uint32_t remoteInitialTsn,
105
105
  uint32_t remoteAdvertisedReceiverWindowCredit,
106
106
  uint64_t tieTag,
107
- const NegotiatedCapabilities& negotiatedCapabilities);
107
+ const NegotiatedCapabilities& negotiatedCapabilities,
108
+ uint64_t creationTimestampMs = 0,
109
+ const uint8_t* macKey = nullptr,
110
+ size_t macKeyLength = 0);
108
111
 
109
112
  protected:
110
113
  StateCookieParameter* SoftClone(const uint8_t* buffer) const final;
@@ -46,7 +46,7 @@ namespace RTC
46
46
  };
47
47
 
48
48
  public:
49
- static const size_t ZeroChecksumAcceptableParameterHeaderLength{ 8 };
49
+ static constexpr size_t ZeroChecksumAcceptableParameterHeaderLength{ 8 };
50
50
 
51
51
  public:
52
52
  /**
@@ -264,6 +264,19 @@ namespace RTC
264
264
  ZeroChecksumAcceptableParameter::AlternateErrorDetectionMethod::NONE
265
265
  };
266
266
 
267
+ /**
268
+ * Whether received State Cookies must be authenticated with a MAC keyed
269
+ * by a per-association secret, and checked for staleness.
270
+ *
271
+ * This MUST be enabled in transports whose SCTP traffic is not protected
272
+ * by DTLS to comply with RFC 9260 section 5.1.3 and prevent State Cookie
273
+ * forgery (an on-path attacker could otherwise craft a COOKIE-ECHO chunk
274
+ * that passes validation and establish an unauthorized association).
275
+ *
276
+ * @see RFC 9260 sections 5.1.3 and 5.1.4.
277
+ */
278
+ bool requireAuthenticatedCookie{ false };
279
+
267
280
  void Dump(int indentation = 0) const;
268
281
  };
269
282
 
@@ -0,0 +1,72 @@
1
+ #ifndef MS_RTC_SIMPLE_CONSUMER_STREAM_HPP
2
+ #define MS_RTC_SIMPLE_CONSUMER_STREAM_HPP
3
+
4
+ #include "RTC/ProducerStreamManager.hpp"
5
+
6
+ namespace RTC
7
+ {
8
+ class SimpleProducerStreamManager : public ProducerStreamManager
9
+ {
10
+ public:
11
+ SimpleProducerStreamManager(
12
+ const std::vector<RTC::RtpEncodingParameters>& consumableRtpEncodings,
13
+ const RTC::ConsumerTypes::VideoLayers& preferredLayers,
14
+ std::unique_ptr<RTC::RTP::Codecs::EncodingContext> encodingContext,
15
+ RTC::Media::Kind kind,
16
+ bool keyFrameSupported,
17
+ Listener* listener,
18
+ SharedInterface* shared);
19
+
20
+ public:
21
+ RTC::ConsumerTypes::VideoLayers GetTargetLayers() const override
22
+ {
23
+ return {};
24
+ }
25
+ int16_t GetCurrentSpatialLayer() const override
26
+ {
27
+ return 0;
28
+ }
29
+ int16_t GetCurrentTemporalLayer() const override
30
+ {
31
+ return 0;
32
+ }
33
+ RTC::RTP::RtpStreamRecv* GetProducerCurrentRtpStream() const override;
34
+ RTC::RTP::RtpStreamRecv* GetProducerTargetRtpStream() const override;
35
+ bool IsPacketForCurrentStream(const RTC::RTP::Packet* /*packet*/) const override
36
+ {
37
+ return true;
38
+ }
39
+ bool IsActive() const override;
40
+ void ProducerRtpStream(RTC::RTP::RtpStreamRecv* rtpStream, uint32_t mappedSsrc) override;
41
+ void ProducerNewRtpStream(RTC::RTP::RtpStreamRecv* rtpStream, uint32_t mappedSsrc) override;
42
+ void ProducerRtpStreamScore(
43
+ RTC::RTP::RtpStreamRecv* rtpStream, uint8_t score, uint8_t previousScore) override;
44
+ void ProducerRtcpSenderReport(RTC::RTP::RtpStreamRecv* rtpStream, bool first) override;
45
+ uint32_t IncreaseLayer(
46
+ uint32_t bitrate, bool considerLoss, float lossPercentage, uint64_t nowMs) override;
47
+ void ApplyLayers(uint64_t rtpStreamActiveMs) override;
48
+ uint32_t GetDesiredBitrate(uint64_t nowMs) const override;
49
+ RtpPacketProcessResult ProcessRtpPacket(
50
+ RTC::RTP::Packet* packet,
51
+ bool lastSentPacketHasMarker,
52
+ uint32_t clockRate,
53
+ uint32_t maxPacketTs) override;
54
+ void RequestKeyFrame() override;
55
+ void RequestKeyFrameForTargetSpatialLayer() override;
56
+ void RequestKeyFrameForCurrentSpatialLayer() override;
57
+ void UpdateTargetLayers(int16_t spatial, int16_t temporal) override;
58
+ bool RecalculateTargetLayers(RTC::ConsumerTypes::VideoLayers& newTargetLayers) const override;
59
+ void OnTransportConnected() override;
60
+ void OnTransportDisconnected() override;
61
+ void OnPaused() override;
62
+ void OnResumed() override;
63
+
64
+ private:
65
+ // Producer RTP stream (single stream for Simple).
66
+ RTC::RTP::RtpStreamRecv* producerRtpStream{ nullptr };
67
+ // Prevents double IncreaseLayer in one BWE round.
68
+ bool managingBitrate{ false };
69
+ };
70
+ } // namespace RTC
71
+
72
+ #endif
@@ -0,0 +1,93 @@
1
+ #ifndef MS_RTC_SIMULCAST_CONSUMER_STREAM_HPP
2
+ #define MS_RTC_SIMULCAST_CONSUMER_STREAM_HPP
3
+
4
+ #include "RTC/ProducerStreamManager.hpp"
5
+ #include <ankerl/unordered_dense.h>
6
+
7
+ namespace RTC
8
+ {
9
+ class SimulcastProducerStreamManager : public ProducerStreamManager
10
+ {
11
+ public:
12
+ SimulcastProducerStreamManager(
13
+ const std::vector<RTC::RtpEncodingParameters>& consumableRtpEncodings,
14
+ const RTC::ConsumerTypes::VideoLayers& preferredLayers,
15
+ std::unique_ptr<RTC::RTP::Codecs::EncodingContext> encodingContext,
16
+ RTC::Media::Kind kind,
17
+ bool keyFrameSupported,
18
+ Listener* listener,
19
+ SharedInterface* shared);
20
+
21
+ public:
22
+ RTC::ConsumerTypes::VideoLayers GetTargetLayers() const override
23
+ {
24
+ return this->targetLayers;
25
+ }
26
+ int16_t GetCurrentSpatialLayer() const override
27
+ {
28
+ return this->currentSpatialLayer;
29
+ }
30
+ int16_t GetCurrentTemporalLayer() const override
31
+ {
32
+ return this->encodingContext->GetCurrentTemporalLayer();
33
+ }
34
+ RTC::RTP::RtpStreamRecv* GetProducerCurrentRtpStream() const override;
35
+ RTC::RTP::RtpStreamRecv* GetProducerTargetRtpStream() const override;
36
+ bool IsPacketForCurrentStream(const RTC::RTP::Packet* packet) const override
37
+ {
38
+ const auto it = this->mapMappedSsrcSpatialLayer.find(packet->GetSsrc());
39
+ if (it == this->mapMappedSsrcSpatialLayer.end())
40
+ {
41
+ return false;
42
+ }
43
+ return it->second == this->currentSpatialLayer;
44
+ }
45
+ bool IsActive() const override;
46
+ void ProducerRtpStream(RTC::RTP::RtpStreamRecv* rtpStream, uint32_t mappedSsrc) override;
47
+ void ProducerNewRtpStream(RTC::RTP::RtpStreamRecv* rtpStream, uint32_t mappedSsrc) override;
48
+ void ProducerRtpStreamScore(
49
+ RTC::RTP::RtpStreamRecv* rtpStream, uint8_t score, uint8_t previousScore) override;
50
+ void ProducerRtcpSenderReport(RTC::RTP::RtpStreamRecv* rtpStream, bool first) override;
51
+ uint32_t IncreaseLayer(
52
+ uint32_t bitrate, bool considerLoss, float lossPercentage, uint64_t nowMs) override;
53
+ void ApplyLayers(uint64_t rtpStreamActiveMs) override;
54
+ uint32_t GetDesiredBitrate(uint64_t nowMs) const override;
55
+ RtpPacketProcessResult ProcessRtpPacket(
56
+ RTC::RTP::Packet* packet,
57
+ bool lastSentPacketHasMarker,
58
+ uint32_t clockRate,
59
+ uint32_t maxPacketTs) override;
60
+ void RequestKeyFrame() override;
61
+ void RequestKeyFrameForTargetSpatialLayer() override;
62
+ void RequestKeyFrameForCurrentSpatialLayer() override;
63
+ void UpdateTargetLayers(int16_t newTargetSpatialLayer, int16_t newTargetTemporalLayer) override;
64
+ bool RecalculateTargetLayers(RTC::ConsumerTypes::VideoLayers& newTargetLayers) const override;
65
+ void OnTransportConnected() override;
66
+ void OnTransportDisconnected() override;
67
+ void OnPaused() override;
68
+ void OnResumed() override;
69
+
70
+ private:
71
+ bool CanSwitchToSpatialLayer(int16_t spatialLayer) const;
72
+ RTC::RTP::RtpStreamRecv* GetProducerTsReferenceRtpStream() const;
73
+
74
+ private:
75
+ // Producer RTP streams (multiple for Simulcast).
76
+ std::vector<RTC::RTP::RtpStreamRecv*> producerRtpStreams;
77
+ ankerl::unordered_dense::map<uint32_t, int16_t> mapMappedSsrcSpatialLayer;
78
+ RTC::ConsumerTypes::VideoLayers targetLayers;
79
+ int16_t currentSpatialLayer{ -1 };
80
+ int16_t spatialLayerToSync{ -1 };
81
+ // Timestamp synchronization.
82
+ int16_t tsReferenceSpatialLayer{ -1 };
83
+ uint32_t tsOffset{ 0u };
84
+ bool keyFrameForTsOffsetRequested{ false };
85
+ // Old-packet filtering after spatial switch.
86
+ uint16_t snReferenceSpatialLayer{ 0u };
87
+ bool checkingForOldPacketsInSpatialLayer{ false };
88
+ // BWE downgrade tracking.
89
+ uint64_t lastBweDowngradeAtMs{ 0u };
90
+ };
91
+ } // namespace RTC
92
+
93
+ #endif