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.
This commit is contained in:
Tobias Brunner
2013-05-03 15:11:20 +02:00
parent 37873f9994
commit 18dab76bfa
3 changed files with 34 additions and 59 deletions
@@ -1,7 +1,7 @@
/* /*
* Copyright (C) 2012-2013 Tobias Brunner
* Copyright (C) 2012 Giuliano Grassi * Copyright (C) 2012 Giuliano Grassi
* Copyright (C) 2012 Ralf Sager * Copyright (C) 2012 Ralf Sager
* Copyright (C) 2012 Tobias Brunner
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
@@ -78,6 +78,11 @@ struct private_charonservice_t {
*/ */
network_manager_t *network_manager; network_manager_t *network_manager;
/**
* Handle network events
*/
android_net_t *net_handler;
/** /**
* CharonVpnService reference * CharonVpnService reference
*/ */
@@ -358,12 +363,14 @@ static bool charonservice_register(void *plugin, plugin_feature_t *feature,
private_charonservice_t *this = (private_charonservice_t*)charonservice; private_charonservice_t *this = (private_charonservice_t*)charonservice;
if (reg) if (reg)
{ {
this->net_handler = android_net_create();
lib->credmgr->add_set(lib->credmgr, &this->creds->set); lib->credmgr->add_set(lib->credmgr, &this->creds->set);
hydra->attributes->add_handler(hydra->attributes, hydra->attributes->add_handler(hydra->attributes,
&this->attr->handler); &this->attr->handler);
} }
else else
{ {
this->net_handler->destroy(this->net_handler);
lib->credmgr->remove_set(lib->credmgr, &this->creds->set); lib->credmgr->remove_set(lib->credmgr, &this->creds->set);
hydra->attributes->remove_handler(hydra->attributes, hydra->attributes->remove_handler(hydra->attributes,
&this->attr->handler); &this->attr->handler);
@@ -413,6 +420,10 @@ static void set_options(char *logfile)
/* don't install virtual IPs via kernel-netlink */ /* don't install virtual IPs via kernel-netlink */
lib->settings->set_bool(lib->settings, lib->settings->set_bool(lib->settings,
"charon.install_virtual_ip", FALSE); "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 /* ignore tun devices (it's mostly tun0 but it may already be taken, ignore
* some others too) */ * some others too) */
lib->settings->set_str(lib->settings, lib->settings->set_str(lib->settings,
@@ -16,21 +16,20 @@
#include "../charonservice.h" #include "../charonservice.h"
#include <hydra.h> #include <hydra.h>
#include <utils/debug.h>
#include <processing/jobs/callback_job.h> #include <processing/jobs/callback_job.h>
#include <threading/mutex.h> #include <threading/mutex.h>
/** delay before firing roam events (ms) */ /** delay before firing roam events (ms) */
#define ROAM_DELAY 100 #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 * Public kernel interface
*/ */
kernel_android_net_t public; android_net_t public;
/** /**
* Reference to NetworkManager object * Reference to NetworkManager object
@@ -62,7 +61,7 @@ static job_requeue_t roam_event()
/** /**
* Listen for connectivity change events and queue a 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) bool disconnected)
{ {
timeval_t now; 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); lib->scheduler->schedule_job_ms(lib->scheduler, job, ROAM_DELAY);
} }
METHOD(kernel_net_t, get_source_addr, host_t*, METHOD(android_net_t, destroy, void,
private_kernel_android_net_t *this, host_t *dest, host_t *src) private_android_net_t *this)
{
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)
{ {
this->network_manager->remove_connectivity_cb(this->network_manager, this->network_manager->remove_connectivity_cb(this->network_manager,
(void*)connectivity_cb); (void*)connectivity_cb);
@@ -118,23 +95,13 @@ METHOD(kernel_net_t, destroy, void,
/* /*
* Described in header. * 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, INIT(this,
.public = { .public = {
.interface = { .destroy = _destroy,
.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,
},
}, },
.mutex = mutex_create(MUTEX_TYPE_DEFAULT), .mutex = mutex_create(MUTEX_TYPE_DEFAULT),
.network_manager = charonservice->get_network_manager(charonservice), .network_manager = charonservice->get_network_manager(charonservice),
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2012 Tobias Brunner * Copyright (C) 2012-2013 Tobias Brunner
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
* This program is free software; you can redistribute it and/or modify it * 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 * @{ @ingroup android_kernel
*/ */
#ifndef KERNEL_ANDROID_NET_H_ #ifndef ANDROID_NET_H_
#define KERNEL_ANDROID_NET_H_ #define ANDROID_NET_H_
#include <library.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 * Handle connectivity events from NetworkManager
* noops because a kernel_net_t implementation is required and we can't use
* kernel_netlink_net_t at the moment.
*/ */
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_ @}*/