Retransmit active-open SYN after RTO (#130)

* added: sync packet retransmission

* test: sync packet retransmission

* refactor: remove packet time from tcppool

* fix: return comment

* refactor: move retrying to stackRetrying

* added: retries & timeout to stackGoConfig

* test: test retries stack

* refactor: move StackRetrying to stackBlocking

* fix: line gofmt

---------

Co-authored-by: Pat Whittingslow <graded.sp@gmail.com>
This commit is contained in:
TuteMthCD
2026-06-23 00:19:16 -03:00
committed by GitHub
parent a0a5336108
commit d5ea2efdf4
7 changed files with 256 additions and 15 deletions
+53
View File
@@ -2,10 +2,12 @@ package xnet
import (
"bytes"
"context"
"errors"
"math/rand"
"net/netip"
"sync"
"syscall"
"testing"
"time"
@@ -105,6 +107,57 @@ func TestTCPConn_ReadBlocksUntilDataAvailable(t *testing.T) {
}
}
func TestStackGoTCPDialRetriesPendingControl(t *testing.T) {
const seed = 5678
const MTU = ethernet.MaxMTU
client, sv, _, _ := newTCPStacks(t, seed, MTU)
sg := client.StackBlocking(backoffYield).StackGo(StackGoConfig{
ListenerPoolConfig: TCPPoolConfig{
QueueSize: 4,
TxBufSize: MTU,
RxBufSize: MTU,
NewBackoff: func() lneto.BackoffStrategy {
return backoffYield
},
},
TCPDialTimeout: 10 * time.Millisecond,
TCPDialRetries: 2,
})
laddr := netip.AddrPortFrom(netip.AddrFrom4(client.Addr4()), 1234)
raddr := netip.AddrPortFrom(netip.AddrFrom4(sv.Addr4()), 22)
done := make(chan error, 1)
go func() {
_, err := sg.SocketNetip(context.Background(), "tcp", syscall.AF_INET, sockSTREAM, laddr, raddr)
done <- err
}()
var buf [ethernet.MaxMTU + ethernet.MaxOverheadSize]byte
waitForEgress := func() {
t.Helper()
deadline := time.Now().Add(100 * time.Millisecond)
for time.Now().Before(deadline) {
n, err := client.EgressEthernet(buf[:])
if err != nil {
t.Fatal(err)
}
if n > 0 {
return
}
time.Sleep(time.Millisecond)
}
t.Fatal("timed out waiting for TCP dial egress packet")
}
waitForEgress()
waitForEgress()
err := <-done
if err == nil {
t.Fatal("expected TCP dial to fail after retries without peer response")
}
}
func TestStackAsyncTCP_multipacket(t *testing.T) {
const seed = 1234
const MTU = 512