aboutsummaryrefslogtreecommitdiffstats
path: root/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2013-08-13 16:53:06 +0200
committerTobias Brunner <tobias@strongswan.org>2013-10-11 15:32:44 +0200
commit51fefe460609ff734d702388973d326d3976189f (patch)
treea17ad65ca17bd8f83e482d6445dfc097752e2e4f /src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
parent434e530f75411f1153995dde356696f8c1e209a8 (diff)
downloadstrongswan-51fefe460609ff734d702388973d326d3976189f.tar.bz2
strongswan-51fefe460609ff734d702388973d326d3976189f.tar.xz
kernel-netlink: Allow setting firewall marks on routing rule
Diffstat (limited to 'src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c')
-rw-r--r--src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
index 1b9e0f031..04dc22c00 100644
--- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
+++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
@@ -44,6 +44,7 @@
#include <unistd.h>
#include <errno.h>
#include <net/if.h>
+#include <linux/fib_rules.h>
#include "kernel_netlink_net.h"
#include "kernel_netlink_shared.h"
@@ -2096,6 +2097,8 @@ static status_t manage_rule(private_kernel_netlink_net_t *this, int nlmsg_type,
struct nlmsghdr *hdr;
struct rtmsg *msg;
chunk_t chunk;
+ char *fwmark;
+ mark_t mark;
memset(&request, 0, sizeof(request));
hdr = (struct nlmsghdr*)request;
@@ -2117,6 +2120,23 @@ static status_t manage_rule(private_kernel_netlink_net_t *this, int nlmsg_type,
chunk = chunk_from_thing(prio);
netlink_add_attribute(hdr, RTA_PRIORITY, chunk, sizeof(request));
+ fwmark = lib->settings->get_str(lib->settings,
+ "%s.plugins.kernel-netlink.fwmark", NULL, hydra->daemon);
+ if (fwmark)
+ {
+ if (fwmark[0] == '!')
+ {
+ msg->rtm_flags |= FIB_RULE_INVERT;
+ fwmark++;
+ }
+ if (mark_from_string(fwmark, &mark))
+ {
+ chunk = chunk_from_thing(mark.value);
+ netlink_add_attribute(hdr, FRA_FWMARK, chunk, sizeof(request));
+ chunk = chunk_from_thing(mark.mask);
+ netlink_add_attribute(hdr, FRA_FWMASK, chunk, sizeof(request));
+ }
+ }
return this->socket->send_ack(this->socket, hdr);
}