From 3fa2f327378df0a2412a058bc03a3ebdda16a8b8 Mon Sep 17 00:00:00 2001 From: soypat Date: Fri, 24 Oct 2025 18:26:59 -0300 Subject: [PATCH] fix timewait not counting as closed state in listen open; add second part to test --- tcp/control.go | 2 +- x/xnet/xnet_test.go | 32 ++++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/tcp/control.go b/tcp/control.go index ce2e465..2810e2f 100644 --- a/tcp/control.go +++ b/tcp/control.go @@ -148,7 +148,7 @@ type recvSpace struct { // To open an active connection use [ControlBlock.Send] with a segment generated with [ClientSynSegment]. func (tcb *ControlBlock) Open(iss Value, wnd Size) (err error) { switch { - case tcb._state != StateClosed && tcb._state != StateListen: + case tcb._state != StateClosed && tcb._state != StateTimeWait: err = errNeedClosedTCBToOpen case wnd > math.MaxUint16: err = errWindowTooLarge diff --git a/x/xnet/xnet_test.go b/x/xnet/xnet_test.go index 48becc5..5766537 100644 --- a/x/xnet/xnet_test.go +++ b/x/xnet/xnet_test.go @@ -17,7 +17,7 @@ const ( finack = tcp.FlagFIN | tcp.FlagACK ) -func TestABC(t *testing.T) { +func TestStackAsyncTCP(t *testing.T) { const seed = 1234 const MTU = 1500 var mac = [6]byte{0x02, 0x00, 0x00, 0x00, 0x00, 0x01} @@ -47,6 +47,8 @@ func TestABC(t *testing.T) { if err != nil { t.Fatal(err) } + client.SetGateway6(sv.HardwareAddress()) + sv.SetGateway6(client.HardwareAddress()) const svPort = 80 var svconn tcp.Conn @@ -58,11 +60,6 @@ func TestABC(t *testing.T) { if err != nil { t.Fatal(err) } - err = sv.ListenTCP(&svconn, svPort) - if err != nil { - t.Fatal(err) - } - var clconn tcp.Conn err = clconn.Configure(tcp.ConnConfig{ RxBuf: make([]byte, MTU), @@ -72,9 +69,12 @@ func TestABC(t *testing.T) { if err != nil { t.Fatal(err) } - client.SetGateway6(sv.HardwareAddress()) - sv.SetGateway6(client.HardwareAddress()) + // Attach server and client connections to stacks. + err = sv.ListenTCP(&svconn, svPort) + if err != nil { + t.Fatal(err) + } err = client.DialTCP(&clconn, 1337, netip.AddrPortFrom(sv.Addr(), svPort)) if err != nil { t.Fatal(err) @@ -87,6 +87,22 @@ func TestABC(t *testing.T) { tst.TestTCPHandshake(&client, &sv) tst.TestTCPEstablishedSingleData(&client, &sv, &clconn, &svconn, sendData) tst.TestTCPClose(&client, &sv, &clconn, &svconn) + + // Switch handles around, now server will be client and they will be registered to + // a different stack. + svconn, clconn = clconn, svconn + err = sv.ListenTCP(&svconn, svPort) + if err != nil { + t.Fatal(err) + } + err = client.DialTCP(&clconn, 1234, netip.AddrPortFrom(sv.Addr(), svPort)) + if err != nil { + t.Fatal(err) + } + sendData = []byte("olleh") + tst.TestTCPHandshake(&client, &sv) + tst.TestTCPEstablishedSingleData(&client, &sv, &clconn, &svconn, sendData) + tst.TestTCPClose(&client, &sv, &clconn, &svconn) } type tester struct {