make DHCP debug messages consistent
[strongswan.git] / src / libcharon / plugins / dhcp / dhcp_transaction.c
index 14e6540..83f822d 100644 (file)
@@ -15,6 +15,8 @@
 
 #include "dhcp_transaction.h"
 
 
 #include "dhcp_transaction.h"
 
+#include <utils/linked_list.h>
+
 typedef struct private_dhcp_transaction_t private_dhcp_transaction_t;
 
 /**
 typedef struct private_dhcp_transaction_t private_dhcp_transaction_t;
 
 /**
@@ -41,8 +43,26 @@ struct private_dhcp_transaction_t {
         * received DHCP address
         */
        host_t *address;
         * received DHCP address
         */
        host_t *address;
+
+       /**
+        * discovered DHCP server address
+        */
+       host_t *server;
+
+       /**
+        * List of added attributes, as attribute_entry_t
+        */
+       linked_list_t *attributes;
 };
 
 };
 
+/**
+ * Entry for an added attribute
+ */
+typedef struct {
+       configuration_attribute_type_t type;
+       chunk_t data;
+} attribute_entry_t;
+
 METHOD(dhcp_transaction_t, get_id, u_int32_t,
        private_dhcp_transaction_t *this)
 {
 METHOD(dhcp_transaction_t, get_id, u_int32_t,
        private_dhcp_transaction_t *this)
 {
@@ -68,11 +88,69 @@ METHOD(dhcp_transaction_t, get_address, host_t*,
        return this->address;
 }
 
        return this->address;
 }
 
+METHOD(dhcp_transaction_t, set_server, void,
+       private_dhcp_transaction_t *this, host_t *server)
+{
+       DESTROY_IF(this->server);
+       this->server = server;
+}
+
+METHOD(dhcp_transaction_t, get_server, host_t*,
+       private_dhcp_transaction_t *this)
+{
+       return this->server;
+}
+
+METHOD(dhcp_transaction_t, add_attribute, void,
+       private_dhcp_transaction_t *this, configuration_attribute_type_t type,
+       chunk_t data)
+{
+       attribute_entry_t *entry;
+
+       INIT(entry,
+               .type = type,
+               .data = chunk_clone(data),
+       );
+       this->attributes->insert_last(this->attributes, entry);
+}
+
+/**
+ * Filter function to map entries to type/data
+ */
+static bool attribute_filter(void *null, attribute_entry_t **entry,
+                                                        configuration_attribute_type_t *type,
+                                                        void **dummy, chunk_t *data)
+{
+       *type = (*entry)->type;
+       *data = (*entry)->data;
+       return TRUE;
+}
+
+METHOD(dhcp_transaction_t, create_attribute_enumerator, enumerator_t*,
+       private_dhcp_transaction_t *this)
+{
+       return enumerator_create_filter(
+                                               this->attributes->create_enumerator(this->attributes),
+                                               (void*)attribute_filter, NULL, NULL);
+}
+
+/**
+ * Clean up an attribute entry
+ */
+static void attribute_entry_destroy(attribute_entry_t *entry)
+{
+       free(entry->data.ptr);
+       free(entry);
+}
+
 METHOD(dhcp_transaction_t, destroy, void,
        private_dhcp_transaction_t *this)
 {
        this->identity->destroy(this->identity);
        DESTROY_IF(this->address);
 METHOD(dhcp_transaction_t, destroy, void,
        private_dhcp_transaction_t *this)
 {
        this->identity->destroy(this->identity);
        DESTROY_IF(this->address);
+       DESTROY_IF(this->server);
+       this->attributes->destroy_function(this->attributes,
+                                                                          (void*)attribute_entry_destroy);
        free(this);
 }
 
        free(this);
 }
 
@@ -90,10 +168,15 @@ dhcp_transaction_t *dhcp_transaction_create(u_int32_t id,
                        .get_identity = _get_identity,
                        .set_address = _set_address,
                        .get_address = _get_address,
                        .get_identity = _get_identity,
                        .set_address = _set_address,
                        .get_address = _get_address,
+                       .set_server = _set_server,
+                       .get_server = _get_server,
+                       .add_attribute = _add_attribute,
+                       .create_attribute_enumerator = _create_attribute_enumerator,
                        .destroy = _destroy,
                },
                .id = id,
                .identity = identity->clone(identity),
                        .destroy = _destroy,
                },
                .id = id,
                .identity = identity->clone(identity),
+               .attributes = linked_list_create(),
        );
 
        return &this->public;
        );
 
        return &this->public;