aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2013-04-16 14:40:19 +0200
committerTobias Brunner <tobias@strongswan.org>2013-05-03 15:11:20 +0200
commit18dab76bfa35afe6e6da5b1c945632c52a4b5de0 (patch)
treef34079c21691e3ab5debe0e8ae1d07ec242ca571 /src
parent37873f9994a8c5e470969c6c906669df1cbdddf6 (diff)
downloadstrongswan-18dab76bfa35afe6e6da5b1c945632c52a4b5de0.tar.bz2
strongswan-18dab76bfa35afe6e6da5b1c945632c52a4b5de0.tar.xz
android: Repurpose android-net to simply handle connectivity events
Using the events by NetworkManager/ConnectivityManager to trigger roam events instead of the events generated by the kernel-netlink plugin the noise level is much lower.
Diffstat (limited to 'src')
-rw-r--r--src/frontends/android/jni/libandroidbridge/charonservice.c13
-rw-r--r--src/frontends/android/jni/libandroidbridge/kernel/android_net.c51
-rw-r--r--src/frontends/android/jni/libandroidbridge/kernel/android_net.h29
3 files changed, 34 insertions, 59 deletions
diff --git a/src/frontends/android/jni/libandroidbridge/charonservice.c b/src/frontends/android/jni/libandroidbridge/charonservice.c
index 4b2e58b25..9afedf616 100644
--- a/src/frontends/android/jni/libandroidbridge/charonservice.c
+++ b/src/frontends/android/jni/libandroidbridge/charonservice.c
@@ -1,7 +1,7 @@
/*
+ * Copyright (C) 2012-2013 Tobias Brunner
* Copyright (C) 2012 Giuliano Grassi
* Copyright (C) 2012 Ralf Sager
- * Copyright (C) 2012 Tobias Brunner
* Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
@@ -79,6 +79,11 @@ struct private_charonservice_t {
network_manager_t *network_manager;
/**
+ * Handle network events
+ */
+ android_net_t *net_handler;
+
+ /**
* CharonVpnService reference
*/
jobject vpn_service;
@@ -358,12 +363,14 @@ static bool charonservice_register(void *plugin, plugin_feature_t *feature,
private_charonservice_t *this = (private_charonservice_t*)charonservice;
if (reg)
{
+ this->net_handler = android_net_create();
lib->credmgr->add_set(lib->credmgr, &this->creds->set);
hydra->attributes->add_handler(hydra->attributes,
&this->attr->handler);
}
else
{
+ this->net_handler->destroy(this->net_handler);
lib->credmgr->remove_set(lib->credmgr, &this->creds->set);
hydra->attributes->remove_handler(hydra->attributes,
&this->attr->handler);
@@ -413,6 +420,10 @@ static void set_options(char *logfile)
/* don't install virtual IPs via kernel-netlink */
lib->settings->set_bool(lib->settings,
"charon.install_virtual_ip", FALSE);
+ /* kernel-netlink should not trigger roam events, we use Android's
+ * ConnectivityManager for that, much less noise */
+ lib->settings->set_bool(lib->settings,
+ "charon.plugins.kernel-netlink.roam_events", FALSE);
/* ignore tun devices (it's mostly tun0 but it may already be taken, ignore
* some others too) */
lib->settings->set_str(lib->settings,
diff --git a/src/frontends/android/jni/libandroidbridge/kernel/android_net.c b/src/frontends/android/jni/libandroidbridge/kernel/android_net.c
index 4b42b55a8..653e2738b 100644
--- a/src/frontends/android/jni/libandroidbridge/kernel/android_net.c
+++ b/src/frontends/android/jni/libandroidbridge/kernel/android_net.c
@@ -16,21 +16,20 @@
#include "../charonservice.h"
#include <hydra.h>
-#include <utils/debug.h>
#include <processing/jobs/callback_job.h>
#include <threading/mutex.h>
/** delay before firing roam events (ms) */
#define ROAM_DELAY 100
-typedef struct private_kernel_android_net_t private_kernel_android_net_t;
+typedef struct private_android_net_t private_android_net_t;
-struct private_kernel_android_net_t {
+struct private_android_net_t {
/**
* Public kernel interface
*/
- kernel_android_net_t public;
+ android_net_t public;
/**
* Reference to NetworkManager object
@@ -62,7 +61,7 @@ static job_requeue_t roam_event()
/**
* Listen for connectivity change events and queue a roam event
*/
-static void connectivity_cb(private_kernel_android_net_t *this,
+static void connectivity_cb(private_android_net_t *this,
bool disconnected)
{
timeval_t now;
@@ -84,30 +83,8 @@ static void connectivity_cb(private_kernel_android_net_t *this,
lib->scheduler->schedule_job_ms(lib->scheduler, job, ROAM_DELAY);
}
-METHOD(kernel_net_t, get_source_addr, host_t*,
- private_kernel_android_net_t *this, host_t *dest, host_t *src)
-{
- return this->network_manager->get_local_address(this->network_manager,
- dest->get_family(dest) == AF_INET);
-}
-
-METHOD(kernel_net_t, get_interface, bool,
- private_kernel_android_net_t *this, host_t *host, char **name)
-{
- return this->network_manager->get_interface(this->network_manager, host,
- name);
-}
-
-METHOD(kernel_net_t, add_ip, status_t,
- private_kernel_android_net_t *this, host_t *virtual_ip, int prefix,
- char *iface)
-{
- /* we get the IP from the IKE_SA once the CHILD_SA is established */
- return SUCCESS;
-}
-
-METHOD(kernel_net_t, destroy, void,
- private_kernel_android_net_t *this)
+METHOD(android_net_t, destroy, void,
+ private_android_net_t *this)
{
this->network_manager->remove_connectivity_cb(this->network_manager,
(void*)connectivity_cb);
@@ -118,23 +95,13 @@ METHOD(kernel_net_t, destroy, void,
/*
* Described in header.
*/
-kernel_android_net_t *kernel_android_net_create()
+android_net_t *android_net_create()
{
- private_kernel_android_net_t *this;
+ private_android_net_t *this;
INIT(this,
.public = {
- .interface = {
- .get_source_addr = _get_source_addr,
- .get_nexthop = (void*)return_null,
- .get_interface = _get_interface,
- .create_address_enumerator = (void*)enumerator_create_empty,
- .add_ip = _add_ip,
- .del_ip = (void*)return_failed,
- .add_route = (void*)return_failed,
- .del_route = (void*)return_failed,
- .destroy = _destroy,
- },
+ .destroy = _destroy,
},
.mutex = mutex_create(MUTEX_TYPE_DEFAULT),
.network_manager = charonservice->get_network_manager(charonservice),
diff --git a/src/frontends/android/jni/libandroidbridge/kernel/android_net.h b/src/frontends/android/jni/libandroidbridge/kernel/android_net.h
index f0605390d..ade83f32a 100644
--- a/src/frontends/android/jni/libandroidbridge/kernel/android_net.h
+++ b/src/frontends/android/jni/libandroidbridge/kernel/android_net.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 Tobias Brunner
+ * Copyright (C) 2012-2013 Tobias Brunner
* Hochschule fuer Technik Rapperswil
*
* This program is free software; you can redistribute it and/or modify it
@@ -14,36 +14,33 @@
*/
/**
- * @defgroup kernel_android_net kernel_android_net
+ * @defgroup android_net android_net
* @{ @ingroup android_kernel
*/
-#ifndef KERNEL_ANDROID_NET_H_
-#define KERNEL_ANDROID_NET_H_
+#ifndef ANDROID_NET_H_
+#define ANDROID_NET_H_
#include <library.h>
-#include <kernel/kernel_net.h>
-typedef struct kernel_android_net_t kernel_android_net_t;
+typedef struct android_net_t android_net_t;
/**
- * Implementation of the kernel-net interface. This currently consists of only
- * noops because a kernel_net_t implementation is required and we can't use
- * kernel_netlink_net_t at the moment.
+ * Handle connectivity events from NetworkManager
*/
-struct kernel_android_net_t {
+struct android_net_t {
/**
- * Implements kernel_net_t interface
+ * Destroy an android_net_t instance.
*/
- kernel_net_t interface;
+ void (*destroy)(android_net_t *this);
};
/**
- * Create a android net interface instance.
+ * Create an android_net_t instance.
*
- * @return kernel_android_net_t instance
+ * @return android_net_t instance
*/
-kernel_android_net_t *kernel_android_net_create();
+android_net_t *android_net_create();
-#endif /** KERNEL_ANDROID_NET_H_ @}*/
+#endif /** ANDROID_NET_H_ @}*/