nearly completed PA-TNC error handling

This commit is contained in:
Andreas Steffen
2011-06-05 23:24:48 +02:00
parent eeef482242
commit d8f7f2f004
10 changed files with 447 additions and 53 deletions
+58
View File
@@ -319,6 +319,63 @@ METHOD(imv_agent_t, set_recommendation, TNC_Result,
return this->provide_recommendation(this->id, connection_id, rec, eval);
}
METHOD(imv_agent_t, receive_message, TNC_Result,
private_imv_agent_t *this, TNC_ConnectionID connection_id, chunk_t msg,
TNC_MessageType msg_type, pa_tnc_msg_t **pa_tnc_msg)
{
pa_tnc_msg_t *pa_msg, *error_msg;
pa_tnc_attr_t *error_attr;
enumerator_t *enumerator;
TNC_Result result;
DBG2(DBG_IMV, "IMV %u \"%s\" received message type 0x%08x for Connection ID %u",
this->id, this->name, msg_type, connection_id);
*pa_tnc_msg = NULL;
pa_msg = pa_tnc_msg_create_from_data(msg);
switch (pa_msg->process(pa_msg))
{
case SUCCESS:
*pa_tnc_msg = pa_msg;
break;
case VERIFY_ERROR:
if (!this->send_message)
{
/* TNCS doen't have a SendMessage() function */
return TNC_RESULT_FATAL;
}
/* build error message */
error_msg = pa_tnc_msg_create();
enumerator = pa_msg->create_error_enumerator(pa_msg);
while (enumerator->enumerate(enumerator, &error_attr))
{
error_msg->add_attribute(error_msg,
error_attr->get_ref(error_attr));
}
enumerator->destroy(enumerator);
error_msg->build(error_msg);
/* send error message */
msg = error_msg->get_encoding(error_msg);
result = this->send_message(this->id, connection_id,
msg.ptr, msg.len, msg_type);
/* clean up */
error_msg->destroy(error_msg);
pa_msg->destroy(pa_msg);
return result;
case FAILED:
default:
pa_msg->destroy(pa_msg);
return set_recommendation(this, connection_id,
TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION,
TNC_IMV_EVALUATION_RESULT_ERROR);
}
return TNC_RESULT_SUCCESS;
}
METHOD(imv_agent_t, provide_recommendation, TNC_Result,
private_imv_agent_t *this, TNC_ConnectionID connection_id)
{
@@ -373,6 +430,7 @@ imv_agent_t *imv_agent_create(const char *name,
.change_state = _change_state,
.get_state = _get_state,
.send_message = _send_message,
.receive_message = _receive_message,
.set_recommendation = _set_recommendation,
.provide_recommendation = _provide_recommendation,
.destroy = _destroy,
+16 -1
View File
@@ -22,6 +22,7 @@
#define IMV_AGENT_H_
#include "imv_state.h"
#include "pa_tnc/pa_tnc_msg.h"
#include <tncifimv.h>
#include <pen/pen.h>
@@ -131,7 +132,7 @@ struct imv_agent_t {
TNC_ConnectionID connection_id, imv_state_t **state);
/**
* Call when an IMV-IMC message is to be sent
* Call when a PA-TNC message is to be sent
*
* @param connection_id network connection ID assigned by TNCS
* @param msg message to send
@@ -140,6 +141,20 @@ struct imv_agent_t {
TNC_Result (*send_message)(imv_agent_t *this,
TNC_ConnectionID connection_id, chunk_t msg);
/**
* Call when a PA-TNC message was received
*
* @param connection_id network connection ID assigned by TNCS
* @param msg received unparsed message
* @param msg_type message type of the received message
* @param pa_tnc_message parsed PA-TNC message or NULL if an error occurred
* @return TNC result code
*/
TNC_Result (*receive_message)(imv_agent_t *this,
TNC_ConnectionID connection_id, chunk_t msg,
TNC_MessageType msg_type,
pa_tnc_msg_t **pa_tnc_msg);
/**
* Set Action Recommendation and Evaluation Result in the IMV state
*