summaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorMithun Iyer <iyerm@google.com>2020-12-16 00:22:20 -0800
committergVisor bot <gvisor-bot@google.com>2020-12-16 00:24:28 -0800
commitb645fcd241a81ac0ae98f85f0f1a6293d968a836 (patch)
tree74872ec5e3c15e8ffdcb682ad23551c8a763f77c /test
parentc55e5bda4d4590c84c6210b78c4b44c849f4400a (diff)
Ensure correctness of saved receive window
When the scaled receive window size > 65535 (max uint16), we advertise the scaled value as 65535, but are not adjusting the saved receive window value when doing so. This would keep our current window calculation logic to be incorrect, as the saved receive window value is different from what was advertised. Fixes #4903 PiperOrigin-RevId: 347771340
Diffstat (limited to 'test')
-rw-r--r--test/packetimpact/tests/tcp_zero_receive_window_test.go20
1 files changed, 15 insertions, 5 deletions
diff --git a/test/packetimpact/tests/tcp_zero_receive_window_test.go b/test/packetimpact/tests/tcp_zero_receive_window_test.go
index b494e179b..d06690705 100644
--- a/test/packetimpact/tests/tcp_zero_receive_window_test.go
+++ b/test/packetimpact/tests/tcp_zero_receive_window_test.go
@@ -15,7 +15,6 @@
package tcp_zero_receive_window_test
import (
- "context"
"flag"
"fmt"
"testing"
@@ -49,12 +48,24 @@ func TestZeroReceiveWindow(t *testing.T) {
samplePayload := &testbench.Payload{Bytes: testbench.GenerateRandomPayload(t, payloadLen)}
// Expect the DUT to eventually advertise zero receive window.
// The test would timeout otherwise.
- for {
+ for readOnce := false; ; {
conn.Send(t, testbench.TCP{Flags: testbench.Uint8(header.TCPFlagAck | header.TCPFlagPsh)}, samplePayload)
gotTCP, err := conn.Expect(t, testbench.TCP{Flags: testbench.Uint8(header.TCPFlagAck)}, time.Second)
if err != nil {
t.Fatalf("expected packet was not received: %s", err)
}
+ // Read once to trigger the subsequent window update from the
+ // DUT to grow the right edge of the receive window from what
+ // was advertised in the SYN-ACK. This ensures that we test
+ // for the full default buffer size (1MB on gVisor at the time
+ // of writing this comment), thus testing for cases when the
+ // scaled receive window size ends up > 65535 (0xffff).
+ if !readOnce {
+ if got := dut.Recv(t, acceptFd, int32(payloadLen), 0); len(got) != payloadLen {
+ t.Fatalf("got dut.Recv(t, %d, %d, 0) = %d, want %d", acceptFd, payloadLen, len(got), payloadLen)
+ }
+ readOnce = true
+ }
windowSize := *gotTCP.WindowSize
t.Logf("got window size = %d", windowSize)
if windowSize == 0 {
@@ -94,10 +105,9 @@ func TestNonZeroReceiveWindow(t *testing.T) {
if err != nil {
t.Fatalf("expected packet was not received: %s", err)
}
- if ret, _, err := dut.RecvWithErrno(context.Background(), t, acceptFd, int32(payloadLen), 0); ret == -1 {
- t.Fatalf("dut.RecvWithErrno(ctx, t, %d, %d, 0) = %d,_, %s", acceptFd, payloadLen, ret, err)
+ if got := dut.Recv(t, acceptFd, int32(payloadLen), 0); len(got) != payloadLen {
+ t.Fatalf("got dut.Recv(t, %d, %d, 0) = %d, want %d", acceptFd, payloadLen, len(got), payloadLen)
}
-
if *gotTCP.WindowSize == 0 {
t.Fatalf("expected non-zero receive window.")
}