]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
farp: use watcher instead of dedicated receiver thread
authorMartin Willi <martin@revosec.ch>
Mon, 1 Jul 2013 09:59:56 +0000 (11:59 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 17 Jul 2013 14:55:50 +0000 (16:55 +0200)
src/libcharon/plugins/farp/farp_spoofer.c

index 52b037c19135f7f4b43101c08a96f857ad8b65df..9f66d74077b998ccdec802879bd33de9cef1a93b 100644 (file)
@@ -96,20 +96,16 @@ static void send_arp(private_farp_spoofer_t *this,
 /**
  * ARP request receiving
  */
-static job_requeue_t receive_arp(private_farp_spoofer_t *this)
+static bool receive_arp(private_farp_spoofer_t *this)
 {
        struct sockaddr_ll addr;
        socklen_t addr_len = sizeof(addr);
        arp_t arp;
-       int oldstate;
        ssize_t len;
        host_t *local, *remote;
 
-       oldstate = thread_cancelability(TRUE);
-       len = recvfrom(this->skt, &arp, sizeof(arp), 0,
+       len = recvfrom(this->skt, &arp, sizeof(arp), MSG_DONTWAIT,
                                   (struct sockaddr*)&addr, &addr_len);
-       thread_cancelability(oldstate);
-
        if (len == sizeof(arp))
        {
                local = host_create_from_chunk(AF_INET,
@@ -124,12 +120,13 @@ static job_requeue_t receive_arp(private_farp_spoofer_t *this)
                remote->destroy(remote);
        }
 
-       return JOB_REQUEUE_DIRECT;
+       return TRUE;
 }
 
 METHOD(farp_spoofer_t, destroy, void,
        private_farp_spoofer_t *this)
 {
+       lib->watcher->remove(lib->watcher, this->skt);
        close(this->skt);
        free(this);
 }
@@ -183,10 +180,8 @@ farp_spoofer_t *farp_spoofer_create(farp_listener_t *listener)
                return NULL;
        }
 
-       lib->processor->queue_job(lib->processor,
-               (job_t*)callback_job_create_with_prio((callback_job_cb_t)receive_arp,
-                       this, NULL, (callback_job_cancel_t)return_false, JOB_PRIO_CRITICAL));
+       lib->watcher->add(lib->watcher, this->skt, WATCHER_READ,
+                                         (watcher_cb_t)receive_arp, this);
 
        return &this->public;
 }
-