aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2010-03-19 16:54:21 +0100
committerMartin Willi <martin@revosec.ch>2010-03-25 14:39:32 +0100
commitdc70a5bb0bb9e9291b6f593a56d8240cf63c542b (patch)
treec9378fe62dbdb14a212d19b164f5d536f8976e2e /src
parent479a7b7d1763861311798c5da02590e82bc5ccc4 (diff)
downloadstrongswan-dc70a5bb0bb9e9291b6f593a56d8240cf63c542b.tar.bz2
strongswan-dc70a5bb0bb9e9291b6f593a56d8240cf63c542b.tar.xz
Use message hook to catch virtual IP, as it is not yet set in ike_updown
Diffstat (limited to 'src')
-rw-r--r--src/libcharon/plugins/farp/farp_listener.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/src/libcharon/plugins/farp/farp_listener.c b/src/libcharon/plugins/farp/farp_listener.c
index 018768144..3875c1faf 100644
--- a/src/libcharon/plugins/farp/farp_listener.c
+++ b/src/libcharon/plugins/farp/farp_listener.c
@@ -60,21 +60,36 @@ static bool equals(host_t *a, host_t *b)
METHOD(listener_t, ike_updown, bool,
private_farp_listener_t *this, ike_sa_t *ike_sa, bool up)
{
- host_t *ip;
-
- ip = ike_sa->get_virtual_ip(ike_sa, FALSE);
- if (ip)
+ if (!up)
{
- this->lock->write_lock(this->lock);
- if (up)
- {
- ip = ip->clone(ip);
- ip = this->ips->put(this->ips, ip, ip);
- }
- else
+ host_t *ip;
+
+ ip = ike_sa->get_virtual_ip(ike_sa, FALSE);
+ if (ip)
{
+ this->lock->write_lock(this->lock);
ip = this->ips->remove(this->ips, ip);
+ this->lock->unlock(this->lock);
+ DESTROY_IF(ip);
}
+ }
+ return TRUE;
+}
+
+METHOD(listener_t, message_hook, bool,
+ private_farp_listener_t *this, ike_sa_t *ike_sa,
+ message_t *message, bool incoming)
+{
+ if (ike_sa->get_state(ike_sa) == IKE_ESTABLISHED &&
+ message->get_exchange_type(message) == IKE_AUTH &&
+ !message->get_request(message))
+ {
+ host_t *ip;
+
+ ip = ike_sa->get_virtual_ip(ike_sa, FALSE);
+ ip = ip->clone(ip);
+ this->lock->write_lock(this->lock);
+ ip = this->ips->put(this->ips, ip, ip);
this->lock->unlock(this->lock);
DESTROY_IF(ip);
}
@@ -119,7 +134,10 @@ farp_listener_t *farp_listener_create()
INIT(this,
.public = {
- .listener.ike_updown = _ike_updown,
+ .listener = {
+ .ike_updown = _ike_updown,
+ .message = _message_hook,
+ },
.is_active = _is_active,
.destroy = _destroy,
},