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:
@@ -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
|
||||
@@ -78,6 +78,11 @@ struct private_charonservice_t {
|
||||
*/
|
||||
network_manager_t *network_manager;
|
||||
|
||||
/**
|
||||
* Handle network events
|
||||
*/
|
||||
android_net_t *net_handler;
|
||||
|
||||
/**
|
||||
* CharonVpnService reference
|
||||
*/
|
||||
@@ -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,
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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_ @}*/
|
||||
|
||||
Reference in New Issue
Block a user