From: Andreas Steffen Date: Thu, 4 Nov 2010 22:56:16 +0000 (+0100) Subject: added connection management to TNCCS manager X-Git-Tag: 4.5.1~560 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7da87f942e1b4523820870154452688dbead77b;p=thirdparty%2Fstrongswan.git added connection management to TNCCS manager --- diff --git a/src/libcharon/tnc/tnccs/tnccs_manager.c b/src/libcharon/tnc/tnccs/tnccs_manager.c index 0fd6737c03..c0b4969287 100644 --- a/src/libcharon/tnc/tnccs/tnccs_manager.c +++ b/src/libcharon/tnc/tnccs/tnccs_manager.c @@ -15,11 +15,13 @@ #include "tnccs_manager.h" +#include #include #include typedef struct private_tnccs_manager_t private_tnccs_manager_t; typedef struct tnccs_entry_t tnccs_entry_t; +typedef struct tnccs_connection_entry_t tnccs_connection_entry_t; /** * TNCCS constructor entry @@ -37,6 +39,22 @@ struct tnccs_entry_t { 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 */ @@ -48,14 +66,25 @@ struct private_tnccs_manager_t { tnccs_manager_t public; /** - * list of tnccs_entry_t's + * list of TNCCS protocol entries */ 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; + }; METHOD(tnccs_manager_t, add_method, void, @@ -117,10 +146,48 @@ METHOD(tnccs_manager_t, create_instance, tnccs_t*, 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, private_tnccs_manager_t *this) { this->protocols->destroy_function(this->protocols, free); + this->connections->destroy_function(this->connections, free); this->lock->destroy(this->lock); free(this); } @@ -137,9 +204,12 @@ tnccs_manager_t *tnccs_manager_create() .add_method = _add_method, .remove_method = _remove_method, .create_instance = _create_instance, + .create_connection = _create_connection, + .remove_connection = _remove_connection, .destroy = _destroy, }, .protocols = linked_list_create(), + .connections = linked_list_create(), .lock = rwlock_create(RWLOCK_TYPE_DEFAULT), ); diff --git a/src/libcharon/tnc/tnccs/tnccs_manager.h b/src/libcharon/tnc/tnccs/tnccs_manager.h index 2f4a961a77..40c3d0a22d 100644 --- a/src/libcharon/tnc/tnccs/tnccs_manager.h +++ b/src/libcharon/tnc/tnccs/tnccs_manager.h @@ -22,6 +22,7 @@ #define TNCCS_MANAGER_H_ #include "tnccs.h" +#include "tncif.h" 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, 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. */