Add code for policy routing handling
authorHenning Rogge <hrogge@googlemail.com>
Sat, 20 Feb 2010 19:19:54 +0000 (20:19 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 20 Feb 2010 19:19:54 +0000 (20:19 +0100)
lib/httpinfo/src/olsrd_httpinfo.c
src/bsd/dummy.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/cfgparser/oscan.lex
src/kernel_routes.h
src/linux/kernel_routes_nl.c
src/main.c
src/olsr_cfg.h
src/win32/dummy.c

index 7244175..da0bce3 100644 (file)
@@ -868,9 +868,11 @@ build_config_body(struct autobuf *abuf)
 
   abuf_appendf(abuf, "<td>Fisheye: %s</td>\n", olsr_cnf->lq_fish ? "Enabled" : "Disabled");
   abuf_appendf(abuf, "<td>TOS: 0x%04x</td>\n", olsr_cnf->tos);
-  abuf_appendf(abuf, "<td>RtTable: 0x%04x/%d</td>\n", olsr_cnf->rttable, olsr_cnf->rttable);
-  abuf_appendf(abuf, "<td>RtTableDefault: 0x%04x/%d</td>\n", olsr_cnf->rttable_default,
-             olsr_cnf->rttable_default);
+  abuf_appendf(abuf, "<td>RtTable: 0x%04x/%d</td>\n", olsr_cnf->rt_table, olsr_cnf->rt_table);
+  abuf_appendf(abuf, "<td>RtTableDefault: 0x%04x/%d</td>\n", olsr_cnf->rt_table_default,
+             olsr_cnf->rt_table_default);
+  abuf_appendf(abuf, "<td>RtTableTunnel: 0x%04x/%d</td>\n", olsr_cnf->rt_table_tunnel,
+             olsr_cnf->rt_table_tunnel);
   abuf_appendf(abuf, "<td>Willingness: %d %s</td>\n", olsr_cnf->willingness,
              olsr_cnf->willingness_auto ? "(auto)" : "");
 
index f3ffbb4..e55f401 100644 (file)
@@ -68,7 +68,7 @@ int olsr_os_policy_rule(int family __attribute__ ((unused)),
   return -1;
 }
 
-int olsr_os_create_localhostif(union olsr_ip_addr *ip __attribute__ ((unused)),
+int olsr_os_localhost_if(union olsr_ip_addr *ip __attribute__ ((unused)),
     bool create __attribute__ ((unused))) {
   return -1;
 }
index 647de7f..8bdaa36 100644 (file)
@@ -112,18 +112,27 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
   fprintf(fd, "# Port to use. Default is 698! and using other port than IANA assigned one needs a really good reason!\n#possible values 698 or >1000\n\n");
   fprintf(fd, "OlsrPort\t\t%d\n\n", cnf->olsrport);
 
+  /* RtPolicy */
+  fprintf(fd, "# Switch the policy routing system on/off (default is true)\n");
+  fprintf(fd, "%sRtPolicy %s\n", cnf->rt_policy ? "# " : "", cnf->rt_policy ? "true" : "false");
+
   /* RtTable */
   fprintf(fd, "# Policy Routing Table to use. Default is 254\n\n");
-  fprintf(fd, "RtTable\t\t%d\n\n", cnf->rttable);
+  fprintf(fd, "RtTable\t\t%d\n\n", cnf->rt_table);
 
   /* RtProto */
   fprintf(fd, "# Policy Routing Proto to use. Default is 3\n\n");
-  fprintf(fd, "RtProto\t\t%d\n\n", cnf->rtproto);
+  fprintf(fd, "RtProto\t\t%d\n\n", cnf->rt_proto);
 
   /* RtTableDefault */
   fprintf(fd,
           "# Policy Routing Table to use for the default Route. Default is 0 (Take the same table as specified by RtTable)\n\n");
-  fprintf(fd, "RtTableDefault\t\t%d\n\n", cnf->rttable_default);
+  fprintf(fd, "RtTableDefault\t\t%d\n\n", cnf->rt_table_default);
+
+  /* RtTableTunnel */
+  fprintf(fd,
+          "# Policy Routing Table to use for the tunnel Routes. Default is 0 (Take the same table as specified by RtTable)\n\n");
+  fprintf(fd, "RtTableTunnel\t\t%d\n\n", cnf->rt_table_tunnel);
 
   /* Willingness */
   fprintf(fd,
@@ -445,11 +454,11 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, uint32_t bufsize)
 
   /* RtTable */
   WRITE_TO_BUF("# Policy Routing Table to use. Default is 254\n\n");
-  WRITE_TO_BUF("RtTable\t\t%d\n\n", cnf->rttable);
+  WRITE_TO_BUF("RtTable\t\t%d\n\n", cnf->rt_table);
 
   /* RtProto */
   WRITE_TO_BUF("# Routing proto flag to use. Default is 3 (BOOT)\n\n");
-  WRITE_TO_BUF("RtProto\t\t%d\n\n", cnf->rtproto);
+  WRITE_TO_BUF("RtProto\t\t%d\n\n", cnf->rt_proto);
 
   /* Willingness */
   WRITE_TO_BUF
index bcfd777..703a5bc 100644 (file)
@@ -55,6 +55,9 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#ifdef linux
+#include <linux/rtnetlink.h>
+#endif
 
 extern FILE *yyin;
 extern int yyparse(void);
@@ -350,7 +353,6 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
   }
 
   /* Link quality level */
-
   if (cnf->lq_level > MAX_LQ_LEVEL) {
     fprintf(stderr, "LQ level %d is not allowed\n", cnf->lq_level);
     return -1;
@@ -368,6 +370,71 @@ olsrd_sanity_check_cnf(struct olsrd_config *cnf)
     return -1;
   }
 
+#ifdef linux
+  /* calculate rt_policy defaults if necessary */
+  if (!cnf->rt_policy) {
+    /* get non policy routing entries */
+    cnf->rt_table = DEF_RTTABLE;
+    cnf->rt_table_default = DEF_RTTABLE;
+    cnf->rt_table_tunnel = DEF_RTTABLE;
+
+    cnf->rt_table_pri = 0;
+    cnf->rt_table_default_pri = 0;
+    cnf->rt_table_defaultolsr_pri = 0;
+    cnf->rt_table_tunnel_pri = 0;
+  }
+  else {
+    /* first fill in missing values */
+    if (cnf->rt_table_pri == 0) {
+      cnf->rt_table_pri = 32766; /* main table */
+      fprintf(stderr, "Choose table %u for rt_table_pri\n", cnf->rt_table_pri);
+    }
+    if (cnf->rt_table_defaultolsr_pri == 0) {
+      cnf->rt_table_defaultolsr_pri = cnf->rt_table_pri + 10;
+      fprintf(stderr, "Choose table %u for rt_table_defaultolsr_pri\n", cnf->rt_table_defaultolsr_pri);
+    }
+    if (cnf->rt_table_tunnel_pri == 0) {
+      cnf->rt_table_tunnel_pri = cnf->rt_table_defaultolsr_pri + 10;
+      fprintf(stderr, "Choose table %u for rt_table_tunnel_pri\n", cnf->rt_table_tunnel_pri);
+    }
+    if (cnf->rt_table_default_pri == 0) {
+      cnf->rt_table_default_pri = cnf->rt_table_tunnel_pri + 10;
+      fprintf(stderr, "Choose table %u for rt_table_default_pri\n", cnf->rt_table_default_pri);
+    }
+
+    /* 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_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_tunnel) {
+      fprintf(stderr, "rttable_defaultolsr priority must be lesser than rttable_tunnel priority\n");
+      return -1;
+    }
+    if (cnf->rt_table_tunnel >= cnf->rt_table_default_pri) {
+      fprintf(stderr, "rttable_tunnel priority must be lesser than rttable_default priority\n");
+      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
+
   if (in == NULL) {
     fprintf(stderr, "No interfaces configured!\n");
     return -1;
@@ -547,9 +614,11 @@ set_default_cnf(struct olsrd_config *cnf)
   cnf->allow_no_interfaces = DEF_ALLOW_NO_INTS;
   cnf->tos = DEF_TOS;
   cnf->olsrport = DEF_OLSRPORT;
-  cnf->rttable = DEF_RTTABLE;
-  cnf->rtproto = DEF_RTPROTO;
-  cnf->rttable_default = 0;
+  cnf->rt_policy = true;
+  cnf->rt_proto = DEF_RTPROTO;
+  cnf->rt_table = DEF_RTTABLE;
+  cnf->rt_table_default = DEF_RTTABLE_DEFAULT;
+  cnf->rt_table_tunnel = DEF_RTTABLE_TUNNEL;
   cnf->willingness_auto = DEF_WILL_AUTO;
   cnf->willingness = DEF_WILLINGNESS;
   cnf->ipc_connections = DEF_IPC_CONNECTIONS;
@@ -658,8 +727,9 @@ olsrd_print_cnf(struct olsrd_config *cnf)
     printf("No interfaces    : NOT ALLOWED\n");
   printf("TOS              : 0x%02x\n", cnf->tos);
   printf("OlsrPort          : 0x%03x\n", cnf->olsrport);
-  printf("RtTable          : 0x%02x\n", cnf->rttable);
-  printf("RtTableDefault   : 0x%02x\n", cnf->rttable_default);
+  printf("RtTable          : %u\n", cnf->rt_table);
+  printf("RtTableDefault   : %u\n", cnf->rt_table_default);
+  printf("RtTableTunnel    : %u\n", cnf->rt_table_tunnel);
   if (cnf->willingness_auto)
     printf("Willingness      : AUTO\n");
   else
index f127095..fbf5064 100644 (file)
@@ -183,10 +183,16 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_INTERFACE
 %token TOK_NOINT
 %token TOK_TOS
-%token TOK_RTTABLE
 %token TOK_OLSRPORT
+%token TOK_RTPOLICY
 %token TOK_RTPROTO
+%token TOK_RTTABLE
 %token TOK_RTTABLE_DEFAULT
+%token TOK_RTTABLE_TUNNEL
+%token TOK_RTTABLE_PRIORITY
+%token TOK_RTTABLE_DEFAULTOLSR_PRIORITY
+%token TOK_RTTABLE_TUNNEL_PRIORITY
+%token TOK_RTTABLE_DEFAULT_PRIORITY
 %token TOK_WILLINGNESS
 %token TOK_IPCCON
 %token TOK_FIBMETRIC
@@ -260,9 +266,15 @@ stmt:       idebug
           | bnoint
           | atos
           | aolsrport
-          | arttable
-          | artproto
-          | arttable_default
+          | brtpolicy
+          | irtproto
+          | irttable
+          | irttable_default
+          | irttable_tunnel
+          | irttable_priority
+          | irttable_defaultolsr_priority
+          | irttable_tunnel_priority
+          | irttable_default_priority
           | awillingness
           | busehyst
           | fhystscale
@@ -981,26 +993,73 @@ aolsrport: TOK_OLSRPORT TOK_INTEGER
 }
 ;
 
-arttable: TOK_RTTABLE TOK_INTEGER
+brtpolicy: TOK_RTPOLICY TOK_BOOLEAN
 {
-  PARSER_DEBUG_PRINTF("RtTable: %d\n", $2->integer);
-  olsr_cnf->rttable = $2->integer;
+  PARSER_DEBUG_PRINTF("RtPolicy: %s\n", $2->boolean ? "true" : "false");
+  olsr_cnf->rt_policy = $2->boolean;
   free($2);
 }
-;
 
-artproto: TOK_RTPROTO TOK_INTEGER
+irtproto: TOK_RTPROTO TOK_INTEGER
 {
   PARSER_DEBUG_PRINTF("RtProto: %d\n", $2->integer);
-  olsr_cnf->rtproto = $2->integer;
+  olsr_cnf->rt_proto = $2->integer;
+  free($2);
+}
+;
+
+irttable: TOK_RTTABLE TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("RtTable: %d\n", $2->integer);
+  olsr_cnf->rt_table = $2->integer;
   free($2);
 }
 ;
 
-arttable_default: TOK_RTTABLE_DEFAULT TOK_INTEGER
+irttable_default: TOK_RTTABLE_DEFAULT TOK_INTEGER
 {
   PARSER_DEBUG_PRINTF("RtTableDefault: %d\n", $2->integer);
-  olsr_cnf->rttable_default = $2->integer;
+  olsr_cnf->rt_table_default = $2->integer;
+  free($2);
+}
+;
+
+irttable_tunnel: TOK_RTTABLE_TUNNEL TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("RtTableTunnel: %d\n", $2->integer);
+  olsr_cnf->rt_table_tunnel = $2->integer;
+  free($2);
+}
+;
+
+irttable_priority: TOK_RTTABLE_PRIORITY TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("RtTablePriority: %d\n", $2->integer);
+  olsr_cnf->rt_table_pri = $2->integer;
+  free($2);
+}
+;
+
+irttable_default_priority: TOK_RTTABLE_DEFAULT_PRIORITY TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("RtTableDefaultPriority: %d\n", $2->integer);
+  olsr_cnf->rt_table_default_pri = $2->integer;
+  free($2);
+}
+;
+
+irttable_tunnel_priority: TOK_RTTABLE_TUNNEL_PRIORITY TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("RtTableTunnelPriority: %d\n", $2->integer);
+  olsr_cnf->rt_table_tunnel_pri = $2->integer;
+  free($2);
+}
+;
+
+irttable_defaultolsr_priority: TOK_RTTABLE_DEFAULTOLSR_PRIORITY TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("RtTableDefaultOlsrPriority: %d\n", $2->integer);
+  olsr_cnf->rt_table_defaultolsr_pri = $2->integer;
   free($2);
 }
 ;
index 0f3d5e0..83a599f 100644 (file)
@@ -307,9 +307,9 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
   return TOK_OLSRPORT;
 }
 
-"RtTable" {
+"RtPolicy" {
   yylval = NULL;
-  return TOK_RTTABLE;
+  return TOK_RTPOLICY;
 }
 
 "RtProto" {
@@ -317,11 +317,41 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
   return TOK_RTPROTO;
 }
 
+"RtTable" {
+  yylval = NULL;
+  return TOK_RTTABLE;
+}
+
 "RtTableDefault" {
   yylval = NULL;
   return TOK_RTTABLE_DEFAULT;
 }
 
+"RtTableTunnel" {
+  yylval = NULL;
+  return TOK_RTTABLE_TUNNEL;
+}
+
+"RtTablePriority" {
+  yylval = NULL;
+  return TOK_RTTABLE_PRIORITY;
+}
+
+"RtTableDefaultOlsrPriority" {
+  yylval = NULL;
+  return TOK_RTTABLE_DEFAULTOLSR_PRIORITY;
+}
+
+"RtTableTunnelPriority" {
+  yylval = NULL;
+  return TOK_RTTABLE_TUNNEL_PRIORITY;
+}
+
+"RtTableDefaultPriority" {
+  yylval = NULL;
+  return TOK_RTTABLE_DEFAULT_PRIORITY;
+}
+
 "Willingness" {
     yylval = NULL;
     return TOK_WILLINGNESS;
index 0c20d2f..bd56cc2 100644 (file)
@@ -62,7 +62,7 @@ void olsr_os_niit_6to4_route(const struct olsr_ip_prefix *dst_v6, bool set);
 void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set);
 
 int olsr_os_policy_rule(int family, int rttable, uint32_t priority, const char *if_name, bool set);
-int olsr_os_create_localhostif(union olsr_ip_addr *ip, bool create);
+int olsr_os_localhost_if(union olsr_ip_addr *ip, bool create);
 
 #endif
 
index 160c258..659c44b 100644 (file)
@@ -304,7 +304,7 @@ int olsr_os_policy_rule(int family, int rttable, uint32_t priority, const char *
 }
 
 int
-olsr_os_create_localhostif(union olsr_ip_addr *ip, bool create)
+olsr_os_localhost_if(union olsr_ip_addr *ip, bool create)
 {
   struct olsr_ipadd_req req;
   static char l[] = "lo:olsr";
@@ -431,8 +431,8 @@ 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) {
   /* TODO: in welche Table kommen die NIIT-Routen ? ne eigene ? */
-  if (olsr_new_netlink_route(AF_INET6, olsr_cnf->rttable, olsr_cnf->niit6to4_if_index,
-      RT_METRIC_DEFAULT, RTPROT_BOOT, NULL, NULL, dst_v6, set, false)) {
+  if (olsr_new_netlink_route(AF_INET6, 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",
         set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v6));
   }
@@ -440,8 +440,8 @@ 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) {
   /* TODO: in welche Table kommen die NIIT-Routen ? ne eigene ? */
-  if (olsr_new_netlink_route(AF_INET, olsr_cnf->rttable, olsr_cnf->niit4to6_if_index,
-      RT_METRIC_DEFAULT, olsr_cnf->rtproto, NULL, NULL, dst_v4, set, false)) {
+  if (olsr_new_netlink_route(AF_INET, 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",
         set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v4));
   }
@@ -454,15 +454,15 @@ void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set) {
 
   dst = ipv4 ? &ipv4_internet_route : &ipv6_internet_route;
 
-  if (olsr_new_netlink_route(ipv4 ? AF_INET : AF_INET6, olsr_cnf->rttable,
-      if_idx, RT_METRIC_DEFAULT, olsr_cnf->rtproto,NULL, NULL, dst, set, false)) {
+  if (olsr_new_netlink_route(ipv4 ? AF_INET : AF_INET6, olsr_cnf->rt_table_tunnel,
+      if_idx, RT_METRIC_DEFAULT, olsr_cnf->rt_proto, NULL, NULL, dst, set, false)) {
     olsr_syslog(OLSR_LOG_ERR, ". error while %s inetgw tunnel route to %s for if %d",
         set ? "setting" : "removing", olsr_ip_prefix_to_string(dst), if_idx);
   }
 }
 
 static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bool set) {
-  int metric, protocol, table;
+  int metric, table;
   const struct rt_nexthop *nexthop;
   union olsr_ip_addr *src;
   bool hostRoute;
@@ -481,18 +481,9 @@ static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bo
     metric += 2;
   }
 
-  /* get protocol
-   * 0 gets replaced by OS-specifc default (3)
-   * 1 is reserved so we take 0 instead (this really makes some sense)
-   * other numbers are used directly without change */
-  protocol = olsr_cnf->rtproto;
-  if (protocol <= 1) {
-    protocol = protocol < 1 ? RTPROT_BOOT : 0;
-  }
-
   /* get table */
   table = is_prefix_inetgw(&rt->rt_dst)
-      ? olsr_cnf->rttable_default : olsr_cnf->rttable;
+      ? olsr_cnf->rt_table_default : olsr_cnf->rt_table;
 
   /* get next hop */
   if (rt->rt_best && set) {
@@ -526,7 +517,7 @@ static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bo
   }
 
   /* create route */
-  err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, protocol,
+  err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, olsr_cnf->rt_proto,
       src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false);
 
   /* resolve "File exist" (17) propblems (on orig and autogen routes)*/
@@ -539,7 +530,7 @@ static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bo
 
     if (!err) {
       /* create this rule a second time if delete worked*/
-      err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, protocol,
+      err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, olsr_cnf->rt_proto,
           src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false);
     }
     olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err);
@@ -576,11 +567,11 @@ static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bo
     hostPrefix.prefix = nexthop->gateway;
     hostPrefix.prefix_len = olsr_cnf->ipsize * 8;
 
-    err = olsr_new_netlink_route(af_family, olsr_cnf->rttable, nexthop->iif_index,
-        metric, protocol, src, NULL, &hostPrefix, true, false);
+    err = olsr_new_netlink_route(af_family, olsr_cnf->rt_table, nexthop->iif_index,
+        metric, olsr_cnf->rt_proto, src, NULL, &hostPrefix, true, false);
     if (err == 0) {
       /* create this rule a second time if hostrule generation was successful */
-      err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, protocol,
+      err = olsr_new_netlink_route(af_family, table, nexthop->iif_index, metric, olsr_cnf->rt_proto,
           src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false);
     }
     olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err);
index 1b57beb..d8ccf75 100644 (file)
@@ -512,99 +512,20 @@ int main(int argc, char *argv[]) {
 
   OLSR_PRINTF(1, "Main address: %s\n\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
 
-#ifdef linux
-/*deativate spoof on all, this is neede ddue to an change in kernel 2.6.31 
- * all and device-specific settings are now combined differently
- * new max(all,device) old: all && device 
- * !!?? does this change only affect rp_filter or other aswell (e.g. icmp_redirect)*/
-
-  // TODO: cleanup ?
-  // deactivate_spoof("all", &olsr_cnf->ipip_base_if, AF_INET );
-#endif
-
 #ifdef LINUX_NETLINK_ROUTING
-  //!!?? disable smartgateway if not ipv4?, or better: do not start olsr
-#if 0
-  if (olsr_cnf->smart_gw_active) {
-    int r = olsr_if_setip(TUNL_BASE, &olsr_cnf->main_addr, 0);
-printf("set interface up returned %i",r);
-    //take up tunl0 device or disable smartgateway
-    olsr_cnf->ipip_base_orig_down = (r == -1 ?true:false);
-printf("old ipip_base_orig_down state: %i",olsr_cnf->ipip_base_orig_down);
-    olsr_cnf->smart_gw_active = (r != 0); //!!?? kernel 2.4 may need true to function as gateway, does it harm to do anyway
-    /*create an interface structure for the tunlbase to store procnet settings*/
-    /*hmmm integrate it into the olsr_interface list to ensure spoof setting clenaup at end!???*/
-    olsr_cnf->ipip_base_if.if_index = if_nametoindex(TUNL_BASE);
-
-    deactivate_spoof(TUNL_BASE, &olsr_cnf->ipip_base_if, AF_INET );//ipip is an ipv4 tunnel
-
-    if (!olsr_cnf->smart_gw_active) 
-    {
-      printf("disabled smart Gateway! (ipip tunnels not useable for olsrd on this host)");
+  /* create policy routing priorities if necessary */
+  if (olsr_cnf->rt_policy) {
+    struct interface *ifn;
+    olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, true);
+    olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_tunnel, olsr_cnf->rt_table_tunnel_pri, NULL, true);
+    olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default, olsr_cnf->rt_table_default_pri, NULL, true);
+
+    /* OLSR sockets */
+    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);
     }
-    else {
-      struct olsr_if *cfg_if;
-
-      //need sanity checks for routintg tables
-
-      //question: if rttable_default unconfigured, determine one?
-      //yes use 112
-      //same with smartTable (113)
-
-      //further checks: tabledefault and smartgateway >0 < 253
-      //check if all tables are unique
-      //if not use other values for unconfigured Tables? or stop startup?
-
-      //future improvement: verify if no rule points to default and smartgateway table, with un unknown realm?
-      //nice as we can use realms to give traffic info about gateway tunnel, and ...
-
-      //question: do we set an defaulttable now, which persists if smartgateway is turned off, due to problems (or an rmmodding user) later?
-      //its easier to stick to tables and also better, 
-      //as users will always find the default route on same place.
-
-      //question: make priority of rules configureable (if configured for rttable this might means we shall create this rule (instead the 65535 dummy)
-      //question olsr did never create rules for a custom table (beside the dummy)
-      //should we start now doing so anyways? (beter not, use only new RTTableRule priority)
-
-      //as above ist neither finalized nor done in parser, we use hardcoded values
-      olsr_cnf->ipip_if_index = false;
-      olsr_cnf->ipip_name=ipip_default_name;
-      olsr_cnf->rttable_default=112;
-      olsr_cnf->rttable_smartgw=113;
-      if (olsr_cnf->rttable_default_rule==0) olsr_cnf->rttable_default_rule=65532;
-      if (olsr_cnf->rttable_smartgw_rule==0) olsr_cnf->rttable_smartgw_rule=olsr_cnf->rttable_default_rule+1;
-      if (olsr_cnf->rttable_backup_rule==0) olsr_cnf->rttable_backup_rule=olsr_cnf->rttable_smartgw_rule+1;
-
-//!!?? just a test
-olsr_cnf->rttable_rule=65531;
-
-printf("\nMain Table is %i prio %i", olsr_cnf->rttable, olsr_cnf->rttable_rule);
-
-      /*table with default routes for olsr interfaces*/
-      for (cfg_if = olsr_cnf->interfaces; cfg_if; cfg_if = cfg_if->next) {
-        olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rttable_default,
-            olsr_cnf->rttable_default_rule, cfg_if->name, true);
-      }
-      /*table with route into tunnel (for all interfaces)*/
-      olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rttable_smartgw,
-                        olsr_cnf->rttable_smartgw_rule, NULL, true);
-      /*backup rule to default route table (if tunnel table gets empty)*/
-      olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rttable_default,
-                        olsr_cnf->rttable_backup_rule, NULL, true);
-    }
-  }
-#endif
-  /* Create rule for RtTable to resolve route insertion problems*/
-  if ((olsr_cnf->rttable < 253) & (olsr_cnf->rttable > 0)) {
-    olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rttable, (olsr_cnf->rttable_rule>0?olsr_cnf->rttable_rule:65535), NULL, true);
   }
-
-  /* Create rtnetlink socket to listen on interface change events RTMGRP_LINK and RTMGRP_IPV4_ROUTE */
-  //todo listen on tunl0 events aswell
-
-#endif
-
-#ifdef LINUX_NETLINK_ROUTING
   /* trigger gateway selection */
   if (olsr_cnf->smart_gw_active) {
     olsr_trigger_inetgw_startup();
@@ -617,7 +538,7 @@ printf("\nMain Table is %i prio %i", olsr_cnf->rttable, olsr_cnf->rttable_rule);
 
   /* create lo:olsr interface */
   if (olsr_cnf->use_src_ip_routes) {
-    olsr_os_create_localhostif(&olsr_cnf->main_addr, true);
+    olsr_os_localhost_if(&olsr_cnf->main_addr, true);
   }
 #endif
 
@@ -775,7 +696,7 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
 
   /* cleanup lo:olsr interface */
   if (olsr_cnf->use_src_ip_routes) {
-    olsr_os_create_localhostif(&olsr_cnf->main_addr, false);
+    olsr_os_localhost_if(&olsr_cnf->main_addr, false);
   }
 #endif
 
@@ -792,6 +713,13 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   for (ifn = ifnet; ifn; ifn = ifn->int_next) {
     close(ifn->olsr_socket);
     close(ifn->send_socket);
+
+#ifdef LINUX_NETLINK_ROUTING
+    if (olsr_cnf->rt_policy) {
+      olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default,
+          olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, false);
+    }
+#endif
   }
 
   /* Closing plug-ins */
@@ -804,47 +732,15 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   close(olsr_cnf->ioctl_s);
 
 #ifdef LINUX_NETLINK_ROUTING
-
-  /*delete smartgw tunnel if it index is known*/
-#if 0
-  if (olsr_cnf->ipip_if_index) olsr_del_tunl();
-#endif
-
-  /*!!?? we should take down the tunl0 interface*/
-
-  /*we shall delete all rules with an configured prio*/
-  if (olsr_cnf->rttable_default_rule>0) {
-    struct olsr_if * cfg_if;
-    for (cfg_if = olsr_cnf->interfaces; cfg_if; cfg_if = cfg_if->next) {
-      olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rttable_default, olsr_cnf->rttable_default_rule, cfg_if->name, false);
-    }
+  if (olsr_cnf->rt_policy) {
+    olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, false);
+    olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_tunnel, olsr_cnf->rt_table_tunnel_pri, NULL, false);
+    olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default, olsr_cnf->rt_table_default_pri, NULL, false);
   }
-  if (olsr_cnf->rttable_smartgw_rule>0)
-    olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rttable_smartgw, olsr_cnf->rttable_smartgw_rule, NULL, false);
-  if (olsr_cnf->rttable_backup_rule>0)
-    olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rttable_default, olsr_cnf->rttable_backup_rule, NULL, false);
-
-#if 0
-  /*tunl0*/
-  if (olsr_cnf->ipip_base_orig_down) {
-    printf("\ntakig down tunl0 again");
-    olsr_if_set_state(TUNL_BASE, false);
-  }
-#endif
-  /* RtTable backup rule */
-  if ((olsr_cnf->rttable < 253) & (olsr_cnf->rttable > 0)) {
-    olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rttable, (olsr_cnf->rttable_rule?olsr_cnf->rttable_rule:65535), NULL, false);
-  }
-
   close(olsr_cnf->rtnl_s);
   close (olsr_cnf->rt_monitor_socket);
-
-  /*TODO: cleanup ?rp_filter*/
-  // if (olsr_cnf->ipip_base_if.if_index) printf("\nresetting of tunl0 rp_filter not implemented");//!!?? no function extists to reset a single interface
 #endif
 
-/*!!?? we need to reset rp_filter of conf/all aswell, so we really need a new rp_filter reset function*/
-
 #if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __MacOSX__ || defined __NetBSD__ || defined __OpenBSD__
   /* routing socket */
   close(olsr_cnf->rts);
index 67a5d5e..4c5a9b1 100644 (file)
@@ -71,6 +71,9 @@
 #define DEF_OLSRPORT         698
 #define DEF_RTPROTO          0 /* 0 means OS-specific default */
 #define DEF_RTTABLE          254
+#define DEF_RTTABLE_DEFAULT  111
+#define DEF_RTTABLE_TUNNEL   112
+#define DEF_RTTABLE          254
 #define DEF_MIN_TC_VTIME     0.0
 #define DEF_USE_NIIT         true
 #define DEF_SMART_GW         false
@@ -212,9 +215,11 @@ struct olsrd_config {
   int ip_version;
   bool allow_no_interfaces;
   uint16_t tos;
-  uint8_t rtproto;
-  uint8_t rttable, rttable_default, rttable_smartgw;
-  uint16_t rttable_rule, rttable_default_rule, rttable_smartgw_rule, rttable_backup_rule;
+  bool rt_policy;
+  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;
   uint8_t willingness;
   bool willingness_auto;
   int ipc_connections;
index f3ffbb4..e55f401 100644 (file)
@@ -68,7 +68,7 @@ int olsr_os_policy_rule(int family __attribute__ ((unused)),
   return -1;
 }
 
-int olsr_os_create_localhostif(union olsr_ip_addr *ip __attribute__ ((unused)),
+int olsr_os_localhost_if(union olsr_ip_addr *ip __attribute__ ((unused)),
     bool create __attribute__ ((unused))) {
   return -1;
 }