mirror of
https://github.com/soypat/lneto.git
synced 2026-08-22 07:29:04 +00:00
rewrite txqueue sequencing logic to use per-packet sequence numbers
This commit is contained in:
+57
-17
@@ -1,6 +1,7 @@
|
||||
package tcp
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"math/rand"
|
||||
"testing"
|
||||
)
|
||||
@@ -9,19 +10,59 @@ func TestHandler(t *testing.T) {
|
||||
const mtu = 1500
|
||||
const maxpackets = 3
|
||||
rng := rand.New(rand.NewSource(0))
|
||||
client, server := setupClientServer(t, rng, mtu, mtu, maxpackets, mtu, mtu, maxpackets)
|
||||
client, server := newHandler(t, mtu, maxpackets), newHandler(t, mtu, maxpackets)
|
||||
setupClientServer(t, rng, client, server)
|
||||
var rawbuf [mtu]byte
|
||||
establish(t, client, server, rawbuf[:])
|
||||
sendDataFull(t, client, server, []byte("hello"), rawbuf[:])
|
||||
}
|
||||
|
||||
func setupClientServer(t *testing.T, rng *rand.Rand, clientTxSize, clientRxSize, clientPackets, serverTxSize, serverRxSize, serverPackets int) (client, server *Handler) {
|
||||
client = new(Handler)
|
||||
server = new(Handler)
|
||||
err := client.SetBuffers(make([]byte, clientTxSize), make([]byte, clientRxSize), clientPackets)
|
||||
func sendDataFull(t *testing.T, client, server *Handler, data, packetBuf []byte) {
|
||||
n, err := client.Write(data)
|
||||
if err != nil {
|
||||
t.Fatal("client write:", err)
|
||||
} else if n != len(data) {
|
||||
t.Fatal("expected client to write full data packet")
|
||||
}
|
||||
n, err = client.Send(packetBuf)
|
||||
if err != nil {
|
||||
t.Fatal("client sending:", err)
|
||||
} else if n < len(data)+sizeHeaderTCP {
|
||||
t.Fatal("expected client to send full data packet", n, len(data)+sizeHeaderTCP)
|
||||
}
|
||||
err = server.Recv(packetBuf[:n])
|
||||
if err != nil {
|
||||
t.Fatal("server receiving:", err)
|
||||
} else if server.Buffered() != len(data) {
|
||||
t.Fatal("server did not receive full data packet", server.Buffered(), len(data))
|
||||
}
|
||||
clear(packetBuf)
|
||||
n, err = server.Read(packetBuf)
|
||||
if err != nil {
|
||||
t.Fatal("server read:", err)
|
||||
} else if n != len(data) {
|
||||
t.Fatal("expected server to read full data packet")
|
||||
} else if !bytes.Equal(packetBuf[:n], data) {
|
||||
t.Fatal("server received unexpected data")
|
||||
}
|
||||
}
|
||||
|
||||
func newHandler(t *testing.T, mtu, mintaxpackets int) *Handler {
|
||||
h := new(Handler)
|
||||
err := h.SetBuffers(make([]byte, mtu), make([]byte, mtu), mintaxpackets)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
err = server.SetBuffers(make([]byte, serverTxSize), make([]byte, serverRxSize), serverPackets)
|
||||
return h
|
||||
}
|
||||
|
||||
func setupClientServer(t *testing.T, rng *rand.Rand, client, server *Handler) {
|
||||
// Ensure buffer sizes are OK with reused buffers.
|
||||
err := client.SetBuffers(nil, nil, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
err = server.SetBuffers(nil, nil, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -39,21 +80,20 @@ func setupClientServer(t *testing.T, rng *rand.Rand, clientTxSize, clientRxSize,
|
||||
if !server.AwaitingSynAck() {
|
||||
t.Fatal("server in wrong state")
|
||||
}
|
||||
return client, server
|
||||
}
|
||||
|
||||
func establish(t *testing.T, client, server *Handler, buf []byte) {
|
||||
func establish(t *testing.T, client, server *Handler, packetBuf []byte) {
|
||||
if client.State() != StateClosed {
|
||||
t.Fatal("client in wrong state")
|
||||
} else if server.State() != StateListen {
|
||||
t.Fatal("server in wrong state")
|
||||
}
|
||||
clear(buf)
|
||||
clear(packetBuf)
|
||||
|
||||
// Commence 3-way handshake: client sends SYN, server sends SYN-ACK, client sends ACK.
|
||||
|
||||
// Client sends SYN.
|
||||
n, err := client.Send(buf)
|
||||
n, err := client.Send(packetBuf)
|
||||
if err != nil {
|
||||
t.Fatal("client sending:", err)
|
||||
} else if n < sizeHeaderTCP {
|
||||
@@ -61,15 +101,15 @@ func establish(t *testing.T, client, server *Handler, buf []byte) {
|
||||
} else if client.State() != StateSynSent {
|
||||
t.Fatal("client did not transition to SynSent state:", client.State().String())
|
||||
}
|
||||
err = server.Recv(buf[:n]) // Server receives SYN.
|
||||
err = server.Recv(packetBuf[:n]) // Server receives SYN.
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
} else if server.State() != StateSynRcvd {
|
||||
t.Fatal("server did not transition to SynReceived state:", server.State().String())
|
||||
}
|
||||
clear(buf)
|
||||
clear(packetBuf)
|
||||
// Server sends SYNACK response to client's SYN.
|
||||
n, err = server.Send(buf)
|
||||
n, err = server.Send(packetBuf)
|
||||
if err != nil {
|
||||
t.Fatal("server sending:", err)
|
||||
} else if n < sizeHeaderTCP {
|
||||
@@ -77,15 +117,15 @@ func establish(t *testing.T, client, server *Handler, buf []byte) {
|
||||
} else if server.State() != StateSynRcvd {
|
||||
t.Fatal("server should remain in SynReceived state:", server.State().String())
|
||||
}
|
||||
err = client.Recv(buf[:n]) // Client receives SYNACK, is established but must send ACK.
|
||||
err = client.Recv(packetBuf[:n]) // Client receives SYNACK, is established but must send ACK.
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
} else if client.State() != StateEstablished {
|
||||
t.Fatal("client did not transition to Established state:", client.State().String())
|
||||
}
|
||||
|
||||
clear(buf)
|
||||
n, err = client.Send(buf) // Client sends ACK.
|
||||
clear(packetBuf)
|
||||
n, err = client.Send(packetBuf) // Client sends ACK.
|
||||
if err != nil {
|
||||
t.Fatal("client sending ACK:", err)
|
||||
} else if n < sizeHeaderTCP {
|
||||
@@ -93,7 +133,7 @@ func establish(t *testing.T, client, server *Handler, buf []byte) {
|
||||
} else if client.State() != StateEstablished {
|
||||
t.Fatal("client should remain in Established state:", client.State().String())
|
||||
}
|
||||
err = server.Recv(buf[:n]) // Server receives ACK.
|
||||
err = server.Recv(packetBuf[:n]) // Server receives ACK.
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
} else if server.State() != StateEstablished {
|
||||
|
||||
Reference in New Issue
Block a user