diff --git a/src/net/tcp.c b/src/net/tcp.c index 5a9810b2..b1533915 100644 --- a/src/net/tcp.c +++ b/src/net/tcp.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -343,6 +344,7 @@ static void tcp_close ( struct tcp_connection *tcp, int rc ) { /* Remove from list and drop reference */ stop_timer ( &tcp->timer ); + stop_timer ( &tcp->wait ); list_del ( &tcp->list ); ref_put ( &tcp->refcnt ); DBGC ( tcp, "TCP %p connection deleted\n", tcp ); @@ -1261,6 +1263,26 @@ struct cache_discarder tcp_cache_discarder __cache_discarder = { .discard = tcp_discard, }; +/** + * Shut down all TCP connections + * + */ +static void tcp_shutdown ( int booting __unused ) { + struct tcp_connection *tcp; + + while ( ( tcp = list_first_entry ( &tcp_conns, struct tcp_connection, + list ) ) != NULL ) { + tcp->tcp_state = TCP_CLOSED; + tcp_dump_state ( tcp ); + tcp_close ( tcp, -ECANCELED ); + } +} + +/** TCP shutdown function */ +struct startup_fn tcp_startup_fn __startup_fn ( STARTUP_EARLY ) = { + .shutdown = tcp_shutdown, +}; + /*************************************************************************** * * Data transfer interface