diff options
author | Tobias Brunner <tobias@strongswan.org> | 2010-07-06 16:03:09 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2010-09-02 19:01:25 +0200 |
commit | ba26508d0598d440638710736031864320253d94 (patch) | |
tree | 01459ecd827e571b90a4436475cec5bd46b56508 /src | |
parent | 61e8e73206829e1d37c8e64585dd283ab4a29cef (diff) | |
download | strongswan-ba26508d0598d440638710736031864320253d94.tar.bz2 strongswan-ba26508d0598d440638710736031864320253d94.tar.xz |
Moved roam job creation to kernel event handler.
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/kernel/kernel_handler.c | 11 | ||||
-rw-r--r-- | src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c | 34 | ||||
-rw-r--r-- | src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c | 32 |
3 files changed, 56 insertions, 21 deletions
diff --git a/src/libcharon/kernel/kernel_handler.c b/src/libcharon/kernel/kernel_handler.c index 4fae6cde2..482f1494c 100644 --- a/src/libcharon/kernel/kernel_handler.c +++ b/src/libcharon/kernel/kernel_handler.c @@ -21,6 +21,7 @@ #include <processing/jobs/delete_child_sa_job.h> #include <processing/jobs/migrate_job.h> #include <processing/jobs/rekey_child_sa_job.h> +#include <processing/jobs/roam_job.h> #include <processing/jobs/update_sa_job.h> typedef struct private_kernel_handler_t private_kernel_handler_t; @@ -103,6 +104,15 @@ METHOD(kernel_listener_t, migrate, bool, return TRUE; } +METHOD(kernel_listener_t, roam, bool, + private_kernel_handler_t *this, bool address) +{ + job_t *job; + job = (job_t*)roam_job_create(address); + hydra->processor->queue_job(hydra->processor, job); + return TRUE; +} + METHOD(kernel_handler_t, destroy, void, private_kernel_handler_t *this) { @@ -122,6 +132,7 @@ kernel_handler_t *kernel_handler_create() .expire = _expire, .mapping = _mapping, .migrate = _migrate, + .roam = _roam, }, .destroy = _destroy, }, diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c index fa4a50134..e55329e84 100644 --- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c +++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c @@ -54,9 +54,8 @@ #include <threading/mutex.h> #include <utils/linked_list.h> #include <processing/jobs/callback_job.h> -#include <processing/jobs/roam_job.h> -/** delay before firing roam jobs (ms) */ +/** delay before firing roam events (ms) */ #define ROAM_DELAY 100 typedef struct addr_entry_t addr_entry_t; @@ -159,7 +158,7 @@ struct private_kernel_netlink_net_t { int socket_events; /** - * time of the last roam_job + * time of the last roam event */ timeval_t last_roam; @@ -224,12 +223,22 @@ static int get_vip_refcount(private_kernel_netlink_net_t *this, host_t* ip) } /** - * start a roaming job. We delay it for a second 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_netlink_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_netlink_net_t *this, bool address) { timeval_t now; + job_t *job; time_monotonic(&now); if (timercmp(&now, &this->last_roam, >)) @@ -241,8 +250,11 @@ static void fire_roam_job(private_kernel_netlink_net_t *this, bool address) now.tv_usec -= 1000000; } this->last_roam = now; - hydra->scheduler->schedule_job_ms(hydra->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); } } @@ -342,7 +354,7 @@ static void process_link(private_kernel_netlink_net_t *this, /* send an update to all IKE_SAs */ if (update && event) { - fire_roam_job(this, TRUE); + fire_roam_event(this, TRUE); } } @@ -459,7 +471,7 @@ static void process_addr(private_kernel_netlink_net_t *this, /* send an update to all IKE_SAs */ if (update && event && changed) { - fire_roam_job(this, TRUE); + fire_roam_event(this, TRUE); } } @@ -495,7 +507,7 @@ static void process_route(private_kernel_netlink_net_t *this, struct nlmsghdr *h this->mutex->lock(this->mutex); if (!get_vip_refcount(this, host)) { /* ignore routes added for virtual IPs */ - fire_roam_job(this, FALSE); + fire_roam_event(this, FALSE); } this->mutex->unlock(this->mutex); host->destroy(host); diff --git a/src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c b/src/libcharon/plugins/kernel_pfroute/kernel_pfroute_net.c index ab82c1e57..9f40daeaa 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 <threading/mutex.h> #include <utils/linked_list.h> #include <processing/jobs/callback_job.h> -#include <processing/jobs/roam_job.h> #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; - hydra->scheduler->schedule_job_ms(hydra->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); } } |