From 35cc60dc4dd8ea4c921dbe64bb2376ab9aee76e1 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 5 Feb 2016 16:43:53 +0100 Subject: [PATCH] rules: process rules after the local table to ensure that local access still works Signed-off-by: Felix Fietkau --- route.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/route.c b/route.c index df933b1..6cea299 100644 --- a/route.c +++ b/route.c @@ -68,6 +68,10 @@ rtnl_rule_request(struct relayd_interface *rif, int flags) } __packed table; struct { struct rtattr rta; + int prio; + } __packed prio; + struct { + struct rtattr rta; char ifname[IFNAMSIZ + 1]; } __packed dev; } __packed req = { @@ -77,6 +81,11 @@ rtnl_rule_request(struct relayd_interface *rif, int flags) .rtm_scope = RT_SCOPE_UNIVERSE, .rtm_protocol = RTPROT_BOOT, }, + .prio = { + .rta.rta_type = FRA_PRIORITY, + .rta.rta_len = sizeof(req.prio), + .prio = 2, + }, .table.rta = { .rta_type = FRA_TABLE, .rta_len = sizeof(req.table), @@ -94,11 +103,8 @@ rtnl_rule_request(struct relayd_interface *rif, int flags) strcpy(req.dev.ifname, ifname); req.dev.rta.rta_len = sizeof(req.dev.rta) + strlen(ifname) + 1; } else { - uint32_t val = 1; - req.dev.rta.rta_type = FRA_PRIORITY; - req.dev.rta.rta_len = sizeof(req.dev.rta) + sizeof(uint32_t); - padding -= sizeof(uint32_t); - memcpy(&req.dev.ifname, &val, sizeof(val)); + padding = sizeof(req.dev); + req.prio.prio--; } req.table.table = get_route_table(rif); req.nl.nlmsg_len = sizeof(req) - padding; -- 2.11.0