quic: avoid busy-loop when keep-alive is blocked by congestion control

When a connection's keep-alive timer expires, we send a PING frame.
Sending an ack-eliciting frame such as a PING clears the idle timer.
However, if the frame could not be sent (due to being blocked by
congestion control, for example), the keep-alive timer was not cleared
resulting in the connection event loop busy-waiting on the timer.

Now, when the keep-alive timer expires we clear it immediately and
set a flag indicating that we want to send a keep-alive.

Minor related fix: Disable the keep-alive and idle timers when
entering the closing/draining states. (We never set these timers
when in these states, but we failed to clear them on entry.)

Change-Id: I9f3f2327f2138273b7e10c4185cf9c176a6a6964
Reviewed-on: https://go-review.googlesource.com/c/net/+/801882
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Nicholas Husin <husin@google.com>
Auto-Submit: Damien Neil <dneil@google.com>
Reviewed-by: Nicholas Husin <nsh@golang.org>
5 files changed
tree: 1dc8dacb01cf3c96f7f93d0c481af5e5a5a2105a
  1. bpf/
  2. context/
  3. dict/
  4. dns/
  5. html/
  6. http/
  7. http2/
  8. http3/
  9. icmp/
  10. idna/
  11. internal/
  12. ipv4/
  13. ipv6/
  14. lif/
  15. nettest/
  16. netutil/
  17. proxy/
  18. publicsuffix/
  19. quic/
  20. route/
  21. trace/
  22. webdav/
  23. websocket/
  24. xsrftoken/
  25. .gitattributes
  26. .gitignore
  27. codereview.cfg
  28. CONTRIBUTING.md
  29. go.mod
  30. go.sum
  31. LICENSE
  32. PATENTS
  33. README.md
README.md

Go Networking

Go Reference

This repository holds supplementary Go networking packages.

Report Issues / Send Patches

This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see https://go.dev/doc/contribute.

The git repository is https://go.googlesource.com/net.

The main issue tracker for the net repository is located at https://go.dev/issues. Prefix your issue with “x/net:” in the subject line, so it is easy to find.