Retry RST expectation in tcp_synrcvd_reset_test

Deflake this test by retransmitting the ACK and retrying RST
expectation after the supposed state transition to CLOSED.
This gives time for the state transition to complete.

Without such a retransmit from the test, the ACK could get silently
dropped by the listener when the passively connecting endpoint
has not yet completely updated the state (in gVisor this would be
endpoint state and decrement of synRcvdCount).

PiperOrigin-RevId: 356825562
This commit is contained in:
Mithun Iyer
2021-02-10 14:22:16 -08:00
committed by gVisor bot
parent c2f204658e
commit 380ede9b73
@@ -42,10 +42,22 @@ func TestTCPSynRcvdReset(t *testing.T) {
t.Fatalf("expected SYN-ACK %s", err)
}
conn.Send(t, testbench.TCP{Flags: testbench.Uint8(header.TCPFlagRst)})
// Expect the connection to have transitioned SYN-RCVD to CLOSED.
// TODO(gvisor.dev/issue/478): Check for TCP_INFO on the dut side.
conn.Send(t, testbench.TCP{Flags: testbench.Uint8(header.TCPFlagAck)})
if _, err := conn.ExpectData(t, &testbench.TCP{Flags: testbench.Uint8(header.TCPFlagRst)}, nil, time.Second); err != nil {
t.Fatalf("expected a TCP RST %s", err)
//
// Retransmit the ACK a few times to give time for the DUT to
// transition to CLOSED. We cannot use TCP_INFO to lookup the state
// as this is a passive DUT connection.
i := 0
for ; i < 5; i++ {
conn.Send(t, testbench.TCP{Flags: testbench.Uint8(header.TCPFlagAck)})
if _, err := conn.ExpectData(t, &testbench.TCP{Flags: testbench.Uint8(header.TCPFlagRst)}, nil, time.Second); err != nil {
t.Logf("retransmit%d ACK as we did not get the expected RST, %s", i, err)
} else {
break
}
}
if i == 5 {
t.Fatalf("expected a TCP RST")
}
}