Merge branch 'release-0.6.7'
authorFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 24 Oct 2014 07:34:18 +0000 (09:34 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 24 Oct 2014 07:34:18 +0000 (09:34 +0200)
* release-0.6.7:
  plugins: add a comment to clarify strange behaviour
  txtinfo: set_plugin_boolean stores into an int
  jsoninfo: set_plugin_boolean stores into an int
  android: fix build on 32 bit platform (see 0295e11)
  android: use the machine specific NDK instead of always the 32bit variant

17 files changed:
CHANGELOG
Makefile
gui/win32/Inst/installer.nsi
gui/win32/Main/Frontend.rc
lib/pud/src/configTools.c
lib/sgwdynspeed/src/configuration.c
lib/sgwdynspeed/src/speedFile.c
src/cfgparser/olsrd_conf.c
src/cfgparser/oparse.y
src/gateway.c
src/gateway.h
src/gateway_costs.c
src/gateway_costs.h
src/gateway_default_handler.c
src/kernel_routes.h
src/linux/kernel_routes_nl.c
src/linux/net.c

index 55e36a1..e5cea78 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,12 @@
+Note: In this release the pud plugin was upgraded to version 2.0.0.
+      This is because of a breaking change in its wire format. If you have
+      deployed the pud plugin on your mesh then you should update all nodes
+      to the new pud plugin at the same time since there is no interoperability
+      between the old version and the new version.
+
+Note: In this release the configuration files have been moved from /etc into
+      /etc/olsrd.
+
 0.6.7 -------------------------------------------------------------------
 
 Alessio Caiazza (4):
@@ -261,15 +270,6 @@ Teco Boot (2):
 Yury Popov (1):
       Fix for win32 compiling with i686-w64-mingw32-gcc on ubuntu
 
-Note: In this release the pud plugin was upgraded to version 2.0.0.
-      This is because of a breaking change in its wire format. If you have
-      deployed the pud plugin on your mesh then you should update all nodes
-      to the new pud plugin at the same time since there is no interoperability
-      between the old version and the new version.
-
-Note: In this release the configuration files have been moved from /etc into
-      /etc/olsrd.
-
 0.6.6.2 -------------------------------------------------------------------
 
 Alessio Caiazza (2):
index c5a2ca5..0a1f946 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -39,7 +39,7 @@
 # Please also write a new version to:
 # gui/win32/Main/Frontend.rc (line 71, around "CAPTION [...]")
 # gui/win32/Inst/installer.nsi (line 57, around "MessageBox MB_YESNO [...]")
-VERS =         pre-0.6.7.1
+VERS =         pre-0.6.8
 
 TOPDIR = .
 INSTALLOVERWRITE ?=
index 9b1580c..2f39ece 100644 (file)
@@ -54,7 +54,7 @@ UninstPage uninstConfirm
 UninstPage instfiles
 
 Function .onInit
-        MessageBox MB_YESNO "This will install olsr.org pre-0.6.7.1 on your computer. Continue?" IDYES NoAbort
+        MessageBox MB_YESNO "This will install olsr.org pre-0.6.8 on your computer. Continue?" IDYES NoAbort
         Abort
 NoAbort:
 FunctionEnd
index b58b51f..4bc1285 100644 (file)
@@ -68,7 +68,7 @@ IDD_FRONTEND_DIALOG DIALOGEX 0, 0, 399, 289
 STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | \r
     WS_SYSMENU\r
 EXSTYLE WS_EX_APPWINDOW\r
-CAPTION "olsr.org Switch pre-0.6.7.1"
+CAPTION "olsr.org Switch pre-0.6.8"
 FONT 8, "MS Sans Serif", 0, 0, 0x1\r
 BEGIN\r
     CONTROL         "Tab1",IDC_TAB1,"SysTabControl32",0x0,7,7,383,256\r
index 40610e0..b047a9c 100644 (file)
@@ -63,7 +63,7 @@ bool readBool(const char * parameterName, const char * str, bool * dst) {
        errno = 0;
        value = strtoul(str, &endPtr, 10);
 
-       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str);
                retVal = false;
@@ -109,7 +109,7 @@ bool readUC(const char * parameterName, const char * str, unsigned char * dst) {
        errno = 0;
        value = strtoul(str, &endPtr, 10);
 
-       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str);
                return false;
@@ -150,7 +150,7 @@ bool readUS(const char * parameterName, const char * str, unsigned short * dst)
        errno = 0;
        value = strtoul(str, &endPtr, 10);
 
-       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str);
                return false;
@@ -194,7 +194,7 @@ bool readULL(const char * parameterName, const char * str, unsigned long long *
        errno = 0;
        value = strtoull(str, &endPtr, base);
 
-       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                pudError(false, "Value of parameter %s (%s) could not be converted to a number (base %d)", parameterName, str, base);
                return false;
@@ -230,7 +230,7 @@ bool readULL(const char * parameterName, const char * str, unsigned long long *
        errno = 0;
        value = strtod(str, &endPtr);
 
-       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != str) && (*str != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                pudError(false, "Value of parameter %s (%s) could not be converted to a number", parameterName, str);
                return false;
index 32a0fc6..363aa67 100644 (file)
@@ -39,7 +39,7 @@ static bool readULL(const char * valueName, const char * value, unsigned long lo
        errno = 0;
        valueNew = strtoull(value, &endPtr, 10);
 
-       if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                sgwDynSpeedError(true, "Configured %s (%s) could not be converted to a number", valueName, value);
                return false;
index ef9a8df..bf3a246 100644 (file)
@@ -76,7 +76,7 @@ static bool readUL(const char * valueName, const char * value, unsigned long * v
        errno = 0;
        valueNew = strtoul(value, &endPtr, 10);
 
-       if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0'))) {
+       if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0')) || (errno == ERANGE)) {
                /* invalid conversion */
                sgwDynSpeedError(false, "Value of parameter %s (%s) could not be converted to a number", valueName, value);
                return false;
index e01bb37..5e627c5 100644 (file)
@@ -60,6 +60,7 @@
 #include <linux/rtnetlink.h>
 #include <linux/version.h>
 #include <sys/stat.h>
+#include <net/if.h>
 #endif /* __linux__ */
 
 extern FILE *yyin;
index 6cc2f8e..3def782 100644 (file)
@@ -1379,15 +1379,15 @@ sgw_egress_if: TOK_STRING
   }
 
   /* Trim trailing space */
-  end = str + strlen(str) - 1;
+  end = &str[strlen(str) - 1];
   while((end > str) && isspace(*end)) {
     end--;
   }
 
   /* Write new null terminator */
-  *(end + 1) = '\0';
+  end[1] = '\0';
 
-  if(*str == 0) {
+  if(*str == '\0') {
     PARSER_DEBUG_PRINTF("Smart gateway egress interface: <empty> (skipped)\n");
   } else {
     PARSER_DEBUG_PRINTF("Smart gateway egress interface: %s\n", str);
index 76501ca..110be80 100644 (file)
@@ -113,13 +113,6 @@ static inline uint8_t * hna_mask_to_hna_pointer(union olsr_ip_addr *mask, int pr
   return (((uint8_t *)mask) + ((prefixlen+7)/8));
 }
 
-/**
- * @return true if multi-gateway mode is enabled
- */
-static inline bool multi_gateway_mode(void) {
-  return (olsr_cnf->smart_gw_use_count > 1);
-}
-
 /**
  * Convert an encoded 1 byte transport value (5 bits mantissa, 3 bits exponent)
  * to an uplink/downlink speed value
@@ -654,8 +647,6 @@ int olsr_init_gateways(void) {
     return 1;
   }
 
-  olsr_add_ifchange_handler(smartgw_tunnel_monitor);
-
   return 0;
 }
 
@@ -666,6 +657,7 @@ int olsr_startup_gateways(void) {
   bool ok = true;
 
   if (!multi_gateway_mode()) {
+    olsr_add_ifchange_handler(smartgw_tunnel_monitor);
     return 0;
   }
 
@@ -680,6 +672,8 @@ int olsr_startup_gateways(void) {
     return 1;
   }
 
+  olsr_add_ifchange_handler(smartgw_tunnel_monitor);
+
   if (olsr_cnf->smart_gw_takedown_percentage > 0) {
     /* start gateway takedown timer */
     olsr_set_timer(&gw_takedown_timer, olsr_cnf->smart_gw_period, 0, true, &gw_takedown_timer_callback, NULL, 0);
@@ -693,6 +687,7 @@ int olsr_startup_gateways(void) {
  */
 void olsr_shutdown_gateways(void) {
   if (!multi_gateway_mode()) {
+    olsr_remove_ifchange_handler(smartgw_tunnel_monitor);
     return;
   }
 
@@ -702,6 +697,8 @@ void olsr_shutdown_gateways(void) {
     gw_takedown_timer = NULL;
   }
 
+  olsr_remove_ifchange_handler(smartgw_tunnel_monitor);
+
   (void)multiGwRulesSgwTunnels(false);
   (void)multiGwRulesEgressInterfaces(false);
   (void)multiGwRulesOlsrInterfaces(false);
@@ -716,8 +713,6 @@ void olsr_cleanup_gateways(void) {
   struct gateway_entry * tree_gw;
   struct gw_container_entry * gw;
 
-  olsr_remove_ifchange_handler(smartgw_tunnel_monitor);
-
   /* remove all gateways in the gateway tree that are not the active gateway */
   OLSR_FOR_ALL_GATEWAY_ENTRIES(tree_gw) {
     if ((tree_gw != olsr_get_inet_gateway(false)) && (tree_gw != olsr_get_inet_gateway(true))) {
@@ -927,6 +922,7 @@ void olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_add
 
   gw->ipv4 = (ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV4) != 0;
   gw->ipv4nat = (ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV4_NAT) != 0;
+  gw->ipv6 = false;
 
   if (olsr_cnf->ip_version == AF_INET6) {
     gw->ipv6 = (ptr[GW_HNA_FLAGS] & GW_HNA_FLAG_IPV6) != 0;
index 5ca479e..52dfe30 100644 (file)
 /** the interval (in milliseconds) on which to run gateway cleanup */
 #define GW_CLEANUP_INTERVAL 30000
 
+/**
+ * @return true if multi-gateway mode is enabled
+ */
+static inline bool multi_gateway_mode(void) {
+  return (olsr_cnf->smart_gw_use_count > 1);
+}
+
 /*
  * hack for Vienna network:
  * set MAXIMUM_GATEWAY_PREFIX_LENGTH to 1 to remove 0.0.0.0/128.0.0.0 and
index 5aa549b..7a4ebf9 100644 (file)
@@ -7,11 +7,16 @@ extern "C" {
 #define SCALING_SHIFT_CLASSIC 31
 #define SCALING_SHIFT 23
 
-int64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk) {
+int64_t gw_costs_weigh(bool up, const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk) {
   int64_t costU;
   int64_t costD;
   int64_t costE;
 
+  if (!up) {
+    /* interface is down */
+    return INT64_MAX;
+  }
+
   if (!weights.Detx) {
     /* only consider path costs (classic behaviour) (but scale to 64 bit) */
     return ((int64_t) path_cost) << SCALING_SHIFT_CLASSIC;
index f83dab9..72f49a6 100644 (file)
@@ -56,6 +56,7 @@
  */
 
 #include "stdint.h"
+#include "stdbool.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -77,13 +78,14 @@ extern "C" {
    * If the ETX divider is zero, then no weighing is performed and only the path
    * costs are considered (classic behaviour), but scaled to a 64 bit number.
    *
+   * @param up true when the relevant interface is up
    * @param weights the weights for the calculation
    * @param path_cost the (ETX) path cost to the gateway
    * @param exitUk the gateway exit link uplink bandwidth (in kbps)
    * @param exitDk the gateway exit link downlink bandwidth (in kbps)
-   * @return the weighed path cost, INT64_MAX when exitUk and/or exitDk are zero
+   * @return the weighed path cost, INT64_MAX when up is false or when exitUk and/or exitDk are zero
    */
-  int64_t gw_costs_weigh(const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk);
+  int64_t gw_costs_weigh(bool up, const struct costs_weights weights, uint32_t path_cost, uint32_t exitUk, uint32_t exitDk);
 
 #ifdef __cplusplus
 }
index 5a39fcf..958495c 100644 (file)
@@ -267,7 +267,7 @@ static int64_t gw_default_getcosts(struct gateway_entry *gw) {
   }
 
   /* determine the path cost */
-  return gw_costs_weigh(gw_costs_weights, tc->path_cost, gw->uplink, gw->downlink);
+  return gw_costs_weigh(true, gw_costs_weights, tc->path_cost, gw->uplink, gw->downlink);
 }
 
 /**
index 10e7eca..38f163a 100644 (file)
@@ -54,7 +54,12 @@ int olsr_ioctl_del_route(const struct rt_entry *rt);
 int olsr_ioctl_del_route6(const struct rt_entry *rt);
 
 #ifdef __linux__
-int rtnetlink_register_socket(int);
+  int olsr_new_netlink_route(unsigned char family, uint32_t rttable,
+    unsigned int flags, unsigned char scope, int if_index, int metric,
+    int protocol, const union olsr_ip_addr *src, const union olsr_ip_addr *gw,
+    const struct olsr_ip_prefix *dst, bool set, bool del_similar, bool blackhole);
+
+  int rtnetlink_register_socket(int);
 #endif /* __linux__ */
 
 void olsr_os_niit_4to6_route(const struct olsr_ip_prefix *dst_v4, bool set);
index 76dfb0d..496f75e 100644 (file)
@@ -77,7 +77,7 @@ static void rtnetlink_read(int sock, void *, unsigned int);
 struct olsr_rtreq {
   struct nlmsghdr n;
   struct rtmsg r;
-  char buf[512];
+  char buf[1024];
 };
 
 struct olsr_ipadd_req {
@@ -98,7 +98,7 @@ int rtnetlink_register_socket(int rtnl_mgrp)
 
   memset(&addr, 0, sizeof(addr));
   addr.nl_family = AF_NETLINK;
-  addr.nl_pid = 0; //kernel will assign appropiate number instead of pid (which is already used by primaray rtnetlink socket to add/delete routes)
+  addr.nl_pid = 0; //kernel will assign appropriate number instead of pid (which is already used by primary rtnetlink socket to add/delete routes)
   addr.nl_groups = rtnl_mgrp;
 
   if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0) {
@@ -338,9 +338,9 @@ int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create) {
   return olsr_add_ip(ifindex, ip, NULL, create);
 }
 
-static int olsr_new_netlink_route(int family, int rttable, int if_index, int metric, int protocol,
+int olsr_new_netlink_route(unsigned char family, uint32_t rttable, unsigned int flags, unsigned char scope, int if_index, int metric, int protocol,
     const union olsr_ip_addr *src, const union olsr_ip_addr *gw, const struct olsr_ip_prefix *dst,
-    bool set, bool del_similar) {
+    bool set, bool del_similar, bool blackhole) {
 
   struct olsr_rtreq req;
   int family_size;
@@ -358,9 +358,18 @@ static int olsr_new_netlink_route(int family, int rttable, int if_index, int met
 
   memset(&req, 0, sizeof(req));
 
-  req.r.rtm_flags = RTNH_F_ONLINK;
+  req.r.rtm_flags = flags;
   req.r.rtm_family = family;
+#ifndef __ANDROID__
+  if (rttable < 256)
+    req.r.rtm_table = rttable;
+  else {
+    req.r.rtm_table = RT_TABLE_UNSPEC;
+    olsr_netlink_addreq(&req.n, sizeof(req), RTA_TABLE, &rttable, sizeof(rttable));
+  }
+#else
   req.r.rtm_table = rttable;
+#endif
 
   req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
   req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
@@ -374,7 +383,11 @@ static int olsr_new_netlink_route(int family, int rttable, int if_index, int met
 
   /* RTN_UNSPEC would be the wildcard, but blackhole broadcast or nat roules should usually not conflict */
   /* -> olsr only adds deletes unicast routes */
-  req.r.rtm_type = RTN_UNICAST;
+  if (blackhole) {
+    req.r.rtm_type = RTN_BLACKHOLE;
+  } else {
+    req.r.rtm_type = RTN_UNICAST;
+  }
 
   req.r.rtm_dst_len = dst->prefix_len;
 
@@ -390,10 +403,10 @@ static int olsr_new_netlink_route(int family, int rttable, int if_index, int met
   }
   else {
     /* for all our routes */
-    req.r.rtm_scope = RT_SCOPE_UNIVERSE;
+    req.r.rtm_scope = scope;
   }
 
-  if (set || !del_similar) {
+  if ((set || !del_similar) && !blackhole) {
     /* add interface*/
     olsr_netlink_addreq(&req.n, sizeof(req), RTA_OIF, &if_index, sizeof(if_index));
   }
@@ -403,7 +416,7 @@ static int olsr_new_netlink_route(int family, int rttable, int if_index, int met
     olsr_netlink_addreq(&req.n, sizeof(req), RTA_PREFSRC, src, family_size);
   }
 
-  if (metric != -1) {
+  if (metric >= 0) {
     /* add metric */
     olsr_netlink_addreq(&req.n, sizeof(req), RTA_PRIORITY, &metric, sizeof(metric));
   }
@@ -449,8 +462,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) {
   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,
-      olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v6, set, false)) {
+      RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, olsr_cnf->niit6to4_if_index,
+      olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v6, set, false, false)) {
     olsr_syslog(OLSR_LOG_ERR, ". error while %s static niit route to %s",
         set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v6));
   }
@@ -459,8 +472,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) {
   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,
-      olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v4, set, false)) {
+      RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, olsr_cnf->niit4to6_if_index,
+      olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst_v4, set, false, false)) {
     olsr_syslog(OLSR_LOG_ERR, ". error while %s niit route to %s",
         set ? "setting" : "removing", olsr_ip_prefix_to_string(dst_v4));
   }
@@ -473,15 +486,16 @@ 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, olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst, set, false)) {
+  if (olsr_new_netlink_route(ipv4 ? AF_INET : AF_INET6, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE,
+      if_idx, olsr_cnf->fib_metric_default, olsr_cnf->rt_proto, NULL, NULL, dst, set, false, 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, table;
+static int olsr_os_process_rt_entry(unsigned char af_family, const struct rt_entry *rt, bool set) {
+  int metric;
+  uint32_t table;
   const struct rt_nexthop *nexthop;
   union olsr_ip_addr *src;
   bool hostRoute;
@@ -525,8 +539,8 @@ 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, olsr_cnf->rt_proto,
-      src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false);
+  err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index, metric, olsr_cnf->rt_proto,
+      src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false, false);
 
   /* resolve "File exist" (17) propblems (on orig and autogen routes)*/
   if (set && err == 17) {
@@ -534,12 +548,12 @@ static int olsr_os_process_rt_entry(int af_family, const struct rt_entry *rt, bo
     olsr_syslog(OLSR_LOG_ERR, ". auto-deleting similar routes to resolve 'File exists' (17) while adding route!");
 
     /* erase similar rule */
-    err = olsr_new_netlink_route(af_family, table, 0, 0, -1, NULL, NULL, &rt->rt_dst, false, true);
+    err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, 0, 0, -1, NULL, NULL, &rt->rt_dst, false, true, false);
 
     if (!err) {
       /* create this rule a second time if delete worked*/
-      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);
+      err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index, metric, olsr_cnf->rt_proto,
+          src, hostRoute ? NULL : &nexthop->gateway, &rt->rt_dst, set, false, false);
     }
     olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err);
   }
@@ -575,12 +589,12 @@ 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->rt_table, nexthop->iif_index,
-        metric, olsr_cnf->rt_proto, src, NULL, &hostPrefix, true, false);
+    err = olsr_new_netlink_route(af_family, olsr_cnf->rt_table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index,
+        metric, olsr_cnf->rt_proto, src, NULL, &hostPrefix, true, false, 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, olsr_cnf->rt_proto,
-          src, &nexthop->gateway, &rt->rt_dst, set, false);
+      err = olsr_new_netlink_route(af_family, table, RTNH_F_ONLINK, RT_SCOPE_UNIVERSE, nexthop->iif_index, metric, olsr_cnf->rt_proto,
+          src, &nexthop->gateway, &rt->rt_dst, set, false, false);
     }
     olsr_syslog(OLSR_LOG_ERR, ". %s (%d)", err == 0 ? "successful" : "failed", err);
   }
index 650773f..a6a7781 100644 (file)
@@ -713,7 +713,7 @@ bool olsr_if_isup(const char * dev)
   if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) {
     OLSR_PRINTF(1, "ioctl SIOCGIFFLAGS (get flags) error on device %s: %s (%d)\n",
         dev, strerror(errno), errno);
-    return 1;
+    return false;
   }
   return (ifr.ifr_flags & IFF_UP) != 0;
 }