Migrated transform_substructure to INIT/METHOD macros
authorMartin Willi <martin@revosec.ch>
Wed, 24 Nov 2010 13:17:44 +0000 (14:17 +0100)
committerMartin Willi <martin@revosec.ch>
Wed, 5 Jan 2011 15:45:51 +0000 (16:45 +0100)
src/libcharon/encoding/payloads/transform_substructure.c
src/libcharon/encoding/payloads/transform_substructure.h

index 83d5794..63e31e5 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2005-2006 Martin Willi
+ * Copyright (C) 2005-2010 Martin Willi
+ * Copyright (C) 2010 revosec AG
  * Copyright (C) 2005 Jan Hutter
  * Hochschule fuer Technik Rapperswil
  *
 #include <utils/linked_list.h>
 #include <daemon.h>
 
-
 typedef struct private_transform_substructure_t private_transform_substructure_t;
 
 /**
  * Private data of an transform_substructure_t object.
- *
  */
 struct private_transform_substructure_t {
+
        /**
         * Public transform_substructure_t interface.
         */
@@ -42,13 +42,11 @@ struct private_transform_substructure_t {
         */
        u_int8_t  next_payload;
 
-
        /**
         * Length of this payload.
         */
        u_int16_t transform_length;
 
-
        /**
         * Type of the transform.
         */
@@ -65,30 +63,28 @@ struct private_transform_substructure_t {
        linked_list_t *attributes;
 };
 
-
 /**
  * Encoding rules to parse or generate a Transform substructure.
  *
  * The defined offsets are the positions in a object of type
  * private_transform_substructure_t.
- *
  */
 encoding_rule_t transform_substructure_encodings[] = {
        /* 1 Byte next payload type, stored in the field next_payload */
-       { U_INT_8,                      offsetof(private_transform_substructure_t, next_payload)                },
+       { U_INT_8,                              offsetof(private_transform_substructure_t, next_payload)        },
        /* Reserved Byte is skipped */
-       { RESERVED_BYTE,                0                                                                                                                               },
+       { RESERVED_BYTE,                0                                                                                                                       },
        /* Length of the whole transform substructure*/
-       { PAYLOAD_LENGTH,               offsetof(private_transform_substructure_t, transform_length)    },
+       { PAYLOAD_LENGTH,               offsetof(private_transform_substructure_t, transform_length)},
        /* transform type is a number of 8 bit */
-       { U_INT_8,                              offsetof(private_transform_substructure_t, transform_type)      },
+       { U_INT_8,                              offsetof(private_transform_substructure_t, transform_type)      },
        /* Reserved Byte is skipped */
-       { RESERVED_BYTE,                0                                                                                                                               },
+       { RESERVED_BYTE,                0                                                                                                                       },
        /* tranform ID is a number of 8 bit */
-       { U_INT_16,                             offsetof(private_transform_substructure_t, transform_id)                },
+       { U_INT_16,                             offsetof(private_transform_substructure_t, transform_id)        },
        /* Attributes are stored in a transform attribute,
           offset points to a linked_list_t pointer */
-       { TRANSFORM_ATTRIBUTES, offsetof(private_transform_substructure_t, attributes)          }
+       { TRANSFORM_ATTRIBUTES, offsetof(private_transform_substructure_t, attributes)          }
 };
 
 /*
@@ -105,19 +101,15 @@ encoding_rule_t transform_substructure_encodings[] = {
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 */
 
-
-/**
- * Implementation of payload_t.verify.
- */
-static status_t verify(private_transform_substructure_t *this)
+METHOD(payload_t, verify, status_t,
+       private_transform_substructure_t *this)
 {
        status_t status = SUCCESS;
-       iterator_t *iterator;
-       payload_t *current_attributes;
+       enumerator_t *enumerator;
+       payload_t *attribute;
 
-       if ((this->next_payload != NO_PAYLOAD) && (this->next_payload != 3))
+       if (this->next_payload != NO_PAYLOAD && this->next_payload != 3)
        {
-               /* must be 0 or 3 */
                DBG1(DBG_ENC, "inconsistent next payload");
                return FAILED;
        }
@@ -138,45 +130,41 @@ static status_t verify(private_transform_substructure_t *this)
                        return FAILED;
                }
        }
-       iterator = this->attributes->create_iterator(this->attributes,TRUE);
 
-       while(iterator->iterate(iterator, (void**)&current_attributes))
+       enumerator = this->attributes->create_enumerator(this->attributes);
+       while (enumerator->enumerate(enumerator, &attribute))
        {
-               status = current_attributes->verify(current_attributes);
+               status = attribute->verify(attribute);
                if (status != SUCCESS)
                {
                        DBG1(DBG_ENC, "TRANSFORM_ATTRIBUTE verification failed");
+                       break;
                }
        }
-       iterator->destroy(iterator);
+       enumerator->destroy(enumerator);
 
        /* proposal number is checked in SA payload */
        return status;
 }
 
-/**
- * Implementation of payload_t.get_encoding_rules.
- */
-static void get_encoding_rules(private_transform_substructure_t *this, encoding_rule_t **rules, size_t *rule_count)
+METHOD(payload_t, get_encoding_rules, void,
+       private_transform_substructure_t *this, encoding_rule_t **rules,
+       size_t *rule_count)
 {
        *rules = transform_substructure_encodings;
-       *rule_count = sizeof(transform_substructure_encodings) / sizeof(encoding_rule_t);
+       *rule_count = countof(transform_substructure_encodings);
 }
 
-/**
- * Implementation of payload_t.get_type.
- */
-static payload_type_t get_type(private_transform_substructure_t *this)
+METHOD(payload_t, get_type, payload_type_t,
+       private_transform_substructure_t *this)
 {
        return TRANSFORM_SUBSTRUCTURE;
 }
 
-/**
- * Implementation of payload_t.get_next_type.
- */
-static payload_type_t get_next_type(private_transform_substructure_t *this)
+METHOD(payload_t, get_next_type, payload_type_t,
+       private_transform_substructure_t *this)
 {
-       return (this->next_payload);
+       return this->next_payload;
 }
 
 /**
@@ -184,153 +172,69 @@ static payload_type_t get_next_type(private_transform_substructure_t *this)
  */
 static void compute_length (private_transform_substructure_t *this)
 {
-       iterator_t *iterator;
-       payload_t *current_attribute;
-       size_t length = TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH;
+       enumerator_t *enumerator;
+       payload_t *attribute;
 
-       iterator = this->attributes->create_iterator(this->attributes,TRUE);
-       while (iterator->iterate(iterator, (void**)&current_attribute))
+       this->transform_length = TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH;
+       enumerator = this->attributes->create_enumerator(this->attributes);
+       while (enumerator->enumerate(enumerator, &attribute))
        {
-               length += current_attribute->get_length(current_attribute);
+               this->transform_length += attribute->get_length(attribute);
        }
-       iterator->destroy(iterator);
-
-       this->transform_length = length;
+       enumerator->destroy(enumerator);
 }
 
-/**
- * Implementation of payload_t.get_length.
- */
-static size_t get_length(private_transform_substructure_t *this)
+METHOD(payload_t, get_length, size_t,
+       private_transform_substructure_t *this)
 {
        return this->transform_length;
 }
 
-/**
- * Implementation of transform_substructure_t.create_transform_attribute_iterator.
- */
-static iterator_t *create_transform_attribute_iterator (private_transform_substructure_t *this,bool forward)
-{
-       return this->attributes->create_iterator(this->attributes,forward);
-}
-
-/**
- * Implementation of transform_substructure_t.add_transform_attribute.
- */
-static void add_transform_attribute (private_transform_substructure_t *this,transform_attribute_t *attribute)
-{
-       this->attributes->insert_last(this->attributes,(void *) attribute);
-       compute_length(this);
-}
-
-/**
- * Implementation of transform_substructure_t.set_is_last_transform.
- */
-static void set_is_last_transform (private_transform_substructure_t *this, bool is_last)
-{
-       this->next_payload = (is_last) ? 0: TRANSFORM_TYPE_VALUE;
-}
-
-/**
- * Implementation of transform_substructure_t.get_is_last_transform.
- */
-static bool get_is_last_transform (private_transform_substructure_t *this)
-{
-       return ((this->next_payload == TRANSFORM_TYPE_VALUE) ? FALSE : TRUE);
-}
-
-/**
- * Implementation of payload_t.set_next_type.
- */
-static void set_next_type(private_transform_substructure_t *this,payload_type_t type)
+METHOD(transform_substructure_t, set_is_last_transform, void,
+       private_transform_substructure_t *this, bool is_last)
 {
+       this->next_payload = is_last ? 0: TRANSFORM_TYPE_VALUE;
 }
 
-/**
- * Implementation of transform_substructure_t.set_transform_type.
- */
-static void set_transform_type (private_transform_substructure_t *this,u_int8_t type)
+METHOD(payload_t, set_next_type, void,
+       private_transform_substructure_t *this,payload_type_t type)
 {
-       this->transform_type = type;
 }
 
-/**
- * Implementation of transform_substructure_t.get_transform_type.
- */
-static u_int8_t get_transform_type (private_transform_substructure_t *this)
+METHOD(transform_substructure_t, get_transform_type, u_int8_t,
+       private_transform_substructure_t *this)
 {
        return this->transform_type;
 }
 
-/**
- * Implementation of transform_substructure_t.set_transform_id.
- */
-static void set_transform_id (private_transform_substructure_t *this,u_int16_t id)
-{
-       this->transform_id = id;
-}
-
-/**
- * Implementation of transform_substructure_t.get_transform_id.
- */
-static u_int16_t get_transform_id (private_transform_substructure_t *this)
+METHOD(transform_substructure_t, get_transform_id, u_int16_t,
+       private_transform_substructure_t *this)
 {
        return this->transform_id;
 }
 
-/**
- * Implementation of transform_substructure_t.clone.
- */
-static transform_substructure_t *clone_(private_transform_substructure_t *this)
+METHOD(transform_substructure_t, get_key_length, status_t,
+       private_transform_substructure_t *this, u_int16_t *key_length)
 {
-       private_transform_substructure_t *clone;
-       iterator_t *attributes;
-       transform_attribute_t *current_attribute;
-
-       clone = (private_transform_substructure_t *) transform_substructure_create();
-       clone->next_payload = this->next_payload;
-       clone->transform_type = this->transform_type;
-       clone->transform_id = this->transform_id;
+       enumerator_t *enumerator;
+       transform_attribute_t *attribute;
 
-       attributes = this->attributes->create_iterator(this->attributes, FALSE);
-       while (attributes->iterate(attributes, (void**)&current_attribute))
+       enumerator = this->attributes->create_enumerator(this->attributes);
+       while (enumerator->enumerate(enumerator, &attribute))
        {
-               current_attribute = current_attribute->clone(current_attribute);
-               clone->public.add_transform_attribute(&clone->public, current_attribute);
-       }
-       attributes->destroy(attributes);
-
-       return &clone->public;
-}
-
-
-/**
- * Implementation of transform_substructure_t.get_key_length.
- */
-static status_t get_key_length(private_transform_substructure_t *this, u_int16_t *key_length)
-{
-       iterator_t *attributes;
-       transform_attribute_t *current_attribute;
-
-       attributes = this->attributes->create_iterator(this->attributes, TRUE);
-       while (attributes->iterate(attributes, (void**)&current_attribute))
-       {
-               if (current_attribute->get_attribute_type(current_attribute) == KEY_LENGTH)
+               if (attribute->get_attribute_type(attribute) == KEY_LENGTH)
                {
-                       *key_length = current_attribute->get_value(current_attribute);
-                       attributes->destroy(attributes);
+                       *key_length = attribute->get_value(attribute);
+                       enumerator->destroy(enumerator);
                        return SUCCESS;
                }
        }
-       attributes->destroy(attributes);
+       enumerator->destroy(enumerator);
        return FAILED;
 }
 
-
-/**
- * Implementation of transform_substructure_t.destroy and payload_t.destroy.
- */
-static void destroy(private_transform_substructure_t *this)
+METHOD2(payload_t, transform_substructure_t, destroy, void,
+       private_transform_substructure_t *this)
 {
        this->attributes->destroy_offset(this->attributes,
                                                                         offsetof(transform_attribute_t, destroy));
@@ -342,60 +246,50 @@ static void destroy(private_transform_substructure_t *this)
  */
 transform_substructure_t *transform_substructure_create()
 {
-       private_transform_substructure_t *this = malloc_thing(private_transform_substructure_t);
-
-       /* payload interface */
-       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_type;
-       this->public.payload_interface.destroy = (void (*) (payload_t *))destroy;
-
-       /* public functions */
-       this->public.create_transform_attribute_iterator = (iterator_t * (*) (transform_substructure_t *,bool)) create_transform_attribute_iterator;
-       this->public.add_transform_attribute = (void (*) (transform_substructure_t *,transform_attribute_t *)) add_transform_attribute;
-       this->public.set_is_last_transform = (void (*) (transform_substructure_t *,bool)) set_is_last_transform;
-       this->public.get_is_last_transform = (bool (*) (transform_substructure_t *)) get_is_last_transform;
-       this->public.set_transform_type = (void (*) (transform_substructure_t *,u_int8_t)) set_transform_type;
-       this->public.get_transform_type = (u_int8_t (*) (transform_substructure_t *)) get_transform_type;
-       this->public.set_transform_id = (void (*) (transform_substructure_t *,u_int16_t)) set_transform_id;
-       this->public.get_transform_id = (u_int16_t (*) (transform_substructure_t *)) get_transform_id;
-       this->public.get_key_length = (status_t (*) (transform_substructure_t *,u_int16_t *)) get_key_length;
-       this->public.clone = (transform_substructure_t* (*) (transform_substructure_t *)) clone_;
-       this->public.destroy = (void (*) (transform_substructure_t *)) destroy;
-
-       /* set default values of the fields */
-       this->next_payload = NO_PAYLOAD;
-       this->transform_length = TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH;
-       this->transform_id = 0;
-       this->transform_type = 0;
-       this->attributes = linked_list_create();
-
-       return (&(this->public));
+       private_transform_substructure_t *this;
+
+       INIT(this,
+               .public = {
+                       .payload_interface = {
+                               .verify = _verify,
+                               .get_encoding_rules = _get_encoding_rules,
+                               .get_length = _get_length,
+                               .get_next_type = _get_next_type,
+                               .set_next_type = _set_next_type,
+                               .get_type = _get_type,
+                               .destroy = _destroy,
+                       },
+                       .set_is_last_transform = _set_is_last_transform,
+                       .get_transform_type = _get_transform_type,
+                       .get_transform_id = _get_transform_id,
+                       .get_key_length = _get_key_length,
+                       .destroy = _destroy,
+               },
+               .next_payload = NO_PAYLOAD,
+               .transform_length = TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH,
+               .attributes = linked_list_create(),
+       );
+       return &this->public;
 }
 
 /*
  * Described in header
  */
 transform_substructure_t *transform_substructure_create_type(
-                                                               transform_type_t transform_type,
-                                                               u_int16_t transform_id, u_int16_t key_length)
+                                       transform_type_t type, u_int16_t id, u_int16_t key_length)
 {
-       transform_substructure_t *transform = transform_substructure_create();
+       private_transform_substructure_t *this;
 
-       transform->set_transform_type(transform,transform_type);
-       transform->set_transform_id(transform,transform_id);
+       this = (private_transform_substructure_t*)transform_substructure_create();
 
+       this->transform_type = type;
+       this->transform_id = id;
        if (key_length)
        {
-               transform_attribute_t *attribute;
-
-               attribute = transform_attribute_create_key_length(key_length);
-               transform->add_transform_attribute(transform, attribute);
-
+               this->attributes->insert_last(this->attributes,
+                                       (void*)transform_attribute_create_key_length(key_length));
+               compute_length(this);
        }
-       return transform;
+       return &this->public;
 }
 
index 5d31f8c..c961700 100644 (file)
@@ -34,7 +34,6 @@ typedef struct transform_substructure_t transform_substructure_t;
 #include <crypto/crypters/crypter.h>
 #include <config/proposal.h>
 
-
 /**
  * IKEv1 Value for a transform payload.
  */
@@ -45,32 +44,19 @@ typedef struct transform_substructure_t transform_substructure_t;
  */
 #define TRANSFORM_SUBSTRUCTURE_HEADER_LENGTH 8
 
-
 /**
  * Class representing an IKEv2- TRANSFORM SUBSTRUCTURE.
  *
  * The TRANSFORM SUBSTRUCTURE format is described in RFC section 3.3.2.
  */
 struct transform_substructure_t {
+
        /**
         * The payload_t interface.
         */
        payload_t payload_interface;
 
        /**
-        * Creates an iterator of stored transform_attribute_t objects.
-        *
-        * When deleting an transform attribute using this iterator,
-        * the length of this transform substructure has to be refreshed
-        * by calling get_length().
-        *
-        * @param forward               iterator direction (TRUE: front to end)
-        * @return                              created iterator_t object.
-        */
-       iterator_t * (*create_transform_attribute_iterator) (
-                                                               transform_substructure_t *this, bool forward);
-
-       /**
         * Adds a transform_attribute_t object to this object.
         *
         * @param proposal  transform_attribute_t object to add
@@ -89,20 +75,6 @@ struct transform_substructure_t {
        void (*set_is_last_transform) (transform_substructure_t *this, bool is_last);
 
        /**
-        * Checks if this is the last transform.
-        *
-        * @return                      TRUE if this is the last Transform, FALSE otherwise
-        */
-       bool (*get_is_last_transform) (transform_substructure_t *this);
-
-       /**
-        * Sets transform type of the current transform substructure.
-        *
-        * @param type          type value to set
-        */
-       void (*set_transform_type) (transform_substructure_t *this, u_int8_t type);
-
-       /**
         * get transform type of the current transform.
         *
         * @return                      Transform type of current transform substructure.
@@ -110,21 +82,14 @@ struct transform_substructure_t {
        u_int8_t (*get_transform_type) (transform_substructure_t *this);
 
        /**
-        * Sets transform id of the current transform substructure.
-        *
-        * @param id            transform id to set
-        */
-       void (*set_transform_id) (transform_substructure_t *this, u_int16_t id);
-
-       /**
-        * get transform id of the current transform.
+        * Get transform id of the current transform.
         *
         * @return                      Transform id of current transform substructure.
         */
        u_int16_t (*get_transform_id) (transform_substructure_t *this);
 
        /**
-        * get transform id of the current transform.
+        * Get transform id of the current transform.
         *
         * @param key_length    The key length is written to this location
         * @return
@@ -136,13 +101,6 @@ struct transform_substructure_t {
                                                                u_int16_t *key_length);
 
        /**
-        * Clones an transform_substructure_t object.
-        *
-        * @return              cloned transform_substructure_t object
-        */
-       transform_substructure_t* (*clone) (transform_substructure_t *this);
-
-       /**
         * Destroys an transform_substructure_t object.
         */
        void (*destroy) (transform_substructure_t *this);
@@ -151,24 +109,19 @@ struct transform_substructure_t {
 /**
  * Creates an empty transform_substructure_t object.
  *
- * @return                     created transform_substructure_t object
+ * @return                             created transform_substructure_t object
  */
 transform_substructure_t *transform_substructure_create(void);
 
 /**
  * Creates an empty transform_substructure_t object.
  *
- * The key length is used for the transport types ENCRYPTION_ALGORITHM,
- * PSEUDO_RANDOM_FUNCTION, INTEGRITY_ALGORITHM. For all
- * other transport types the key_length parameter is not used
- *
- * @param transform_type       type of transform to create
- * @param transform_id         transform id specifying the specific algorithm of a transform type
- * @param key_length           Key length for key lenght attribute
- * @return                                     transform_substructure_t object
+ * @param type                 type of transform to create
+ * @param id                   transform id specifc for the transform type
+ * @param key_length   key length for key lenght attribute, 0 to omit
+ * @return                             transform_substructure_t object
  */
 transform_substructure_t *transform_substructure_create_type(
-                                               transform_type_t transform_type, u_int16_t transform_id,
-                                               u_int16_t key_length);
+                                       transform_type_t type, u_int16_t id, u_int16_t key_length);
 
 #endif /** TRANSFORM_SUBSTRUCTURE_H_ @}*/