X-Git-Url: https://git.strongswan.org/?p=strongswan.git;a=blobdiff_plain;f=src%2Flibcharon%2Fplugins%2Fkernel_pfroute%2Fkernel_pfroute_net.c;h=9f40daeaabffb11b23cde8bffba0c5fc571f614d;hp=6c06b6292d1b0492ce311bc1d284831122a1cd8a;hb=ba26508d0598d440638710736031864320253d94;hpb=c5f7146b17453d1d4d2c7cbd4e9880a3fd342591 diff --git a/src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c b/src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c index 6c06b62..9f40dae 100644 --- a/src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c +++ b/src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c @@ -30,13 +30,12 @@ #include #include #include -#include #ifndef HAVE_STRUCT_SOCKADDR_SA_LEN #error Cannot compile this plugin on systems where 'struct sockaddr' has no sa_len member. #endif -/** delay before firing roam jobs (ms) */ +/** delay before firing roam events (ms) */ #define ROAM_DELAY 100 /** buffer size for PF_ROUTE messages */ @@ -146,18 +145,28 @@ struct private_kernel_pfroute_net_t int seq; /** - * time of last roam job + * time of last roam event */ timeval_t last_roam; }; /** - * Start a roaming job. We delay it a bit and fire only one job - * for multiple events. Otherwise we would create too many jobs. + * callback function that raises the delayed roam event */ -static void fire_roam_job(private_kernel_pfroute_net_t *this, bool address) +static job_requeue_t roam_event(uintptr_t address) +{ + charon->kernel_interface->roam(charon->kernel_interface, address != 0); + return JOB_REQUEUE_NONE; +} + +/** + * fire a roaming event. we delay it for a bit and fire only one event + * for multiple calls. otherwise we would create too many events. + */ +static void fire_roam_event(private_kernel_pfroute_net_t *this, bool address) { timeval_t now; + job_t *job; time_monotonic(&now); if (timercmp(&now, &this->last_roam, >)) @@ -169,8 +178,11 @@ static void fire_roam_job(private_kernel_pfroute_net_t *this, bool address) now.tv_usec -= 1000000; } this->last_roam = now; - charon->scheduler->schedule_job_ms(charon->scheduler, - (job_t*)roam_job_create(address), ROAM_DELAY); + + job = (job_t*)callback_job_create((callback_job_cb_t)roam_event, + (void*)(uintptr_t)(address ? 1 : 0), + NULL, NULL); + hydra->scheduler->schedule_job_ms(hydra->scheduler, job, ROAM_DELAY); } } @@ -262,7 +274,7 @@ static void process_addr(private_kernel_pfroute_net_t *this, if (roam) { - fire_roam_job(this, TRUE); + fire_roam_event(this, TRUE); } } @@ -307,7 +319,7 @@ static void process_link(private_kernel_pfroute_net_t *this, if (roam) { - fire_roam_job(this, TRUE); + fire_roam_event(this, TRUE); } }