]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[tls] Use intf_insert() to add TLS to an interface
authorMichael Brown <mcb30@ipxe.org>
Mon, 7 Dec 2020 13:51:46 +0000 (13:51 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 7 Dec 2020 13:51:46 +0000 (13:51 +0000)
Restructure the use of add_tls() to insert a TLS filter onto an
existing interface.  This allows for the possibility of using
add_tls() to start TLS on an existing connection (as used in several
protocols which will negotiate the choice to use TLS before the
ClientHello is sent).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/http.h
src/include/ipxe/tls.h
src/net/tcp/httpconn.c
src/net/tcp/syslogs.c
src/net/tls.c

index 0893c9537441626f2a1b7702ca1f3dbb4017f912..117f174af2391f858997f5febab2e13c104ae7ae 100644 (file)
@@ -45,11 +45,9 @@ struct http_scheme {
         *
         * @v xfer              Data transfer interface
         * @v name              Host name
-        * @v next              Next interface
         * @ret rc              Return status code
         */
-       int ( * filter ) ( struct interface *xfer, const char *name,
-                          struct interface **next );
+       int ( * filter ) ( struct interface *xfer, const char *name );
 };
 
 /** HTTP scheme table */
index febbdc5898ba8f2465129251c7d5e9dab710aebd..2eaaadf2078b2192c3ec279bbfe8c3d3c9b3d3c0 100644 (file)
@@ -378,7 +378,6 @@ struct tls_connection {
 /** RX I/O buffer alignment */
 #define TLS_RX_ALIGN 16
 
-extern int add_tls ( struct interface *xfer, const char *name,
-                    struct interface **next );
+extern int add_tls ( struct interface *xfer, const char *name );
 
 #endif /* _IPXE_TLS_H */
index 5121ff6c221e398b578aab69fe08d59c95825e9e..2804e09d54da781fa0c51e3f64ca4ebbbd0c674d 100644 (file)
@@ -236,7 +236,6 @@ int http_connect ( struct interface *xfer, struct uri *uri ) {
        struct http_connection *conn;
        struct http_scheme *scheme;
        struct sockaddr_tcpip server;
-       struct interface *socket;
        unsigned int port;
        int rc;
 
@@ -296,15 +295,16 @@ int http_connect ( struct interface *xfer, struct uri *uri ) {
        /* Open socket */
        memset ( &server, 0, sizeof ( server ) );
        server.st_port = htons ( port );
-       socket = &conn->socket;
-       if ( scheme->filter &&
-            ( ( rc = scheme->filter ( socket, uri->host, &socket ) ) != 0 ) )
-               goto err_filter;
-       if ( ( rc = xfer_open_named_socket ( socket, SOCK_STREAM,
+       if ( ( rc = xfer_open_named_socket ( &conn->socket, SOCK_STREAM,
                                             ( struct sockaddr * ) &server,
                                             uri->host, NULL ) ) != 0 )
                goto err_open;
 
+       /* Add filter, if any */
+       if ( scheme->filter &&
+            ( ( rc = scheme->filter ( &conn->socket, uri->host ) ) != 0 ) )
+               goto err_filter;
+
        /* Attach to parent interface, mortalise self, and return */
        intf_plug_plug ( &conn->xfer, xfer );
        ref_put ( &conn->refcnt );
@@ -313,8 +313,8 @@ int http_connect ( struct interface *xfer, struct uri *uri ) {
                conn->scheme->name, conn->uri->host, port );
        return 0;
 
- err_open:
  err_filter:
+ err_open:
        DBGC2 ( conn, "HTTPCONN %p could not create %s://%s:%d: %s\n", conn,
                conn->scheme->name, conn->uri->host, port, strerror ( rc ) );
        http_conn_close ( conn, rc );
index 0c07f86d58aed2ce6a386f06b1cd73131ffc894b..b37605272037d8b8386289853821af02820b4059 100644 (file)
@@ -62,9 +62,10 @@ static struct sockaddr_tcpip logserver = {
  * @v intf             Interface
  * @v rc               Reason for close
  */
-static void syslogs_close ( struct interface *intf __unused, int rc ) {
+static void syslogs_close ( struct interface *intf, int rc ) {
 
        DBG ( "SYSLOGS console disconnected: %s\n", strerror ( rc ) );
+       intf_restart ( intf, rc );
 }
 
 /**
@@ -208,7 +209,6 @@ const struct setting syslogs_setting __setting ( SETTING_MISC, syslogs ) = {
 static int apply_syslogs_settings ( void ) {
        static char *old_server;
        char *server;
-       struct interface *socket;
        int rc;
 
        /* Fetch log server */
@@ -234,33 +234,32 @@ static int apply_syslogs_settings ( void ) {
                rc = 0;
                goto out_no_server;
        }
-
-       /* Add TLS filter */
-       if ( ( rc = add_tls ( &syslogs, server, &socket ) ) != 0 ) {
-               DBG ( "SYSLOGS cannot create TLS filter: %s\n",
-                     strerror ( rc ) );
-               goto err_add_tls;
-       }
+       DBG ( "SYSLOGS using log server %s\n", server );
 
        /* Connect to log server */
-       if ( ( rc = xfer_open_named_socket ( socket, SOCK_STREAM,
+       if ( ( rc = xfer_open_named_socket ( &syslogs, SOCK_STREAM,
                                             (( struct sockaddr *) &logserver ),
                                             server, NULL ) ) != 0 ) {
                DBG ( "SYSLOGS cannot connect to log server: %s\n",
                      strerror ( rc ) );
                goto err_open_named_socket;
        }
-       DBG ( "SYSLOGS using log server %s\n", server );
+
+       /* Add TLS filter */
+       if ( ( rc = add_tls ( &syslogs, server ) ) != 0 ) {
+               DBG ( "SYSLOGS cannot create TLS filter: %s\n",
+                     strerror ( rc ) );
+               goto err_add_tls;
+       }
 
        /* Record log server */
        old_server = server;
-       server = NULL;
 
-       /* Success */
-       rc = 0;
+       return 0;
 
- err_open_named_socket:
  err_add_tls:
+ err_open_named_socket:
+       syslogs_close ( &syslogs, rc );
  out_no_server:
  out_no_change:
        free ( server );
index ea827600f38b7e14a8feedf4639344760e6b5d9f..4822006506095ad1c338273f63900badb8f6ae2c 100644 (file)
@@ -3088,8 +3088,14 @@ static int tls_session ( struct tls_connection *tls, const char *name ) {
  ******************************************************************************
  */
 
-int add_tls ( struct interface *xfer, const char *name,
-             struct interface **next ) {
+/**
+ * Add TLS on an interface
+ *
+ * @v xfer             Data transfer interface
+ * @v name             Host name
+ * @ret rc             Return status code
+ */
+int add_tls ( struct interface *xfer, const char *name ) {
        struct tls_connection *tls;
        int rc;
 
@@ -3133,8 +3139,7 @@ int add_tls ( struct interface *xfer, const char *name,
        tls_restart ( tls );
 
        /* Attach to parent interface, mortalise self, and return */
-       intf_plug_plug ( &tls->plainstream, xfer );
-       *next = &tls->cipherstream;
+       intf_insert ( xfer, &tls->plainstream, &tls->cipherstream );
        ref_put ( &tls->refcnt );
        return 0;