summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--pkg/tcpip/transport/tcp/connect.go1
-rw-r--r--pkg/tcpip/transport/tcp/endpoint.go11
2 files changed, 7 insertions, 5 deletions
diff --git a/pkg/tcpip/transport/tcp/connect.go b/pkg/tcpip/transport/tcp/connect.go
index 2facbebec..6e9015be1 100644
--- a/pkg/tcpip/transport/tcp/connect.go
+++ b/pkg/tcpip/transport/tcp/connect.go
@@ -1451,7 +1451,6 @@ func (e *endpoint) protocolMainLoop(handshake bool, wakerInitDone chan<- struct{
// The socket has been closed and we are in FIN_WAIT2
// so start the FIN_WAIT2 timer.
closeTimer = time.AfterFunc(e.tcpLingerTimeout, closeWaker.Assert)
- e.waiterQueue.Notify(waiter.EventHUp | waiter.EventErr | waiter.EventIn | waiter.EventOut)
}
}
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