Disabled listening for kernel events in starter.

This commit is contained in:
Tobias Brunner
2012-06-08 14:12:06 +02:00
parent 82ad53b776
commit 05ca56558c
4 changed files with 110 additions and 74 deletions
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2006-2011 Tobias Brunner * Copyright (C) 2006-2012 Tobias Brunner
* Copyright (C) 2005-2009 Martin Willi * Copyright (C) 2005-2009 Martin Willi
* Copyright (C) 2008 Andreas Steffen * Copyright (C) 2008 Andreas Steffen
* Copyright (C) 2006-2007 Fabian Hartmann, Noah Heusser * Copyright (C) 2006-2007 Fabian Hartmann, Noah Heusser
@@ -2645,7 +2645,7 @@ METHOD(kernel_ipsec_t, destroy, void,
kernel_netlink_ipsec_t *kernel_netlink_ipsec_create() kernel_netlink_ipsec_t *kernel_netlink_ipsec_create()
{ {
private_kernel_netlink_ipsec_t *this; private_kernel_netlink_ipsec_t *this;
struct sockaddr_nl addr; bool register_for_events = TRUE;
int fd; int fd;
INIT(this, INIT(this,
@@ -2687,6 +2687,10 @@ kernel_netlink_ipsec_t *kernel_netlink_ipsec_create()
/* no policy history for pluto */ /* no policy history for pluto */
this->policy_history = FALSE; this->policy_history = FALSE;
} }
else if (streq(hydra->daemon, "starter"))
{ /* starter has no threads, so we do not register for kernel events */
register_for_events = FALSE;
}
/* disable lifetimes for allocated SPIs in kernel */ /* disable lifetimes for allocated SPIs in kernel */
fd = open("/proc/sys/net/core/xfrm_acq_expires", O_WRONLY); fd = open("/proc/sys/net/core/xfrm_acq_expires", O_WRONLY);
@@ -2703,6 +2707,10 @@ kernel_netlink_ipsec_t *kernel_netlink_ipsec_create()
return NULL; return NULL;
} }
if (register_for_events)
{
struct sockaddr_nl addr;
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK; addr.nl_family = AF_NETLINK;
@@ -2725,6 +2733,7 @@ kernel_netlink_ipsec_t *kernel_netlink_ipsec_create()
this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events, this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events,
this, NULL, NULL, JOB_PRIO_CRITICAL); this, NULL, NULL, JOB_PRIO_CRITICAL);
lib->processor->queue_job(lib->processor, (job_t*)this->job); lib->processor->queue_job(lib->processor, (job_t*)this->job);
}
return &this->public; return &this->public;
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2008-2011 Tobias Brunner * Copyright (C) 2008-2012 Tobias Brunner
* Copyright (C) 2005-2008 Martin Willi * Copyright (C) 2005-2008 Martin Willi
* Hochschule fuer Technik Rapperswil * Hochschule fuer Technik Rapperswil
* *
@@ -1790,8 +1790,8 @@ METHOD(kernel_net_t, destroy, void,
kernel_netlink_net_t *kernel_netlink_net_create() kernel_netlink_net_t *kernel_netlink_net_create()
{ {
private_kernel_netlink_net_t *this; private_kernel_netlink_net_t *this;
struct sockaddr_nl addr;
enumerator_t *enumerator; enumerator_t *enumerator;
bool register_for_events = TRUE;
char *exclude; char *exclude;
INIT(this, INIT(this,
@@ -1831,6 +1831,11 @@ kernel_netlink_net_t *kernel_netlink_net_create()
timerclear(&this->last_route_reinstall); timerclear(&this->last_route_reinstall);
timerclear(&this->last_roam); timerclear(&this->last_roam);
if (streq(hydra->daemon, "starter"))
{ /* starter has no threads, so we do not register for kernel events */
register_for_events = FALSE;
}
exclude = lib->settings->get_str(lib->settings, exclude = lib->settings->get_str(lib->settings,
"%s.ignore_routing_tables", NULL, hydra->daemon); "%s.ignore_routing_tables", NULL, hydra->daemon);
if (exclude) if (exclude)
@@ -1852,6 +1857,10 @@ kernel_netlink_net_t *kernel_netlink_net_create()
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
} }
if (register_for_events)
{
struct sockaddr_nl addr;
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK; addr.nl_family = AF_NETLINK;
@@ -1875,6 +1884,7 @@ kernel_netlink_net_t *kernel_netlink_net_create()
this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events, this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events,
this, NULL, NULL, JOB_PRIO_CRITICAL); this, NULL, NULL, JOB_PRIO_CRITICAL);
lib->processor->queue_job(lib->processor, (job_t*)this->job); lib->processor->queue_job(lib->processor, (job_t*)this->job);
}
if (init_address_list(this) != SUCCESS) if (init_address_list(this) != SUCCESS)
{ {
@@ -2524,6 +2524,7 @@ METHOD(kernel_ipsec_t, destroy, void,
kernel_pfkey_ipsec_t *kernel_pfkey_ipsec_create() kernel_pfkey_ipsec_t *kernel_pfkey_ipsec_create()
{ {
private_kernel_pfkey_ipsec_t *this; private_kernel_pfkey_ipsec_t *this;
bool register_for_events = TRUE;
INIT(this, INIT(this,
.public = { .public = {
@@ -2557,6 +2558,10 @@ kernel_pfkey_ipsec_t *kernel_pfkey_ipsec_create()
{ /* no routes for pluto, they are installed via updown script */ { /* no routes for pluto, they are installed via updown script */
this->install_routes = FALSE; this->install_routes = FALSE;
} }
else if (streq(hydra->daemon, "starter"))
{ /* starter has no threads, so we do not register for kernel events */
register_for_events = FALSE;
}
/* create a PF_KEY socket to communicate with the kernel */ /* create a PF_KEY socket to communicate with the kernel */
this->socket = socket(PF_KEY, SOCK_RAW, PF_KEY_V2); this->socket = socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
@@ -2567,6 +2572,8 @@ kernel_pfkey_ipsec_t *kernel_pfkey_ipsec_create()
return NULL; return NULL;
} }
if (register_for_events)
{
/* create a PF_KEY socket for ACQUIRE & EXPIRE */ /* create a PF_KEY socket for ACQUIRE & EXPIRE */
this->socket_events = socket(PF_KEY, SOCK_RAW, PF_KEY_V2); this->socket_events = socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
if (this->socket_events <= 0) if (this->socket_events <= 0)
@@ -2588,6 +2595,7 @@ kernel_pfkey_ipsec_t *kernel_pfkey_ipsec_create()
this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events, this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events,
this, NULL, NULL, JOB_PRIO_CRITICAL); this, NULL, NULL, JOB_PRIO_CRITICAL);
lib->processor->queue_job(lib->processor, (job_t*)this->job); lib->processor->queue_job(lib->processor, (job_t*)this->job);
}
return &this->public; return &this->public;
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2009 Tobias Brunner * Copyright (C) 2009-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
@@ -672,6 +672,7 @@ METHOD(kernel_net_t, destroy, void,
kernel_pfroute_net_t *kernel_pfroute_net_create() kernel_pfroute_net_t *kernel_pfroute_net_create()
{ {
private_kernel_pfroute_net_t *this; private_kernel_pfroute_net_t *this;
bool register_for_events = TRUE;
INIT(this, INIT(this,
.public = { .public = {
@@ -692,6 +693,11 @@ kernel_pfroute_net_t *kernel_pfroute_net_create()
.mutex_pfroute = mutex_create(MUTEX_TYPE_DEFAULT), .mutex_pfroute = mutex_create(MUTEX_TYPE_DEFAULT),
); );
if (streq(hydra->daemon, "starter"))
{ /* starter has no threads, so we do not register for kernel events */
register_for_events = FALSE;
}
/* create a PF_ROUTE socket to communicate with the kernel */ /* create a PF_ROUTE socket to communicate with the kernel */
this->socket = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC); this->socket = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
if (this->socket < 0) if (this->socket < 0)
@@ -701,6 +707,8 @@ kernel_pfroute_net_t *kernel_pfroute_net_create()
return NULL; return NULL;
} }
if (register_for_events)
{
/* create a PF_ROUTE socket to receive events */ /* create a PF_ROUTE socket to receive events */
this->socket_events = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC); this->socket_events = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
if (this->socket_events < 0) if (this->socket_events < 0)
@@ -713,6 +721,7 @@ kernel_pfroute_net_t *kernel_pfroute_net_create()
this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events, this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events,
this, NULL, NULL, JOB_PRIO_CRITICAL); this, NULL, NULL, JOB_PRIO_CRITICAL);
lib->processor->queue_job(lib->processor, (job_t*)this->job); lib->processor->queue_job(lib->processor, (job_t*)this->job);
}
if (init_address_list(this) != SUCCESS) if (init_address_list(this) != SUCCESS)
{ {