When a sender has requested a stream to be reset, and the last sender assigned TSN hasn't been received yet, the receiver will enter deferred reset mode, where it will store any data chunks received after that given TSN, and replay those later, when the stream has been reset. Before this CL, leaving deferred mode was done as soon as the sender's last assigned TSN was received. That's actually not how the RFC describes the process[1], but was done that way to properly handle some sequences of RE-CONFIG and FORWARD-TSN. But after having read the RFCs again, and realizing that whenever RFC6525 mention "any data arriving", this also applies to any FORWARD-TSN[2] - it's better to reset streams synchronously with the incoming requests, and defer not just DATA past the sender last assigned TSN, but also any FORWARD-TSN after that TSN. This mostly simplifies the code and is mostly a refactoring, but most importantly aligns it with how the resetting procedure is explained in the RFC. It also fixes two bugs: * It defers FORWARD-TSN *as well as* DATA chunks with a TSN later than the sender's last assigned TSN - see test case. The old implementation tried to handle that by exiting the deferred reset processing as soon as it reached the sender's last assigned TSN, but it didn't manage to do that in all cases. * It only defers DATA chunks for streams that are to be reset, not all DATA chunks with a TSN > sender's last assigned TSN. This was missed in the old implementation, but as it's now implemented strictly according to the RFC, this was now done. [1] https://datatracker.ietf.org/doc/html/rfc6525#section-5.2.2 [2] RFC6525 cover stream resetting, and RFC3758 cover FORWARD-TSN, and the combination of these is not covered in the RFCs. Bug: webrtc:14600 Change-Id: Ief878b755291b9c923aa6fb4317b0f5c00231df4 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/322623 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/main@{#40889}
151 lines
4.0 KiB
Plaintext
151 lines
4.0 KiB
Plaintext
# Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
|
|
#
|
|
# Use of this source code is governed by a BSD-style license
|
|
# that can be found in the LICENSE file in the root of the source
|
|
# tree. An additional intellectual property rights grant can be found
|
|
# in the file PATENTS. All contributing project authors may
|
|
# be found in the AUTHORS file in the root of the source tree.
|
|
|
|
import("../../../webrtc.gni")
|
|
|
|
rtc_library("data_tracker") {
|
|
deps = [
|
|
"../../../api:array_view",
|
|
"../../../rtc_base:checks",
|
|
"../../../rtc_base:logging",
|
|
"../../../rtc_base:stringutils",
|
|
"../common:sequence_numbers",
|
|
"../packet:chunk",
|
|
"../packet:data",
|
|
"../public:socket",
|
|
"../timer",
|
|
]
|
|
sources = [
|
|
"data_tracker.cc",
|
|
"data_tracker.h",
|
|
]
|
|
absl_deps = [
|
|
"//third_party/abseil-cpp/absl/algorithm:container",
|
|
"//third_party/abseil-cpp/absl/strings",
|
|
"//third_party/abseil-cpp/absl/types:optional",
|
|
]
|
|
}
|
|
|
|
rtc_source_set("reassembly_streams") {
|
|
deps = [
|
|
"../../../api:array_view",
|
|
"../common:sequence_numbers",
|
|
"../packet:chunk",
|
|
"../packet:data",
|
|
"../public:socket",
|
|
"../public:types",
|
|
]
|
|
sources = [ "reassembly_streams.h" ]
|
|
absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
|
|
}
|
|
|
|
rtc_library("interleaved_reassembly_streams") {
|
|
deps = [
|
|
":reassembly_streams",
|
|
"../../../api:array_view",
|
|
"../../../rtc_base:checks",
|
|
"../../../rtc_base:logging",
|
|
"../common:sequence_numbers",
|
|
"../packet:chunk",
|
|
"../packet:data",
|
|
"../public:types",
|
|
]
|
|
sources = [
|
|
"interleaved_reassembly_streams.cc",
|
|
"interleaved_reassembly_streams.h",
|
|
]
|
|
absl_deps = [
|
|
"//third_party/abseil-cpp/absl/algorithm:container",
|
|
"//third_party/abseil-cpp/absl/strings",
|
|
"//third_party/abseil-cpp/absl/types:optional",
|
|
]
|
|
}
|
|
rtc_library("traditional_reassembly_streams") {
|
|
deps = [
|
|
":reassembly_streams",
|
|
"../../../api:array_view",
|
|
"../../../rtc_base:checks",
|
|
"../../../rtc_base:logging",
|
|
"../common:sequence_numbers",
|
|
"../packet:chunk",
|
|
"../packet:data",
|
|
"../public:types",
|
|
]
|
|
sources = [
|
|
"traditional_reassembly_streams.cc",
|
|
"traditional_reassembly_streams.h",
|
|
]
|
|
absl_deps = [
|
|
"//third_party/abseil-cpp/absl/algorithm:container",
|
|
"//third_party/abseil-cpp/absl/strings",
|
|
"//third_party/abseil-cpp/absl/types:optional",
|
|
]
|
|
}
|
|
|
|
rtc_library("reassembly_queue") {
|
|
deps = [
|
|
":interleaved_reassembly_streams",
|
|
":reassembly_streams",
|
|
":traditional_reassembly_streams",
|
|
"../../../api:array_view",
|
|
"../../../rtc_base:checks",
|
|
"../../../rtc_base:logging",
|
|
"../../../rtc_base/containers:flat_set",
|
|
"../common:internal_types",
|
|
"../common:sequence_numbers",
|
|
"../common:str_join",
|
|
"../packet:chunk",
|
|
"../packet:data",
|
|
"../packet:parameter",
|
|
"../public:socket",
|
|
"../public:types",
|
|
]
|
|
sources = [
|
|
"reassembly_queue.cc",
|
|
"reassembly_queue.h",
|
|
]
|
|
absl_deps = [
|
|
"//third_party/abseil-cpp/absl/functional:any_invocable",
|
|
"//third_party/abseil-cpp/absl/strings",
|
|
"//third_party/abseil-cpp/absl/types:optional",
|
|
]
|
|
}
|
|
|
|
if (rtc_include_tests) {
|
|
rtc_library("dcsctp_rx_unittests") {
|
|
testonly = true
|
|
|
|
deps = [
|
|
":data_tracker",
|
|
":interleaved_reassembly_streams",
|
|
":reassembly_queue",
|
|
":reassembly_streams",
|
|
":traditional_reassembly_streams",
|
|
"../../../api:array_view",
|
|
"../../../api/task_queue:task_queue",
|
|
"../../../rtc_base:checks",
|
|
"../../../rtc_base:gunit_helpers",
|
|
"../../../test:test_support",
|
|
"../common:handover_testing",
|
|
"../common:sequence_numbers",
|
|
"../packet:chunk",
|
|
"../packet:data",
|
|
"../public:types",
|
|
"../testing:data_generator",
|
|
"../timer",
|
|
]
|
|
absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
|
|
sources = [
|
|
"data_tracker_test.cc",
|
|
"interleaved_reassembly_streams_test.cc",
|
|
"reassembly_queue_test.cc",
|
|
"traditional_reassembly_streams_test.cc",
|
|
]
|
|
}
|
|
}
|