Add a function to enable RACK in tests.

- Adds a function to enable RACK in tests.
- RACK update functions are guarded behind the flag tcpRecovery.

PiperOrigin-RevId: 355435973
This commit is contained in:
Nayana Bidari 2021-02-03 11:06:55 -08:00 committed by gVisor bot
parent d3113ad440
commit e3bce9689f
2 changed files with 24 additions and 5 deletions

View File

@ -1320,7 +1320,9 @@ func (s *sender) handleRcvdSegment(rcvdSeg *segment) {
// unacknowledged and also never retransmitted sequence below
// RACK.fack, then the corresponding packet has been
// reordered and RACK.reord is set to TRUE.
if s.ep.tcpRecovery&tcpip.TCPRACKLossDetection != 0 {
s.walkSACK(rcvdSeg)
}
s.SetPipe()
}
@ -1339,7 +1341,9 @@ func (s *sender) handleRcvdSegment(rcvdSeg *segment) {
}
// See if TLP based recovery was successful.
if s.ep.tcpRecovery&tcpip.TCPRACKLossDetection != 0 {
s.detectTLPRecovery(ack, rcvdSeg)
}
// Stash away the current window size.
s.sndWnd = rcvdSeg.window
@ -1421,7 +1425,7 @@ func (s *sender) handleRcvdSegment(rcvdSeg *segment) {
}
// Update the RACK fields if SACK is enabled.
if s.ep.sackPermitted && !seg.acked {
if s.ep.sackPermitted && !seg.acked && s.ep.tcpRecovery&tcpip.TCPRACKLossDetection != 0 {
s.rc.update(seg, rcvdSeg)
s.rc.detectReorder(seg)
}
@ -1455,9 +1459,11 @@ func (s *sender) handleRcvdSegment(rcvdSeg *segment) {
// Update RACK when we are exiting fast or RTO
// recovery as described in the RFC
// draft-ietf-tcpm-rack-08 Section-7.2 Step 4.
if s.ep.tcpRecovery&tcpip.TCPRACKLossDetection != 0 {
s.rc.exitRecovery()
}
}
}
// It is possible for s.outstanding to drop below zero if we get
// a retransmit timeout, reset outstanding to zero but later
@ -1483,7 +1489,9 @@ func (s *sender) handleRcvdSegment(rcvdSeg *segment) {
// See: https://tools.ietf.org/html/draft-ietf-tcpm-rack-08#section-7.2
// * Upon receiving an ACK:
// * Step 4: Update RACK reordering window
if s.ep.tcpRecovery&tcpip.TCPRACKLossDetection != 0 {
s.rc.updateRACKReorderWindow(rcvdSeg)
}
// Now that we've popped all acknowledged data from the retransmit
// queue, retransmit if needed.

View File

@ -34,6 +34,14 @@ const (
mtu = header.TCPMinimumSize + header.IPv4MinimumSize + maxTCPOptionSize + maxPayload
)
func setStackRACKPermitted(t *testing.T, c *context.Context) {
t.Helper()
opt := tcpip.TCPRecovery(tcpip.TCPRACKLossDetection)
if err := c.Stack().SetTransportProtocolOption(header.TCPProtocolNumber, &opt); err != nil {
t.Fatalf("c.s.SetTransportProtocolOption(%d, &%v(%v)): %s", header.TCPProtocolNumber, opt, opt, err)
}
}
// TestRACKUpdate tests the RACK related fields are updated when an ACK is
// received on a SACK enabled connection.
func TestRACKUpdate(t *testing.T) {
@ -60,6 +68,7 @@ func TestRACKUpdate(t *testing.T) {
close(probeDone)
})
setStackSACKPermitted(t, c, true)
setStackRACKPermitted(t, c)
createConnectedWithSACKAndTS(c)
data := make([]byte, maxPayload)
@ -116,6 +125,7 @@ func TestRACKDetectReorder(t *testing.T) {
close(probeDone)
})
setStackSACKPermitted(t, c, true)
setStackRACKPermitted(t, c)
createConnectedWithSACKAndTS(c)
data := make([]byte, ackNumToVerify*maxPayload)
for i := range data {
@ -148,6 +158,7 @@ func TestRACKDetectReorder(t *testing.T) {
func sendAndReceive(t *testing.T, c *context.Context, numPackets int) []byte {
setStackSACKPermitted(t, c, true)
setStackRACKPermitted(t, c)
createConnectedWithSACKAndTS(c)
data := make([]byte, numPackets*maxPayload)