diff options
author | gVisor bot <gvisor-bot@google.com> | 2020-06-03 15:52:37 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-06-03 15:52:37 +0000 |
commit | 5451d0b376f9e6f5f4ddb00bb1e4c1502af68126 (patch) | |
tree | 69d0b15baaec460f011e89d50e233ed45aedc0ee /pkg/tcpip/transport | |
parent | 88cd4b103458fc4bc43b344dad23e88c5bf7f850 (diff) | |
parent | 162848e129e50e25c3bb9c5fdc337584b3531da0 (diff) |
Merge release-20200522.0-66-g162848e1 (automated)
Diffstat (limited to 'pkg/tcpip/transport')
-rw-r--r-- | pkg/tcpip/transport/tcp/snd.go | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/pkg/tcpip/transport/tcp/snd.go b/pkg/tcpip/transport/tcp/snd.go index 06dc9b7d7..3a19c4468 100644 --- a/pkg/tcpip/transport/tcp/snd.go +++ b/pkg/tcpip/transport/tcp/snd.go @@ -816,6 +816,25 @@ func (s *sender) maybeSendSegment(seg *segment, limit int, end seqnum.Value) (se panic("Netstack queues FIN segments without data.") } + segEnd = seg.sequenceNumber.Add(seqnum.Size(seg.data.Size())) + // If the entire segment cannot be accomodated in the receiver + // advertized window, skip splitting and sending of the segment. + // ref: net/ipv4/tcp_output.c::tcp_snd_wnd_test() + // + // Linux checks this for all segment transmits not triggered + // by a probe timer. On this condition, it defers the segment + // split and transmit to a short probe timer. + // ref: include/net/tcp.h::tcp_check_probe_timer() + // ref: net/ipv4/tcp_output.c::tcp_write_wakeup() + // + // Instead of defining a new transmit timer, we attempt to split the + // segment right here if there are no pending segments. + // If there are pending segments, segment transmits are deferred + // to the retransmit timer handler. + if s.sndUna != s.sndNxt && !segEnd.LessThan(end) { + return false + } + if !seg.sequenceNumber.LessThan(end) { return false } |