diff options
author | Andreas Steffen <andreas.steffen@strongswan.org> | 2010-11-13 10:01:46 +0100 |
---|---|---|
committer | Andreas Steffen <andreas.steffen@strongswan.org> | 2010-11-13 10:02:02 +0100 |
commit | 10647add810b676b0c7a56043ff78ea88ad058c4 (patch) | |
tree | 493955757f0efab0b02362ceb612b504a1554d9b /src/libcharon/tnc | |
parent | 8f927116be6849f7fc69a29f96d42ff1a21cf858 (diff) | |
download | strongswan-10647add810b676b0c7a56043ff78ea88ad058c4.tar.bz2 strongswan-10647add810b676b0c7a56043ff78ea88ad058c4.tar.xz |
moved recommendation handling to the tnc_imv plugin
Diffstat (limited to 'src/libcharon/tnc')
-rw-r--r-- | src/libcharon/tnc/imc/imc_manager.h | 7 | ||||
-rw-r--r-- | src/libcharon/tnc/imv/imv_manager.h | 7 | ||||
-rw-r--r-- | src/libcharon/tnc/imv/imv_recommendations.h | 56 | ||||
-rw-r--r-- | src/libcharon/tnc/tnccs/tnccs.h | 14 | ||||
-rw-r--r-- | src/libcharon/tnc/tnccs/tnccs_manager.c | 55 | ||||
-rw-r--r-- | src/libcharon/tnc/tnccs/tnccs_manager.h | 14 |
6 files changed, 108 insertions, 45 deletions
diff --git a/src/libcharon/tnc/imc/imc_manager.h b/src/libcharon/tnc/imc/imc_manager.h index c52bc93ce..634afdbe8 100644 --- a/src/libcharon/tnc/imc/imc_manager.h +++ b/src/libcharon/tnc/imc/imc_manager.h @@ -49,13 +49,6 @@ struct imc_manager_t { imc_t* (*remove)(imc_manager_t *this, TNC_IMCID id); /** - * Return the number of registered IMCs - * - * @return number of IMCs - */ - int (*get_count)(imc_manager_t *this); - - /** * Return the preferred language for recommendations * * @return preferred language string diff --git a/src/libcharon/tnc/imv/imv_manager.h b/src/libcharon/tnc/imv/imv_manager.h index 0e8319396..a1951fe64 100644 --- a/src/libcharon/tnc/imv/imv_manager.h +++ b/src/libcharon/tnc/imv/imv_manager.h @@ -22,6 +22,7 @@ #define IMV_MANAGER_H_ #include "imv.h" +#include "imv_recommendations.h" #include <library.h> @@ -49,11 +50,11 @@ struct imv_manager_t { imv_t* (*remove)(imv_manager_t *this, TNC_IMVID id); /** - * Return the number of registered IMVs + * Create an empty set of IMV recommendations and evaluations * - * @return number of IMVs + * @return instance of a recommendations_t list */ - int (*get_count)(imv_manager_t *this); + recommendations_t* (*create_recommendations)(imv_manager_t *this); /** * Enforce the TNC recommendation on the IKE_SA by either inserting an diff --git a/src/libcharon/tnc/imv/imv_recommendations.h b/src/libcharon/tnc/imv/imv_recommendations.h new file mode 100644 index 000000000..daf618b65 --- /dev/null +++ b/src/libcharon/tnc/imv/imv_recommendations.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2010 Andreas Steffen + * HSR Hochschule fuer Technik Rapperswil + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +/** + * @defgroup imv_recommendations imv_recommendations + * @{ @ingroup libcharon + */ + +#ifndef IMV_RECOMMENDATIONS_H_ +#define IMV_RECOMMENDATIONS_H_ + +#include <tnc/tncifimv.h> +#include <library.h> + +typedef struct recommendations_t recommendations_t; + +/** + * Collection of all IMV action recommendations and evaluation results + */ +struct recommendations_t { + + /** + * Deliver an IMV action recommendation and IMV evaluation result to the TNCS + * + * @param imv_id ID of the IMV providing the recommendation + * @param recommendation action recommendation + * @param evaluation evaluation result + */ + TNC_Result (*provide_recommendation)(recommendations_t *this, + TNC_IMVID imv_id, + TNC_IMV_Action_Recommendation rec, + TNC_IMV_Evaluation_Result eval); + + bool (*have_recommendation)(recommendations_t *this, + TNC_IMV_Action_Recommendation *rec, + TNC_IMV_Evaluation_Result *eval); + + /** + * Destroys an imv_t object. + */ + void (*destroy)(recommendations_t *this); +}; + +#endif /** IMV_RECOMMENDATIONS_H_ @}*/ diff --git a/src/libcharon/tnc/tnccs/tnccs.h b/src/libcharon/tnc/tnccs/tnccs.h index 86759a1ff..e4b7585be 100644 --- a/src/libcharon/tnc/tnccs/tnccs.h +++ b/src/libcharon/tnc/tnccs/tnccs.h @@ -63,18 +63,4 @@ typedef void (*tnccs_send_message_t)(tnccs_t* tncss, TNC_UInt32 message_len, TNC_MessageType message_type); - -/** - * Callback function delivering an IMV Action Recommendation and - * IMV Evaluation Result to the TNCS - * - * @param imv_id ID of the IMV providing the recommendation - * @param recommendation action recommendation - * @param evaluation evaluation result - */ -typedef void (*tnccs_provide_recommendation_t)(tnccs_t* tncss, - TNC_IMVID imv_id, - TNC_IMV_Action_Recommendation recommendation, - TNC_IMV_Evaluation_Result evaluation); - #endif /** TNCCS_H_ @}*/ diff --git a/src/libcharon/tnc/tnccs/tnccs_manager.c b/src/libcharon/tnc/tnccs/tnccs_manager.c index c21ed4813..0c59e0c26 100644 --- a/src/libcharon/tnc/tnccs/tnccs_manager.c +++ b/src/libcharon/tnc/tnccs/tnccs_manager.c @@ -15,7 +15,10 @@ #include "tnccs_manager.h" +#include <tnc/imv/imv_recommendations.h> + #include <debug.h> +#include <daemon.h> #include <utils/linked_list.h> #include <threading/rwlock.h> @@ -59,10 +62,10 @@ struct tnccs_connection_entry_t { */ tnccs_send_message_t send_message; - /** TNCS provide recommendation function + /** collection of IMV recommendations * */ - tnccs_provide_recommendation_t provide_recommendation; + recommendations_t *recs; }; /** @@ -164,17 +167,37 @@ METHOD(tnccs_manager_t, create_instance, tnccs_t*, } METHOD(tnccs_manager_t, create_connection, TNC_ConnectionID, - private_tnccs_manager_t *this, tnccs_t *tnccs, - tnccs_send_message_t send_message, - tnccs_provide_recommendation_t provide_recommendation) + private_tnccs_manager_t *this, tnccs_t *tnccs, + tnccs_send_message_t send_message, recommendations_t **recs) { tnccs_connection_entry_t *entry; entry = malloc_thing(tnccs_connection_entry_t); entry->tnccs = tnccs; entry->send_message = send_message; - entry->provide_recommendation = provide_recommendation; - + if (recs) + { + /* we assume a TNC Server needing recommendations from IMVs */ + if (!charon->imvs) + { + DBG1(DBG_TNC, "no IMV manager available!"); + free(entry); + return 0; + } + entry->recs = charon->imvs->create_recommendations(charon->imvs); + *recs = entry->recs; + } + else + { + /* we assume a TNC Client */ + if (!charon->imcs) + { + DBG1(DBG_TNC, "no IMC manager available!"); + free(entry); + return 0; + } + entry->recs = NULL; + } this->connection_lock->write_lock(this->connection_lock); entry->id = ++this->connection_id; this->connections->insert_last(this->connections, entry); @@ -197,6 +220,10 @@ METHOD(tnccs_manager_t, remove_connection, void, if (id == entry->id) { this->connections->remove_at(this->connections, enumerator); + if (entry->recs) + { + entry->recs->destroy(entry->recs); + } free(entry); DBG1(DBG_TNC, "removed TNCCS Connection ID %u", id); } @@ -241,13 +268,12 @@ METHOD(tnccs_manager_t, send_message, TNC_Result, METHOD(tnccs_manager_t, provide_recommendation, TNC_Result, private_tnccs_manager_t *this, TNC_IMVID imv_id, TNC_ConnectionID id, - TNC_IMV_Action_Recommendation recommendation, - TNC_IMV_Evaluation_Result evaluation) + TNC_IMV_Action_Recommendation rec, + TNC_IMV_Evaluation_Result eval) { enumerator_t *enumerator; tnccs_connection_entry_t *entry; - tnccs_provide_recommendation_t provide_recommendation = NULL; - tnccs_t *tnccs = NULL; + recommendations_t *recs = NULL; this->connection_lock->read_lock(this->connection_lock); enumerator = this->connections->create_enumerator(this->connections); @@ -255,17 +281,16 @@ METHOD(tnccs_manager_t, provide_recommendation, TNC_Result, { if (id == entry->id) { - tnccs = entry->tnccs; - provide_recommendation = entry->provide_recommendation; + recs = entry->recs; break; } } enumerator->destroy(enumerator); this->connection_lock->unlock(this->connection_lock); - if (tnccs && provide_recommendation) + if (recs) { - provide_recommendation(tnccs, imv_id, recommendation, evaluation); + recs->provide_recommendation(recs, imv_id, rec, eval); return TNC_RESULT_SUCCESS; } return TNC_RESULT_FATAL; diff --git a/src/libcharon/tnc/tnccs/tnccs_manager.h b/src/libcharon/tnc/tnccs/tnccs_manager.h index d1f73148b..18ad89db3 100644 --- a/src/libcharon/tnc/tnccs/tnccs_manager.h +++ b/src/libcharon/tnc/tnccs/tnccs_manager.h @@ -23,6 +23,8 @@ #include "tnccs.h" +#include <tnc/imv/imv_recommendations.h> + typedef struct tnccs_manager_t tnccs_manager_t; /** @@ -61,18 +63,18 @@ struct tnccs_manager_t { bool is_server); /** - * Create a TNCCS connection and assign a unique connection ID as well as - * callback functions for adding a message to a TNCCS batch and delivering - * an IMV recommendation, respectively + * Create a TNCCS connection and assign a unique connection ID as well a + * callback function for adding a message to a TNCCS batch and create + * an empty set for collecting IMV recommendations * * @param tnccs TNCCS connection instance * @param send_message TNCCS callback function - * @param provide_recommendation TNCS callback function + * @param recs pointer to IMV recommendation set * @return assigned connection ID */ TNC_ConnectionID (*create_connection)(tnccs_manager_t *this, tnccs_t *tnccs, - tnccs_send_message_t send_message, - tnccs_provide_recommendation_t provide_recommendation); + tnccs_send_message_t send_message, + recommendations_t **recs); /** * Remove a TNCCS connection using its connection ID. |