aboutsummaryrefslogtreecommitdiffstats
path: root/src/charon/kernel/kernel_interface.c
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2007-09-03 12:37:25 +0000
committerMartin Willi <martin@strongswan.org>2007-09-03 12:37:25 +0000
commit5474dc650053c8aded6e58a9e91511def9579a69 (patch)
treefb2e069cd1b6c73bef8763081cba250a74c73244 /src/charon/kernel/kernel_interface.c
parentf5da63e937cdd4a115ab14a53771d4d2aa009805 (diff)
downloadstrongswan-5474dc650053c8aded6e58a9e91511def9579a69.tar.bz2
strongswan-5474dc650053c8aded6e58a9e91511def9579a69.tar.xz
implemented routeability checks for mobike (experimental)
Diffstat (limited to 'src/charon/kernel/kernel_interface.c')
-rw-r--r--src/charon/kernel/kernel_interface.c44
1 files changed, 38 insertions, 6 deletions
diff --git a/src/charon/kernel/kernel_interface.c b/src/charon/kernel/kernel_interface.c
index 64448e63f..83f542e6c 100644
--- a/src/charon/kernel/kernel_interface.c
+++ b/src/charon/kernel/kernel_interface.c
@@ -29,6 +29,7 @@
#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/time.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <linux/xfrm.h>
@@ -67,6 +68,9 @@
#define PRIO_LOW 3000
#define PRIO_HIGH 2000
+/** delay before firing roam jobs (ms) */
+#define ROAM_DELAY 100
+
#define BUFFER_SIZE 1024
/**
@@ -344,6 +348,11 @@ struct private_kernel_interface_t {
* Netlink rt socket to receive address change events
*/
int socket_rt_events;
+
+ /**
+ * time of the last roam_job
+ */
+ struct timeval last_roam;
};
/**
@@ -528,6 +537,31 @@ static void process_expire(private_kernel_interface_t *this, struct nlmsghdr *hd
}
/**
+ * start a roaming job. We delay it for a second and fire only one job
+ * for multiple events. Otherwise we would create two many jobs.
+ */
+static void fire_roam_job(private_kernel_interface_t *this, bool address)
+{
+ struct timeval now;
+
+ if (gettimeofday(&now, NULL) == 0)
+ {
+ if (timercmp(&now, &this->last_roam, >))
+ {
+ now.tv_usec += ROAM_DELAY * 1000;
+ while (now.tv_usec > 1000000)
+ {
+ now.tv_sec++;
+ now.tv_usec -= 1000000;
+ }
+ this->last_roam = now;
+ charon->scheduler->schedule_job(charon->scheduler,
+ (job_t*)roam_job_create(address), ROAM_DELAY);
+ }
+ }
+}
+
+/**
* process RTM_NEWLINK/RTM_DELLINK from kernel
*/
static void process_link(private_kernel_interface_t *this,
@@ -623,8 +657,7 @@ static void process_link(private_kernel_interface_t *this,
/* send an update to all IKE_SAs */
if (update && event)
{
- charon->processor->queue_job(charon->processor,
- (job_t*)roam_job_create(TRUE));
+ fire_roam_job(this, TRUE);
}
}
@@ -731,8 +764,7 @@ static void process_addr(private_kernel_interface_t *this,
/* send an update to all IKE_SAs */
if (update && event && changed)
{
- charon->processor->queue_job(charon->processor,
- (job_t*)roam_job_create(TRUE));
+ fire_roam_job(this, TRUE);
}
}
@@ -828,8 +860,7 @@ static job_requeue_t receive_events(private_kernel_interface_t *this)
break;
case RTM_NEWROUTE:
case RTM_DELROUTE:
- charon->processor->queue_job(charon->processor,
- (job_t*)roam_job_create(FALSE));
+ fire_roam_job(this, FALSE);
break;
default:
break;
@@ -2517,6 +2548,7 @@ kernel_interface_t *kernel_interface_create()
this->hiter = NULL;
this->seq = 200;
pthread_mutex_init(&this->mutex,NULL);
+ timerclear(&this->last_roam);
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;