Pass a constructor callback to create TNCCS server instances while dispatching

This commit is contained in:
Martin Willi
2013-01-17 16:34:34 +01:00
parent 04a9a99bc1
commit 16ef69d70a
4 changed files with 31 additions and 15 deletions
+14 -2
View File
@@ -45,6 +45,11 @@ struct private_pt_tls_dispatcher_t {
* Server identity * Server identity
*/ */
identification_t *server; 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, METHOD(pt_tls_dispatcher_t, dispatch, void,
private_pt_tls_dispatcher_t *this) private_pt_tls_dispatcher_t *this, tnccs_t*(*create)())
{ {
while (TRUE) while (TRUE)
{ {
pt_tls_server_t *connection; pt_tls_server_t *connection;
tnccs_t *tnccs;
bool old; bool old;
int fd; int fd;
@@ -123,7 +129,13 @@ METHOD(pt_tls_dispatcher_t, dispatch, void,
continue; 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) if (!connection)
{ {
close(fd); close(fd);
+7 -2
View File
@@ -24,6 +24,8 @@
#include <networking/host.h> #include <networking/host.h>
#include <utils/identification.h> #include <utils/identification.h>
#include <tnc/tnccs/tnccs.h>
typedef struct pt_tls_dispatcher_t pt_tls_dispatcher_t; 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. * 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. * Destroy a pt_tls_dispatcher_t.
+5 -10
View File
@@ -18,8 +18,6 @@
#include <utils/debug.h> #include <utils/debug.h>
#include <tnc/tnc.h>
typedef struct private_pt_tls_server_t private_pt_tls_server_t; 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; return FAILED;
} }
this->state = PT_TLS_SERVER_TNCCS; 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; break;
case PT_TLS_SERVER_TNCCS: case PT_TLS_SERVER_TNCCS:
if (!assess(this, (tls_t*)this->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, METHOD(pt_tls_server_t, destroy, void,
private_pt_tls_server_t *this) private_pt_tls_server_t *this)
{ {
DESTROY_IF(this->tnccs); this->tnccs->destroy(this->tnccs);
this->tls->destroy(this->tls); this->tls->destroy(this->tls);
free(this); free(this);
} }
@@ -258,7 +250,8 @@ METHOD(pt_tls_server_t, destroy, void,
/** /**
* See header * 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; 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, .state = PT_TLS_SERVER_VERSION,
.tls = tls_socket_create(TRUE, server, NULL, fd, NULL), .tls = tls_socket_create(TRUE, server, NULL, fd, NULL),
.tnccs = (tls_t*)tnccs,
); );
if (!this->tls) if (!this->tls)
{ {
this->tnccs->destroy(this->tnccs);
free(this); free(this);
return NULL; return NULL;
} }
+5 -1
View File
@@ -23,6 +23,8 @@
#include <utils/identification.h> #include <utils/identification.h>
#include <tnc/tnccs/tnccs.h>
typedef struct pt_tls_server_t pt_tls_server_t; 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 server TLS server identity
* @param fd client connection socket * @param fd client connection socket
* @param tnccs inner TNCCS protocol handler to use for this connection
* @return PT-TLS server * @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_ @}*/ #endif /** PT_TLS_SERVER_H_ @}*/