diff options
author | Tobias Brunner <tobias@strongswan.org> | 2012-09-05 13:16:31 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2012-09-05 14:35:57 +0200 |
commit | d2e8f20d949dde98d5c42e5d7da9dae5771b56f1 (patch) | |
tree | bcd444240bb5c4598ef9fb99a14a6d4d294d2055 /src/libcharon/plugins/ha/ha_dispatcher.c | |
parent | 4c892fe5335851d79ce6193cbfdc307cea34c70b (diff) | |
download | strongswan-d2e8f20d949dde98d5c42e5d7da9dae5771b56f1.tar.bz2 strongswan-d2e8f20d949dde98d5c42e5d7da9dae5771b56f1.tar.xz |
Clear virtual IPs before storing assigned ones on the IKE_SA
Otherwise we'll end up with duplicate or invalid VIPs stored on the
IKE_SA.
Diffstat (limited to 'src/libcharon/plugins/ha/ha_dispatcher.c')
-rw-r--r-- | src/libcharon/plugins/ha/ha_dispatcher.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/libcharon/plugins/ha/ha_dispatcher.c b/src/libcharon/plugins/ha/ha_dispatcher.c index f07b4ea21..97ed13111 100644 --- a/src/libcharon/plugins/ha/ha_dispatcher.c +++ b/src/libcharon/plugins/ha/ha_dispatcher.c @@ -310,7 +310,7 @@ static void process_ike_update(private_ha_dispatcher_t *this, ike_sa_t *ike_sa = NULL; peer_cfg_t *peer_cfg = NULL; auth_cfg_t *auth; - bool received_vip = FALSE, first_peer_addr = TRUE; + bool received_vip = FALSE, first_local_vip = TRUE, first_peer_addr = TRUE; enumerator = message->create_attribute_enumerator(message); while (enumerator->enumerate(enumerator, &attribute, &value)) @@ -344,9 +344,18 @@ static void process_ike_update(private_ha_dispatcher_t *this, ike_sa->set_other_host(ike_sa, value.host->clone(value.host)); break; case HA_LOCAL_VIP: + if (first_local_vip) + { + ike_sa->clear_virtual_ips(ike_sa, TRUE); + first_local_vip = FALSE; + } ike_sa->add_virtual_ip(ike_sa, TRUE, value.host); break; case HA_REMOTE_VIP: + if (!received_vip) + { + ike_sa->clear_virtual_ips(ike_sa, FALSE); + } ike_sa->add_virtual_ip(ike_sa, FALSE, value.host); received_vip = TRUE; break; |