]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
Pass a constructor callback to create TNCCS server instances while dispatching
authorMartin Willi <martin@revosec.ch>
Thu, 17 Jan 2013 14:16:03 +0000 (15:16 +0100)
committerMartin Willi <martin@revosec.ch>
Thu, 17 Jan 2013 15:34:34 +0000 (16:34 +0100)
src/libpttls/pt_tls_dispatcher.c
src/libpttls/pt_tls_dispatcher.h
src/libpttls/pt_tls_server.c
src/libpttls/pt_tls_server.h

index adcf5b4bfaebd11772ee1dc862535f79a8aca725..fab44596c612060b9aa7c7682d19ccd529cbd7c9 100644 (file)
@@ -45,6 +45,11 @@ struct private_pt_tls_dispatcher_t {
         * Server identity
         */
        identification_t *server;
+
+       /**
+        * TNCCS protocol handler constructor
+        */
+       tnccs_t*(*create)();
 };
 
 /**
@@ -106,11 +111,12 @@ static void cleanup(pt_tls_server_t *connection)
 }
 
 METHOD(pt_tls_dispatcher_t, dispatch, void,
-       private_pt_tls_dispatcher_t *this)
+       private_pt_tls_dispatcher_t *this, tnccs_t*(*create)())
 {
        while (TRUE)
        {
                pt_tls_server_t *connection;
+               tnccs_t *tnccs;
                bool old;
                int fd;
 
@@ -123,7 +129,13 @@ METHOD(pt_tls_dispatcher_t, dispatch, void,
                        continue;
                }
 
-               connection = pt_tls_server_create(this->server, fd);
+               tnccs = create();
+               if (!tnccs)
+               {
+                       close(fd);
+                       continue;
+               }
+               connection = pt_tls_server_create(this->server, fd, tnccs);
                if (!connection)
                {
                        close(fd);
index 463bd6cc839d3792b5df09bf33c4b1d34ba320d7..5d01f7fef68135ff08adb8d59e457fecd69d0088 100644 (file)
@@ -24,6 +24,8 @@
 #include <networking/host.h>
 #include <utils/identification.h>
 
+#include <tnc/tnccs/tnccs.h>
+
 typedef struct pt_tls_dispatcher_t pt_tls_dispatcher_t;
 
 /**
@@ -34,9 +36,12 @@ struct pt_tls_dispatcher_t {
        /**
         * Dispatch and handle PT-TLS connections.
         *
-        * This call is blocking and a thread cancellation point.
+        * This call is blocking and a thread cancellation point. The passed
+        * constructor gets called for each dispatched connection.
+        *
+        * @param create                TNCCS constructor function to use
         */
-       void (*dispatch)(pt_tls_dispatcher_t *this);
+       void (*dispatch)(pt_tls_dispatcher_t *this, tnccs_t*(*create)());
 
        /**
         * Destroy a pt_tls_dispatcher_t.
index 2260d72ab8969e181d1982274445edb779a5eb31..b525acb6f69a1522f1fb4c4b31485943c1a6a970 100644 (file)
@@ -18,8 +18,6 @@
 
 #include <utils/debug.h>
 
-#include <tnc/tnc.h>
-
 typedef struct private_pt_tls_server_t private_pt_tls_server_t;
 
 /**
@@ -221,12 +219,6 @@ METHOD(pt_tls_server_t, handle, status_t,
                                return FAILED;
                        }
                        this->state = PT_TLS_SERVER_TNCCS;
-                       this->tnccs = (tls_t*)tnc->tnccs->create_instance(tnc->tnccs,
-                                                                                                                         TNCCS_2_0, TRUE);
-                       if (!this->tnccs)
-                       {
-                               return FAILED;
-                       }
                        break;
                case PT_TLS_SERVER_TNCCS:
                        if (!assess(this, (tls_t*)this->tnccs))
@@ -250,7 +242,7 @@ METHOD(pt_tls_server_t, get_fd, int,
 METHOD(pt_tls_server_t, destroy, void,
        private_pt_tls_server_t *this)
 {
-       DESTROY_IF(this->tnccs);
+       this->tnccs->destroy(this->tnccs);
        this->tls->destroy(this->tls);
        free(this);
 }
@@ -258,7 +250,8 @@ METHOD(pt_tls_server_t, destroy, void,
 /**
  * See header
  */
-pt_tls_server_t *pt_tls_server_create(identification_t *server, int fd)
+pt_tls_server_t *pt_tls_server_create(identification_t *server, int fd,
+                                                                         tnccs_t *tnccs)
 {
        private_pt_tls_server_t *this;
 
@@ -270,10 +263,12 @@ pt_tls_server_t *pt_tls_server_create(identification_t *server, int fd)
                },
                .state = PT_TLS_SERVER_VERSION,
                .tls = tls_socket_create(TRUE, server, NULL, fd, NULL),
+               .tnccs = (tls_t*)tnccs,
        );
 
        if (!this->tls)
        {
+               this->tnccs->destroy(this->tnccs);
                free(this);
                return NULL;
        }
index 0d952c4407f468e5326bc87504c2115579a5fe84..244111b43088b170eb79b5f8d6f9e7fda5530d1b 100644 (file)
@@ -23,6 +23,8 @@
 
 #include <utils/identification.h>
 
+#include <tnc/tnccs/tnccs.h>
+
 typedef struct pt_tls_server_t pt_tls_server_t;
 
 /**
@@ -58,8 +60,10 @@ struct pt_tls_server_t {
  *
  * @param server       TLS server identity
  * @param fd           client connection socket
+ * @param tnccs                inner TNCCS protocol handler to use for this connection
  * @return                     PT-TLS server
  */
-pt_tls_server_t *pt_tls_server_create(identification_t *server, int fd);
+pt_tls_server_t *pt_tls_server_create(identification_t *server, int fd,
+                                                                         tnccs_t *tnccs);
 
 #endif /** PT_TLS_SERVER_H_ @}*/