From d1384080b3ba74f366eaf8b5f027babca3f5d607 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Mon, 26 Jul 2010 15:01:24 +0200 Subject: [PATCH] Reserve virtual IP of passive IKE_SAs in the local pool --- src/libcharon/plugins/ha/ha_dispatcher.c | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/libcharon/plugins/ha/ha_dispatcher.c b/src/libcharon/plugins/ha/ha_dispatcher.c index 2385be328..3c41466aa 100644 --- a/src/libcharon/plugins/ha/ha_dispatcher.c +++ b/src/libcharon/plugins/ha/ha_dispatcher.c @@ -15,6 +15,7 @@ #include "ha_dispatcher.h" +#include #include #include @@ -203,6 +204,34 @@ static void set_extension(ike_sa_t *ike_sa, ike_extension_t set, } } +/** + * For a virtual IP, try to reserve it in the pool. + */ +static void reserve_vip(ike_sa_t *ike_sa, host_t *vip) +{ + host_t *acquired; + identification_t *id; + peer_cfg_t *peer_cfg; + + peer_cfg = ike_sa->get_peer_cfg(ike_sa); + if (peer_cfg) + { + DBG1(DBG_CFG, "trying to reserve virtual IP %H", vip); + id = ike_sa->get_other_eap_id(ike_sa); + acquired = hydra->attributes->acquire_address(hydra->attributes, + peer_cfg->get_pool(peer_cfg), id, vip); + if (acquired) + { + if (!vip->ip_equals(vip, acquired)) + { /* got a different IP, release */ + hydra->attributes->release_address(hydra->attributes, + peer_cfg->get_pool(peer_cfg), acquired, id); + } + acquired->destroy(acquired); + } + } +} + /** * Process messages of type IKE_UPDATE */ @@ -246,6 +275,7 @@ static void process_ike_update(private_ha_dispatcher_t *this, break; case HA_REMOTE_VIP: ike_sa->set_virtual_ip(ike_sa, FALSE, value.host); + reserve_vip(ike_sa, value.host); break; case HA_ADDITIONAL_ADDR: ike_sa->add_additional_address(ike_sa,