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:
committed by
Martin Willi
parent
9cda39923e
commit
8f927116be
@@ -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**)¤t, entry->my_id, entry->other_id) == SUCCESS)
|
(void**)¤t, 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, ¤t))
|
while (enumerator->enumerate(enumerator, ¤t))
|
||||||
{
|
{
|
||||||
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**)¤t, me, other) == SUCCESS)
|
(void**)¤t, 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,
|
||||||
|
|||||||
Reference in New Issue
Block a user