]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
Use message hook to catch virtual IP, as it is not yet set in ike_updown
authorMartin Willi <martin@revosec.ch>
Fri, 19 Mar 2010 15:54:21 +0000 (16:54 +0100)
committerMartin Willi <martin@revosec.ch>
Thu, 25 Mar 2010 13:39:32 +0000 (14:39 +0100)
src/libcharon/plugins/farp/farp_listener.c

index 01876814496b114b00776946bf5ff9727a995071..3875c1fafbca52295351a89b705dc3281c528206 100644 (file)
@@ -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,
                },