sgw: do not program routes on interfaces that are not up
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 4 Nov 2015 14:36:32 +0000 (15:36 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 4 Nov 2015 14:49:18 +0000 (15:49 +0100)
This doesn't work and then spams the log.
Discovered when the best (selected) egress interface was brought
down and olsrd tried to remove the routes on that interface

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/gateway.c

index 643e30a..e136b67 100644 (file)
@@ -27,6 +27,8 @@
 
 #include <assert.h>
 #include <linux/rtnetlink.h>
+#include <net/if.h>
+#include <sys/ioctl.h>
 
 /*
  * Defines for the multi-gateway script
@@ -1620,6 +1622,32 @@ static bool determineBestOverallLink(enum sgw_multi_change_phase phase) {
   return memcmp(&bestOverallLink, &bestOverallLinkPrevious, sizeof(bestOverallLink));
 }
 
+static bool isInterfaceUp(int if_index) {
+  char nameBuf[IF_NAMESIZE];
+  char * name;
+  struct ifreq ifr;
+
+  name = if_indextoname(if_index, nameBuf);
+  if (!name) {
+    /* interface doesn't exist */
+    return false;
+  }
+
+  memset(&ifr, 0, sizeof(struct ifreq));
+  strscpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+
+  /* Get flags (and check if interface exists) */
+  if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) {
+    return false;
+  }
+
+  if (ifr.ifr_flags & IFF_UP) {
+    return true;
+  }
+
+  return false;
+}
+
 /**
  * Program a route (add or remove) through netlink
  *
@@ -1633,6 +1661,10 @@ static void programRoute(bool add, struct sgw_route_info * route, const char * l
     return;
   }
 
+  if (!isInterfaceUp(route->route.if_index)) {
+    return;
+  }
+
   if (olsr_new_netlink_route( //
       route->route.family, //
       route->route.rttable, //