]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[tcp] Discard all TCP connections on shutdown
authorMichael Brown <mcb30@ipxe.org>
Tue, 8 May 2012 11:39:04 +0000 (12:39 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 8 May 2012 11:49:01 +0000 (12:49 +0100)
Allow detection of genuine memory leaks by ensuring that all TCP
connections are freed on shutdown.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/net/tcp.c

index 5a9810b2c57bc03cdddcaa94b9ec1baafb1fff5a..b15339153122de488301f3ab047e9dd9e68e0a20 100644 (file)
@@ -7,6 +7,7 @@
 #include <ipxe/timer.h>
 #include <ipxe/iobuf.h>
 #include <ipxe/malloc.h>
+#include <ipxe/init.h>
 #include <ipxe/retry.h>
 #include <ipxe/refcnt.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 */
                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