preliminary support of Mobile IPv6
This commit is contained in:
@@ -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, ¤t))
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user