Pass a constructor callback to create TNCCS server instances while dispatching
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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_ @}*/
|
||||||
|
|||||||
Reference in New Issue
Block a user