preliminary support of Mobile IPv6

This commit is contained in:
Andreas Steffen
2008-11-11 06:37:37 +00:00
parent 91db979cdd
commit d487b4b727
17 changed files with 336 additions and 200 deletions
+30 -9
View File
@@ -21,6 +21,8 @@
#include "peer_cfg.h"
#include <daemon.h>
#include <utils/mutex.h>
#include <utils/linked_list.h>
#include <utils/identification.h>
@@ -228,16 +230,20 @@ static enumerator_t* create_child_cfg_enumerator(private_peer_cfg_t *this)
/**
* Check if child_cfg contains traffic selectors
*/
static bool contains_ts(child_cfg_t *child, bool mine, linked_list_t *ts,
static int contains_ts(child_cfg_t *child, bool mine, linked_list_t *ts,
host_t *host)
{
linked_list_t *selected;
bool contains = FALSE;
int prio;
if (child->equal_traffic_selectors(child, mine, ts, host))
{
return 2;
}
selected = child->get_traffic_selectors(child, mine, ts, host);
contains = selected->get_count(selected);
prio = selected->get_count(selected) ? 1 : 0;
selected->destroy_offset(selected, offsetof(traffic_selector_t, destroy));
return contains;
return prio;
}
/**
@@ -250,18 +256,33 @@ static child_cfg_t* select_child_cfg(private_peer_cfg_t *this,
{
child_cfg_t *current, *found = NULL;
enumerator_t *enumerator;
int best = 0;
DBG2(DBG_CFG, "looking for a child config for %#R=== %#R", my_ts, other_ts);
enumerator = create_child_cfg_enumerator(this);
while (enumerator->enumerate(enumerator, &current))
{
if (contains_ts(current, TRUE, my_ts, my_host) &&
contains_ts(current, FALSE, other_ts, other_host))
int prio = contains_ts(current, TRUE, my_ts, my_host) +
contains_ts(current, FALSE, other_ts, other_host);
if (prio)
{
found = current->get_ref(current);
break;
DBG2(DBG_CFG, " candidate \"%s\" with prio %d",
current->get_name(current), prio);
if (prio > best)
{
best = prio;
DESTROY_IF(found);
found = current->get_ref(current);
}
}
}
enumerator->destroy(enumerator);
if (found)
{
DBG2(DBG_CFG, "found matching child config \"%s\" with prio %d",
found->get_name(found), best);
}
return found;
}