upgraded Test IMC/IMV pair to fully support multple IMC IDs

This commit is contained in:
Andreas Steffen
2011-12-11 22:01:49 +01:00
parent 6f04ccff5e
commit 63179fd459
7 changed files with 149 additions and 81 deletions
+72 -5
View File
@@ -15,6 +15,7 @@
#include "imv_test_state.h"
#include <utils/lexparser.h>
#include <utils/linked_list.h>
#include <debug.h>
typedef struct private_imv_test_state_t private_imv_test_state_t;
@@ -60,12 +61,22 @@ struct private_imv_test_state_t {
TNC_IMV_Evaluation_Result eval;
/**
* IMC-IMV round-trip count
* List of IMCs
*/
int rounds;
linked_list_t *imcs;
};
typedef struct imc_entry_t imc_entry_t;
/**
* Define an internal IMC entry
*/
struct imc_entry_t {
TNC_UInt32 imc_id;
int rounds;
};
typedef struct entry_t entry_t;
/**
@@ -180,19 +191,73 @@ METHOD(imv_state_t, get_reason_string, bool,
METHOD(imv_state_t, destroy, void,
private_imv_test_state_t *this)
{
this->imcs->destroy_function(this->imcs, free);
free(this);
}
METHOD(imv_test_state_t, add_imc, void,
private_imv_test_state_t *this, TNC_UInt32 imc_id, int rounds)
{
enumerator_t *enumerator;
imc_entry_t *imc_entry;
bool found = FALSE;
enumerator = this->imcs->create_enumerator(this->imcs);
while (enumerator->enumerate(enumerator, &imc_entry))
{
if (imc_entry->imc_id == imc_id)
{
found = TRUE;
break;
}
}
enumerator->destroy(enumerator);
if (!found)
{
imc_entry = malloc_thing(imc_entry_t);
imc_entry->imc_id = imc_id;
imc_entry->rounds = rounds;
this->imcs->insert_last(this->imcs, imc_entry);
}
}
METHOD(imv_test_state_t, set_rounds, void,
private_imv_test_state_t *this, int rounds)
{
this->rounds = rounds;
enumerator_t *enumerator;
imc_entry_t *imc_entry;
enumerator = this->imcs->create_enumerator(this->imcs);
while (enumerator->enumerate(enumerator, &imc_entry))
{
imc_entry->rounds = rounds;
}
enumerator->destroy(enumerator);
}
METHOD(imv_test_state_t, another_round, bool,
private_imv_test_state_t *this)
private_imv_test_state_t *this, TNC_UInt32 imc_id)
{
return (this->rounds-- > 0);
enumerator_t *enumerator;
imc_entry_t *imc_entry;
bool not_finished = FALSE;
enumerator = this->imcs->create_enumerator(this->imcs);
while (enumerator->enumerate(enumerator, &imc_entry))
{
if (imc_entry->rounds > 0)
{
not_finished = TRUE;
}
if (imc_entry->imc_id == imc_id)
{
imc_entry->rounds--;
}
}
enumerator->destroy(enumerator);
return not_finished;
}
/**
@@ -215,6 +280,7 @@ imv_state_t *imv_test_state_create(TNC_ConnectionID connection_id)
.get_reason_string = _get_reason_string,
.destroy = _destroy,
},
.add_imc = _add_imc,
.set_rounds = _set_rounds,
.another_round = _another_round,
},
@@ -222,6 +288,7 @@ imv_state_t *imv_test_state_create(TNC_ConnectionID connection_id)
.rec = TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION,
.eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW,
.connection_id = connection_id,
.imcs = linked_list_create(),
);
return &this->public.interface;