fixes for the rt-policy settings, lot's of sanity check changes, new defaults
authorHenning Rogge <hrogge@googlemail.com>
Mon, 22 Mar 2010 00:02:45 +0000 (01:02 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Mon, 22 Mar 2010 00:02:45 +0000 (01:02 +0100)
files/olsrd.conf.default.full
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/linux/kernel_routes_nl.c
src/main.c
src/olsr_cfg.h

index d2ebb1d..11d495b 100644 (file)
 # RtTable is for host routes, RtTableDefault for the route to the default
 # internet gateway (2 in case of IPv6+NIIT) and RtTableTunnel is for
 # routes to the ipip tunnels, valid values are 1 to 254
-# (default is 254/112/113, the first is the "main" table in linux)
+# There is a special parameter "auto" (choose default below)
+# (with smartgw: default is 254/223/224)
+# (without smartgw: default is 254/254/254, linux main table)
 
-# RtTable 254
-# RtTableDefault 112
-# RtTableTunnel 113
+# RtTable auto
+# RtTableDefault auto
+# RtTableTunnel auto
 
 # Specifies the policy rule priorities for the three routing tables and
 # a special rule for smartgateway routing (see README-Olsr-Extensions)
 # Priorities can only be set if three different routing tables are set.
-# 0 means "set no policy rule", if set the values must obey to condition
+# if set the values must obey to condition
 # RtTablePriority < RtTableDefaultOlsrPriority
-# < RtTableTunnelPriority < RtTableDefaultPriority
-# (default is 32766/32776/32786/32796)
-
-# RtTablePriority 32766
-# RtTableDefaultOlsrPriority 32776
-# RtTableTunnelPriority 32786
-# RtTableDefaultPriority 32796
+# < RtTableTunnelPriority < RtTableDefaultPriority.
+# There are two special parameters, "auto" (choose fitting to SmartGW
+# mode) and "none" (do not set policy rule)
+# (with smartgw: default is none/32776/32776/32796)
+# (without smartgw: default is none/none/none/none)
+
+# RtTablePriority auto
+# RtTableDefaultOlsrPriority auto
+# RtTableTunnelPriority auto
+# RtTableDefaultPriority auto
 
 # Activates (in IPv6 mode) the automatic use of NIIT
 # (see README-Olsr-Extensions)
index c5502e6..fc4ba12 100644 (file)
@@ -387,7 +387,9 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# RtTable is for host routes, RtTableDefault for the route to the default\n"
     "# internet gateway (2 in case of IPv6+NIIT) and RtTableTunnel is for\n"
     "# routes to the ipip tunnels, valid values are 1 to 254\n"
-    "# (default is 254/112/113, the first is the \"main\" table in linux)\n"
+    "# There is a special parameter \"auto\" (choose default below)\n"
+    "# (with smartgw: default is 254/223/224)\n"
+    "# (without smartgw: default is 254/254/254, linux main table)\n"
     "\n");
   abuf_appendf(out, "RtTable %u\n",
       cnf->rt_table);
@@ -400,19 +402,22 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# Specifies the policy rule priorities for the three routing tables and\n"
     "# a special rule for smartgateway routing (see README-Olsr-Extensions)\n"
     "# Priorities can only be set if three different routing tables are set.\n"
-    "# 0 means \"set no policy rule\", if set the values must obey to condition\n"
+    "# if set the values must obey to condition\n"
     "# RtTablePriority < RtTableDefaultOlsrPriority\n"
     "# < RtTableTunnelPriority < RtTableDefaultPriority\n"
-    "# (default is 32766/32776/32786/32796)\n"
+    "# There are two special parameters, \"auto\" (choose fitting to SmartGW\n"
+    "# mode) and \"none\" (do not set policy rule)\n"
+    "# (with smartgw: default is none/32776/32786/32796)\n"
+    "# (without smartgw: default is none/none/none/none)\n"
     "\n");
   abuf_appendf(out, "RtTablePriority %u\n",
       cnf->rt_table_pri);
   abuf_appendf(out, "RtTableDefaultOlsrPriority %u\n",
-      cnf->rt_table_defaultolsr_pri);
+      cnf->rt_table_default_pri);
   abuf_appendf(out, "RtTableTunnelPriority %u\n",
       cnf->rt_table_tunnel_pri);
   abuf_appendf(out, "RtTableDefaultPriority %u\n",
-      cnf->rt_table_default_pri);
+      cnf->rt_table_defaultolsr_pri);
   abuf_puts(out,
     "\n"
     "# Activates (in IPv6 mode) the automatic use of NIIT\n"
index 2eab4a3..97eb0b0 100644 (file)
@@ -210,6 +210,143 @@ olsrd_print_interface_cnf(struct if_config_options *cnf, struct if_config_option
   printf("\tAutodetect changes       : %s%s\n", cnf->autodetect_chg ? "yes" : "no",DEFAULT_STR(autodetect_chg));
 }
 
+static int olsrd_sanity_check_rtpolicy(struct olsrd_config *cnf) {
+  int prio;
+
+#ifdef linux
+  /* calculate rt_policy defaults if necessary */
+  if (!cnf->smart_gw_active) {
+    /* default is "no policy rules" and "everything into the main table" */
+    if (cnf->rt_table == DEF_RT_AUTO) {
+      cnf->rt_table = 254;
+    }
+    if (cnf->rt_table_default == DEF_RT_AUTO) {
+      cnf->rt_table_default = cnf->rt_table;
+    }
+    if (cnf->rt_table_tunnel != DEF_RT_AUTO) {
+      fprintf(stderr, "Warning, setting a table for tunnels without SmartGW does not make sense.\n");
+    }
+    cnf->rt_table_tunnel = cnf->rt_table_default;
+
+    /* priority rules default is "none" */
+    if (cnf->rt_table_pri == DEF_RT_AUTO) {
+      cnf->rt_table_pri = DEF_RT_NONE;
+    }
+    if (cnf->rt_table_defaultolsr_pri == DEF_RT_AUTO) {
+      cnf->rt_table_defaultolsr_pri = DEF_RT_NONE;
+    }
+    if (cnf->rt_table_tunnel_pri == DEF_RT_AUTO) {
+      cnf->rt_table_tunnel_pri = DEF_RT_NONE;
+    }
+    if (cnf->rt_table_default_pri == DEF_RT_AUTO) {
+      cnf->rt_table_default_pri = DEF_RT_NONE;
+    }
+  }
+  else {
+    /* default is "policy rules" and "everything into separate tables (254, 223, 224)" */
+    if (cnf->rt_table == DEF_RT_AUTO) {
+      cnf->rt_table = 254;
+    }
+    if (cnf->rt_table_default == DEF_RT_AUTO) {
+      cnf->rt_table_default = 223;
+    }
+    if (cnf->rt_table_tunnel == DEF_RT_AUTO) {
+      cnf->rt_table_tunnel = 224;
+    }
+
+    /* default for "rt_table_pri" is none (main table already has a policy rule */
+    prio = 32766;
+    if (cnf->rt_table_pri > 0) {
+      prio = cnf->rt_table_pri;
+    }
+    else if (cnf->rt_table_pri == DEF_RT_AUTO) {
+      /* choose default */
+      olsr_cnf->rt_table_pri = 0;
+      fprintf(stderr, "No policy rule for rt_table_pri\n");
+    }
+
+    /* default for "rt_table_defaultolsr_pri" is +10 */
+    prio += 10;
+    if (cnf->rt_table_defaultolsr_pri > 0) {
+      prio = cnf->rt_table_defaultolsr_pri;
+    }
+    else if (cnf->rt_table_defaultolsr_pri == DEF_RT_AUTO) {
+      olsr_cnf->rt_table_defaultolsr_pri = prio;
+      fprintf(stderr, "Choose priority %u for rt_table_defaultolsr_pri\n", prio);
+    }
+
+    prio += 10;
+    if (cnf->rt_table_tunnel_pri > 0) {
+      prio = cnf->rt_table_tunnel_pri;
+    }
+    else if (cnf->rt_table_tunnel_pri == DEF_RT_AUTO) {
+      olsr_cnf->rt_table_tunnel_pri = prio;
+      fprintf(stderr, "Choose priority %u for rt_table_tunnel_pri\n", prio);
+    }
+
+    prio += 10;
+    if (cnf->rt_table_default_pri == DEF_RT_AUTO) {
+      olsr_cnf->rt_table_default_pri = prio;
+      fprintf(stderr, "Choose priority %u for rt_table_default_pri\n", prio);
+    }
+  }
+
+  /* check rule priorities */
+  if (cnf->rt_table_pri > 0) {
+    if (cnf->rt_table >= 253) {
+      fprintf(stderr, "rttable %d does not need policy rules from OLSRd\n", cnf->rt_table);
+      return -1;
+    }
+  }
+
+  prio = cnf->rt_table_pri;
+  if (cnf->rt_table_defaultolsr_pri > 0) {
+    if (prio >= cnf->rt_table_defaultolsr_pri) {
+      fprintf(stderr, "rttable_defaultolsr priority must be greater than %d\n", prio);
+      return -1;
+    }
+    if (cnf->rt_table_default >= 253) {
+      fprintf(stderr, "rttable %d does not need policy rules from OLSRd\n", cnf->rt_table_default);
+      return -1;
+    }
+    prio = olsr_cnf->rt_table_defaultolsr_pri;
+  }
+
+  if (cnf->rt_table_tunnel_pri > 0 ) {
+    if (prio >= cnf->rt_table_tunnel_pri) {
+      fprintf(stderr, "rttable_tunnel priority must be greater than %d\n", prio);
+      return -1;
+    }
+    if (cnf->rt_table_tunnel >= 253) {
+      fprintf(stderr, "rttable %d does not need policy rules from OLSRd\n", cnf->rt_table_tunnel);
+      return -1;
+    }
+    prio = cnf->rt_table_tunnel_pri;
+  }
+
+  if (cnf->rt_table_default_pri > 0) {
+    if (prio >= cnf->rt_table_default_pri) {
+      fprintf(stderr, "rttable_default priority must be greater than %d\n", prio);
+      return -1;
+    }
+    if (cnf->rt_table_default >= 253) {
+      fprintf(stderr, "rttable %d does not need policy rules from OLSRd\n", cnf->rt_table_default);
+      return -1;
+    }
+  }
+
+  /* filter rt_proto entry */
+  if (cnf->rt_proto == 1) {
+    /* protocol 1 is reserved, so better use 0 */
+    cnf->rt_proto = 0;
+  }
+  else if (cnf->rt_proto == 0) {
+    cnf->rt_proto = RTPROT_BOOT;
+  }
+#endif
+  return 0;
+}
+
 static 
 int olsrd_sanity_check_interface_cnf(struct if_config_options * io, struct olsrd_config * cnf, char* name) {
   struct olsr_lq_mult *mult;
@@ -385,50 +522,9 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
 #endif
 #endif
 
-#ifdef linux
-  if (olsr_cnf->smart_gw_active) {
-    if (0 == cnf->rt_table_default) {
-      cnf->rt_table_default = DEF_RTTABLE_DEFAULT;
-      fprintf(stderr, "Choose table %u for rt_table_default\n", cnf->rt_table_default);
-    }
-    /* check tables */
-    if (cnf->rt_table == cnf->rt_table_default
-        || cnf->rt_table == cnf->rt_table_tunnel
-        || cnf->rt_table_default == cnf->rt_table_tunnel) {
-      fprintf(stderr, "all three rttables must be unique\n");
-      return -1;
-    }
-
-    /* check priorities */
-    if (cnf->rt_table_pri && cnf->rt_table_pri >= cnf->rt_table_defaultolsr_pri) {
-      fprintf(stderr, "rttable priority must be lesser than rttable_defaultolsr priority\n");
-      return -1;
-    }
-    if (cnf->rt_table_defaultolsr_pri && cnf->rt_table_defaultolsr_pri >= cnf->rt_table_tunnel_pri) {
-      fprintf(stderr, "rttable_defaultolsr priority must be lesser than rttable_tunnel priority\n");
-      return -1;
-    }
-    if (cnf->rt_table_tunnel_pri && cnf->rt_table_tunnel_pri >= cnf->rt_table_default_pri) {
-      fprintf(stderr, "rttable_tunnel priority must be lesser than rttable_default priority\n");
-      return -1;
-    }
-  }
-  else {
-    if (0 == cnf->rt_table_default) {
-      cnf->rt_table_default = DEF_RTTABLE;
-      fprintf(stderr, "Choose table %u for rt_table_default\n", cnf->rt_table_default);
-    }
-  }
-
-  /* filter rt_proto entry */
-  if (cnf->rt_proto == 1) {
-    /* protocol 1 is reserved, so better use 0 */
-    cnf->rt_proto = 0;
-  }
-  else if (cnf->rt_proto == 0) {
-    cnf->rt_proto = RTPROT_BOOT;
+  if (olsrd_sanity_check_rtpolicy(cnf)) {
+    return -1;
   }
-#endif
 
   if (in == NULL) {
     fprintf(stderr, "No interfaces configured!\n");
@@ -610,13 +706,14 @@ set_default_cnf(struct olsrd_config *cnf)
   cnf->tos = DEF_TOS;
   cnf->olsrport = DEF_OLSRPORT;
   cnf->rt_proto = DEF_RTPROTO;
-  cnf->rt_table = DEF_RTTABLE;
-  cnf->rt_table_default = 0;
-  cnf->rt_table_tunnel = DEF_RTTABLE_TUNNEL;
-  cnf->rt_table_pri = 0x7FFE; /* 32766, main table prio */
-  cnf->rt_table_defaultolsr_pri = 0x7FFE + 10;
-  cnf->rt_table_tunnel_pri = 0x7FFE + 20;
-  cnf->rt_table_default_pri = 0x7FFE + 30;
+  cnf->rt_table = DEF_RT_AUTO;
+  cnf->rt_table_default = DEF_RT_AUTO;
+  cnf->rt_table_tunnel = DEF_RT_AUTO;
+  cnf->rt_table_pri = DEF_RT_AUTO;
+  cnf->rt_table_default_pri = DEF_RT_AUTO;
+  cnf->rt_table_defaultolsr_pri = DEF_RT_AUTO;
+  cnf->rt_table_tunnel_pri = DEF_RT_AUTO;
+
   cnf->willingness_auto = DEF_WILL_AUTO;
   cnf->willingness = DEF_WILLINGNESS;
   cnf->ipc_connections = DEF_IPC_CONNECTIONS;
index 19da045..baccdf9 100644 (file)
@@ -184,7 +184,6 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_NOINT
 %token TOK_TOS
 %token TOK_OLSRPORT
-%token TOK_RTPOLICY
 %token TOK_RTPROTO
 %token TOK_RTTABLE
 %token TOK_RTTABLE_DEFAULT
@@ -248,6 +247,8 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_IPV4_ADDR
 %token TOK_IPV6_ADDR
 %token TOK_DEFAULT
+%token TOK_AUTO
+%token TOK_NONE
 
 %token TOK_COMMENT
 
@@ -1002,6 +1003,12 @@ irttable: TOK_RTTABLE TOK_INTEGER
   olsr_cnf->rt_table = $2->integer;
   free($2);
 }
+       | TOK_RTTABLE TOK_AUTO
+{
+  PARSER_DEBUG_PRINTF("RtTable: auto\n");
+  olsr_cnf->rt_table = DEF_RT_AUTO;
+  free($2);
+}
 ;
 
 irttable_default: TOK_RTTABLE_DEFAULT TOK_INTEGER
@@ -1010,6 +1017,12 @@ irttable_default: TOK_RTTABLE_DEFAULT TOK_INTEGER
   olsr_cnf->rt_table_default = $2->integer;
   free($2);
 }
+       | TOK_RTTABLE_DEFAULT TOK_AUTO
+{
+  PARSER_DEBUG_PRINTF("RtTableDefault: auto\n");
+  olsr_cnf->rt_table_default = DEF_RT_AUTO;
+  free($2);
+}
 ;
 
 irttable_tunnel: TOK_RTTABLE_TUNNEL TOK_INTEGER
@@ -1018,6 +1031,12 @@ irttable_tunnel: TOK_RTTABLE_TUNNEL TOK_INTEGER
   olsr_cnf->rt_table_tunnel = $2->integer;
   free($2);
 }
+       | TOK_RTTABLE_TUNNEL TOK_AUTO
+{
+  PARSER_DEBUG_PRINTF("RtTableTunnel: auto\n");
+  olsr_cnf->rt_table_tunnel = DEF_RT_AUTO;
+  free($2);
+}
 ;
 
 irttable_priority: TOK_RTTABLE_PRIORITY TOK_INTEGER
@@ -1026,6 +1045,18 @@ irttable_priority: TOK_RTTABLE_PRIORITY TOK_INTEGER
   olsr_cnf->rt_table_pri = $2->integer;
   free($2);
 }
+        | TOK_RTTABLE_PRIORITY TOK_AUTO
+{
+  PARSER_DEBUG_PRINTF("RtTablePriority: auto\n");
+  olsr_cnf->rt_table_pri = DEF_RT_AUTO;
+  free($2);
+}
+        | TOK_RTTABLE_PRIORITY TOK_NONE
+{
+  PARSER_DEBUG_PRINTF("RtTablePriority: none\n");
+  olsr_cnf->rt_table_pri = DEF_RT_NONE;
+  free($2);
+}
 ;
 
 irttable_default_priority: TOK_RTTABLE_DEFAULT_PRIORITY TOK_INTEGER
@@ -1034,6 +1065,18 @@ irttable_default_priority: TOK_RTTABLE_DEFAULT_PRIORITY TOK_INTEGER
   olsr_cnf->rt_table_default_pri = $2->integer;
   free($2);
 }
+        | TOK_RTTABLE_DEFAULT_PRIORITY TOK_AUTO
+{
+  PARSER_DEBUG_PRINTF("RtTableDefaultPriority: auto\n");
+  olsr_cnf->rt_table_default_pri = DEF_RT_AUTO;
+  free($2);
+}
+        | TOK_RTTABLE_DEFAULT_PRIORITY TOK_NONE
+{
+  PARSER_DEBUG_PRINTF("RtTableDefaultPriority: none\n");
+  olsr_cnf->rt_table_default_pri = DEF_RT_NONE;
+  free($2);
+}
 ;
 
 irttable_tunnel_priority: TOK_RTTABLE_TUNNEL_PRIORITY TOK_INTEGER
@@ -1042,6 +1085,18 @@ irttable_tunnel_priority: TOK_RTTABLE_TUNNEL_PRIORITY TOK_INTEGER
   olsr_cnf->rt_table_tunnel_pri = $2->integer;
   free($2);
 }
+        | TOK_RTTABLE_TUNNEL_PRIORITY TOK_AUTO
+{
+  PARSER_DEBUG_PRINTF("RtTableTunnelPriority: auto\n");
+  olsr_cnf->rt_table_tunnel_pri = DEF_RT_AUTO;
+  free($2);
+}
+        | TOK_RTTABLE_TUNNEL_PRIORITY TOK_NONE
+{
+  PARSER_DEBUG_PRINTF("RtTableTunnelPriority: none\n");
+  olsr_cnf->rt_table_tunnel_pri = DEF_RT_NONE;
+  free($2);
+}
 ;
 
 irttable_defaultolsr_priority: TOK_RTTABLE_DEFAULTOLSR_PRIORITY TOK_INTEGER
@@ -1050,6 +1105,18 @@ irttable_defaultolsr_priority: TOK_RTTABLE_DEFAULTOLSR_PRIORITY TOK_INTEGER
   olsr_cnf->rt_table_defaultolsr_pri = $2->integer;
   free($2);
 }
+        | TOK_RTTABLE_DEFAULTOLSR_PRIORITY TOK_AUTO
+{
+  PARSER_DEBUG_PRINTF("RtTableDefaultOlsrPriority: auto\n");
+  olsr_cnf->rt_table_defaultolsr_pri = DEF_RT_AUTO;
+  free($2);
+}
+        | TOK_RTTABLE_DEFAULTOLSR_PRIORITY TOK_NONE
+{
+  PARSER_DEBUG_PRINTF("RtTableDefaultOlsrPriority: none\n");
+  olsr_cnf->rt_table_defaultolsr_pri = DEF_RT_NONE;
+  free($2);
+}
 ;
 
 awillingness: TOK_WILLINGNESS TOK_INTEGER
index 0204975..cd32baf 100644 (file)
@@ -218,6 +218,16 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_DEFAULT;
 }
 
+"auto" {
+    yylval = NULL;
+    return TOK_AUTO;
+}
+
+"none" {
+    yylval = NULL;
+    return TOK_NONE;
+}
+
 {DECDIGIT}+ {
     yylval = get_integer_token(yytext);
     return TOK_INTEGER;
index e2d0e7b..9ecc341 100644 (file)
@@ -269,9 +269,6 @@ int olsr_os_policy_rule(int family, int rttable, uint32_t priority, const char *
   struct olsr_rtreq req;
   int err;
 
-  // Nobody needs these rules
-  if (0 == rttable || rttable >= 253 || 0 == priority) return 0;
-
   memset(&req, 0, sizeof(req));
 
   req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
@@ -299,7 +296,7 @@ int olsr_os_policy_rule(int family, int rttable, uint32_t priority, const char *
 
   err = olsr_netlink_send(&req.n);
   if (err) {
-    olsr_syslog(OLSR_LOG_ERR,"Error on %s empty policy rule aimed to activate RtTable %u!",
+    olsr_syslog(OLSR_LOG_ERR,"Error on %s policy rule aimed to activate RtTable %u!",
         set ? "inserting" : "deleting", rttable);
   }
 
index a021269..78affac 100644 (file)
@@ -204,6 +204,8 @@ int main(int argc, char *argv[]) {
   struct ipaddr_str buf;
   bool loadedConfig = false;
   int i;
+  struct interface *ifn;
+
 #ifdef WIN32
   WSADATA WsaData;
   size_t len;
@@ -518,21 +520,27 @@ int main(int argc, char *argv[]) {
 
 #ifdef LINUX_NETLINK_ROUTING
   /* create policy routing priorities if necessary */
-  if (olsr_cnf->smart_gw_active) {
-    struct interface *ifn;
+  if (olsr_cnf->rt_table_pri) {
     olsr_os_policy_rule(olsr_cnf->ip_version,
         olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, true);
+  }
+  if (olsr_cnf->rt_table_tunnel_pri) {
     olsr_os_policy_rule(olsr_cnf->ip_version,
         olsr_cnf->rt_table_tunnel, olsr_cnf->rt_table_tunnel_pri, NULL, true);
+  }
+  if (olsr_cnf->rt_table_default_pri) {
     olsr_os_policy_rule(olsr_cnf->ip_version,
         olsr_cnf->rt_table_default, olsr_cnf->rt_table_default_pri, NULL, true);
+  }
 
-    /* OLSR sockets */
+  /* OLSR sockets */
+  if (olsr_cnf->rt_table_defaultolsr_pri) {
     for (ifn = ifnet; ifn; ifn = ifn->int_next) {
       olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default,
           olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, true);
     }
   }
+
   /* trigger gateway selection */
   if (olsr_cnf->smart_gw_active) {
     olsr_trigger_inetgw_startup();
@@ -722,7 +730,7 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
     close(ifn->send_socket);
 
 #ifdef LINUX_NETLINK_ROUTING
-    if (olsr_cnf->smart_gw_active) {
+    if (olsr_cnf->rt_table_defaultolsr_pri) {
       olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default,
           olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, false);
     }
@@ -739,11 +747,15 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   close(olsr_cnf->ioctl_s);
 
 #ifdef LINUX_NETLINK_ROUTING
-  if (olsr_cnf->smart_gw_active) {
+  if (olsr_cnf->rt_table_pri) {
     olsr_os_policy_rule(olsr_cnf->ip_version,
         olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, false);
+  }
+  if (olsr_cnf->rt_table_tunnel_pri) {
     olsr_os_policy_rule(olsr_cnf->ip_version,
         olsr_cnf->rt_table_tunnel, olsr_cnf->rt_table_tunnel_pri, NULL, false);
+  }
+  if (olsr_cnf->rt_table_default_pri) {
     olsr_os_policy_rule(olsr_cnf->ip_version,
         olsr_cnf->rt_table_default, olsr_cnf->rt_table_default_pri, NULL, false);
   }
index 887b913..7774b25 100644 (file)
 #define DEF_LQ_AGING         0.05
 #define DEF_CLEAR_SCREEN     true
 #define DEF_OLSRPORT         698
-#define DEF_RTPOLICY         true
 #define DEF_RTPROTO          0 /* 0 means OS-specific default */
-#define DEF_RTTABLE          254
-#define DEF_RTTABLE_DEFAULT  112
-#define DEF_RTTABLE_TUNNEL   113
+#define DEF_RT_NONE          -1
+#define DEF_RT_AUTO          0
 #define DEF_MIN_TC_VTIME     0.0
 #define DEF_USE_NIIT         true
 #define DEF_SMART_GW         false
@@ -228,8 +226,8 @@ struct olsrd_config {
   uint16_t tos;
   uint8_t rt_proto;
   uint8_t rt_table, rt_table_default, rt_table_tunnel;
-  uint16_t rt_table_pri, rt_table_tunnel_pri;
-  uint16_t rt_table_defaultolsr_pri, rt_table_default_pri;
+  int32_t rt_table_pri, rt_table_tunnel_pri;
+  int32_t rt_table_defaultolsr_pri, rt_table_default_pri;
   uint8_t willingness;
   bool willingness_auto;
   int ipc_connections;