summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/transport/tcp/endpoint.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/tcpip/transport/tcp/endpoint.go')
-rw-r--r--pkg/tcpip/transport/tcp/endpoint.go11
1 files changed, 7 insertions, 4 deletions
diff --git a/pkg/tcpip/transport/tcp/endpoint.go b/pkg/tcpip/transport/tcp/endpoint.go
index 258f9f1bb..23b9de8c5 100644
--- a/pkg/tcpip/transport/tcp/endpoint.go
+++ b/pkg/tcpip/transport/tcp/endpoint.go
@@ -1069,9 +1069,7 @@ func (e *endpoint) Close() {
e.closeNoShutdownLocked()
}
-// closeNoShutdown closes the endpoint without doing a full shutdown. This is
-// used when a connection needs to be aborted with a RST and we want to skip
-// a full 4 way TCP shutdown.
+// closeNoShutdown closes the endpoint without doing a full shutdown.
func (e *endpoint) closeNoShutdownLocked() {
// For listening sockets, we always release ports inline so that they
// are immediately available for reuse after Close() is called. If also
@@ -1098,6 +1096,7 @@ func (e *endpoint) closeNoShutdownLocked() {
return
}
+ eventMask := waiter.EventIn | waiter.EventOut
// Either perform the local cleanup or kick the worker to make sure it
// knows it needs to cleanup.
if e.workerRunning {
@@ -1109,8 +1108,12 @@ func (e *endpoint) closeNoShutdownLocked() {
} else {
e.transitionToStateCloseLocked()
// Notify that the endpoint is closed.
- e.waiterQueue.Notify(waiter.EventHUp)
+ eventMask |= waiter.EventHUp
}
+
+ // The TCP closing state-machine would eventually notify EventHUp, but we
+ // notify EventIn|EventOut immediately to unblock any blocked waiters.
+ e.waiterQueue.Notify(eventMask)
}
// closePendingAcceptableConnections closes all connections that have completed