add prelocal table to manipulate locally destinated traffic
authorSteven Barth <steven@midlink.org>
Thu, 19 Mar 2015 17:13:33 +0000 (18:13 +0100)
committerSteven Barth <steven@midlink.org>
Thu, 19 Mar 2015 17:13:33 +0000 (18:13 +0100)
Signed-off-by: Steven Barth <steven@midlink.org>
system-linux.c

index fb2ee29..21385fc 100644 (file)
 #define RTN_FAILED_POLICY 12
 #endif
 
 #define RTN_FAILED_POLICY 12
 #endif
 
+#ifndef RT_TABLE_PRELOCAL
+#define RT_TABLE_PRELOCAL 128
+#endif
+
 #include <string.h>
 #include <fcntl.h>
 #include <glob.h>
 #include <string.h>
 #include <fcntl.h>
 #include <glob.h>
@@ -1606,6 +1610,8 @@ bool system_resolve_rt_table(const char *name, unsigned int *id)
                table = RT_TABLE_MAIN;
        else if (!strcmp(name, "local"))
                table = RT_TABLE_LOCAL;
                table = RT_TABLE_MAIN;
        else if (!strcmp(name, "local"))
                table = RT_TABLE_LOCAL;
+       else if (!strcmp(name, "prelocal"))
+               table = RT_TABLE_PRELOCAL;
 
        /* try to look up name in /etc/iproute2/rt_tables */
        else if ((f = fopen("/etc/iproute2/rt_tables", "r")) != NULL)
 
        /* try to look up name in /etc/iproute2/rt_tables */
        else if ((f = fopen("/etc/iproute2/rt_tables", "r")) != NULL)
@@ -1767,6 +1773,10 @@ int system_flush_iprules(void)
        rule.flags = IPRULE_INET4 | IPRULE_PRIORITY | IPRULE_LOOKUP;
 
        rule.priority = 0;
        rule.flags = IPRULE_INET4 | IPRULE_PRIORITY | IPRULE_LOOKUP;
 
        rule.priority = 0;
+       rule.lookup = RT_TABLE_PRELOCAL;
+       rv |= system_iprule(&rule, RTM_NEWRULE);
+
+       rule.priority = 1;
        rule.lookup = RT_TABLE_LOCAL;
        rv |= system_iprule(&rule, RTM_NEWRULE);
 
        rule.lookup = RT_TABLE_LOCAL;
        rv |= system_iprule(&rule, RTM_NEWRULE);
 
@@ -1782,6 +1792,10 @@ int system_flush_iprules(void)
        rule.flags = IPRULE_INET6 | IPRULE_PRIORITY | IPRULE_LOOKUP;
 
        rule.priority = 0;
        rule.flags = IPRULE_INET6 | IPRULE_PRIORITY | IPRULE_LOOKUP;
 
        rule.priority = 0;
+       rule.lookup = RT_TABLE_PRELOCAL;
+       rv |= system_iprule(&rule, RTM_NEWRULE);
+
+       rule.priority = 1;
        rule.lookup = RT_TABLE_LOCAL;
        rv |= system_iprule(&rule, RTM_NEWRULE);
 
        rule.lookup = RT_TABLE_LOCAL;
        rv |= system_iprule(&rule, RTM_NEWRULE);