aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/plugins/dhcp/dhcp_transaction.c
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2010-03-24 15:28:14 +0100
committerMartin Willi <martin@revosec.ch>2010-03-25 14:29:10 +0100
commitb262429e0b991ec8dbe7f7694c8f0418023f0fde (patch)
tree51012f3a4818c86cbf01b98a8d25c790274b8feb /src/libcharon/plugins/dhcp/dhcp_transaction.c
parent913eb696929d9c611cc9a85a0609c122467f696e (diff)
downloadstrongswan-b262429e0b991ec8dbe7f7694c8f0418023f0fde.tar.bz2
strongswan-b262429e0b991ec8dbe7f7694c8f0418023f0fde.tar.xz
Include configuration payloads for DNS/WINS server received via DHCP
Diffstat (limited to 'src/libcharon/plugins/dhcp/dhcp_transaction.c')
-rw-r--r--src/libcharon/plugins/dhcp/dhcp_transaction.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/libcharon/plugins/dhcp/dhcp_transaction.c b/src/libcharon/plugins/dhcp/dhcp_transaction.c
index 27235ffb9..83f822dd8 100644
--- a/src/libcharon/plugins/dhcp/dhcp_transaction.c
+++ b/src/libcharon/plugins/dhcp/dhcp_transaction.c
@@ -15,6 +15,8 @@
#include "dhcp_transaction.h"
+#include <utils/linked_list.h>
+
typedef struct private_dhcp_transaction_t private_dhcp_transaction_t;
/**
@@ -46,8 +48,21 @@ struct private_dhcp_transaction_t {
* 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)
{
@@ -86,12 +101,56 @@ METHOD(dhcp_transaction_t, get_server, host_t*,
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);
DESTROY_IF(this->server);
+ this->attributes->destroy_function(this->attributes,
+ (void*)attribute_entry_destroy);
free(this);
}
@@ -111,10 +170,13 @@ dhcp_transaction_t *dhcp_transaction_create(u_int32_t id,
.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),
+ .attributes = linked_list_create(),
);
return &this->public;