diff options
-rw-r--r-- | src/libcharon/plugins/tnc_imc/tnc_imc_bind_function.c | 4 | ||||
-rw-r--r-- | src/libcharon/plugins/tnc_imv/tnc_imv_bind_function.c | 4 | ||||
-rw-r--r-- | src/libcharon/tnc/tnccs/tnccs_manager.c | 44 | ||||
-rw-r--r-- | src/libcharon/tnc/tnccs/tnccs_manager.h | 59 |
4 files changed, 84 insertions, 27 deletions
diff --git a/src/libcharon/plugins/tnc_imc/tnc_imc_bind_function.c b/src/libcharon/plugins/tnc_imc/tnc_imc_bind_function.c index 5cc14f109..e18f1b006 100644 --- a/src/libcharon/plugins/tnc_imc/tnc_imc_bind_function.c +++ b/src/libcharon/plugins/tnc_imc/tnc_imc_bind_function.c @@ -39,8 +39,8 @@ TNC_Result TNC_TNCC_RequestHandshakeRetry(TNC_IMCID imc_id, TNC_ConnectionID connection_id, TNC_RetryReason reason) { - DBG2(DBG_TNC,"TNCC_RequestHandshakeRetry not supported yet"); - return TNC_RESULT_CANT_RESPOND; + return charon->tnccs->request_handshake_retry(charon->tnccs, TRUE, imc_id, + connection_id, reason); } /** diff --git a/src/libcharon/plugins/tnc_imv/tnc_imv_bind_function.c b/src/libcharon/plugins/tnc_imv/tnc_imv_bind_function.c index e36997ea0..f6e9c5e32 100644 --- a/src/libcharon/plugins/tnc_imv/tnc_imv_bind_function.c +++ b/src/libcharon/plugins/tnc_imv/tnc_imv_bind_function.c @@ -39,8 +39,8 @@ TNC_Result TNC_TNCS_RequestHandshakeRetry(TNC_IMVID imv_id, TNC_ConnectionID connection_id, TNC_RetryReason reason) { - DBG2(DBG_TNC,"TNCS_RequestHandshakeRetry not supported yet"); - return TNC_RESULT_CANT_RESPOND; + return charon->tnccs->request_handshake_retry(charon->tnccs, FALSE, imv_id, + connection_id, reason); } /** diff --git a/src/libcharon/tnc/tnccs/tnccs_manager.c b/src/libcharon/tnc/tnccs/tnccs_manager.c index 898c4f00a..7e522b870 100644 --- a/src/libcharon/tnc/tnccs/tnccs_manager.c +++ b/src/libcharon/tnc/tnccs/tnccs_manager.c @@ -63,6 +63,11 @@ struct tnccs_connection_entry_t { tnccs_send_message_t send_message; /** + * TNCCS request handshake retry flag + */ + bool *request_handshake_retry; + + /** * collection of IMV recommendations */ recommendations_t *recs; @@ -168,13 +173,15 @@ 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, recommendations_t **recs) + tnccs_send_message_t send_message, bool* request_handshake_retry, + recommendations_t **recs) { tnccs_connection_entry_t *entry; entry = malloc_thing(tnccs_connection_entry_t); entry->tnccs = tnccs; entry->send_message = send_message; + entry->request_handshake_retry = request_handshake_retry; if (recs) { /* we assume a TNC Server needing recommendations from IMVs */ @@ -232,6 +239,40 @@ METHOD(tnccs_manager_t, remove_connection, void, this->connection_lock->unlock(this->connection_lock); } +METHOD(tnccs_manager_t, request_handshake_retry, TNC_Result, + private_tnccs_manager_t *this, bool is_imc, TNC_UInt32 imcv_id, + TNC_ConnectionID id, + TNC_RetryReason reason) +{ + enumerator_t *enumerator; + tnccs_connection_entry_t *entry; + + if (id == TNC_CONNECTIONID_ANY) + { + DBG2(DBG_TNC, "%s %u requests handshake retry for all connections " + "(reason: %u)", is_imc ? "IMC":"IMV", reason); + } + else + { + DBG2(DBG_TNC, "%s %u requests handshake retry for connection ID %u " + "(reason: %u)", is_imc ? "IMC":"IMV", id, reason); + } + this->connection_lock->read_lock(this->connection_lock); + enumerator = this->connections->create_enumerator(this->connections); + while (enumerator->enumerate(enumerator, &entry)) + { + if (id == TNC_CONNECTIONID_ANY || id == entry->id) + { + *entry->request_handshake_retry = TRUE; + break; + } + } + enumerator->destroy(enumerator); + this->connection_lock->unlock(this->connection_lock); + + return TNC_RESULT_SUCCESS; +} + METHOD(tnccs_manager_t, send_message, TNC_Result, private_tnccs_manager_t *this, TNC_IMCID imc_id, TNC_IMVID imv_id, TNC_ConnectionID id, @@ -418,6 +459,7 @@ tnccs_manager_t *tnccs_manager_create() .create_instance = _create_instance, .create_connection = _create_connection, .remove_connection = _remove_connection, + .request_handshake_retry = _request_handshake_retry, .send_message = _send_message, .provide_recommendation = _provide_recommendation, .get_attribute = _get_attribute, diff --git a/src/libcharon/tnc/tnccs/tnccs_manager.h b/src/libcharon/tnc/tnccs/tnccs_manager.h index 23f7a6810..c02eac03c 100644 --- a/src/libcharon/tnc/tnccs/tnccs_manager.h +++ b/src/libcharon/tnc/tnccs/tnccs_manager.h @@ -55,9 +55,9 @@ struct tnccs_manager_t { /** * Create a new TNCCS protocol instance. * - * @param type type of the TNCCS protocol - * @param is_server TRUE if TNC Server, FALSE if TNC Client - * @return TNCCS protocol instance, NULL if no constructor found + * @param type type of the TNCCS protocol + * @param is_server TRUE if TNC Server, FALSE if TNC Client + * @return TNCCS protocol instance, NULL if no constructor found */ tnccs_t* (*create_instance)(tnccs_manager_t *this, tnccs_type_t type, bool is_server); @@ -67,53 +67,68 @@ struct tnccs_manager_t { * 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 recs pointer to IMV recommendation set - * @return assigned connection ID + * @param tnccs TNCCS connection instance + * @param send_message TNCCS callback function + * @param request_handshake_retry pointer to boolean variable + * @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, + bool *request_handshake_retry, recommendations_t **recs); /** * Remove a TNCCS connection using its connection ID. * - * @param id connection ID of the connection to be removed + * @param id ID of the connection to be removed */ void (*remove_connection)(tnccs_manager_t *this, TNC_ConnectionID id); /** + * Request a handshake retry + * + * @param is_imc TRUE if IMC, FALSE if IMV + * @param imcv_id ID of IMC or IMV requesting the retry + * @param id ID of a specific connection or any connection + * @param reason reason for the handshake retry + * @return return code + */ + TNC_Result (*request_handshake_retry)(tnccs_manager_t *this, bool is_imc, + TNC_UInt32 imcv_id, + TNC_ConnectionID id, + TNC_RetryReason reason); + + /** * Add an IMC/IMV message to the batch of a given connection ID. * * @param imc_id ID of IMC or TNC_IMCID_ANY * @param imv_id ID of IMV or TNC_IMVID_ANY - * @param connection_id ID of target connection + * @param id ID of target connection * @param msg message to be added * @param msg_len message length * @param msg_type message type * @return return code */ - TNC_Result (*send_message)(tnccs_manager_t *this, - TNC_IMCID imc_id, - TNC_IMVID imv_id, - TNC_ConnectionID connection_id, - TNC_BufferReference msg, - TNC_UInt32 msg_len, - TNC_MessageType msg_type); + TNC_Result (*send_message)(tnccs_manager_t *this, TNC_IMCID imc_id, + TNC_IMVID imv_id, + TNC_ConnectionID id, + TNC_BufferReference msg, + TNC_UInt32 msg_len, + TNC_MessageType msg_type); /** * Deliver an IMV Action Recommendation and IMV Evaluation Result to the TNCS * * @param imv_id ID of the IMV providing the recommendation - * @param connection_id ID of target connection + * @param id ID of target connection * @param rec action recommendation * @param eval evaluation result * @return return code */ TNC_Result (*provide_recommendation)(tnccs_manager_t *this, TNC_IMVID imv_id, - TNC_ConnectionID connection_id, + TNC_ConnectionID id, TNC_IMV_Action_Recommendation rec, TNC_IMV_Evaluation_Result eval); @@ -122,7 +137,7 @@ struct tnccs_manager_t { * TNCS as a whole. * * @param imv_id ID of the IMV requesting the attribute - * @param connection_id ID of target connection + * @param id ID of target connection * @param attribute_id ID of the requested attribute * @param buffer_len length of the buffer in bytes * @param buffer pointer to the buffer @@ -131,7 +146,7 @@ struct tnccs_manager_t { */ TNC_Result (*get_attribute)(tnccs_manager_t *this, TNC_IMVID imv_id, - TNC_ConnectionID connection_id, + TNC_ConnectionID id, TNC_AttributeID attribute_id, TNC_UInt32 buffer_len, TNC_BufferReference buffer, @@ -142,7 +157,7 @@ struct tnccs_manager_t { * TNCS as a whole. * * @param imv_id ID of the IMV setting the attribute - * @param connection_id ID of target connection + * @param id ID of target connection * @param attribute_id ID of the attribute to be set * @param buffer_len length of the buffer in bytes * @param buffer pointer to the buffer @@ -150,7 +165,7 @@ struct tnccs_manager_t { */ TNC_Result (*set_attribute)(tnccs_manager_t *this, TNC_IMVID imv_id, - TNC_ConnectionID connection_id, + TNC_ConnectionID id, TNC_AttributeID attribute_id, TNC_UInt32 buffer_len, TNC_BufferReference buffer); |