dcsctp: Relax seq nbr handling for stream reset

The current implementation of the Stream Reset Handler strictly validates
incoming Re-configuration Request Sequence Numbers. If a request is a
retransmission (same sequence number), it immediately returns the cached
response, which was how RFC6525 was interpreted.

However, per recent discussions (and there will be an errata to clarify
this), if a request was previously responded to with "In Progress"
(because the Sender's Last Assigned TSN hadn't been reached), the
receiver must re-evaluate the condition upon receiving a retransmission.
The current implementation creates a deadlock with peers that does this:
The peer retransmits the same sequence number, and dcSCTP keeps replying
"In Progress" from its cache without checking if the TSN condition is
now met.

This CL relaxes the validation logic. If a request is a retransmission
and the last result was "In Progress", the handler will now re-evaluate
the state (check the cumulative ack against the sender's last assigned
TSN). If the condition is met, it proceeds to reset the streams;
otherwise, it returns "In Progress" again.

This change maintains backward compatibility with older peers (like
current dcSCTP senders) that increment the sequence number when retrying
after an "In Progress" response.

Following this CL, when it has reached a sufficiently large population,
the sender logic can be updated to send requests without incrementing
the sequence number when "In Progress" was the response.

Bug: webrtc:379844648
Change-Id: Icc3908a2e94e4a5bc0d350cae58bb8d844a27c1f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/427361
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Victor Boivie <boivie@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#46261}
3 files changed
tree: 3503dda9a9bcb6d5333ed2dff78e57d0446b0c95
  1. api/
  2. audio/
  3. build_overrides/
  4. call/
  5. common_audio/
  6. common_video/
  7. data/
  8. docs/
  9. examples/
  10. experiments/
  11. g3doc/
  12. infra/
  13. logging/
  14. media/
  15. modules/
  16. net/
  17. p2p/
  18. pc/
  19. resources/
  20. rtc_base/
  21. rtc_tools/
  22. sdk/
  23. stats/
  24. system_wrappers/
  25. test/
  26. tools_webrtc/
  27. video/
  28. .clang-format
  29. .clang-tidy
  30. .git-blame-ignore-revs
  31. .gitignore
  32. .gn
  33. .mailmap
  34. .rustfmt.toml
  35. .style.yapf
  36. .vpython3
  37. AUTHORS
  38. BUILD.gn
  39. CODE_OF_CONDUCT.md
  40. codereview.settings
  41. DEPS
  42. DIR_METADATA
  43. ENG_REVIEW_OWNERS
  44. LICENSE
  45. license_template.txt
  46. native-api.md
  47. OWNERS
  48. OWNERS_INFRA
  49. PATENTS
  50. PRESUBMIT.py
  51. presubmit_test.py
  52. presubmit_test_mocks.py
  53. pylintrc
  54. pylintrc_old_style
  55. README.chromium
  56. README.md
  57. WATCHLISTS
  58. webrtc.gni
  59. webrtc_lib_link_test.cc
  60. whitespace.txt
README.md

WebRTC is a free, open software project that provides browsers and mobile applications with Real-Time Communications (RTC) capabilities via simple APIs. The WebRTC components have been optimized to best serve this purpose.

Our mission: To enable rich, high-quality RTC applications to be developed for the browser, mobile platforms, and IoT devices, and allow them all to communicate via a common set of protocols.

The WebRTC initiative is a project supported by Google, Mozilla and Opera, amongst others.

Development

See here for instructions on how to get started developing with the native code.

Authoritative list of directories that contain the native API header files.

More info