[tcp] Discard all TCP connections on shutdown
Allow detection of genuine memory leaks by ensuring that all TCP connections are freed on shutdown. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
52dd4bacad
commit
8a0331c29b
|
@ -7,6 +7,7 @@
|
||||||
#include <ipxe/timer.h>
|
#include <ipxe/timer.h>
|
||||||
#include <ipxe/iobuf.h>
|
#include <ipxe/iobuf.h>
|
||||||
#include <ipxe/malloc.h>
|
#include <ipxe/malloc.h>
|
||||||
|
#include <ipxe/init.h>
|
||||||
#include <ipxe/retry.h>
|
#include <ipxe/retry.h>
|
||||||
#include <ipxe/refcnt.h>
|
#include <ipxe/refcnt.h>
|
||||||
#include <ipxe/xfer.h>
|
#include <ipxe/xfer.h>
|
||||||
|
@ -343,6 +344,7 @@ static void tcp_close ( struct tcp_connection *tcp, int rc ) {
|
||||||
|
|
||||||
/* Remove from list and drop reference */
|
/* Remove from list and drop reference */
|
||||||
stop_timer ( &tcp->timer );
|
stop_timer ( &tcp->timer );
|
||||||
|
stop_timer ( &tcp->wait );
|
||||||
list_del ( &tcp->list );
|
list_del ( &tcp->list );
|
||||||
ref_put ( &tcp->refcnt );
|
ref_put ( &tcp->refcnt );
|
||||||
DBGC ( tcp, "TCP %p connection deleted\n", tcp );
|
DBGC ( tcp, "TCP %p connection deleted\n", tcp );
|
||||||
|
@ -1261,6 +1263,26 @@ struct cache_discarder tcp_cache_discarder __cache_discarder = {
|
||||||
.discard = tcp_discard,
|
.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
|
* Data transfer interface
|
||||||
|
|
Reference in New Issue