diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/plugins/farp/farp_listener.c | 42 |
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, }, |