dcsctp: Add pull mode to consume received messages

The current API delivers received message by a callback API. The caller
is expected to process the received message directly, and the socket
will immediately restore the advertised receiver window as there is
nothing buffered in the socket any longer. But it may be buffered in the
application, if it can't process messages in the same rate as they are
received.

How can you as a receiver tell the sender to stop sending for a while,
because it can't keep up with the pace? It's not possible - the callback
is triggered unconditionally.

In other words: The advertised receiver window is of little use for
implementing back-pressure, which it's intending to do.

This CL adds a new option, that might become the default, that replaces
the delivery callback with a new "signal" callback, just indicating to
the caller that there are received messages that can be consumed by
calling a new API on the socket. If not, the message statys buffered and
it's reflected in the advertised receiver window.

Note that as a back-pressure algorithm, it's quite simple. The sender
must make sure that it doesn't send more than the receiver can fit
within its receiver window, but it's also allowed to always have a
single MTU inflight. So the sender will never stop sending completely,
but will definitely go down in send rate.

Depending on application, it might be a good idea to ALSO implement a
more sophisticated back-pressure algorithm by e.g. sending backpressure
messages on a separate stream that has a higher priority. But this
CL provides the fallback basics that the SCTP protocol provides.

No-Iwyu: Base CL not clean. Needs separate cleaning.
Co-authored-by: Nathan Lewis <npl@google.com>
Bug: webrtc:407622662
Change-Id: I9a63ee117a0fcf0ccb8409287b6a0548f9bcb7b1
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/383780
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Victor Boivie <boivie@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#44486}
13 files changed
tree: c86f22f02a54a6516120945a8f708a1bc9546fec
  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. .git-blame-ignore-revs
  30. .gitignore
  31. .gn
  32. .mailmap
  33. .rustfmt.toml
  34. .style.yapf
  35. .vpython3
  36. AUTHORS
  37. BUILD.gn
  38. CODE_OF_CONDUCT.md
  39. codereview.settings
  40. DEPS
  41. DIR_METADATA
  42. ENG_REVIEW_OWNERS
  43. LICENSE
  44. license_template.txt
  45. native-api.md
  46. OWNERS
  47. OWNERS_INFRA
  48. PATENTS
  49. PRESUBMIT.py
  50. presubmit_test.py
  51. presubmit_test_mocks.py
  52. pylintrc
  53. pylintrc_old_style
  54. README.chromium
  55. README.md
  56. WATCHLISTS
  57. webrtc.gni
  58. webrtc_lib_link_test.cc
  59. 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