added connection management to TNCCS manager
This commit is contained in:
@@ -15,11 +15,13 @@
|
|||||||
|
|
||||||
#include "tnccs_manager.h"
|
#include "tnccs_manager.h"
|
||||||
|
|
||||||
|
#include <debug.h>
|
||||||
#include <utils/linked_list.h>
|
#include <utils/linked_list.h>
|
||||||
#include <threading/rwlock.h>
|
#include <threading/rwlock.h>
|
||||||
|
|
||||||
typedef struct private_tnccs_manager_t private_tnccs_manager_t;
|
typedef struct private_tnccs_manager_t private_tnccs_manager_t;
|
||||||
typedef struct tnccs_entry_t tnccs_entry_t;
|
typedef struct tnccs_entry_t tnccs_entry_t;
|
||||||
|
typedef struct tnccs_connection_entry_t tnccs_connection_entry_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TNCCS constructor entry
|
* TNCCS constructor entry
|
||||||
@@ -37,6 +39,22 @@ struct tnccs_entry_t {
|
|||||||
tnccs_constructor_t constructor;
|
tnccs_constructor_t constructor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TNCCS connection entry
|
||||||
|
*/
|
||||||
|
struct tnccs_connection_entry_t {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TNCCS connection ID
|
||||||
|
*/
|
||||||
|
TNC_ConnectionID id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TNCCS instance
|
||||||
|
*/
|
||||||
|
tnccs_t *tnccs;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* private data of tnccs_manager
|
* private data of tnccs_manager
|
||||||
*/
|
*/
|
||||||
@@ -48,14 +66,25 @@ struct private_tnccs_manager_t {
|
|||||||
tnccs_manager_t public;
|
tnccs_manager_t public;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* list of tnccs_entry_t's
|
* list of TNCCS protocol entries
|
||||||
*/
|
*/
|
||||||
linked_list_t *protocols;
|
linked_list_t *protocols;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* rwlock to lock methods
|
* connection ID counter
|
||||||
|
*/
|
||||||
|
TNC_ConnectionID connection_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* list of TNCCS connection entries
|
||||||
|
*/
|
||||||
|
linked_list_t *connections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rwlock to lock TNCCS protocol and connection entries
|
||||||
*/
|
*/
|
||||||
rwlock_t *lock;
|
rwlock_t *lock;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(tnccs_manager_t, add_method, void,
|
METHOD(tnccs_manager_t, add_method, void,
|
||||||
@@ -117,10 +146,48 @@ METHOD(tnccs_manager_t, create_instance, tnccs_t*,
|
|||||||
return protocol;
|
return protocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
METHOD(tnccs_manager_t, create_connection, TNC_ConnectionID,
|
||||||
|
private_tnccs_manager_t *this, tnccs_t *tnccs)
|
||||||
|
{
|
||||||
|
tnccs_connection_entry_t *entry = malloc_thing(tnccs_connection_entry_t);
|
||||||
|
|
||||||
|
entry->id = ++this->connection_id;
|
||||||
|
entry->tnccs = tnccs;
|
||||||
|
|
||||||
|
this->lock->write_lock(this->lock);
|
||||||
|
this->connections->insert_last(this->connections, entry);
|
||||||
|
this->lock->unlock(this->lock);
|
||||||
|
|
||||||
|
DBG1(DBG_TNC, "assigned TNCCS Connection ID %u", entry->id);
|
||||||
|
return entry->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
METHOD(tnccs_manager_t, remove_connection, void,
|
||||||
|
private_tnccs_manager_t *this, TNC_ConnectionID id)
|
||||||
|
{
|
||||||
|
enumerator_t *enumerator;
|
||||||
|
tnccs_connection_entry_t *entry;
|
||||||
|
|
||||||
|
this->lock->write_lock(this->lock);
|
||||||
|
enumerator = this->connections->create_enumerator(this->connections);
|
||||||
|
while (enumerator->enumerate(enumerator, &entry))
|
||||||
|
{
|
||||||
|
if (id == entry->id)
|
||||||
|
{
|
||||||
|
this->connections->remove_at(this->connections, enumerator);
|
||||||
|
free(entry);
|
||||||
|
DBG1(DBG_TNC, "removed TNCCS Connection ID %u", id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
this->lock->unlock(this->lock);
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(tnccs_manager_t, destroy, void,
|
METHOD(tnccs_manager_t, destroy, void,
|
||||||
private_tnccs_manager_t *this)
|
private_tnccs_manager_t *this)
|
||||||
{
|
{
|
||||||
this->protocols->destroy_function(this->protocols, free);
|
this->protocols->destroy_function(this->protocols, free);
|
||||||
|
this->connections->destroy_function(this->connections, free);
|
||||||
this->lock->destroy(this->lock);
|
this->lock->destroy(this->lock);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
@@ -137,9 +204,12 @@ tnccs_manager_t *tnccs_manager_create()
|
|||||||
.add_method = _add_method,
|
.add_method = _add_method,
|
||||||
.remove_method = _remove_method,
|
.remove_method = _remove_method,
|
||||||
.create_instance = _create_instance,
|
.create_instance = _create_instance,
|
||||||
|
.create_connection = _create_connection,
|
||||||
|
.remove_connection = _remove_connection,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
.protocols = linked_list_create(),
|
.protocols = linked_list_create(),
|
||||||
|
.connections = linked_list_create(),
|
||||||
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
|
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#define TNCCS_MANAGER_H_
|
#define TNCCS_MANAGER_H_
|
||||||
|
|
||||||
#include "tnccs.h"
|
#include "tnccs.h"
|
||||||
|
#include "tncif.h"
|
||||||
|
|
||||||
typedef struct tnccs_manager_t tnccs_manager_t;
|
typedef struct tnccs_manager_t tnccs_manager_t;
|
||||||
|
|
||||||
@@ -60,6 +61,21 @@ struct tnccs_manager_t {
|
|||||||
tnccs_t* (*create_instance)(tnccs_manager_t *this, tnccs_type_t type,
|
tnccs_t* (*create_instance)(tnccs_manager_t *this, tnccs_type_t type,
|
||||||
bool is_server);
|
bool is_server);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a TNCCS connection and assign a unique connection ID
|
||||||
|
*
|
||||||
|
* @param tnccs TNCCS connection instance
|
||||||
|
* @result assigned connection ID
|
||||||
|
*/
|
||||||
|
TNC_ConnectionID (*create_connection)(tnccs_manager_t *this, tnccs_t *tnccs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a TNCCS connection using its connection ID.
|
||||||
|
*
|
||||||
|
* @param id connection ID of the connection to be removed
|
||||||
|
*/
|
||||||
|
void (*remove_connection)(tnccs_manager_t *this, TNC_ConnectionID id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy a tnccs_manager instance.
|
* Destroy a tnccs_manager instance.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user