No connection created through x/xnet had one. Neither NewTCPPool nor the
dial path in StackGo set ConnConfig.LossRecovery and ConnConfig.Nanotime,
so tcp.Handler ran with loss recovery disabled: nothing noticed a lost
segment, and the connection simply stopped: the sender waiting for an
ACK that cannot arrive, the receiver for data nobody will resend.
TCPPoolConfig.NanoTime already documents itself as "passed to each
tcp.Conn for retransmission timing (RFC 6298)", including the
time.Now fallback when it is nil; this makes that true. Each connection
gets its own tcp.RTO, which shadows that connection's send sequence space
and so cannot be shared. That is 80 bytes per connection, allocated once
at pool construction, against buffers measured in kilobytes.
The test drops exactly one data segment and requires the byte to arrive
anyway. It depends on the FIN-WAIT-1 retransmission fix, since the server
closes after writing.
Ephemeral ports were drawn at random from the 16384-port dynamic range on
every dial. Under connection-per-request churn the birthday paradox reuses
a recently-released port after only a few dozen dials (~1% per dial at 200
outstanding-in-teardown), and a reused 4-tuple lands on whatever state the
previous conversation left along the path, such as the peer's TIME-WAIT
socket or a NAT's flow-table entry, which silently swallows the new SYN.
Measured end to end: an HTTP client with keep-alives off against a macOS
peer hit a dead dial after ~286 connections and stayed dark for ~30
seconds, exactly one 2MSL TIME-WAIT expiry.
Allocate sequentially from a per-stack random starting offset instead: a
port is only revisited after the full 16384-port cycle, and the random
start keeps a rebooted node off the ports its previous life just used.
TestEphemeralPortSequence pins the full-cycle-no-reuse property.
Co-authored-by: Derek den Haas <d.haas@directcode.com>
* rewrite tinygo failing test to be more real-time
* use channels to scheduler stack
* fix flakiness by increasing timeout and move implementation to top of file
* update README table and begin planning udp.PacketConn
* first attempt at packetconn implementation
* add udp.PacketConn to StackAsync and implement SocketNetip iface
* add tests for PacketConn
* add ipv6 to xnet.StackAsync
* dns improvements
* improve DNS workings of StackAsync
* add tentative ICMPv6
* work on prefixes and fix some small bugs, plan UDP/TCP6
* fix bugs in StackAsync and ipv4.Prefix.Contains
* update arpsubtable
* completely remove legacy internet.StackIP for StackIPv4/v6
* ipv4/ipv6 tcp/udp
* add TCP6/UDP6 dialing APIs
* add xnet.Stack6 interface
* more ipv6 integration into StackAsync; various tweaks to lneto and documentation+TODOs
* add stack6 tests
* replace netip.Prefix with ipv4.Prefix where it makes sense
* apply StackIP changes and internet package test passing
* fix tests and examples
* remove old Reset method on StackIP
* use encapsulate for ipv6
* add TCP over IPv6 tests
* begin adding better fuzz test
* finish adding working fuzzer
* implement mutateipv4
* fuzzer finds a panic in ICMP client on receive empty payload
* rename fuzz tests to reflect fuzz methodology
* fix: StackBerkeley Bind/Listen/Connect and StackGo dial support
- Bind now stores the bound address; Listen and Connect forward it to
the gostack so the local port reaches SocketNetip.
- Fix StackGo.Socket parsing laddr/raddr instead of zero-value locals.
- Fix inverted isvalid() checks in StackBerkeley.Close causing nil deref.
- Auto-assign ephemeral port for outbound dial connections in SocketNetip.
- Configure tcp.Conn with TX/RX buffers before DialTCP; add DialConfig
fields to StackGoConfig.
Signed-off-by: deadprogram <ron@hybridgroup.com>
* use already existing poolconfig for new tcp config
---------
Signed-off-by: deadprogram <ron@hybridgroup.com>
Co-authored-by: Patricio Whittingslow <graded.sp@gmail.com>
* switcheroo: StackBerkeley now StackGo and added proper berkeley interface as StackBerkeley
* minor nits
* remove host name resolution
* further improve API and documentation
* xnet/stack: fix a few small errors in logic
Signed-off-by: deadprogram <ron@hybridgroup.com>
* add mutex and small fix
* fix: correct checking for integer max
Signed-off-by: deadprogram <ron@hybridgroup.com>
---------
Signed-off-by: deadprogram <ron@hybridgroup.com>
Co-authored-by: deadprogram <ron@hybridgroup.com>