]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[interface] Provide intf_insert() to insert a filter interface
authorMichael Brown <mcb30@ipxe.org>
Mon, 7 Dec 2020 13:49:47 +0000 (13:49 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 7 Dec 2020 13:50:24 +0000 (13:50 +0000)
Generalise the filter interface insertion logic from block_translate()
and expose as intf_insert(), allowing a filter interface to be
inserted on any existing interface.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/blocktrans.c
src/core/interface.c
src/include/ipxe/interface.h

index 3f32f9cf892525eda85887dbef812b367f6589b7..f9dcb95d2517693af618704963a5ff6087ca3a7e 100644 (file)
@@ -242,9 +242,7 @@ int block_translate ( struct interface *block, userptr_t buffer, size_t size ) {
        }
 
        /* Attach to interfaces, mortalise self, and return */
-       assert ( block->dest != &null_intf );
-       intf_plug_plug ( &blktrans->xfer, block->dest );
-       intf_plug_plug ( &blktrans->block, block );
+       intf_insert ( block, &blktrans->block, &blktrans->xfer );
        ref_put ( &blktrans->refcnt );
 
        DBGC2 ( blktrans, "BLKTRANS %p created", blktrans );
index 05e7e4777b1d213cb96a692ea0f2da92b849c926..34a4180a57cf10f823648c4d69c15545d6bcf1fe 100644 (file)
@@ -390,6 +390,23 @@ void intfs_restart ( int rc, ... ) {
        va_end ( intfs );
 }
 
+/**
+ * Insert a filter interface
+ *
+ * @v intf             Object interface
+ * @v upper            Upper end of filter
+ * @v lower            Lower end of filter
+ */
+void intf_insert ( struct interface *intf, struct interface *upper,
+                  struct interface *lower ) {
+       struct interface *dest = intf->dest;
+
+       intf_get ( dest );
+       intf_plug_plug ( intf, upper );
+       intf_plug_plug ( lower, dest );
+       intf_put ( dest );
+}
+
 /**
  * Poke an object interface
  *
index 9281aeef502febb9528c9ff54cb03b91a26fdb4f..19f58a4b4e961d69549d77ad6fe3164dee7536e8 100644 (file)
@@ -169,6 +169,8 @@ 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_insert ( struct interface *intf, struct interface *upper,
+                         struct interface *lower );
 
 extern void intf_poke ( struct interface *intf,
                        void ( type ) ( struct interface *intf ) );