moved imc_test/imv_test plugins to libimcv
authorAndreas Steffen <andreas.steffen@strongswan.org>
Wed, 1 Jun 2011 05:54:14 +0000 (07:54 +0200)
committerAndreas Steffen <andreas.steffen@strongswan.org>
Wed, 1 Jun 2011 05:55:07 +0000 (07:55 +0200)
18 files changed:
src/libcharon/Makefile.am
src/libcharon/plugins/imc_test/Makefile.am [deleted file]
src/libcharon/plugins/imc_test/imc_test.c [deleted file]
src/libcharon/plugins/imc_test/imc_test_state.c [deleted file]
src/libcharon/plugins/imc_test/imc_test_state.h [deleted file]
src/libcharon/plugins/imv_test/Makefile.am [deleted file]
src/libcharon/plugins/imv_test/imv_test.c [deleted file]
src/libcharon/plugins/imv_test/imv_test_state.c [deleted file]
src/libcharon/plugins/imv_test/imv_test_state.h [deleted file]
src/libimcv/Makefile.am
src/libimcv/plugins/imc_test/Makefile.am [new file with mode: 0644]
src/libimcv/plugins/imc_test/imc_test.c [new file with mode: 0644]
src/libimcv/plugins/imc_test/imc_test_state.c [new file with mode: 0644]
src/libimcv/plugins/imc_test/imc_test_state.h [new file with mode: 0644]
src/libimcv/plugins/imv_test/Makefile.am [new file with mode: 0644]
src/libimcv/plugins/imv_test/imv_test.c [new file with mode: 0644]
src/libimcv/plugins/imv_test/imv_test_state.c [new file with mode: 0644]
src/libimcv/plugins/imv_test/imv_test_state.h [new file with mode: 0644]

index 23c57cb..08f3981 100644 (file)
@@ -371,14 +371,6 @@ if MONOLITHIC
 endif
 endif
 
-if USE_IMC_TEST
-  SUBDIRS += plugins/imc_test
-endif
-
-if USE_IMV_TEST
-  SUBDIRS += plugins/imv_test
-endif
-
 if USE_MEDSRV
   SUBDIRS += plugins/medsrv
 if MONOLITHIC
diff --git a/src/libcharon/plugins/imc_test/Makefile.am b/src/libcharon/plugins/imc_test/Makefile.am
deleted file mode 100644 (file)
index ffad4e4..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-
-INCLUDES = -I$(top_srcdir)/src/libstrongswan -I$(top_srcdir)/src/libhydra \
-       -I$(top_srcdir)/src/libcharon -I$(top_srcdir)/src/libimcv
-
-AM_CFLAGS = -rdynamic
-
-plugin_LTLIBRARIES = libstrongswan-imc-test.la
-
-libstrongswan_imc_test_la_LIBADD = $(top_builddir)/src/libimcv/libimcv.la
-
-libstrongswan_imc_test_la_SOURCES = imc_test.c \
-       imc_test_state.h imc_test_state.c
-
-libstrongswan_imc_test_la_LDFLAGS = -module -avoid-version
-
diff --git a/src/libcharon/plugins/imc_test/imc_test.c b/src/libcharon/plugins/imc_test/imc_test.c
deleted file mode 100644 (file)
index ad5d3b0..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#include "imc_test_state.h"
-
-#include <imc/imc_agent.h>
-#include <pa_tnc/pa_tnc_msg.h>
-#include <ita/ita_attr_command.h>
-#include <tnc/pen/pen.h>
-#include <debug.h>
-
-/* IMC definitions */
-
-static const char imc_name[] = "Test";
-
-#define IMC_VENDOR_ID  PEN_ITA
-#define IMC_SUBTYPE            0x01
-
-static imc_agent_t *imc_test;
-/**
- * see section 3.7.1 of TCG TNC IF-IMC Specification 1.2
- */
-TNC_Result TNC_IMC_Initialize(TNC_IMCID imc_id,
-                                                         TNC_Version min_version,
-                                                         TNC_Version max_version,
-                                                         TNC_Version *actual_version)
-{
-       if (imc_test)
-       {
-               DBG1(DBG_IMC, "IMC \"%s\" has already been initialized", imc_name);
-               return TNC_RESULT_ALREADY_INITIALIZED;
-       }
-       if (min_version > TNC_IFIMC_VERSION_1 || max_version < TNC_IFIMC_VERSION_1)
-       {
-               DBG1(DBG_IMC, "no common IF-IMC version");
-               return TNC_RESULT_NO_COMMON_VERSION;
-       }
-       imc_test = imc_agent_create(imc_name, IMC_VENDOR_ID, IMC_SUBTYPE,
-                                                               imc_id, actual_version);
-       return TNC_RESULT_SUCCESS;
-}
-
-/**
- * see section 3.7.2 of TCG TNC IF-IMC Specification 1.2
- */
-TNC_Result TNC_IMC_NotifyConnectionChange(TNC_IMCID imc_id,
-                                                                                 TNC_ConnectionID connection_id,
-                                                                                 TNC_ConnectionState new_state)
-{
-       imc_state_t *state;
-
-       if (!imc_test)
-       {
-               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-       switch (new_state)
-       {
-               case TNC_CONNECTION_STATE_CREATE:
-                       state = imc_test_state_create(connection_id);
-                       return imc_test->create_state(imc_test, state);
-               case TNC_CONNECTION_STATE_DELETE:
-                       return imc_test->delete_state(imc_test, connection_id);
-               default:
-                       return imc_test->change_state(imc_test, connection_id, new_state);
-       }
-}
-
-static TNC_Result send_message(TNC_ConnectionID connection_id)
-{
-       pa_tnc_msg_t *msg;
-       pa_tnc_attr_t *attr;
-       char *command;
-       TNC_Result result;
-
-       command = lib->settings->get_str(lib->settings, "imc-test.command", "none");
-       attr = ita_attr_command_create(command);
-       attr->set_noskip_flag(attr, TRUE);
-       msg = pa_tnc_msg_create();
-       msg->add_attribute(msg, attr);
-       msg->build(msg);
-       result = imc_test->send_message(imc_test, connection_id,
-                                                                       msg->get_encoding(msg));        
-       msg->destroy(msg);
-
-       return result;
-}
-
-/**
- * see section 3.7.3 of TCG TNC IF-IMC Specification 1.2
- */
-TNC_Result TNC_IMC_BeginHandshake(TNC_IMCID imc_id,
-                                                                 TNC_ConnectionID connection_id)
-{
-       if (!imc_test)
-       {
-               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-       return send_message(connection_id);
-}
-
-/**
- * see section 3.7.4 of TCG TNC IF-IMC Specification 1.2
- */
-TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id,
-                                                                 TNC_ConnectionID connection_id,
-                                                                 TNC_BufferReference msg,
-                                                                 TNC_UInt32 msg_len,
-                                                                 TNC_MessageType msg_type)
-{
-       pa_tnc_msg_t *pa_tnc_msg;
-       status_t status;
-
-       if (!imc_test)
-       {
-               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-
-       /* process received message */
-       DBG2(DBG_IMC, "IMC %u \"%s\" received message type 0x%08x for Connection ID %u",
-                                  imc_id, imc_name, msg_type, connection_id);
-       pa_tnc_msg = pa_tnc_msg_create_from_data(chunk_create(msg, msg_len));
-       status = pa_tnc_msg->process(pa_tnc_msg);
-       pa_tnc_msg->destroy(pa_tnc_msg);
-       if (status != SUCCESS)
-       {
-               return TNC_RESULT_FATAL;
-       }
-
-       /* always return the same response */
-       return send_message(connection_id);
-}
-
-/**
- * see section 3.7.5 of TCG TNC IF-IMC Specification 1.2
- */
-TNC_Result TNC_IMC_BatchEnding(TNC_IMCID imc_id,
-                                                          TNC_ConnectionID connection_id)
-{
-       if (!imc_test)
-       {
-               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-       return TNC_RESULT_SUCCESS;
-}
-
-/**
- * see section 3.7.6 of TCG TNC IF-IMC Specification 1.2
- */
-TNC_Result TNC_IMC_Terminate(TNC_IMCID imc_id)
-{
-       if (!imc_test)
-       {
-               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-       imc_test->destroy(imc_test);
-       imc_test = NULL;
-
-       return TNC_RESULT_SUCCESS;
-}
-
-/**
- * see section 4.2.8.1 of TCG TNC IF-IMC Specification 1.2
- */
-TNC_Result TNC_IMC_ProvideBindFunction(TNC_IMCID imc_id,
-                                                                          TNC_TNCC_BindFunctionPointer bind_function)
-{
-       if (!imc_test)
-       {
-               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-       return imc_test->bind_functions(imc_test, bind_function);
-}
diff --git a/src/libcharon/plugins/imc_test/imc_test_state.c b/src/libcharon/plugins/imc_test/imc_test_state.c
deleted file mode 100644 (file)
index 1b60f32..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#include "imc_test_state.h"
-
-#include <debug.h>
-
-typedef struct private_imc_test_state_t private_imc_test_state_t;
-
-/**
- * Private data of an imc_test_state_t object.
- */
-struct private_imc_test_state_t {
-
-       /**
-        * Public members of imc_test_state_t
-        */
-       imc_test_state_t public;
-
-       /**
-        * TNCCS connection ID
-        */
-       TNC_ConnectionID connection_id;
-
-       /**
-        * TNCCS connection state
-        */
-       TNC_ConnectionState state;
-
-};
-
-METHOD(imc_state_t, get_connection_id, TNC_ConnectionID,
-       private_imc_test_state_t *this)
-{
-       return this->connection_id;
-}
-
-METHOD(imc_state_t, change_state, void,
-       private_imc_test_state_t *this, TNC_ConnectionState new_state)
-{
-       this->state = new_state;
-}
-
-METHOD(imc_state_t, destroy, void,
-       private_imc_test_state_t *this)
-{
-       free(this);
-}
-
-/**
- * Described in header.
- */
-imc_state_t *imc_test_state_create(TNC_ConnectionID connection_id)
-{
-       private_imc_test_state_t *this;
-
-       INIT(this,
-               .public = {
-                       .interface = {
-                               .get_connection_id = _get_connection_id,
-                               .change_state = _change_state,
-                               .destroy = _destroy,
-                       },
-               },
-               .state = TNC_CONNECTION_STATE_CREATE,
-               .connection_id = connection_id,
-       );
-       
-       return &this->public.interface;
-}
-
-
diff --git a/src/libcharon/plugins/imc_test/imc_test_state.h b/src/libcharon/plugins/imc_test/imc_test_state.h
deleted file mode 100644 (file)
index 6d2dc5e..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2011 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 imc_test_state_t imc_test_state
- * @{ @ingroup imc_test_state
- */
-
-#ifndef IMC_TEST_STATE_H_
-#define IMC_TEST_STATE_H_
-
-#include <imc/imc_state.h>
-#include <library.h>
-
-typedef struct imc_test_state_t imc_test_state_t;
-
-/**
- * Internal state of an imc_test_t connection instance
- */
-struct imc_test_state_t {
-
-       /**
-        * imc_state_t interface
-        */
-       imc_state_t interface;
-};
-
-/**
- * Create an imc_test_state_t instance
- *
- * @param id           connection ID
- * @param rounds       total number of IMC re-measurements
- */
-imc_state_t* imc_test_state_create(TNC_ConnectionID id);
-
-#endif /** IMC_TEST_STATE_H_ @}*/
diff --git a/src/libcharon/plugins/imv_test/Makefile.am b/src/libcharon/plugins/imv_test/Makefile.am
deleted file mode 100644 (file)
index 59a6cc8..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-
-INCLUDES = -I$(top_srcdir)/src/libstrongswan -I$(top_srcdir)/src/libhydra \
-       -I$(top_srcdir)/src/libcharon -I$(top_srcdir)/src/libimcv
-
-AM_CFLAGS = -rdynamic
-
-plugin_LTLIBRARIES = libstrongswan-imv-test.la
-
-libstrongswan_imv_test_la_LIBADD = $(top_builddir)/src/libimcv/libimcv.la
-
-libstrongswan_imv_test_la_SOURCES = imv_test.c \
-       imv_test_state.h imv_test_state.c
-
-libstrongswan_imv_test_la_LDFLAGS = -module -avoid-version
-
diff --git a/src/libcharon/plugins/imv_test/imv_test.c b/src/libcharon/plugins/imv_test/imv_test.c
deleted file mode 100644 (file)
index 92605d1..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#include "imv_test_state.h"
-
-#include <imv/imv_agent.h>
-#include <pa_tnc/pa_tnc_msg.h>
-#include <ita/ita_attr_command.h>
-#include <tnc/pen/pen.h>
-#include <debug.h>
-
-/* IMV definitions */
-
-static const char imv_name[] = "Test";
-
-#define IMV_VENDOR_ID  PEN_ITA
-#define IMV_SUBTYPE            0x01
-
-static imv_agent_t *imv_test;
-
-/**
- * see section 3.7.1 of TCG TNC IF-IMV Specification 1.2
- */
-TNC_Result TNC_IMV_Initialize(TNC_IMVID imv_id,
-                                                         TNC_Version min_version,
-                                                         TNC_Version max_version,
-                                                         TNC_Version *actual_version)
-{
-       if (imv_test)
-       {
-               DBG1(DBG_IMV, "IMV \"%s\" has already been initialized", imv_name);
-               return TNC_RESULT_ALREADY_INITIALIZED;
-       }
-       if (min_version > TNC_IFIMV_VERSION_1 || max_version < TNC_IFIMV_VERSION_1)
-       {
-               DBG1(DBG_IMV, "no common IF-IMV version");
-               return TNC_RESULT_NO_COMMON_VERSION;
-       }
-       imv_test = imv_agent_create(imv_name, IMV_VENDOR_ID, IMV_SUBTYPE,
-                                                               imv_id, actual_version);
-       return TNC_RESULT_SUCCESS;
-}
-
-/**
- * see section 3.7.2 of TCG TNC IF-IMV Specification 1.2
- */
-TNC_Result TNC_IMV_NotifyConnectionChange(TNC_IMVID imv_id,
-                                                                                 TNC_ConnectionID connection_id,
-                                                                                 TNC_ConnectionState new_state)
-{
-       imv_state_t *state;
-       int rounds;
-
-       if (!imv_test)
-       {
-               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-       switch (new_state)
-       {
-               case TNC_CONNECTION_STATE_CREATE:
-                       rounds = lib->settings->get_int(lib->settings, "imv-test.rounds", 0);
-                       state = imv_test_state_create(connection_id, rounds);
-                       return imv_test->create_state(imv_test, state);
-               case TNC_CONNECTION_STATE_DELETE:
-                       return imv_test->delete_state(imv_test, connection_id);
-               default:
-                       return imv_test->change_state(imv_test, connection_id, new_state);
-       }
-}
-
-static TNC_Result send_message(TNC_ConnectionID connection_id)
-{
-       pa_tnc_msg_t *msg;
-       pa_tnc_attr_t *attr;
-       TNC_Result result;
-
-       attr = ita_attr_command_create("repeat");
-       msg = pa_tnc_msg_create();
-       msg->add_attribute(msg, attr);
-       msg->build(msg);
-       result = imv_test->send_message(imv_test, connection_id,
-                                                                       msg->get_encoding(msg));        
-       msg->destroy(msg);
-
-       return result;
-}
-
-/**
- * see section 3.7.3 of TCG TNC IF-IMV Specification 1.2
- */
-TNC_Result TNC_IMV_ReceiveMessage(TNC_IMVID imv_id,
-                                                                 TNC_ConnectionID connection_id,
-                                                                 TNC_BufferReference msg,
-                                                                 TNC_UInt32 msg_len,
-                                                                 TNC_MessageType msg_type)
-{
-       pa_tnc_msg_t *pa_tnc_msg;
-       pa_tnc_attr_t *attr;
-       imv_state_t *state;
-       imv_test_state_t *imv_test_state;
-       TNC_Result result = TNC_RESULT_SUCCESS;
-       enumerator_t *enumerator;
-
-       if (!imv_test)
-       {
-               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-
-       /* process received message */
-       DBG2(DBG_IMV, "IMV %u \"%s\" received message type 0x%08x for Connection ID %u",
-                                  imv_id, imv_name, msg_type, connection_id);
-       pa_tnc_msg = pa_tnc_msg_create_from_data(chunk_create(msg, msg_len));
-
-       if (pa_tnc_msg->process(pa_tnc_msg) != SUCCESS)
-       {
-               pa_tnc_msg->destroy(pa_tnc_msg);
-               return TNC_RESULT_FATAL;
-       }
-
-       /* get current IMV state */
-       if (!imv_test->get_state(imv_test, connection_id, &state))
-       {
-               pa_tnc_msg->destroy(pa_tnc_msg);
-               return TNC_RESULT_FATAL;
-       }
-
-       enumerator = pa_tnc_msg->create_attribute_enumerator(pa_tnc_msg);
-       while (enumerator->enumerate(enumerator, &attr))
-       {
-               if (attr->get_vendor_id(attr) == PEN_ITA &&
-                       attr->get_type(attr) == ITA_ATTR_COMMAND)
-               {
-                       ita_attr_command_t *ita_attr;
-                       char *command;
-       
-                       ita_attr = (ita_attr_command_t*)attr;
-                       command = ita_attr->get_command(ita_attr);
-
-                       if (streq(command, "allow"))
-                       {
-                               state->set_recommendation(state,
-                                                               TNC_IMV_ACTION_RECOMMENDATION_ALLOW,
-                                                               TNC_IMV_EVALUATION_RESULT_COMPLIANT);                     
-                       }
-                       else if (streq(command, "isolate"))
-                       {
-                               state->set_recommendation(state,
-                                                               TNC_IMV_ACTION_RECOMMENDATION_ISOLATE,
-                                                               TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR);                    
-                       }
-                       else if (streq(command, "none"))
-                       {
-                               state->set_recommendation(state,
-                                                               TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS,
-                                                               TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR);                    
-                       }
-                       else
-                       {
-                               result = TNC_RESULT_FATAL;
-                       }
-                       break;
-               }               
-       }
-       enumerator->destroy(enumerator);
-       pa_tnc_msg->destroy(pa_tnc_msg);
-
-       if (result != TNC_RESULT_SUCCESS)
-       {
-               return result;
-       }
-
-       /* repeat the measurement ? */
-       imv_test_state = (imv_test_state_t*)state;
-       if (imv_test_state->another_round(imv_test_state))
-       {
-               return send_message(connection_id);
-       }
-
-       return imv_test->provide_recommendation(imv_test, connection_id);
-}
-
-/**
- * see section 3.7.4 of TCG TNC IF-IMV Specification 1.2
- */
-TNC_Result TNC_IMV_SolicitRecommendation(TNC_IMVID imv_id,
-                                                                                TNC_ConnectionID connection_id)
-{
-       if (!imv_test)
-       {
-               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-       return imv_test->provide_recommendation(imv_test, connection_id);
-}
-
-/**
- * see section 3.7.5 of TCG TNC IF-IMV Specification 1.2
- */
-TNC_Result TNC_IMV_BatchEnding(TNC_IMVID imv_id,
-                                                          TNC_ConnectionID connection_id)
-{
-       if (!imv_test)
-       {
-               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-       return TNC_RESULT_SUCCESS;
-}
-
-/**
- * see section 3.7.6 of TCG TNC IF-IMV Specification 1.2
- */
-TNC_Result TNC_IMV_Terminate(TNC_IMVID imv_id)
-{
-       if (!imv_test)
-       {
-               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-       imv_test->destroy(imv_test);
-       imv_test = NULL;
-
-       return TNC_RESULT_SUCCESS;
-}
-
-/**
- * see section 4.2.8.1 of TCG TNC IF-IMV Specification 1.2
- */
-TNC_Result TNC_IMV_ProvideBindFunction(TNC_IMVID imv_id,
-                                                                          TNC_TNCS_BindFunctionPointer bind_function)
-{
-       if (!imv_test)
-       {
-               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
-               return TNC_RESULT_NOT_INITIALIZED;
-       }
-       return imv_test->bind_functions(imv_test, bind_function);
-}
diff --git a/src/libcharon/plugins/imv_test/imv_test_state.c b/src/libcharon/plugins/imv_test/imv_test_state.c
deleted file mode 100644 (file)
index 21d0c4c..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#include "imv_test_state.h"
-
-#include <debug.h>
-
-typedef struct private_imv_test_state_t private_imv_test_state_t;
-
-/**
- * Private data of an imv_test_state_t object.
- */
-struct private_imv_test_state_t {
-
-       /**
-        * Public members of imv_test_state_t
-        */
-       imv_test_state_t public;
-
-       /**
-        * TNCCS connection ID
-        */
-       TNC_ConnectionID connection_id;
-
-       /**
-        * TNCCS connection state
-        */
-       TNC_ConnectionState state;
-
-       /**
-        * IMV action recommendation
-        */
-       TNC_IMV_Action_Recommendation rec;
-
-       /**
-        * IMV evaluation result
-        */
-       TNC_IMV_Evaluation_Result eval;
-
-       /**
-        * IMC-IMV round-trip count
-        */
-       int rounds;
-
-};
-
-METHOD(imv_state_t, get_connection_id, TNC_ConnectionID,
-       private_imv_test_state_t *this)
-{
-       return this->connection_id;
-}
-
-METHOD(imv_state_t, change_state, void,
-       private_imv_test_state_t *this, TNC_ConnectionState new_state)
-{
-       this->state = new_state;
-}
-
-METHOD(imv_state_t, get_recommendation, void,
-       private_imv_test_state_t *this, TNC_IMV_Action_Recommendation *rec,
-                                                                       TNC_IMV_Evaluation_Result *eval)
-{
-       *rec = this->rec;
-       *eval = this->eval;
-}
-
-METHOD(imv_state_t, set_recommendation, void,
-       private_imv_test_state_t *this, TNC_IMV_Action_Recommendation rec,
-                                                                       TNC_IMV_Evaluation_Result eval)
-{
-       this->rec = rec;
-       this->eval = eval;
-}
-
-METHOD(imv_state_t, destroy, void,
-       private_imv_test_state_t *this)
-{
-       free(this);
-}
-
-METHOD(imv_test_state_t, another_round, bool,
-       private_imv_test_state_t *this)
-{
-       return (this->rounds-- > 0);
-}
-
-/**
- * Described in header.
- */
-imv_state_t *imv_test_state_create(TNC_ConnectionID connection_id, int rounds)
-{
-       private_imv_test_state_t *this;
-
-       INIT(this,
-               .public = {
-                       .interface = {
-                               .get_connection_id = _get_connection_id,
-                               .change_state = _change_state,
-                               .get_recommendation = _get_recommendation,
-                               .set_recommendation = _set_recommendation,
-                               .destroy = _destroy,
-                       },
-                       .another_round = _another_round,
-               },
-               .state = TNC_CONNECTION_STATE_CREATE,
-               .rec = TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION,
-               .eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW,
-               .connection_id = connection_id,
-               .rounds = rounds,
-       );
-       
-       return &this->public.interface;
-}
-
-
diff --git a/src/libcharon/plugins/imv_test/imv_test_state.h b/src/libcharon/plugins/imv_test/imv_test_state.h
deleted file mode 100644 (file)
index 164aca9..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2011 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_test_state_t imv_test_state
- * @{ @ingroup imv_test_state
- */
-
-#ifndef IMV_TEST_STATE_H_
-#define IMV_TEST_STATE_H_
-
-#include <imv/imv_state.h>
-#include <library.h>
-
-typedef struct imv_test_state_t imv_test_state_t;
-
-/**
- * Internal state of an imv_test_t connection instance
- */
-struct imv_test_state_t {
-
-       /**
-        * imv_state_t interface
-        */
-       imv_state_t interface;
-
-       /**
-        * Check and decrease IMC-IMV round-trip count
-        *
-        * @return              new connection state
-        */
-       bool (*another_round)(imv_test_state_t *this);
-
-};
-
-/**
- * Create an imv_test_state_t instance
- *
- * @param id           connection ID
- * @param rounds       total number of IMC re-measurements
- */
-imv_state_t* imv_test_state_create(TNC_ConnectionID id, int rounds);
-
-#endif /** IMV_TEST_STATE_H_ @}*/
index 4caa77c..4df819d 100644 (file)
@@ -11,3 +11,13 @@ libimcv_la_SOURCES = \
        ita/ita_attr_command.h ita/ita_attr_command.c \
        pa_tnc/pa_tnc_msg.h pa_tnc/pa_tnc_msg.c \
        pa_tnc/pa_tnc_attr.h pa_tnc/pa_tnc_attr.c
+
+SUBDIRS = .
+
+if USE_IMC_TEST
+  SUBDIRS += plugins/imc_test
+endif
+
+if USE_IMV_TEST
+  SUBDIRS += plugins/imv_test
+endif
diff --git a/src/libimcv/plugins/imc_test/Makefile.am b/src/libimcv/plugins/imc_test/Makefile.am
new file mode 100644 (file)
index 0000000..ffad4e4
--- /dev/null
@@ -0,0 +1,15 @@
+
+INCLUDES = -I$(top_srcdir)/src/libstrongswan -I$(top_srcdir)/src/libhydra \
+       -I$(top_srcdir)/src/libcharon -I$(top_srcdir)/src/libimcv
+
+AM_CFLAGS = -rdynamic
+
+plugin_LTLIBRARIES = libstrongswan-imc-test.la
+
+libstrongswan_imc_test_la_LIBADD = $(top_builddir)/src/libimcv/libimcv.la
+
+libstrongswan_imc_test_la_SOURCES = imc_test.c \
+       imc_test_state.h imc_test_state.c
+
+libstrongswan_imc_test_la_LDFLAGS = -module -avoid-version
+
diff --git a/src/libimcv/plugins/imc_test/imc_test.c b/src/libimcv/plugins/imc_test/imc_test.c
new file mode 100644 (file)
index 0000000..ad5d3b0
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+#include "imc_test_state.h"
+
+#include <imc/imc_agent.h>
+#include <pa_tnc/pa_tnc_msg.h>
+#include <ita/ita_attr_command.h>
+#include <tnc/pen/pen.h>
+#include <debug.h>
+
+/* IMC definitions */
+
+static const char imc_name[] = "Test";
+
+#define IMC_VENDOR_ID  PEN_ITA
+#define IMC_SUBTYPE            0x01
+
+static imc_agent_t *imc_test;
+/**
+ * see section 3.7.1 of TCG TNC IF-IMC Specification 1.2
+ */
+TNC_Result TNC_IMC_Initialize(TNC_IMCID imc_id,
+                                                         TNC_Version min_version,
+                                                         TNC_Version max_version,
+                                                         TNC_Version *actual_version)
+{
+       if (imc_test)
+       {
+               DBG1(DBG_IMC, "IMC \"%s\" has already been initialized", imc_name);
+               return TNC_RESULT_ALREADY_INITIALIZED;
+       }
+       if (min_version > TNC_IFIMC_VERSION_1 || max_version < TNC_IFIMC_VERSION_1)
+       {
+               DBG1(DBG_IMC, "no common IF-IMC version");
+               return TNC_RESULT_NO_COMMON_VERSION;
+       }
+       imc_test = imc_agent_create(imc_name, IMC_VENDOR_ID, IMC_SUBTYPE,
+                                                               imc_id, actual_version);
+       return TNC_RESULT_SUCCESS;
+}
+
+/**
+ * see section 3.7.2 of TCG TNC IF-IMC Specification 1.2
+ */
+TNC_Result TNC_IMC_NotifyConnectionChange(TNC_IMCID imc_id,
+                                                                                 TNC_ConnectionID connection_id,
+                                                                                 TNC_ConnectionState new_state)
+{
+       imc_state_t *state;
+
+       if (!imc_test)
+       {
+               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+       switch (new_state)
+       {
+               case TNC_CONNECTION_STATE_CREATE:
+                       state = imc_test_state_create(connection_id);
+                       return imc_test->create_state(imc_test, state);
+               case TNC_CONNECTION_STATE_DELETE:
+                       return imc_test->delete_state(imc_test, connection_id);
+               default:
+                       return imc_test->change_state(imc_test, connection_id, new_state);
+       }
+}
+
+static TNC_Result send_message(TNC_ConnectionID connection_id)
+{
+       pa_tnc_msg_t *msg;
+       pa_tnc_attr_t *attr;
+       char *command;
+       TNC_Result result;
+
+       command = lib->settings->get_str(lib->settings, "imc-test.command", "none");
+       attr = ita_attr_command_create(command);
+       attr->set_noskip_flag(attr, TRUE);
+       msg = pa_tnc_msg_create();
+       msg->add_attribute(msg, attr);
+       msg->build(msg);
+       result = imc_test->send_message(imc_test, connection_id,
+                                                                       msg->get_encoding(msg));        
+       msg->destroy(msg);
+
+       return result;
+}
+
+/**
+ * see section 3.7.3 of TCG TNC IF-IMC Specification 1.2
+ */
+TNC_Result TNC_IMC_BeginHandshake(TNC_IMCID imc_id,
+                                                                 TNC_ConnectionID connection_id)
+{
+       if (!imc_test)
+       {
+               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+       return send_message(connection_id);
+}
+
+/**
+ * see section 3.7.4 of TCG TNC IF-IMC Specification 1.2
+ */
+TNC_Result TNC_IMC_ReceiveMessage(TNC_IMCID imc_id,
+                                                                 TNC_ConnectionID connection_id,
+                                                                 TNC_BufferReference msg,
+                                                                 TNC_UInt32 msg_len,
+                                                                 TNC_MessageType msg_type)
+{
+       pa_tnc_msg_t *pa_tnc_msg;
+       status_t status;
+
+       if (!imc_test)
+       {
+               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+
+       /* process received message */
+       DBG2(DBG_IMC, "IMC %u \"%s\" received message type 0x%08x for Connection ID %u",
+                                  imc_id, imc_name, msg_type, connection_id);
+       pa_tnc_msg = pa_tnc_msg_create_from_data(chunk_create(msg, msg_len));
+       status = pa_tnc_msg->process(pa_tnc_msg);
+       pa_tnc_msg->destroy(pa_tnc_msg);
+       if (status != SUCCESS)
+       {
+               return TNC_RESULT_FATAL;
+       }
+
+       /* always return the same response */
+       return send_message(connection_id);
+}
+
+/**
+ * see section 3.7.5 of TCG TNC IF-IMC Specification 1.2
+ */
+TNC_Result TNC_IMC_BatchEnding(TNC_IMCID imc_id,
+                                                          TNC_ConnectionID connection_id)
+{
+       if (!imc_test)
+       {
+               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+       return TNC_RESULT_SUCCESS;
+}
+
+/**
+ * see section 3.7.6 of TCG TNC IF-IMC Specification 1.2
+ */
+TNC_Result TNC_IMC_Terminate(TNC_IMCID imc_id)
+{
+       if (!imc_test)
+       {
+               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+       imc_test->destroy(imc_test);
+       imc_test = NULL;
+
+       return TNC_RESULT_SUCCESS;
+}
+
+/**
+ * see section 4.2.8.1 of TCG TNC IF-IMC Specification 1.2
+ */
+TNC_Result TNC_IMC_ProvideBindFunction(TNC_IMCID imc_id,
+                                                                          TNC_TNCC_BindFunctionPointer bind_function)
+{
+       if (!imc_test)
+       {
+               DBG1(DBG_IMC, "IMC \"%s\" has not been initialized", imc_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+       return imc_test->bind_functions(imc_test, bind_function);
+}
diff --git a/src/libimcv/plugins/imc_test/imc_test_state.c b/src/libimcv/plugins/imc_test/imc_test_state.c
new file mode 100644 (file)
index 0000000..1b60f32
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+#include "imc_test_state.h"
+
+#include <debug.h>
+
+typedef struct private_imc_test_state_t private_imc_test_state_t;
+
+/**
+ * Private data of an imc_test_state_t object.
+ */
+struct private_imc_test_state_t {
+
+       /**
+        * Public members of imc_test_state_t
+        */
+       imc_test_state_t public;
+
+       /**
+        * TNCCS connection ID
+        */
+       TNC_ConnectionID connection_id;
+
+       /**
+        * TNCCS connection state
+        */
+       TNC_ConnectionState state;
+
+};
+
+METHOD(imc_state_t, get_connection_id, TNC_ConnectionID,
+       private_imc_test_state_t *this)
+{
+       return this->connection_id;
+}
+
+METHOD(imc_state_t, change_state, void,
+       private_imc_test_state_t *this, TNC_ConnectionState new_state)
+{
+       this->state = new_state;
+}
+
+METHOD(imc_state_t, destroy, void,
+       private_imc_test_state_t *this)
+{
+       free(this);
+}
+
+/**
+ * Described in header.
+ */
+imc_state_t *imc_test_state_create(TNC_ConnectionID connection_id)
+{
+       private_imc_test_state_t *this;
+
+       INIT(this,
+               .public = {
+                       .interface = {
+                               .get_connection_id = _get_connection_id,
+                               .change_state = _change_state,
+                               .destroy = _destroy,
+                       },
+               },
+               .state = TNC_CONNECTION_STATE_CREATE,
+               .connection_id = connection_id,
+       );
+       
+       return &this->public.interface;
+}
+
+
diff --git a/src/libimcv/plugins/imc_test/imc_test_state.h b/src/libimcv/plugins/imc_test/imc_test_state.h
new file mode 100644 (file)
index 0000000..6d2dc5e
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 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 imc_test_state_t imc_test_state
+ * @{ @ingroup imc_test_state
+ */
+
+#ifndef IMC_TEST_STATE_H_
+#define IMC_TEST_STATE_H_
+
+#include <imc/imc_state.h>
+#include <library.h>
+
+typedef struct imc_test_state_t imc_test_state_t;
+
+/**
+ * Internal state of an imc_test_t connection instance
+ */
+struct imc_test_state_t {
+
+       /**
+        * imc_state_t interface
+        */
+       imc_state_t interface;
+};
+
+/**
+ * Create an imc_test_state_t instance
+ *
+ * @param id           connection ID
+ * @param rounds       total number of IMC re-measurements
+ */
+imc_state_t* imc_test_state_create(TNC_ConnectionID id);
+
+#endif /** IMC_TEST_STATE_H_ @}*/
diff --git a/src/libimcv/plugins/imv_test/Makefile.am b/src/libimcv/plugins/imv_test/Makefile.am
new file mode 100644 (file)
index 0000000..59a6cc8
--- /dev/null
@@ -0,0 +1,15 @@
+
+INCLUDES = -I$(top_srcdir)/src/libstrongswan -I$(top_srcdir)/src/libhydra \
+       -I$(top_srcdir)/src/libcharon -I$(top_srcdir)/src/libimcv
+
+AM_CFLAGS = -rdynamic
+
+plugin_LTLIBRARIES = libstrongswan-imv-test.la
+
+libstrongswan_imv_test_la_LIBADD = $(top_builddir)/src/libimcv/libimcv.la
+
+libstrongswan_imv_test_la_SOURCES = imv_test.c \
+       imv_test_state.h imv_test_state.c
+
+libstrongswan_imv_test_la_LDFLAGS = -module -avoid-version
+
diff --git a/src/libimcv/plugins/imv_test/imv_test.c b/src/libimcv/plugins/imv_test/imv_test.c
new file mode 100644 (file)
index 0000000..92605d1
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+#include "imv_test_state.h"
+
+#include <imv/imv_agent.h>
+#include <pa_tnc/pa_tnc_msg.h>
+#include <ita/ita_attr_command.h>
+#include <tnc/pen/pen.h>
+#include <debug.h>
+
+/* IMV definitions */
+
+static const char imv_name[] = "Test";
+
+#define IMV_VENDOR_ID  PEN_ITA
+#define IMV_SUBTYPE            0x01
+
+static imv_agent_t *imv_test;
+
+/**
+ * see section 3.7.1 of TCG TNC IF-IMV Specification 1.2
+ */
+TNC_Result TNC_IMV_Initialize(TNC_IMVID imv_id,
+                                                         TNC_Version min_version,
+                                                         TNC_Version max_version,
+                                                         TNC_Version *actual_version)
+{
+       if (imv_test)
+       {
+               DBG1(DBG_IMV, "IMV \"%s\" has already been initialized", imv_name);
+               return TNC_RESULT_ALREADY_INITIALIZED;
+       }
+       if (min_version > TNC_IFIMV_VERSION_1 || max_version < TNC_IFIMV_VERSION_1)
+       {
+               DBG1(DBG_IMV, "no common IF-IMV version");
+               return TNC_RESULT_NO_COMMON_VERSION;
+       }
+       imv_test = imv_agent_create(imv_name, IMV_VENDOR_ID, IMV_SUBTYPE,
+                                                               imv_id, actual_version);
+       return TNC_RESULT_SUCCESS;
+}
+
+/**
+ * see section 3.7.2 of TCG TNC IF-IMV Specification 1.2
+ */
+TNC_Result TNC_IMV_NotifyConnectionChange(TNC_IMVID imv_id,
+                                                                                 TNC_ConnectionID connection_id,
+                                                                                 TNC_ConnectionState new_state)
+{
+       imv_state_t *state;
+       int rounds;
+
+       if (!imv_test)
+       {
+               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+       switch (new_state)
+       {
+               case TNC_CONNECTION_STATE_CREATE:
+                       rounds = lib->settings->get_int(lib->settings, "imv-test.rounds", 0);
+                       state = imv_test_state_create(connection_id, rounds);
+                       return imv_test->create_state(imv_test, state);
+               case TNC_CONNECTION_STATE_DELETE:
+                       return imv_test->delete_state(imv_test, connection_id);
+               default:
+                       return imv_test->change_state(imv_test, connection_id, new_state);
+       }
+}
+
+static TNC_Result send_message(TNC_ConnectionID connection_id)
+{
+       pa_tnc_msg_t *msg;
+       pa_tnc_attr_t *attr;
+       TNC_Result result;
+
+       attr = ita_attr_command_create("repeat");
+       msg = pa_tnc_msg_create();
+       msg->add_attribute(msg, attr);
+       msg->build(msg);
+       result = imv_test->send_message(imv_test, connection_id,
+                                                                       msg->get_encoding(msg));        
+       msg->destroy(msg);
+
+       return result;
+}
+
+/**
+ * see section 3.7.3 of TCG TNC IF-IMV Specification 1.2
+ */
+TNC_Result TNC_IMV_ReceiveMessage(TNC_IMVID imv_id,
+                                                                 TNC_ConnectionID connection_id,
+                                                                 TNC_BufferReference msg,
+                                                                 TNC_UInt32 msg_len,
+                                                                 TNC_MessageType msg_type)
+{
+       pa_tnc_msg_t *pa_tnc_msg;
+       pa_tnc_attr_t *attr;
+       imv_state_t *state;
+       imv_test_state_t *imv_test_state;
+       TNC_Result result = TNC_RESULT_SUCCESS;
+       enumerator_t *enumerator;
+
+       if (!imv_test)
+       {
+               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+
+       /* process received message */
+       DBG2(DBG_IMV, "IMV %u \"%s\" received message type 0x%08x for Connection ID %u",
+                                  imv_id, imv_name, msg_type, connection_id);
+       pa_tnc_msg = pa_tnc_msg_create_from_data(chunk_create(msg, msg_len));
+
+       if (pa_tnc_msg->process(pa_tnc_msg) != SUCCESS)
+       {
+               pa_tnc_msg->destroy(pa_tnc_msg);
+               return TNC_RESULT_FATAL;
+       }
+
+       /* get current IMV state */
+       if (!imv_test->get_state(imv_test, connection_id, &state))
+       {
+               pa_tnc_msg->destroy(pa_tnc_msg);
+               return TNC_RESULT_FATAL;
+       }
+
+       enumerator = pa_tnc_msg->create_attribute_enumerator(pa_tnc_msg);
+       while (enumerator->enumerate(enumerator, &attr))
+       {
+               if (attr->get_vendor_id(attr) == PEN_ITA &&
+                       attr->get_type(attr) == ITA_ATTR_COMMAND)
+               {
+                       ita_attr_command_t *ita_attr;
+                       char *command;
+       
+                       ita_attr = (ita_attr_command_t*)attr;
+                       command = ita_attr->get_command(ita_attr);
+
+                       if (streq(command, "allow"))
+                       {
+                               state->set_recommendation(state,
+                                                               TNC_IMV_ACTION_RECOMMENDATION_ALLOW,
+                                                               TNC_IMV_EVALUATION_RESULT_COMPLIANT);                     
+                       }
+                       else if (streq(command, "isolate"))
+                       {
+                               state->set_recommendation(state,
+                                                               TNC_IMV_ACTION_RECOMMENDATION_ISOLATE,
+                                                               TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR);                    
+                       }
+                       else if (streq(command, "none"))
+                       {
+                               state->set_recommendation(state,
+                                                               TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS,
+                                                               TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR);                    
+                       }
+                       else
+                       {
+                               result = TNC_RESULT_FATAL;
+                       }
+                       break;
+               }               
+       }
+       enumerator->destroy(enumerator);
+       pa_tnc_msg->destroy(pa_tnc_msg);
+
+       if (result != TNC_RESULT_SUCCESS)
+       {
+               return result;
+       }
+
+       /* repeat the measurement ? */
+       imv_test_state = (imv_test_state_t*)state;
+       if (imv_test_state->another_round(imv_test_state))
+       {
+               return send_message(connection_id);
+       }
+
+       return imv_test->provide_recommendation(imv_test, connection_id);
+}
+
+/**
+ * see section 3.7.4 of TCG TNC IF-IMV Specification 1.2
+ */
+TNC_Result TNC_IMV_SolicitRecommendation(TNC_IMVID imv_id,
+                                                                                TNC_ConnectionID connection_id)
+{
+       if (!imv_test)
+       {
+               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+       return imv_test->provide_recommendation(imv_test, connection_id);
+}
+
+/**
+ * see section 3.7.5 of TCG TNC IF-IMV Specification 1.2
+ */
+TNC_Result TNC_IMV_BatchEnding(TNC_IMVID imv_id,
+                                                          TNC_ConnectionID connection_id)
+{
+       if (!imv_test)
+       {
+               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+       return TNC_RESULT_SUCCESS;
+}
+
+/**
+ * see section 3.7.6 of TCG TNC IF-IMV Specification 1.2
+ */
+TNC_Result TNC_IMV_Terminate(TNC_IMVID imv_id)
+{
+       if (!imv_test)
+       {
+               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+       imv_test->destroy(imv_test);
+       imv_test = NULL;
+
+       return TNC_RESULT_SUCCESS;
+}
+
+/**
+ * see section 4.2.8.1 of TCG TNC IF-IMV Specification 1.2
+ */
+TNC_Result TNC_IMV_ProvideBindFunction(TNC_IMVID imv_id,
+                                                                          TNC_TNCS_BindFunctionPointer bind_function)
+{
+       if (!imv_test)
+       {
+               DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
+               return TNC_RESULT_NOT_INITIALIZED;
+       }
+       return imv_test->bind_functions(imv_test, bind_function);
+}
diff --git a/src/libimcv/plugins/imv_test/imv_test_state.c b/src/libimcv/plugins/imv_test/imv_test_state.c
new file mode 100644 (file)
index 0000000..21d0c4c
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+#include "imv_test_state.h"
+
+#include <debug.h>
+
+typedef struct private_imv_test_state_t private_imv_test_state_t;
+
+/**
+ * Private data of an imv_test_state_t object.
+ */
+struct private_imv_test_state_t {
+
+       /**
+        * Public members of imv_test_state_t
+        */
+       imv_test_state_t public;
+
+       /**
+        * TNCCS connection ID
+        */
+       TNC_ConnectionID connection_id;
+
+       /**
+        * TNCCS connection state
+        */
+       TNC_ConnectionState state;
+
+       /**
+        * IMV action recommendation
+        */
+       TNC_IMV_Action_Recommendation rec;
+
+       /**
+        * IMV evaluation result
+        */
+       TNC_IMV_Evaluation_Result eval;
+
+       /**
+        * IMC-IMV round-trip count
+        */
+       int rounds;
+
+};
+
+METHOD(imv_state_t, get_connection_id, TNC_ConnectionID,
+       private_imv_test_state_t *this)
+{
+       return this->connection_id;
+}
+
+METHOD(imv_state_t, change_state, void,
+       private_imv_test_state_t *this, TNC_ConnectionState new_state)
+{
+       this->state = new_state;
+}
+
+METHOD(imv_state_t, get_recommendation, void,
+       private_imv_test_state_t *this, TNC_IMV_Action_Recommendation *rec,
+                                                                       TNC_IMV_Evaluation_Result *eval)
+{
+       *rec = this->rec;
+       *eval = this->eval;
+}
+
+METHOD(imv_state_t, set_recommendation, void,
+       private_imv_test_state_t *this, TNC_IMV_Action_Recommendation rec,
+                                                                       TNC_IMV_Evaluation_Result eval)
+{
+       this->rec = rec;
+       this->eval = eval;
+}
+
+METHOD(imv_state_t, destroy, void,
+       private_imv_test_state_t *this)
+{
+       free(this);
+}
+
+METHOD(imv_test_state_t, another_round, bool,
+       private_imv_test_state_t *this)
+{
+       return (this->rounds-- > 0);
+}
+
+/**
+ * Described in header.
+ */
+imv_state_t *imv_test_state_create(TNC_ConnectionID connection_id, int rounds)
+{
+       private_imv_test_state_t *this;
+
+       INIT(this,
+               .public = {
+                       .interface = {
+                               .get_connection_id = _get_connection_id,
+                               .change_state = _change_state,
+                               .get_recommendation = _get_recommendation,
+                               .set_recommendation = _set_recommendation,
+                               .destroy = _destroy,
+                       },
+                       .another_round = _another_round,
+               },
+               .state = TNC_CONNECTION_STATE_CREATE,
+               .rec = TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION,
+               .eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW,
+               .connection_id = connection_id,
+               .rounds = rounds,
+       );
+       
+       return &this->public.interface;
+}
+
+
diff --git a/src/libimcv/plugins/imv_test/imv_test_state.h b/src/libimcv/plugins/imv_test/imv_test_state.h
new file mode 100644 (file)
index 0000000..164aca9
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2011 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_test_state_t imv_test_state
+ * @{ @ingroup imv_test_state
+ */
+
+#ifndef IMV_TEST_STATE_H_
+#define IMV_TEST_STATE_H_
+
+#include <imv/imv_state.h>
+#include <library.h>
+
+typedef struct imv_test_state_t imv_test_state_t;
+
+/**
+ * Internal state of an imv_test_t connection instance
+ */
+struct imv_test_state_t {
+
+       /**
+        * imv_state_t interface
+        */
+       imv_state_t interface;
+
+       /**
+        * Check and decrease IMC-IMV round-trip count
+        *
+        * @return              new connection state
+        */
+       bool (*another_round)(imv_test_state_t *this);
+
+};
+
+/**
+ * Create an imv_test_state_t instance
+ *
+ * @param id           connection ID
+ * @param rounds       total number of IMC re-measurements
+ */
+imv_state_t* imv_test_state_create(TNC_ConnectionID id, int rounds);
+
+#endif /** IMV_TEST_STATE_H_ @}*/