moved management of additional IMC/IMV IDs to agent
[strongswan.git] / src / libimcv / plugins / imc_test / imc_test_state.c
index 1b60f32..2adfd7d 100644 (file)
@@ -15,6 +15,7 @@
 #include "imc_test_state.h"
 
 #include <debug.h>
 #include "imc_test_state.h"
 
 #include <debug.h>
+#include <utils/linked_list.h>
 
 typedef struct private_imc_test_state_t private_imc_test_state_t;
 
 
 typedef struct private_imc_test_state_t private_imc_test_state_t;
 
@@ -38,6 +39,31 @@ struct private_imc_test_state_t {
         */
        TNC_ConnectionState state;
 
         */
        TNC_ConnectionState state;
 
+       /**
+        * Does the TNCCS connection support long message types?
+        */
+       bool has_long;
+
+       /**
+        * Does the TNCCS connection support exclusive delivery?
+        */
+       bool has_excl;
+
+       /**
+        * Command to transmit to IMV
+        */
+       char *command;
+
+       /**
+        * Is it the first handshake?
+        */
+       bool first_handshake;
+
+       /**
+        * Do a handshake retry
+        */
+       bool handshake_retry;
+       
 };
 
 METHOD(imc_state_t, get_connection_id, TNC_ConnectionID,
 };
 
 METHOD(imc_state_t, get_connection_id, TNC_ConnectionID,
@@ -46,6 +72,25 @@ METHOD(imc_state_t, get_connection_id, TNC_ConnectionID,
        return this->connection_id;
 }
 
        return this->connection_id;
 }
 
+METHOD(imc_state_t, has_long, bool,
+       private_imc_test_state_t *this)
+{
+       return this->has_long;
+}
+
+METHOD(imc_state_t, has_excl, bool,
+       private_imc_test_state_t *this)
+{
+       return this->has_excl;
+}
+
+METHOD(imc_state_t, set_flags, void,
+       private_imc_test_state_t *this, bool has_long, bool has_excl)
+{
+       this->has_long = has_long;
+       this->has_excl = has_excl;
+}
+
 METHOD(imc_state_t, change_state, void,
        private_imc_test_state_t *this, TNC_ConnectionState new_state)
 {
 METHOD(imc_state_t, change_state, void,
        private_imc_test_state_t *this, TNC_ConnectionState new_state)
 {
@@ -55,13 +100,53 @@ METHOD(imc_state_t, change_state, void,
 METHOD(imc_state_t, destroy, void,
        private_imc_test_state_t *this)
 {
 METHOD(imc_state_t, destroy, void,
        private_imc_test_state_t *this)
 {
+       free(this->command);
        free(this);
 }
 
        free(this);
 }
 
+METHOD(imc_test_state_t, get_command, char*,
+       private_imc_test_state_t *this)
+{
+       return this->command;
+}
+
+METHOD(imc_test_state_t, set_command, void,
+       private_imc_test_state_t *this, char* command)
+{
+       char *old_command;
+
+       old_command = this->command;
+       this->command = strdup(command);
+       free(old_command);
+}
+
+METHOD(imc_test_state_t, is_first_handshake, bool,
+       private_imc_test_state_t *this)
+{
+       bool first;
+
+       /* test and reset first_handshake flag */
+       first= this->first_handshake;
+       this->first_handshake = FALSE;
+       return first;
+}
+
+METHOD(imc_test_state_t, do_handshake_retry, bool,
+       private_imc_test_state_t *this)
+{
+       bool retry;
+
+       /* test and reset handshake_retry flag */
+       retry = this->handshake_retry;
+       this->handshake_retry = FALSE;
+       return retry;
+}
+
 /**
  * Described in header.
  */
 /**
  * Described in header.
  */
-imc_state_t *imc_test_state_create(TNC_ConnectionID connection_id)
+imc_state_t *imc_test_state_create(TNC_ConnectionID connection_id,
+                                                                  char *command, bool retry)
 {
        private_imc_test_state_t *this;
 
 {
        private_imc_test_state_t *this;
 
@@ -69,12 +154,22 @@ imc_state_t *imc_test_state_create(TNC_ConnectionID connection_id)
                .public = {
                        .interface = {
                                .get_connection_id = _get_connection_id,
                .public = {
                        .interface = {
                                .get_connection_id = _get_connection_id,
+                               .has_long = _has_long,
+                               .has_excl = _has_excl,
+                               .set_flags = _set_flags,
                                .change_state = _change_state,
                                .destroy = _destroy,
                        },
                                .change_state = _change_state,
                                .destroy = _destroy,
                        },
+                       .get_command = _get_command,
+                       .set_command = _set_command,
+                       .is_first_handshake = _is_first_handshake,
+                       .do_handshake_retry = _do_handshake_retry,
                },
                .state = TNC_CONNECTION_STATE_CREATE,
                .connection_id = connection_id,
                },
                .state = TNC_CONNECTION_STATE_CREATE,
                .connection_id = connection_id,
+               .command = strdup(command),
+               .first_handshake = TRUE,
+               .handshake_retry = retry,
        );
        
        return &this->public.interface;
        );
        
        return &this->public.interface;