mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Fix a race where keepalives could be sent while there is pending data
PiperOrigin-RevId: 219571556 Change-Id: I5a1042c1cb05eb2711eb01627fd298bad6c543a6
This commit is contained in:
@@ -62,8 +62,6 @@ go_test(
|
||||
"tcp_test.go",
|
||||
"tcp_timestamp_test.go",
|
||||
],
|
||||
# FIXME
|
||||
tags = ["flaky"],
|
||||
deps = [
|
||||
":tcp",
|
||||
"//pkg/tcpip",
|
||||
|
||||
@@ -829,6 +829,13 @@ func (e *endpoint) resetKeepaliveTimer(receivedData bool) {
|
||||
}
|
||||
}
|
||||
|
||||
// disableKeepaliveTimer stops the keepalive timer.
|
||||
func (e *endpoint) disableKeepaliveTimer() {
|
||||
e.keepalive.Lock()
|
||||
e.keepalive.timer.disable()
|
||||
e.keepalive.Unlock()
|
||||
}
|
||||
|
||||
// protocolMainLoop is the main loop of the TCP protocol. It runs in its own
|
||||
// goroutine and is responsible for sending segments and handling received
|
||||
// segments.
|
||||
|
||||
@@ -405,6 +405,7 @@ func (s *sender) sendData() {
|
||||
// eventually.
|
||||
var seg *segment
|
||||
end := s.sndUna.Add(s.sndWnd)
|
||||
var dataSent bool
|
||||
for seg = s.writeNext; seg != nil && s.outstanding < s.sndCwnd; seg = seg.Next() {
|
||||
// We abuse the flags field to determine if we have already
|
||||
// assigned a sequence number to this segment.
|
||||
@@ -448,6 +449,12 @@ func (s *sender) sendData() {
|
||||
segEnd = seg.sequenceNumber.Add(seqnum.Size(seg.data.Size()))
|
||||
}
|
||||
|
||||
if !dataSent {
|
||||
dataSent = true
|
||||
// We are sending data, so we should stop the keepalive timer to
|
||||
// ensure that no keepalives are sent while there is pending data.
|
||||
s.ep.disableKeepaliveTimer()
|
||||
}
|
||||
s.sendSegment(seg.data, seg.flags, seg.sequenceNumber)
|
||||
|
||||
// Update sndNxt if we actually sent new data (as opposed to
|
||||
|
||||
Reference in New Issue
Block a user