From Sven-Ola Tuecke: 121-olsrd-fib-metric-approx.patch
authorHannes Gredler <hannes@gredler.at>
Fri, 28 Dec 2007 16:57:59 +0000 (17:57 +0100)
committerHannes Gredler <hannes@gredler.at>
Fri, 28 Dec 2007 16:57:59 +0000 (17:57 +0100)
files/olsrd.conf.default.lq
files/olsrd.conf.default.lq-fisheye
files/olsrd.conf.default.rfc
lib/httpinfo/src/olsrd_httpinfo.c
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/linux/kernel_routes.c
src/olsr_cfg.h
src/process_routes.c
src/routing_table.c

index b508060..1b8cd05 100644 (file)
@@ -20,7 +20,7 @@ DebugLevel    2
 
 IpVersion      4
 
-# FIBMetric ("flat" or "correct")
+# FIBMetric ("flat", "correct", or "approx")
 
 FIBMetric "flat"
 
index 0625390..c7e695a 100644 (file)
@@ -20,7 +20,7 @@ DebugLevel    0
 
 IpVersion      4
 
-# FIBMetric ("flat" or "correct")
+# FIBMetric ("flat", "correct", or "approx")
 
 FIBMetric "flat"
 
index d14df7c..11bb224 100644 (file)
@@ -15,7 +15,7 @@ DebugLevel    1
 
 IpVersion      4
 
-# FIBMetric ("flat" or "correct")
+# FIBMetric ("flat", "correct", or "approx")
 
 FIBMetric "flat"
 
index 71faba6..63d99be 100644 (file)
@@ -839,7 +839,7 @@ static int build_config_body(char *buf, olsr_u32_t bufsize)
     size += snprintf(&buf[size], bufsize-size, "<td>Main address: <strong>%s</strong></td>\n", olsr_ip_to_string(&mainaddrbuf, &olsr_cnf->main_addr));
     size += snprintf(&buf[size], bufsize-size, "<td>IP version: %d</td>\n", olsr_cnf->ip_version == AF_INET ? 4 : 6);
     size += snprintf(&buf[size], bufsize-size, "<td>Debug level: %d</td>\n", olsr_cnf->debug_level);
-    size += snprintf(&buf[size], bufsize-size, "<td>FIB Metrics: %s</td>\n", olsr_cnf->flat_fib_metric ? CFG_FIBM_FLAT : CFG_FIBM_CORRECT);
+    size += snprintf(&buf[size], bufsize-size, "<td>FIB Metrics: %s</td>\n", FIBM_FLAT == olsr_cnf->fib_metric ? CFG_FIBM_FLAT : FIBM_CORRECT == olsr_cnf->fib_metric ? CFG_FIBM_CORRECT : CFG_FIBM_APPROX);
 
     size += snprintf(&buf[size], bufsize-size, "</tr>\n<tr>\n");
 
index 414ea7e..6b50bc9 100644 (file)
@@ -83,7 +83,8 @@ olsrd_write_cnf(struct olsrd_config *cnf, const char *fname)
   fprintf(fd, "# IP version to use (4 or 6)\n\nIpVersion\t%d\n\n", cnf->ip_version == AF_INET ? 4 : 6);
 
   /* FIB Metric */
-  fprintf(fd, "# FIBMetric (\"%s\" or \"%s\")\n\nFIBMetric\t\"%s\"\n\n", CFG_FIBM_FLAT, CFG_FIBM_CORRECT, cnf->flat_fib_metric ? CFG_FIBM_FLAT : CFG_FIBM_CORRECT);
+  fprintf(fd, "# FIBMetric (\"%s\", \"%s\", or \"%s\")\n\nFIBMetric\t\"%s\"\n\n", CFG_FIBM_FLAT, CFG_FIBM_CORRECT, CFG_FIBM_APPROX,
+    FIBM_FLAT == cnf->fib_metric ? CFG_FIBM_FLAT : FIBM_CORRECT == cnf->fib_metric ? CFG_FIBM_CORRECT : CFG_FIBM_APPROX);
 
   /* HNA IPv4/IPv6 */
   fprintf(fd, "# HNA IPv%d routes\n# syntax: netaddr/prefix\n\nHna%d {\n", cnf->ip_version == AF_INET ? 4 : 6, cnf->ip_version == AF_INET ? 4 : 6);
@@ -369,7 +370,8 @@ olsrd_write_cnf_buf(struct olsrd_config *cnf, char *buf, olsr_u32_t bufsize)
   WRITE_TO_BUF("# IP version to use (4 or 6)\n\nIpVersion\t%d\n\n", cnf->ip_version == AF_INET ? 4 : 6);
 
   /* FIB Metric */
-  WRITE_TO_BUF("# FIBMetric (\"%s\" or \"%s\")\n\nFIBMetric\t\"%s\"\n\n", CFG_FIBM_FLAT, CFG_FIBM_CORRECT, cnf->flat_fib_metric ? CFG_FIBM_FLAT : CFG_FIBM_CORRECT);
+  WRITE_TO_BUF("# FIBMetric (\"%s\", \"%s\", or \"%s\")\n\nFIBMetric\t\"%s\"\n\n", CFG_FIBM_FLAT, CFG_FIBM_CORRECT, CFG_FIBM_APPROX,
+    FIBM_FLAT == cnf->fib_metric ? CFG_FIBM_FLAT : FIBM_CORRECT == cnf->fib_metric ? CFG_FIBM_CORRECT : CFG_FIBM_APPROX);
 
   /* HNA IPv4/IPv6 */
   WRITE_TO_BUF("# HNA IPv%1$d routes\n# syntax: netaddr netmask\n\nHna%1$d {\n", cnf->ip_version == AF_INET ? 4 : 6);
index 0b2eeb7..0f3c166 100644 (file)
@@ -439,7 +439,7 @@ set_default_cnf(struct olsrd_config *cnf)
     cnf->rttable = 254;
     cnf->willingness_auto = DEF_WILL_AUTO;
     cnf->ipc_connections = DEF_IPC_CONNECTIONS;
-    cnf->flat_fib_metric = DEF_FLAT_FIB_METRIC;
+    cnf->fib_metric = DEF_FIB_METRIC;
 
     cnf->use_hysteresis = DEF_USE_HYST;
     cnf->hysteresis_param.scaling = HYST_SCALING;
index a501910..daf911d 100644 (file)
@@ -720,11 +720,13 @@ fibmetric:    TOK_FIBMETRIC TOK_STRING
 {
   PARSER_DEBUG_PRINTF("FIBMetric: %d\n", $2->string);
   if (strcmp($2->string, CFG_FIBM_FLAT) == 0) {
-      olsr_cnf->flat_fib_metric = OLSR_TRUE;
+      olsr_cnf->fib_metric = FIBM_FLAT;
   } else if (strcmp($2->string, CFG_FIBM_CORRECT) == 0) {
-      olsr_cnf->flat_fib_metric = OLSR_FALSE;
+      olsr_cnf->fib_metric = FIBM_CORRECT;
+  } else if (strcmp($2->string, CFG_FIBM_APPROX) == 0) {
+      olsr_cnf->fib_metric = FIBM_APPROX;
   } else {
-    fprintf(stderr, "FIBMetric must be \"%s\" or \"%s\"!\n", CFG_FIBM_FLAT, CFG_FIBM_CORRECT);
+    fprintf(stderr, "FIBMetric must be \"%s\", \"%s\", or \"%s\"!\n", CFG_FIBM_FLAT, CFG_FIBM_CORRECT, CFG_FIBM_APPROX);
     YYABORT;
   }
   free($1);
index 5438238..210c176 100644 (file)
@@ -86,11 +86,10 @@ static int olsr_netlink_route(const struct rt_entry *rt, olsr_u8_t family, olsr_
                0,
                0
        };
-        olsr_u32_t metric = RT_METRIC_DEFAULT;
+       olsr_u32_t metric = FIBM_FLAT != olsr_cnf->fib_metric ? (RTM_NEWROUTE == cmd ?
+               rt->rt_best->rtp_metric.hops : rt->rt_metric.hops): RT_METRIC_DEFAULT;
        const struct rt_nexthop* nexthop = (RTM_NEWROUTE == cmd) ?
                &rt->rt_best->rtp_nexthop : &rt->rt_nexthop;
-       const struct rt_metric* met = (RTM_NEWROUTE == cmd) ?
-               &rt->rt_best->rtp_metric : &rt->rt_metric;
 
        memset(&req, 0, sizeof(req));
        req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
@@ -109,7 +108,6 @@ static int olsr_netlink_route(const struct rt_entry *rt, olsr_u8_t family, olsr_
                {
                        olsr_netlink_addreq(&req, RTA_GATEWAY, &nexthop->gateway.v4, sizeof(nexthop->gateway.v4));
                        req.r.rtm_scope = RT_SCOPE_UNIVERSE;
-                       metric = olsr_fib_metric(met);
                }
                olsr_netlink_addreq(&req, RTA_DST, &rt->rt_dst.prefix.v4, sizeof(rt->rt_dst.prefix.v4));
        }
@@ -119,12 +117,13 @@ static int olsr_netlink_route(const struct rt_entry *rt, olsr_u8_t family, olsr_
                {
                        olsr_netlink_addreq(&req, RTA_GATEWAY, &nexthop->gateway.v6, sizeof(nexthop->gateway.v6));
                        req.r.rtm_scope = RT_SCOPE_UNIVERSE;
-                       metric = olsr_fib_metric(met);
                }
                olsr_netlink_addreq(&req, RTA_DST, &rt->rt_dst.prefix.v6, sizeof(rt->rt_dst.prefix.v6));
        }
-       //!!!olsr_netlink_addreq(&req, RTA_PRIORITY, &rt->rt_best->rtp_metric.hops, sizeof(rt->rt_best->rtp_metric.hops));
-       olsr_netlink_addreq(&req, RTA_PRIORITY, &metric, sizeof(metric));
+       if (FIBM_APPROX != olsr_cnf->fib_metric || RTM_NEWROUTE == cmd)
+       {
+               olsr_netlink_addreq(&req, RTA_PRIORITY, &metric, sizeof(metric));
+       }
        olsr_netlink_addreq(&req, RTA_OIF, &nexthop->iif_index, sizeof(nexthop->iif_index));
        iov.iov_base = &req.n;
        iov.iov_len = req.n.nlmsg_len;
index 26428c7..c893c58 100644 (file)
@@ -61,7 +61,7 @@
 #define DEF_DEBUGLVL        1
 #define DEF_IPC_CONNECTIONS 0
 #define DEF_USE_HYST        OLSR_FALSE
-#define DEF_FLAT_FIB_METRIC OLSR_TRUE
+#define DEF_FIB_METRIC      FIBM_FLAT
 #define DEF_LQ_LEVEL        2
 #define DEF_LQ_FISH         0
 #define DEF_LQ_DIJK_LIMIT   255
@@ -95,8 +95,9 @@
 #define MIN_LQ_WSIZE        3
 
 /* Option values */
-#define CFG_FIBM_FLAT          "flat"
-#define CFG_FIBM_CORRECT       "correct"
+#define CFG_FIBM_FLAT          "flat"
+#define CFG_FIBM_CORRECT       "correct"
+#define CFG_FIBM_APPROX        "approx"
 
 #ifndef IPV6_ADDR_SITELOCAL
 #define IPV6_ADDR_SITELOCAL    0x0040U
@@ -180,6 +181,12 @@ struct plugin_entry
 };
 
 
+typedef enum {
+  FIBM_FLAT,
+  FIBM_CORRECT,
+  FIBM_APPROX
+} olsr_fib_metric_options;
+
 /*
  * The config struct
  */
@@ -197,7 +204,7 @@ struct olsrd_config
   olsr_bool                willingness_auto;
   int                      ipc_connections;
   olsr_bool                use_hysteresis;
-  olsr_bool                flat_fib_metric;
+  olsr_fib_metric_options  fib_metric;
   struct hyst_param        hysteresis_param;
   struct plugin_entry      *plugins;
   struct ip_prefix_list    *hna_entries;
index 68ff5c3..a4d56a7 100644 (file)
@@ -355,7 +355,7 @@ olsr_update_rib_routes(void)
 
     /* nexthop or hopcount change ? */
     if (olsr_nh_change(&rt->rt_best->rtp_nexthop, &rt->rt_nexthop) ||
-        (!olsr_cnf->flat_fib_metric &&
+        (FIBM_CORRECT == olsr_cnf->fib_metric &&
          olsr_hopcount_change(&rt->rt_best->rtp_metric, &rt->rt_metric))) {
 
       if (0 > rt->rt_nexthop.iif_index) {
index e0a1514..f9db44a 100644 (file)
@@ -379,7 +379,7 @@ olsr_hopcount_change(const struct rt_metric *met1, const struct rt_metric *met2)
 olsr_u8_t
 olsr_fib_metric(const struct rt_metric *met)
 {
-  if (!olsr_cnf->flat_fib_metric) {
+  if (FIBM_CORRECT == olsr_cnf->fib_metric) {
     return met->hops;
   }
   return RT_METRIC_DEFAULT;