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:
parent
d3113ad440
commit
e3bce9689f
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue