Extend connected peers by peer family

This allows for simultanious IPv4 and IPv6 tunnel for same peers with
matching identities.
This commit is contained in:
Thomas Egerer
2010-11-12 16:28:04 +01:00
committed by Martin Willi
parent 9cda39923e
commit 8f927116be
+16 -5
View File
@@ -241,6 +241,9 @@ struct connected_peers_t {
/** remote identity */ /** remote identity */
identification_t *other_id; identification_t *other_id;
/** ip address family of peer */
int family;
/** list of ike_sa_id_t objects of IKE_SAs between the two identities */ /** list of ike_sa_id_t objects of IKE_SAs between the two identities */
linked_list_t *sas; linked_list_t *sas;
}; };
@@ -257,10 +260,12 @@ static void connected_peers_destroy(connected_peers_t *this)
* Function that matches connected_peers_t objects by the given ids. * Function that matches connected_peers_t objects by the given ids.
*/ */
static bool connected_peers_match(connected_peers_t *connected_peers, static bool connected_peers_match(connected_peers_t *connected_peers,
identification_t *my_id, identification_t *other_id) identification_t *my_id, identification_t *other_id,
uintptr_t family)
{ {
return my_id->equals(my_id, connected_peers->my_id) && return my_id->equals(my_id, connected_peers->my_id) &&
other_id->equals(other_id, connected_peers->other_id); other_id->equals(other_id, connected_peers->other_id) &&
family == connected_peers->family;
} }
typedef struct segment_t segment_t; typedef struct segment_t segment_t;
@@ -786,7 +791,8 @@ static void put_connected_peers(private_ike_sa_manager_t *this, entry_t *entry)
{ {
connected_peers_t *current; connected_peers_t *current;
if (list->find_first(list, (linked_list_match_t)connected_peers_match, if (list->find_first(list, (linked_list_match_t)connected_peers_match,
(void**)&current, entry->my_id, entry->other_id) == SUCCESS) (void**)&current, entry->my_id, entry->other_id,
(uintptr_t)entry->other->get_family(entry->other)) == SUCCESS)
{ {
connected_peers = current; connected_peers = current;
if (connected_peers->sas->find_first(connected_peers->sas, if (connected_peers->sas->find_first(connected_peers->sas,
@@ -804,6 +810,7 @@ static void put_connected_peers(private_ike_sa_manager_t *this, entry_t *entry)
connected_peers = malloc_thing(connected_peers_t); connected_peers = malloc_thing(connected_peers_t);
connected_peers->my_id = entry->my_id->clone(entry->my_id); connected_peers->my_id = entry->my_id->clone(entry->my_id);
connected_peers->other_id = entry->other_id->clone(entry->other_id); connected_peers->other_id = entry->other_id->clone(entry->other_id);
connected_peers->family = entry->other->get_family(entry->other);
connected_peers->sas = linked_list_create(); connected_peers->sas = linked_list_create();
list->insert_last(list, connected_peers); list->insert_last(list, connected_peers);
} }
@@ -832,7 +839,8 @@ static void remove_connected_peers(private_ike_sa_manager_t *this, entry_t *entr
enumerator_t *enumerator = list->create_enumerator(list); enumerator_t *enumerator = list->create_enumerator(list);
while (enumerator->enumerate(enumerator, &current)) while (enumerator->enumerate(enumerator, &current))
{ {
if (connected_peers_match(current, entry->my_id, entry->other_id)) if (connected_peers_match(current, entry->my_id, entry->other_id,
(uintptr_t)entry->other->get_family(entry->other)))
{ {
ike_sa_id_t *ike_sa_id; ike_sa_id_t *ike_sa_id;
enumerator_t *inner = current->sas->create_enumerator(current->sas); enumerator_t *inner = current->sas->create_enumerator(current->sas);
@@ -1419,9 +1427,12 @@ static bool check_uniqueness(private_ike_sa_manager_t *this, ike_sa_t *ike_sa)
if ((list = this->connected_peers_table[row]) != NULL) if ((list = this->connected_peers_table[row]) != NULL)
{ {
connected_peers_t *current; connected_peers_t *current;
host_t *other_host;
other_host = ike_sa->get_other_host(ike_sa);
if (list->find_first(list, (linked_list_match_t)connected_peers_match, if (list->find_first(list, (linked_list_match_t)connected_peers_match,
(void**)&current, me, other) == SUCCESS) (void**)&current, me, other,
(uintptr_t)other_host->get_family(other_host)) == SUCCESS)
{ {
/* clone the list, so we can release the lock */ /* clone the list, so we can release the lock */
duplicate_ids = current->sas->clone_offset(current->sas, duplicate_ids = current->sas->clone_offset(current->sas,