summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/transport/tcp/snd.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/tcpip/transport/tcp/snd.go')
-rw-r--r--pkg/tcpip/transport/tcp/snd.go27
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
}