Skip to content

stratum: max_conns_per_ip, and a deadline from connect for unauthorized peers - #106

Open
asilgulsar1 wants to merge 1 commit into
LayerTwo-Labs:mainfrom
asilgulsar1:connection-limits
Open

asilgulsar1 wants to merge 1 commit into
LayerTwo-Labs:mainfrom
asilgulsar1:connection-limits

Conversation

@asilgulsar1

Copy link
Copy Markdown

We run simplepool in solo mode for eCash.com (ECX, BIP300/301) behind the CUSF enforcer. These came out of a review of the solo path before we rely on it.

max_conns is global, so one host could take every slot. An unauthorized connection's idle budget was measured from its last byte, and checked only on the SO_RCVTIMEO wake. A peer sending a blank line more often than that wake was never checked, and held its slot indefinitely without ever giving a username.

  • max_conns_per_ip (default 0 = no limit) closes one host's extra connections at accept.
  • Until it authorizes, a connection gets idle_timeout_sec from connect, checked whenever bytes arrive as well as on the wake. Authorized connections are unchanged: blank-line keepalives still keep them open.

Tests: test_max_conns_per_ip, test_unauthorized_deadline_runs_from_connect, and test_authorized_keepalive_is_not_reaped, all over real sockets.

Tested: make test passes on this branch alone, and the new test fails on main without the fix. This PR is independent of the five others opened alongside it, and all six merge together cleanly. Happy to add a CHANGELOG entry if you'd like one.

🤖 Generated with Claude Code

…ed peers

max_conns is global, so one host could take every slot. And an unauthorized
connection's idle budget was measured from its last byte and only checked on
the SO_RCVTIMEO wake, so a peer sending a blank line more often than that wake
was never checked at all and held its slot for ever without a username.

- max_conns_per_ip (default 0 = no limit) closes one host's extra
  connections at accept.
- Until it authorizes, a connection gets idle_timeout_sec from connect,
  checked whenever bytes arrive as well as on the wake. Authorized
  connections are unchanged: blank-line keepalives still keep them open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant