- Implemented but not tested unknown_payload_t
authorJan Hutter <jhutter@hsr.ch>
Mon, 5 Dec 2005 19:17:45 +0000 (19:17 -0000)
committerJan Hutter <jhutter@hsr.ch>
Mon, 5 Dec 2005 19:17:45 +0000 (19:17 -0000)
Source/charon/encoding/payloads/Makefile.payloads
Source/charon/encoding/payloads/encodings.c
Source/charon/encoding/payloads/encodings.h
Source/charon/encoding/payloads/payload.c
Source/charon/encoding/payloads/payload.h
Source/charon/encoding/payloads/unknown_payload.c [new file with mode: 0644]
Source/charon/encoding/payloads/unknown_payload.h [new file with mode: 0644]
Source/charon/testcases/ike_sa_manager_test.c

index b03da7a..19b9a3b 100644 (file)
@@ -69,6 +69,10 @@ $(BUILD_DIR)configuration_attribute.o :      $(PAYLOADS_DIR)configuration_attribute.c
 OBJS+= $(BUILD_DIR)eap_payload.o
 $(BUILD_DIR)eap_payload.o :                            $(PAYLOADS_DIR)eap_payload.c $(PAYLOADS_DIR)eap_payload.h
                                                                                $(CC) $(CFLAGS) -c -o $@ $<
+                                                                               
+OBJS+= $(BUILD_DIR)unknown_payload.o
+$(BUILD_DIR)unknown_payload.o :                        $(PAYLOADS_DIR)unknown_payload.c $(PAYLOADS_DIR)unknown_payload.h
+                                                                               $(CC) $(CFLAGS) -c -o $@ $<
 
 OBJS+= $(BUILD_DIR)ts_payload.o
 $(BUILD_DIR)ts_payload.o :                             $(PAYLOADS_DIR)ts_payload.c $(PAYLOADS_DIR)ts_payload.h
index 44ae826..4533245 100644 (file)
@@ -63,5 +63,6 @@ mapping_t encoding_type_m[] = {
        {CONFIGURATION_ATTRIBUTE_LENGTH, "CONFIGURATION_ATTRIBUTE_LENGTH"},
        {CONFIGURATION_ATTRIBUTE_VALUE, "CONFIGURATION_ATTRIBUTE_VALUE"},       
        {EAP_MESSAGE, "EAP_MESSAGE"},
+       {UNKNOWN_DATA,"UNKNOWN_DATA"},
        {MAPPING_END, NULL}
 };
index a53dc3e..4f36799 100644 (file)
@@ -454,6 +454,17 @@ enum encoding_type_t{
         * When parsing (Payload Length - 4) bytes are read and written into the chunk pointing to.
         */
        VID_DATA,
+       
+       /**
+        * Representating the DATA of an unknown payload.
+        * 
+        * When generating the content of the chunkt pointing to 
+        * is written.
+        * 
+        * When parsing (Payload Length - 4) bytes are read and written into the chunk pointing to.
+        */
+       UNKNOWN_DATA,
+
 
        /**
         * Representating an IKE_SPI field in an IKEv2 Header.
index d311365..bd94eaa 100644 (file)
@@ -40,6 +40,7 @@
 #include <encoding/payloads/cp_payload.h>
 #include <encoding/payloads/configuration_attribute.h>
 #include <encoding/payloads/eap_payload.h>
+#include <encoding/payloads/unknown_payload.h>
 
 /*
  * build the mappings for payload_type_t
@@ -68,6 +69,7 @@ mapping_t payload_type_m[] = {
        {TRANSFORM_ATTRIBUTE, "TRANSFORM_ATTRIBUTE"},
        {TRAFFIC_SELECTOR_SUBSTRUCTURE, "TRAFFIC_SELECTOR_SUBSTRUCTURE"},
        {CONFIGURATION_ATTRIBUTE,"CONFIGURATION_ATTRIBUTE"},
+       {UNKNOWN_PAYLOAD,"UNKNOWN_PAYLOAD"},
        {MAPPING_END, NULL}
 };
 
@@ -120,6 +122,8 @@ payload_t *payload_create(payload_type_t type)
                        return (payload_t*)configuration_attribute_create();
                case EXTENSIBLE_AUTHENTICATION:
                        return (payload_t*)eap_payload_create();
+               case UNKNOWN_PAYLOAD:
+                       return (payload_t*)unknown_payload_create();
                case ENCRYPTED:
                        return (payload_t*)encryption_payload_create();
                default:
index 5c9806d..6fbd949 100644 (file)
@@ -174,6 +174,14 @@ enum payload_type_t{
         * used internally to handle a transform attribute like a payload.
         */
        CONFIGURATION_ATTRIBUTE = 145,
+       
+       /**
+        * A unknown payload has a value of PRIVATE USE space.
+        * 
+        * This payload type is not send over wire and just 
+        * used internally to handle a unknown payload.
+        */
+       UNKNOWN_PAYLOAD = 146,
 };
 
 
diff --git a/Source/charon/encoding/payloads/unknown_payload.c b/Source/charon/encoding/payloads/unknown_payload.c
new file mode 100644 (file)
index 0000000..3e910ba
--- /dev/null
@@ -0,0 +1,251 @@
+/**
+ * @file unknown_payload.c
+ * 
+ * @brief Implementation of unknown_payload_t.
+ * 
+ */
+
+/*
+ * Copyright (C) 2005 Jan Hutter, Martin Willi
+ * 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 "unknown_payload.h"
+
+#include <utils/allocator.h>
+
+
+typedef struct private_unknown_payload_t private_unknown_payload_t;
+
+/**
+ * Private data of an unknown_payload_t object.
+ * 
+ */
+struct private_unknown_payload_t {
+       /**
+        * Public unknown_payload_t interface.
+        */
+       unknown_payload_t public;
+       
+       /**
+        * Next payload type.
+        */
+       u_int8_t  next_payload;
+
+       /**
+        * Critical flag.
+        */
+       bool critical;
+       
+       /**
+        * Length of this payload.
+        */
+       u_int16_t payload_length;
+       
+       /**
+        * Type of this payload.
+        */
+       payload_type_t payload_type;
+       
+       /**
+        * The contained data.
+        */
+       chunk_t data;
+};
+
+/**
+ * Encoding rules to parse or generate a EAP payload.
+ * 
+ * The defined offsets are the positions in a object of type 
+ * private_unknown_payload_t.
+ * 
+ */
+encoding_rule_t unknown_payload_encodings[] = {
+       /* 1 Byte next payload type, stored in the field next_payload */
+       { U_INT_8,                      offsetof(private_unknown_payload_t, next_payload)},
+       /* the critical bit */
+       { FLAG,                         offsetof(private_unknown_payload_t, critical)   },
+       /* 7 Bit reserved bits, nowhere stored */
+       { RESERVED_BIT, 0                                                                                                       },
+       { RESERVED_BIT, 0                                                                                                       },
+       { RESERVED_BIT, 0                                                                                                       },
+       { RESERVED_BIT, 0                                                                                                       },
+       { RESERVED_BIT, 0                                                                                                       },
+       { RESERVED_BIT, 0                                                                                                       },
+       { RESERVED_BIT, 0                                                                                                       },
+       /* Length of the whole payload*/
+       { PAYLOAD_LENGTH,       offsetof(private_unknown_payload_t, payload_length)},
+       /* some unknown data bytes, length is defined in PAYLOAD_LENGTH */
+       { UNKNOWN_DATA, offsetof(private_unknown_payload_t, data)                       }
+};
+
+/*
+                           1                   2                   3
+        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       ! Next Payload  !C!  RESERVED   !         Payload Length        !
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       !                                                               !
+       ~                       Data of any type                        ~
+       !                                                               !
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+*/
+
+/**
+ * Implementation of payload_t.verify.
+ */
+static status_t verify(private_unknown_payload_t *this)
+{
+       return SUCCESS;
+}
+
+/**
+ * Implementation of unknown_payload_t.get_encoding_rules.
+ */
+static void get_encoding_rules(private_unknown_payload_t *this, encoding_rule_t **rules, size_t *rule_count)
+{
+       *rules = unknown_payload_encodings;
+       *rule_count = sizeof(unknown_payload_encodings) / sizeof(encoding_rule_t);
+}
+
+/**
+ * Implementation of payload_t.get_type.
+ */
+static payload_type_t get_payload_type(private_unknown_payload_t *this)
+{
+       return UNKNOWN_PAYLOAD;
+}
+
+/**
+ * Implementation of payload_t.get_next_type.
+ */
+static payload_type_t get_next_type(private_unknown_payload_t *this)
+{
+       return (this->next_payload);
+}
+
+/**
+ * Implementation of payload_t.set_next_type.
+ */
+static void set_next_type(private_unknown_payload_t *this,payload_type_t type)
+{
+       this->next_payload = type;
+}
+
+/**
+ * Implementation of unknown_payload_t.set_real_type.
+ */
+static void set_real_type(private_unknown_payload_t *this,payload_type_t type)
+{
+       this->payload_type = type;
+}
+
+/**
+ * Implementation of unknown_payload_t.get_real_type.
+ */
+static payload_type_t get_real_type(private_unknown_payload_t *this)
+{
+       return this->payload_type;
+}
+
+/**
+ * Implementation of payload_t.get_length.
+ */
+static size_t get_length(private_unknown_payload_t *this)
+{
+       return this->payload_length;
+}
+
+/**
+ * Implementation of unknown_payload_t.set_data.
+ */
+static void set_data (private_unknown_payload_t *this, chunk_t data)
+{
+       if (this->data.ptr != NULL)
+       {
+               allocator_free_chunk(&(this->data));
+       }
+       this->data.ptr = allocator_clone_bytes(data.ptr,data.len);
+       this->data.len = data.len;
+       this->payload_length = DEFAULT_PAYLOAD_HEADER_LENGTH + this->data.len;
+}
+
+/**
+ * Implementation of unknown_payload_t.get_data.
+ */
+static chunk_t get_data (private_unknown_payload_t *this)
+{
+       return (this->data);
+}
+
+/**
+ * Implementation of unknown_payload_t.get_data_clone.
+ */
+static chunk_t get_data_clone (private_unknown_payload_t *this)
+{
+       chunk_t cloned_data;
+       if (this->data.ptr == NULL)
+       {
+               return (this->data);
+       }
+       cloned_data.ptr = allocator_clone_bytes(this->data.ptr,this->data.len);
+       cloned_data.len = this->data.len;
+       return cloned_data;
+}
+
+/**
+ * Implementation of payload_t.destroy and unknown_payload_t.destroy.
+ */
+static void destroy(private_unknown_payload_t *this)
+{
+       if (this->data.ptr != NULL)
+       {
+               allocator_free_chunk(&(this->data));
+       }
+       
+       allocator_free(this);   
+}
+
+/*
+ * Described in header
+ */
+unknown_payload_t *unknown_payload_create()
+{
+       private_unknown_payload_t *this = allocator_alloc_thing(private_unknown_payload_t);
+
+       /* interface functions */
+       this->public.payload_interface.verify = (status_t (*) (payload_t *))verify;
+       this->public.payload_interface.get_encoding_rules = (void (*) (payload_t *, encoding_rule_t **, size_t *) ) get_encoding_rules;
+       this->public.payload_interface.get_length = (size_t (*) (payload_t *)) get_length;
+       this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type;
+       this->public.payload_interface.set_next_type = (void (*) (payload_t *,payload_type_t)) set_next_type;
+       this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_payload_type;
+       this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
+       
+       /* public functions */
+       this->public.destroy = (void (*) (unknown_payload_t *)) destroy;
+       this->public.set_real_type = (void (*) (unknown_payload_t *,payload_type_t)) set_real_type;
+       this->public.get_real_type = (payload_type_t (*) (unknown_payload_t *)) get_real_type;
+       this->public.set_data = (void (*) (unknown_payload_t *,chunk_t)) set_data;
+       this->public.get_data_clone = (chunk_t (*) (unknown_payload_t *)) get_data_clone;
+       this->public.get_data = (chunk_t (*) (unknown_payload_t *)) get_data;
+       
+       /* private variables */
+       this->critical = FALSE;
+       this->next_payload = NO_PAYLOAD;
+       this->payload_type = NO_PAYLOAD;
+       this->payload_length = DEFAULT_PAYLOAD_HEADER_LENGTH;
+       this->data = CHUNK_INITIALIZER;
+
+       return (&(this->public));
+}
diff --git a/Source/charon/encoding/payloads/unknown_payload.h b/Source/charon/encoding/payloads/unknown_payload.h
new file mode 100644 (file)
index 0000000..ea36587
--- /dev/null
@@ -0,0 +1,116 @@
+/**
+ * @file unknown_payload.h
+ * 
+ * @brief Interface of unknown_payload_t.
+ * 
+ */
+
+/*
+ * Copyright (C) 2005 Jan Hutter, Martin Willi
+ * 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.
+ */
+
+#ifndef _UNKNOWN_PAYLOAD_H_
+#define _UNKNOWN_PAYLOAD_H_
+
+#include <types.h>
+#include <encoding/payloads/payload.h>
+
+/**
+ * Length of a default payload header.
+ * 
+ * @ingroup payloads
+ */
+#define DEFAULT_PAYLOAD_HEADER_LENGTH 4
+
+
+typedef struct unknown_payload_t unknown_payload_t;
+
+/**
+ * Object representing an unknown IKEv2 payload.
+ * 
+ * @ingroup payloads
+ * 
+ */
+struct unknown_payload_t {
+       /**
+        * The payload_t interface.
+        */
+       payload_t payload_interface;
+       
+       /**
+        * @brief Set the Data of the unknown payload.
+        * 
+        * Data are getting cloned.
+        *
+        * @param this                  calling unknown_payload_t object
+        * @param data                  data following the header as chunk_t
+        */
+       void (*set_data) (unknown_payload_t *this, chunk_t data);
+       
+       /**
+        * @brief Get the data of the message.
+        * 
+        * Returned data are a copy of the internal one.
+        *
+        * @param this                  calling unknown_payload_t object
+        * @return                              data as chunk_t
+        */
+       chunk_t (*get_data_clone) (unknown_payload_t *this);
+       
+       /**
+        * @brief Get the data of the message.
+        * 
+        * Returned data are NOT copied.
+        *
+        * @param this                  calling unknown_payload_t object
+        * @return                              data as chunk_t
+        */
+       chunk_t (*get_data) (unknown_payload_t *this);
+
+       /**
+        * @brief Set the real Type of this payload.
+        *
+        * @param this                  calling unknown_payload_t object
+        * @param type                  real type of this payload.
+        */
+       
+       void (*set_real_type) (unknown_payload_t *this,payload_type_t type);
+       
+       /**
+        * @brief Get the real Type of this payload.
+        *
+        * @param this                  calling unknown_payload_t object
+        * @return                              real type of this payload.
+        */
+       payload_type_t (*get_real_type) (unknown_payload_t *this);
+       
+       /**
+        * @brief Destroys an unknown_payload_t object.
+        *
+        * @param this  unknown_payload_t object to destroy
+        */
+       void (*destroy) (unknown_payload_t *this);
+};
+
+/**
+ * @brief Creates an empty unknown_payload_t object.
+ * 
+ * @return                             created unknown_payload_t object
+ * 
+ * @ingroup payloads
+ */
+unknown_payload_t *unknown_payload_create();
+
+
+#endif //_UNKNOWN_PAYLOAD_H_
index 29f6a46..f2424bc 100644 (file)
@@ -48,15 +48,6 @@ static void test1_thread(ike_sa_id_t *ike_sa_id)
 }
 
 
-static void test2_thread(ike_sa_id_t *ike_sa_id)
-{
-       ike_sa_t *ike_sa;
-       status_t status;
-       
-       status = td.isam->checkout(td.isam, ike_sa_id, &ike_sa);
-       td.tester->assert_true(td.tester, (status == NOT_FOUND), "IKE_SA already deleted");     
-}
-
 static void test3_thread(ike_sa_id_t *ike_sa_id)
 {
        ike_sa_t *ike_sa;