The rt_policy switch is somewhat superfluous because
authorSven-Ola Tuecke <sven-ola@gmx.de>
Sat, 20 Mar 2010 12:03:41 +0000 (13:03 +0100)
committerSven-Ola Tuecke <sven-ola@gmx.de>
Sat, 20 Mar 2010 12:03:41 +0000 (13:03 +0100)
under Linux u always set policy routes. I left the setting
in here as a convenient way to say "do not fiddle with
unexpected things" with a single rt_policy=no

Besides that: rules setting is useful for smartgw/NIIT
stuff only. For standard policy-settings as they are
used with previous versions of olsrd they are not
required nor helpful. Also: I missed "rt_table_default=0"
which basically says: always use same table as rt_table.
If that is other than 254, please maintain the olsrd-default
route in table "default" as fallback.

src/cfgparser/olsrd_conf.c
src/linux/kernel_routes_nl.c
src/main.c

index 1c4bf88..9c03f45 100644 (file)
@@ -398,7 +398,7 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     cnf->rt_table_defaultolsr_pri = 0;
     cnf->rt_table_tunnel_pri = 0;
   }
-  else {
+  else if (olsr_cnf->smart_gw_active) {
     /* first fill in missing values */
     if (cnf->rt_table_pri == 0) {
       cnf->rt_table_pri = 32766; /* main table */
index 28a9818..7eddf0d 100644 (file)
@@ -431,7 +431,7 @@ static int olsr_new_netlink_route(int family, int rttable, int if_index, int met
 
 void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set) {
   if (olsr_new_netlink_route(AF_INET6,
-      ip_prefix_is_mappedv4_inetgw(dst_v6) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
+      ip_prefix_is_mappedv4_inetgw(dst_v6) && olsr_cnf->rt_table_default ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
       olsr_cnf->niit6to4_if_index,
       RT_METRIC_DEFAULT, olsr_cnf->rt_proto, NULL, NULL, dst_v6, set, false)) {
     olsr_syslog(OLSR_LOG_ERR, ". error while %s static niit route to %s",
@@ -441,7 +441,7 @@ void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set) {
 
 void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4, bool set) {
   if (olsr_new_netlink_route(AF_INET,
-      ip_prefix_is_v4_inetgw(dst_v4) ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
+      ip_prefix_is_v4_inetgw(dst_v4) && olsr_cnf->rt_table_default ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
       olsr_cnf->niit4to6_if_index,
       RT_METRIC_DEFAULT, olsr_cnf->rt_proto, NULL, NULL, dst_v4, set, false)) {
     olsr_syslog(OLSR_LOG_ERR, ". error while %s niit route to %s",
@@ -484,8 +484,18 @@ static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bo
   }
 
   /* get table */
-  table = is_prefix_inetgw(&rt->rt_dst)
-      ? olsr_cnf->rt_table_default : olsr_cnf->rt_table;
+  table = olsr_cnf->rt_table;
+  if (is_prefix_inetgw(&rt->rt_dst)) {
+    if (0 == olsr_cnf->rt_table_default) {
+      /*
+       * Users start whining about not having internet with policy
+       * routing activated and no static default route in table 254.
+       * We maintain a fallback defroute in the default=253 table.
+       */
+      if (253 > olsr_cnf->rt_table) table = 253;
+    }
+    else table = olsr_cnf->rt_table_default;
+  }
 
   /* get next hop */
   if (rt->rt_best && set) {
index 234338b..a4f361a 100644 (file)
@@ -518,7 +518,7 @@ int main(int argc, char *argv[]) {
 
 #ifdef LINUX_NETLINK_ROUTING
   /* create policy routing priorities if necessary */
-  if (olsr_cnf->rt_policy) {
+  if (olsr_cnf->rt_policy && olsr_cnf->smart_gw_active) {
     struct interface *ifn;
     if (olsr_cnf->rt_table_pri) {
       olsr_os_policy_rule(olsr_cnf->ip_version,
@@ -530,13 +530,15 @@ int main(int argc, char *argv[]) {
     }
     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_cnf->rt_table_default ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
+          olsr_cnf->rt_table_default_pri, NULL, true);
     }
 
     /* 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_os_policy_rule(olsr_cnf->ip_version,
+            olsr_cnf->rt_table_default ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
             olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, true);
       }
     }
@@ -730,8 +732,9 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
     close(ifn->send_socket);
 
 #ifdef LINUX_NETLINK_ROUTING
-    if (olsr_cnf->rt_policy && olsr_cnf->rt_table_defaultolsr_pri) {
-      olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default,
+    if (olsr_cnf->rt_policy && olsr_cnf->smart_gw_active && olsr_cnf->rt_table_defaultolsr_pri) {
+      olsr_os_policy_rule(olsr_cnf->ip_version,
+          olsr_cnf->rt_table_default ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
           olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, false);
     }
 #endif
@@ -747,7 +750,7 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   close(olsr_cnf->ioctl_s);
 
 #ifdef LINUX_NETLINK_ROUTING
-  if (olsr_cnf->rt_policy) {
+  if (olsr_cnf->rt_policy && 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);
@@ -758,7 +761,8 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
     }
     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);
+          olsr_cnf->rt_table_default ? olsr_cnf->rt_table_default : olsr_cnf->rt_table,
+          olsr_cnf->rt_table_default_pri, NULL, false);
     }
   }
   close(olsr_cnf->rtnl_s);