Support for FIB metric configuration, other than 2
authorTeco Boot <teco@inf-net.nl>
Wed, 11 Jun 2014 20:57:05 +0000 (22:57 +0200)
committerTeco Boot <teco@inf-net.nl>
Wed, 11 Jun 2014 20:57:05 +0000 (22:57 +0200)
With multiple gateways, the default gateway routes need uniqueness.
Having a unique metric is a natural way to configure.
Metrics on exit link interface can be set with for example pppd configuration
or ifmetric tool.
With more than two exit link interfaces or default route next_hops, olsrd
would need a higher metric than current hard-coded value: 2.

New parameter: FIBMetricDefault
Defaults to existing behavior: 2

Metric range is unsigned 32-bit.

files/olsrd.conf.default.full
lib/dyn_gw/src/olsrd_dyn_gw.c
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/olsr_cfg.h
src/routing_table.c
src/routing_table.h

index 2e2e648..f4fa14a 100644 (file)
 # TosValue 192
 
 # FIBMetric controls the metric value of the host-routes OLSRd sets.
-# - "flat" means that the metric value is always 2. This is the preferred value
-#   because it helps the linux kernel routing to clean up older routes
+# - "flat" means that the metric value is always 2 (or as configured 
+#   with FIBMetricDefault). This is the preferred value because it helps 
+#   the linux kernel routing to clean up older routes.
 # - "correct" use the hopcount as the metric value.
 # - "approx" use the hopcount as the metric value too, but does only update the
 #   hopcount if the nexthop changes too
 # (Default is "flat")
 
 # FIBMetric "flat"
+# FIBMetricDefault 2
 
 #######################################
 ### Linux specific OLSRd extensions ###
index 027863c..074e4d3 100644 (file)
@@ -54,6 +54,7 @@
 #include "scheduler.h"
 #include "log.h"
 #include "routing_table.h"
+#include "olsr_cfg.h"
 
 #include <stdio.h>
 #include <string.h>
@@ -468,7 +469,7 @@ update_routing(void)
       continue;
     }
     
-    if ((iflags & RTF_UP) && (metric != RT_METRIC_DEFAULT)) {
+    if ((iflags & RTF_UP) && (metric != olsr_cnf->fib_metric_default)) {
       hna->checked = true;
     }
   }
index de07d3a..bb2b007 100644 (file)
@@ -346,8 +346,9 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
   abuf_appendf(out,
     "\n"
     "# FIBMetric controls the metric value of the host-routes OLSRd sets.\n"
-    "# - \"flat\" means that the metric value is always 2. This is the preferred value\n"
-    "#   because it helps the linux kernel routing to clean up older routes\n"
+    "# - \"flat\" means that the metric value is always 2(or as configured \n"
+    "#   with FIBMetricDefault). This is the preferred value because it \n"
+    "#   helps the linux kernel routing to clean up older routes\n"
     "# - \"correct\" use the hopcount as the metric value.\n"
     "# - \"approx\" use the hopcount as the metric value too, but does only update the\n"
     "#   hopcount if the nexthop changes too\n"
@@ -356,6 +357,16 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
   abuf_appendf(out, "%sFIBMetric \"%s\"\n",
       cnf->fib_metric == DEF_FIB_METRIC ? "# " : "",
       FIB_METRIC_TXT[cnf->fib_metric]);
+  abuf_appendf(out,
+    "\n"
+    "# Default FIB metric.\n"
+    "# The kernel FIB does not need to know the metric of a route.\n"
+    "# This saves us from enqueuing/dequeueing hopcount only changes.\n"
+    "# (default is %u)\n"
+    "\n", DEF_FIB_METRIC_DEFAULT);
+  abuf_appendf(out, "%sFIBMetricDefault %u\n",
+      cnf->fib_metric_default == DEF_FIB_METRIC_DEFAULT? "# " : "",
+      cnf->fib_metric_default);
   abuf_appendf(out,
     "\n"
     "#######################################\n"
index c68d244..ba7e98d 100644 (file)
@@ -921,6 +921,7 @@ set_default_cnf(struct olsrd_config *cnf)
   cnf->willingness = DEF_WILLINGNESS;
   cnf->ipc_connections = DEF_IPC_CONNECTIONS;
   cnf->fib_metric = DEF_FIB_METRIC;
+  cnf->fib_metric_default = DEF_FIB_METRIC_DEFAULT;
 
   cnf->use_hysteresis = DEF_USE_HYST;
   cnf->hysteresis_param.scaling = HYST_SCALING;
index 1ace8ca..6cc2f8e 100644 (file)
@@ -196,6 +196,7 @@ static int add_ipv6_addr(YYSTYPE ipaddr_arg, YYSTYPE prefixlen_arg)
 %token TOK_WILLINGNESS
 %token TOK_IPCCON
 %token TOK_FIBMETRIC
+%token TOK_FIBMETRICDEFAULT
 %token TOK_USEHYST
 %token TOK_HYSTSCALE
 %token TOK_HYSTUPPER
@@ -279,6 +280,7 @@ conf:
 stmt:       idebug
           | iipversion
           | fibmetric
+          | afibmetricdefault
           | bnoint
           | atos
           | aolsrport
@@ -862,6 +864,14 @@ fibmetric:    TOK_FIBMETRIC TOK_STRING
 }
 ;
 
+afibmetricdefault: TOK_FIBMETRICDEFAULT TOK_INTEGER
+{
+  PARSER_DEBUG_PRINTF("FIBMetricDefault: %d\n", $2->integer);
+  olsr_cnf->fib_metric_default = $2->integer;
+  free($2);
+}
+;
+
 ihna4entry:     TOK_IPV4_ADDR TOK_IPV4_ADDR
 {
   union olsr_ip_addr ipaddr, netmask;
index f909f27..b123fe4 100644 (file)
@@ -375,6 +375,11 @@ IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6
     return TOK_FIBMETRIC;
 }
 
+"FIBMetricDefault" {
+    yylval = NULL;
+    return TOK_FIBMETRICDEFAULT;
+}
+
 "UseHysteresis" {
     yylval = NULL;
     return TOK_USEHYST;
index 0732494..76dfb0d 100644 (file)
@@ -450,7 +450,7 @@ 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,
       olsr_cnf->niit6to4_if_index,
-      RT_METRIC_DEFAULT, olsr_cnf->rt_proto, NULL, NULL, dst_v6, set, false)) {
+      olsr_cnf->fib_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));
   }
@@ -460,7 +460,7 @@ 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,
       olsr_cnf->niit4to6_if_index,
-      RT_METRIC_DEFAULT, olsr_cnf->rt_proto, NULL, NULL, dst_v4, set, false)) {
+      olsr_cnf->fib_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));
   }
@@ -474,7 +474,7 @@ void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set, uint8_t t
   dst = ipv4 ? &ipv4_internet_route : &ipv6_internet_route;
 
   if (olsr_new_netlink_route(ipv4 ? AF_INET : AF_INET6, table,
-      if_idx, RT_METRIC_DEFAULT, olsr_cnf->rt_proto, NULL, NULL, dst, set, false)) {
+      if_idx, olsr_cnf->fib_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);
   }
@@ -489,7 +489,7 @@ static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bo
 
   /* calculate metric */
   if (FIBM_FLAT == olsr_cnf->fib_metric) {
-    metric = RT_METRIC_DEFAULT;
+    metric = olsr_cnf->fib_metric_default;
   }
   else {
     metric = set ? rt->rt_best->rtp_metric.hops : rt->rt_metric.hops;
index 19a1e5f..a2c7603 100644 (file)
@@ -68,6 +68,7 @@
 #define DEF_IPC_CONNECTIONS  0
 #define DEF_USE_HYST         false
 #define DEF_FIB_METRIC       FIBM_FLAT
+#define DEF_FIB_METRIC_DEFAULT            2
 #define DEF_LQ_LEVEL         2
 #define DEF_LQ_ALGORITHM     "etx_ff"
 #define DEF_LQ_FISH          1
@@ -288,6 +289,7 @@ struct olsrd_config {
   int ipc_connections;
   bool use_hysteresis;
   olsr_fib_metric_options fib_metric;
+  uint32_t fib_metric_default;
   struct hyst_param hysteresis_param;
   struct plugin_entry *plugins;
   struct ip_prefix_list *hna_entries;
index 90bd818..eaffe4d 100644 (file)
@@ -395,7 +395,7 @@ olsr_hopcount_change(const struct rt_metric * met1, const struct rt_metric * met
 /**
  * Depending if flat_metric is configured and the kernel fib operation
  * return the hopcount metric of a route.
- * For adds this is the metric of best rour after olsr_rt_best() election,
+ * For adds this is the metric of best route after olsr_rt_best() election,
  * for deletes this is the metric of the route that got stored in the rt_entry,
  * during route installation.
  */
@@ -405,7 +405,7 @@ olsr_fib_metric(const struct rt_metric * met)
   if (FIBM_CORRECT == olsr_cnf->fib_metric) {
     return met->hops;
   }
-  return RT_METRIC_DEFAULT;
+  return olsr_cnf->fib_metric_default;
 }
 
 /**
index 77a732e..3852042 100644 (file)
 #define NETMASK_HOST 0xffffffff
 #define NETMASK_DEFAULT 0x0
 
-/*
- * the kernel FIB does not need to know the metric of a route.
- * this saves us from enqueuing/dequeueing hopcount only changes.
- */
-#define RT_METRIC_DEFAULT 2
-
 /* a composite metric is used for path selection */
 struct rt_metric {
   olsr_linkcost cost;