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,28 +2707,33 @@ kernel_netlink_ipsec_t *kernel_netlink_ipsec_create()
return NULL; return NULL;
} }
memset(&addr, 0, sizeof(addr)); if (register_for_events)
addr.nl_family = AF_NETLINK; {
struct sockaddr_nl addr;
/* create and bind XFRM socket for ACQUIRE, EXPIRE, MIGRATE & MAPPING */ memset(&addr, 0, sizeof(addr));
this->socket_xfrm_events = socket(AF_NETLINK, SOCK_RAW, NETLINK_XFRM); addr.nl_family = AF_NETLINK;
if (this->socket_xfrm_events <= 0)
{ /* create and bind XFRM socket for ACQUIRE, EXPIRE, MIGRATE & MAPPING */
DBG1(DBG_KNL, "unable to create XFRM event socket"); this->socket_xfrm_events = socket(AF_NETLINK, SOCK_RAW, NETLINK_XFRM);
destroy(this); if (this->socket_xfrm_events <= 0)
return NULL; {
DBG1(DBG_KNL, "unable to create XFRM event socket");
destroy(this);
return NULL;
}
addr.nl_groups = XFRMNLGRP(ACQUIRE) | XFRMNLGRP(EXPIRE) |
XFRMNLGRP(MIGRATE) | XFRMNLGRP(MAPPING);
if (bind(this->socket_xfrm_events, (struct sockaddr*)&addr, sizeof(addr)))
{
DBG1(DBG_KNL, "unable to bind XFRM event socket");
destroy(this);
return NULL;
}
this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events,
this, NULL, NULL, JOB_PRIO_CRITICAL);
lib->processor->queue_job(lib->processor, (job_t*)this->job);
} }
addr.nl_groups = XFRMNLGRP(ACQUIRE) | XFRMNLGRP(EXPIRE) |
XFRMNLGRP(MIGRATE) | XFRMNLGRP(MAPPING);
if (bind(this->socket_xfrm_events, (struct sockaddr*)&addr, sizeof(addr)))
{
DBG1(DBG_KNL, "unable to bind XFRM event socket");
destroy(this);
return NULL;
}
this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events,
this, NULL, NULL, JOB_PRIO_CRITICAL);
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,29 +1857,34 @@ kernel_netlink_net_t *kernel_netlink_net_create()
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
} }
memset(&addr, 0, sizeof(addr)); if (register_for_events)
addr.nl_family = AF_NETLINK;
/* create and bind RT socket for events (address/interface/route changes) */
this->socket_events = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (this->socket_events < 0)
{ {
DBG1(DBG_KNL, "unable to create RT event socket"); struct sockaddr_nl addr;
destroy(this);
return NULL;
}
addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |
RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_LINK;
if (bind(this->socket_events, (struct sockaddr*)&addr, sizeof(addr)))
{
DBG1(DBG_KNL, "unable to bind RT event socket");
destroy(this);
return NULL;
}
this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events, memset(&addr, 0, sizeof(addr));
this, NULL, NULL, JOB_PRIO_CRITICAL); addr.nl_family = AF_NETLINK;
lib->processor->queue_job(lib->processor, (job_t*)this->job);
/* create and bind RT socket for events (address/interface/route changes) */
this->socket_events = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (this->socket_events < 0)
{
DBG1(DBG_KNL, "unable to create RT event socket");
destroy(this);
return NULL;
}
addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |
RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_LINK;
if (bind(this->socket_events, (struct sockaddr*)&addr, sizeof(addr)))
{
DBG1(DBG_KNL, "unable to bind RT event socket");
destroy(this);
return NULL;
}
this->job = callback_job_create_with_prio((callback_job_cb_t)receive_events,
this, NULL, NULL, JOB_PRIO_CRITICAL);
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,27 +2572,30 @@ kernel_pfkey_ipsec_t *kernel_pfkey_ipsec_create()
return NULL; return NULL;
} }
/* create a PF_KEY socket for ACQUIRE & EXPIRE */ if (register_for_events)
this->socket_events = socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
if (this->socket_events <= 0)
{ {
DBG1(DBG_KNL, "unable to create PF_KEY event socket"); /* create a PF_KEY socket for ACQUIRE & EXPIRE */
destroy(this); this->socket_events = socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
return NULL; if (this->socket_events <= 0)
} {
DBG1(DBG_KNL, "unable to create PF_KEY event socket");
destroy(this);
return NULL;
}
/* register the event socket */ /* register the event socket */
if (register_pfkey_socket(this, SADB_SATYPE_ESP) != SUCCESS || if (register_pfkey_socket(this, SADB_SATYPE_ESP) != SUCCESS ||
register_pfkey_socket(this, SADB_SATYPE_AH) != SUCCESS) register_pfkey_socket(this, SADB_SATYPE_AH) != SUCCESS)
{ {
DBG1(DBG_KNL, "unable to register PF_KEY event socket"); DBG1(DBG_KNL, "unable to register PF_KEY event socket");
destroy(this); destroy(this);
return NULL; return NULL;
} }
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,18 +707,21 @@ kernel_pfroute_net_t *kernel_pfroute_net_create()
return NULL; return NULL;
} }
/* create a PF_ROUTE socket to receive events */ if (register_for_events)
this->socket_events = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
if (this->socket_events < 0)
{ {
DBG1(DBG_KNL, "unable to create PF_ROUTE event socket"); /* create a PF_ROUTE socket to receive events */
destroy(this); this->socket_events = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
return NULL; if (this->socket_events < 0)
} {
DBG1(DBG_KNL, "unable to create PF_ROUTE event socket");
destroy(this);
return NULL;
}
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)
{ {