kernel-netlink: Always register for events
The starter-specific code path isn't necessary anymore since
d8fdd1018e ("starter: Don't flush SAs in the kernel").
This commit is contained in:
@@ -3764,7 +3764,7 @@ static void setup_spd_hash_thresh(private_kernel_netlink_ipsec_t *this,
|
|||||||
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;
|
||||||
bool register_for_events = TRUE;
|
struct sockaddr_nl addr;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
.public = {
|
.public = {
|
||||||
@@ -3804,11 +3804,6 @@ kernel_netlink_ipsec_t *kernel_netlink_ipsec_create()
|
|||||||
FALSE, lib->ns),
|
FALSE, lib->ns),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (streq(lib->ns, "starter"))
|
|
||||||
{ /* starter has no threads, so we do not register for kernel events */
|
|
||||||
register_for_events = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
this->socket_xfrm = netlink_socket_create(NETLINK_XFRM, xfrm_msg_names,
|
this->socket_xfrm = netlink_socket_create(NETLINK_XFRM, xfrm_msg_names,
|
||||||
lib->settings->get_bool(lib->settings,
|
lib->settings->get_bool(lib->settings,
|
||||||
"%s.plugins.kernel-netlink.parallel_xfrm", FALSE, lib->ns));
|
"%s.plugins.kernel-netlink.parallel_xfrm", FALSE, lib->ns));
|
||||||
@@ -3821,34 +3816,29 @@ kernel_netlink_ipsec_t *kernel_netlink_ipsec_create()
|
|||||||
setup_spd_hash_thresh(this, "ipv4", XFRMA_SPD_IPV4_HTHRESH, 32);
|
setup_spd_hash_thresh(this, "ipv4", XFRMA_SPD_IPV4_HTHRESH, 32);
|
||||||
setup_spd_hash_thresh(this, "ipv6", XFRMA_SPD_IPV6_HTHRESH, 128);
|
setup_spd_hash_thresh(this, "ipv6", XFRMA_SPD_IPV6_HTHRESH, 128);
|
||||||
|
|
||||||
if (register_for_events)
|
memset(&addr, 0, sizeof(addr));
|
||||||
|
addr.nl_family = AF_NETLINK;
|
||||||
|
|
||||||
|
/* create and bind XFRM socket for ACQUIRE, EXPIRE, MIGRATE & MAPPING */
|
||||||
|
this->socket_xfrm_events = socket(AF_NETLINK, SOCK_RAW, NETLINK_XFRM);
|
||||||
|
if (this->socket_xfrm_events <= 0)
|
||||||
{
|
{
|
||||||
struct sockaddr_nl addr;
|
DBG1(DBG_KNL, "unable to create XFRM event socket: %s (%d)",
|
||||||
|
strerror(errno), errno);
|
||||||
memset(&addr, 0, sizeof(addr));
|
destroy(this);
|
||||||
addr.nl_family = AF_NETLINK;
|
return NULL;
|
||||||
|
|
||||||
/* create and bind XFRM socket for ACQUIRE, EXPIRE, MIGRATE & MAPPING */
|
|
||||||
this->socket_xfrm_events = socket(AF_NETLINK, SOCK_RAW, NETLINK_XFRM);
|
|
||||||
if (this->socket_xfrm_events <= 0)
|
|
||||||
{
|
|
||||||
DBG1(DBG_KNL, "unable to create XFRM event socket: %s (%d)",
|
|
||||||
strerror(errno), errno);
|
|
||||||
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: %s (%d)",
|
|
||||||
strerror(errno), errno);
|
|
||||||
destroy(this);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
lib->watcher->add(lib->watcher, this->socket_xfrm_events, WATCHER_READ,
|
|
||||||
(watcher_cb_t)receive_events, this);
|
|
||||||
}
|
}
|
||||||
|
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: %s (%d)",
|
||||||
|
strerror(errno), errno);
|
||||||
|
destroy(this);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
lib->watcher->add(lib->watcher, this->socket_xfrm_events, WATCHER_READ,
|
||||||
|
(watcher_cb_t)receive_events, this);
|
||||||
|
|
||||||
netlink_find_offload_feature(lib->settings->get_str(lib->settings,
|
netlink_find_offload_feature(lib->settings->get_str(lib->settings,
|
||||||
"%s.plugins.kernel-netlink.hw_offload_feature_interface",
|
"%s.plugins.kernel-netlink.hw_offload_feature_interface",
|
||||||
|
|||||||
@@ -3096,7 +3096,7 @@ kernel_netlink_net_t *kernel_netlink_net_create()
|
|||||||
{
|
{
|
||||||
private_kernel_netlink_net_t *this;
|
private_kernel_netlink_net_t *this;
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
bool register_for_events = TRUE;
|
struct sockaddr_nl addr;
|
||||||
char *exclude;
|
char *exclude;
|
||||||
|
|
||||||
INIT(this,
|
INIT(this,
|
||||||
@@ -3168,11 +3168,6 @@ kernel_netlink_net_t *kernel_netlink_net_create()
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (streq(lib->ns, "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, lib->ns);
|
"%s.ignore_routing_tables", NULL, lib->ns);
|
||||||
if (exclude)
|
if (exclude)
|
||||||
@@ -3194,46 +3189,40 @@ kernel_netlink_net_t *kernel_netlink_net_create()
|
|||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (register_for_events)
|
memset(&addr, 0, sizeof(addr));
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
struct sockaddr_nl addr;
|
DBG1(DBG_KNL, "unable to create RT event socket: %s (%d)",
|
||||||
|
strerror(errno), errno);
|
||||||
memset(&addr, 0, sizeof(addr));
|
destroy(this);
|
||||||
addr.nl_family = AF_NETLINK;
|
return NULL;
|
||||||
|
|
||||||
/* 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: %s (%d)",
|
|
||||||
strerror(errno), errno);
|
|
||||||
destroy(this);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
addr.nl_groups = nl_group(RTNLGRP_IPV4_IFADDR) |
|
|
||||||
nl_group(RTNLGRP_IPV6_IFADDR) |
|
|
||||||
nl_group(RTNLGRP_LINK);
|
|
||||||
if (this->process_route)
|
|
||||||
{
|
|
||||||
addr.nl_groups |= nl_group(RTNLGRP_IPV4_ROUTE) |
|
|
||||||
nl_group(RTNLGRP_IPV6_ROUTE);
|
|
||||||
}
|
|
||||||
if (this->process_rules)
|
|
||||||
{
|
|
||||||
addr.nl_groups |= nl_group(RTNLGRP_IPV4_RULE) |
|
|
||||||
nl_group(RTNLGRP_IPV6_RULE);
|
|
||||||
}
|
|
||||||
if (bind(this->socket_events, (struct sockaddr*)&addr, sizeof(addr)))
|
|
||||||
{
|
|
||||||
DBG1(DBG_KNL, "unable to bind RT event socket: %s (%d)",
|
|
||||||
strerror(errno), errno);
|
|
||||||
destroy(this);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
lib->watcher->add(lib->watcher, this->socket_events, WATCHER_READ,
|
|
||||||
(watcher_cb_t)receive_events, this);
|
|
||||||
}
|
}
|
||||||
|
addr.nl_groups = nl_group(RTNLGRP_IPV4_IFADDR) |
|
||||||
|
nl_group(RTNLGRP_IPV6_IFADDR) |
|
||||||
|
nl_group(RTNLGRP_LINK);
|
||||||
|
if (this->process_route)
|
||||||
|
{
|
||||||
|
addr.nl_groups |= nl_group(RTNLGRP_IPV4_ROUTE) |
|
||||||
|
nl_group(RTNLGRP_IPV6_ROUTE);
|
||||||
|
}
|
||||||
|
if (this->process_rules)
|
||||||
|
{
|
||||||
|
addr.nl_groups |= nl_group(RTNLGRP_IPV4_RULE) |
|
||||||
|
nl_group(RTNLGRP_IPV6_RULE);
|
||||||
|
}
|
||||||
|
if (bind(this->socket_events, (struct sockaddr*)&addr, sizeof(addr)))
|
||||||
|
{
|
||||||
|
DBG1(DBG_KNL, "unable to bind RT event socket: %s (%d)",
|
||||||
|
strerror(errno), errno);
|
||||||
|
destroy(this);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
lib->watcher->add(lib->watcher, this->socket_events, WATCHER_READ,
|
||||||
|
(watcher_cb_t)receive_events, this);
|
||||||
|
|
||||||
if (init_address_list(this) != SUCCESS)
|
if (init_address_list(this) != SUCCESS)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user