summaryrefslogtreecommitdiff
path: root/src/charon/sa/tasks/ike_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/charon/sa/tasks/ike_config.c')
-rw-r--r--src/charon/sa/tasks/ike_config.c106
1 files changed, 97 insertions, 9 deletions
diff --git a/src/charon/sa/tasks/ike_config.c b/src/charon/sa/tasks/ike_config.c
index e89f381d3..b890e93ba 100644
--- a/src/charon/sa/tasks/ike_config.c
+++ b/src/charon/sa/tasks/ike_config.c
@@ -13,7 +13,7 @@
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
- * $Id: ike_config.c 4129 2008-07-01 06:36:52Z martin $
+ * $Id: ike_config.c 4867 2009-02-13 11:57:50Z andreas $
*/
#include "ike_config.h"
@@ -21,6 +21,9 @@
#include <daemon.h>
#include <encoding/payloads/cp_payload.h>
+#define DNS_SERVER_MAX 2
+#define NBNS_SERVER_MAX 2
+
typedef struct private_ike_config_t private_ike_config_t;
/**
@@ -52,6 +55,11 @@ struct private_ike_config_t {
* list of DNS servers
*/
linked_list_t *dns;
+
+ /**
+ * list of WINS servers
+ */
+ linked_list_t *nbns;
};
/**
@@ -121,7 +129,10 @@ static void build_payloads(private_ike_config_t *this, message_t *message,
else
{
host_t *ip;
- iterator_t *iterator = this->dns->create_iterator(this->dns, TRUE);
+ iterator_t *iterator;
+
+ /* Add internal DNS servers */
+ iterator = this->dns->create_iterator(this->dns, TRUE);
while (iterator->iterate(iterator, (void**)&ip))
{
ca = configuration_attribute_create();
@@ -138,6 +149,25 @@ static void build_payloads(private_ike_config_t *this, message_t *message,
cp->add_configuration_attribute(cp, ca);
}
iterator->destroy(iterator);
+
+ /* Add internal WINS servers */
+ iterator = this->nbns->create_iterator(this->nbns, TRUE);
+ while (iterator->iterate(iterator, (void**)&ip))
+ {
+ ca = configuration_attribute_create();
+ if (ip->get_family(ip) == AF_INET)
+ {
+ ca->set_type(ca, INTERNAL_IP4_NBNS);
+ }
+ else
+ {
+ ca->set_type(ca, INTERNAL_IP6_NBNS);
+ }
+ chunk = ip->get_address(ip);
+ ca->set_value(ca, chunk);
+ cp->add_configuration_attribute(cp, ca);
+ }
+ iterator->destroy(iterator);
}
message->add_payload(message, (payload_t*)cp);
}
@@ -201,7 +231,22 @@ static void process_attribute(private_ike_config_t *this,
}
case INTERNAL_IP4_NBNS:
case INTERNAL_IP6_NBNS:
- /* TODO */
+ {
+ addr = ca->get_value(ca);
+ if (addr.len == 0)
+ {
+ ip = host_create_any(family);
+ }
+ else
+ {
+ ip = host_create_from_chunk(family, addr, 0);
+ }
+ if (ip)
+ {
+ this->nbns->insert_last(this->nbns, ip);
+ }
+ break;
+ }
default:
DBG1(DBG_IKE, "ignoring %N config attribute",
configuration_attribute_type_names,
@@ -351,7 +396,7 @@ static status_t process_i(private_ike_config_t *this, message_t *message)
process_payloads(this, message);
if (this->virtual_ip == NULL)
- { /* force a configured virtual IP, even server didn't return one */
+ { /* force a configured virtual IP, even if server didn't return one */
config = this->ike_sa->get_peer_cfg(this->ike_sa);
this->virtual_ip = config->get_virtual_ip(config);
if (this->virtual_ip)
@@ -406,6 +451,7 @@ static void destroy(private_ike_config_t *this)
{
DESTROY_IF(this->virtual_ip);
this->dns->destroy_offset(this->dns, offsetof(host_t, destroy));
+ this->nbns->destroy_offset(this->nbns, offsetof(host_t, destroy));
free(this);
}
@@ -420,6 +466,12 @@ ike_config_t *ike_config_create(ike_sa_t *ike_sa, bool initiator)
this->public.task.migrate = (void(*)(task_t*,ike_sa_t*))migrate;
this->public.task.destroy = (void(*)(task_t*))destroy;
+ this->initiator = initiator;
+ this->ike_sa = ike_sa;
+ this->virtual_ip = NULL;
+ this->dns = linked_list_create();
+ this->nbns = linked_list_create();
+
if (initiator)
{
this->public.task.build = (status_t(*)(task_t*,message_t*))build_i;
@@ -427,13 +479,49 @@ ike_config_t *ike_config_create(ike_sa_t *ike_sa, bool initiator)
}
else
{
+ int i;
+
+ /* assign DNS servers */
+ for (i = 1; i <= DNS_SERVER_MAX; i++)
+ {
+ char dns_key[16], *dns_str;
+
+ snprintf(dns_key, sizeof(dns_key), "charon.dns%d", i);
+ dns_str = lib->settings->get_str(lib->settings, dns_key, NULL);
+ if (dns_str)
+ {
+ host_t *dns = host_create_from_string(dns_str, 0);
+
+ if (dns)
+ {
+ DBG2(DBG_CFG, "assigning DNS server %H to peer", dns);
+ this->dns->insert_last(this->dns, dns);
+ }
+ }
+ }
+
+ /* assign WINS servers */
+ for (i = 1; i <= NBNS_SERVER_MAX; i++)
+ {
+ char nbns_key[16], *nbns_str;
+
+ snprintf(nbns_key, sizeof(nbns_key), "charon.nbns%d", i);
+ nbns_str = lib->settings->get_str(lib->settings, nbns_key, NULL);
+ if (nbns_str)
+ {
+ host_t *nbns = host_create_from_string(nbns_str, 0);
+
+ if (nbns)
+ {
+ DBG2(DBG_CFG, "assigning NBNS server %H to peer", nbns);
+ this->nbns->insert_last(this->nbns, nbns);
+ }
+ }
+ }
+
this->public.task.build = (status_t(*)(task_t*,message_t*))build_r;
this->public.task.process = (status_t(*)(task_t*,message_t*))process_r;
}
- this->initiator = initiator;
- this->ike_sa = ike_sa;
- this->virtual_ip = NULL;
- this->dns = linked_list_create();
-
+
return &this->public;
}