tcp: Don't reset connection from ESTABLISHED state on EPOLLHUP

That might just mean we shut down the socket -- but we still have to
go through the other states to ensure a orderly shutdown guest-side.

While at it, drop the EPOLLHUP check for unhandled states: we should
never hit that, but if we do, resetting the connection at that point
is probably the wrong thing to do.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Stefano Brivio 2021-09-16 08:42:45 +02:00
parent 62bace390b
commit 9b6769d53b

7
tcp.c
View file

@ -2825,9 +2825,7 @@ void tcp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events,
case ESTABLISHED_SOCK_FIN_SENT: case ESTABLISHED_SOCK_FIN_SENT:
case ESTABLISHED: case ESTABLISHED:
tcp_data_from_sock(c, conn, now); tcp_data_from_sock(c, conn, now);
if (events & EPOLLHUP) { if (events & EPOLLRDHUP) {
tcp_rst(c, conn);
} else if (events & EPOLLRDHUP) {
if (conn->state == ESTABLISHED) if (conn->state == ESTABLISHED)
tcp_tap_state(conn, ESTABLISHED_SOCK_FIN); tcp_tap_state(conn, ESTABLISHED_SOCK_FIN);
tcp_data_from_sock(c, conn, now); tcp_data_from_sock(c, conn, now);
@ -2870,9 +2868,6 @@ void tcp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events,
case CLOSED: case CLOSED:
break; break;
} }
if (events & EPOLLHUP)
tcp_rst(c, conn);
} }
/** /**