]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[interface] Provide intf_reinit() to reinitialise nullified interfaces
authorMichael Brown <mcb30@ipxe.org>
Wed, 16 Nov 2016 22:22:13 +0000 (22:22 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 16 Nov 2016 22:22:13 +0000 (22:22 +0000)
Provide an abstraction intf_reinit() to restore the descriptor of a
previously nullified interface.

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

index ba148c13dfd9eeec50ce16727bb24bc41659bfe5..948fa5c54421f2e834e28abc31c4da79978d32dd 100644 (file)
@@ -295,7 +295,6 @@ void intf_shutdown ( struct interface *intf, int rc ) {
  * blocked during shutdown.
  */
 void intf_restart ( struct interface *intf, int rc ) {
-       struct interface_descriptor *desc = intf->desc;
 
        /* Shut down the interface */
        intf_shutdown ( intf, rc );
@@ -309,7 +308,7 @@ void intf_restart ( struct interface *intf, int rc ) {
         * infinite loop as the intf_close() operations on each side
         * of the link call each other recursively.
         */
-       intf->desc = desc;
+       intf_reinit ( intf );
 }
 
 /**
index a8d8237753827168b74827e9b79659f43f82e41a..ebb1b691114a366f56805db21266236bc1db496c 100644 (file)
@@ -123,6 +123,11 @@ struct interface {
        struct refcnt *refcnt;
        /** Interface descriptor */
        struct interface_descriptor *desc;
+       /** Original interface descriptor
+        *
+        * Used by intf_reinit().
+        */
+       struct interface_descriptor *original;
 };
 
 extern void intf_plug ( struct interface *intf, struct interface *dest );
@@ -166,6 +171,7 @@ static inline void intf_init ( struct interface *intf,
        intf->dest = &null_intf;
        intf->refcnt = refcnt;
        intf->desc = desc;
+       intf->original = desc;
 }
 
 /**
@@ -177,6 +183,7 @@ static inline void intf_init ( struct interface *intf,
                .dest = &null_intf,             \
                .refcnt = NULL,                 \
                .desc = &(descriptor),          \
+               .original = &(descriptor),      \
        }
 
 /**
@@ -236,4 +243,15 @@ static inline void intf_init ( struct interface *intf,
  */
 #define INTF_INTF_DBG( intf, dest ) INTF_DBG ( intf ), INTF_DBG ( dest )
 
+/**
+ * Reinitialise an object interface
+ *
+ * @v intf             Object interface
+ */
+static inline void intf_reinit ( struct interface *intf ) {
+
+       /* Restore original interface descriptor */
+       intf->desc = intf->original;
+}
+
 #endif /* _IPXE_INTERFACE_H */
index b1f74bc4fb0f8a63357bac9942a0f5a0bb5f3136..27cc506534558dc2597579260f298464b7cfaf60 100644 (file)
@@ -787,12 +787,9 @@ static int http_transfer_complete ( struct http_transaction *http ) {
        /* Restart content decoding interfaces (which may be attached
         * to the same object).
         */
-       intf_nullify ( &http->content );
-       intf_nullify ( &http->transfer );
+       intf_nullify ( &http->transfer ); /* avoid potential loops */
        intf_restart ( &http->content, http->response.rc );
        intf_restart ( &http->transfer, http->response.rc );
-       http->content.desc = &http_content_desc;
-       http->transfer.desc = &http_transfer_desc;
        intf_plug_plug ( &http->transfer, &http->content );
        http->len = 0;
        assert ( http->remaining == 0 );