diff options
Diffstat (limited to 'pkg/tcpip/transport/tcp/snd.go')
-rw-r--r-- | pkg/tcpip/transport/tcp/snd.go | 27 |
1 files changed, 8 insertions, 19 deletions
diff --git a/pkg/tcpip/transport/tcp/snd.go b/pkg/tcpip/transport/tcp/snd.go index 95bea4d88..085973c02 100644 --- a/pkg/tcpip/transport/tcp/snd.go +++ b/pkg/tcpip/transport/tcp/snd.go @@ -333,28 +333,17 @@ func (s *sender) sendData() { var segEnd seqnum.Value if seg.data.Size() == 0 { - seg.flags = flagAck - - s.ep.rcvListMu.Lock() - rcvBufUsed := s.ep.rcvBufUsed - s.ep.rcvListMu.Unlock() - - s.ep.mu.Lock() - // We're sending a FIN by default - fl := flagFin - segEnd = seg.sequenceNumber - if (s.ep.shutdownFlags&tcpip.ShutdownRead) != 0 && rcvBufUsed > 0 { - // If there is unread data we must send a RST. - // For more information see RFC 2525 section 2.17. - fl = flagRst - } else { - segEnd = seg.sequenceNumber.Add(1) + if s.writeList.Back() != seg { + panic("FIN segments must be the final segment in the write list.") } - - s.ep.mu.Unlock() - seg.flags |= uint8(fl) + seg.flags = flagAck | flagFin + segEnd = seg.sequenceNumber.Add(1) } else { // We're sending a non-FIN segment. + if seg.flags&flagFin != 0 { + panic("Netstack queues FIN segments without data.") + } + if !seg.sequenceNumber.LessThan(end) { break } |