summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/interface.c69
-rw-r--r--src/include/ipxe/interface.h5
2 files changed, 74 insertions, 0 deletions
diff --git a/src/core/interface.c b/src/core/interface.c
index f7802be0..402aa454 100644
--- a/src/core/interface.c
+++ b/src/core/interface.c
@@ -291,6 +291,41 @@ void intf_shutdown ( struct interface *intf, int rc ) {
}
/**
+ * Shut down multiple object interfaces
+ *
+ * @v intfs Object interfaces
+ * @v rc Reason for close
+ */
+void intfs_vshutdown ( va_list intfs, int rc ) {
+ struct interface *intf;
+ va_list tmp;
+
+ /* Nullify all interfaces to avoid potential loops */
+ va_copy ( tmp, intfs );
+ while ( ( intf = va_arg ( tmp, struct interface * ) ) )
+ intf_nullify ( intf );
+ va_end ( tmp );
+
+ /* Shut down all interfaces */
+ while ( ( intf = va_arg ( intfs, struct interface * ) ) )
+ intf_shutdown ( intf, rc );
+}
+
+/**
+ * Shut down multiple object interfaces
+ *
+ * @v rc Reason for close
+ * @v ... Object interfaces
+ */
+void intfs_shutdown ( int rc, ... ) {
+ va_list intfs;
+
+ va_start ( intfs, rc );
+ intfs_vshutdown ( intfs, rc );
+ va_end ( intfs );
+}
+
+/**
* Shut down and restart an object interface
*
* @v intf Object interface
@@ -317,6 +352,40 @@ void intf_restart ( struct interface *intf, int rc ) {
}
/**
+ * Shut down and restart multiple object interfaces
+ *
+ * @v intfs Object interfaces
+ * @v rc Reason for close
+ */
+void intfs_vrestart ( va_list intfs, int rc ) {
+ struct interface *intf;
+ va_list tmp;
+
+ /* Shut down all interfaces */
+ va_copy ( tmp, intfs );
+ intfs_vshutdown ( tmp, rc );
+ va_end ( tmp );
+
+ /* Reinitialise all interfaces */
+ while ( ( intf = va_arg ( intfs, struct interface * ) ) )
+ intf_reinit ( intf );
+}
+
+/**
+ * Shut down and restart multiple object interfaces
+ *
+ * @v rc Reason for close
+ * @v ... Object interfaces
+ */
+void intfs_restart ( int rc, ... ) {
+ va_list intfs;
+
+ va_start ( intfs, rc );
+ intfs_vrestart ( intfs, rc );
+ va_end ( intfs );
+}
+
+/**
* Poke an object interface
*
* @v intf Object interface
diff --git a/src/include/ipxe/interface.h b/src/include/ipxe/interface.h
index ebb1b691..b65002c8 100644
--- a/src/include/ipxe/interface.h
+++ b/src/include/ipxe/interface.h
@@ -10,6 +10,7 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stddef.h>
+#include <stdarg.h>
#include <ipxe/refcnt.h>
/** An object interface operation */
@@ -148,7 +149,11 @@ extern void intf_close ( struct interface *intf, int rc );
typeof ( void ( object_type, int rc ) )
extern void intf_shutdown ( struct interface *intf, int rc );
+extern void intfs_vshutdown ( va_list intfs, int rc );
+extern void intfs_shutdown ( int rc, ... ) __attribute__ (( sentinel ));
extern void intf_restart ( struct interface *intf, int rc );
+extern void intfs_vrestart ( va_list intfs, int rc );
+extern void intfs_restart ( int rc, ... ) __attribute__ (( sentinel ));
extern void intf_poke ( struct interface *intf,
void ( type ) ( struct interface *intf ) );