all: use the getInterfaceLinkState function
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 10 Feb 2016 13:19:01 +0000 (14:19 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 10 Feb 2016 13:32:41 +0000 (14:32 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/gateway.c
src/linux/kernel_routes_nl.c
src/linux/net.c
src/unix/ifnet.c

index 1a34bfb..3e5b233 100644 (file)
@@ -24,6 +24,7 @@
 #include "gateway.h"
 #include "egressTypes.h"
 #include "egressFile.h"
+#include "ifnet.h"
 
 #include <assert.h>
 #include <linux/rtnetlink.h>
@@ -1681,6 +1682,10 @@ static bool isInterfaceUp(int if_index) {
     return false;
   }
 
+  if (getInterfaceLinkState(name) == LINKSTATE_DOWN) {
+    return false;
+  }
+
   memset(&ifr, 0, sizeof(struct ifreq));
   strscpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
 
index ca69182..fab4a03 100644 (file)
@@ -129,7 +129,7 @@ static void netlink_process_link(struct nlmsghdr *h)
   }
 
   oif = ifaceName ? olsrif_ifwithname(ifaceName) : NULL;
-  up = ((ifi->ifi_flags & IFF_UP) != 0);
+  up = (getInterfaceLinkState(ifaceName) != LINKSTATE_DOWN) && ((ifi->ifi_flags & IFF_UP) != 0);
 
   if (!iface && up) {
     if (oif) {
index 144139d..d361320 100644 (file)
@@ -51,6 +51,7 @@
 #include "../olsr.h"
 #include "../log.h"
 #include "kernel_tunnel.h"
+#include "ifnet.h"
 
 #include <net/if.h>
 
@@ -707,6 +708,10 @@ bool olsr_if_isup(const char * dev)
 {
   struct ifreq ifr;
 
+  if (!dev || (getInterfaceLinkState(dev) == LINKSTATE_DOWN)) {
+    return false;
+  }
+
   memset(&ifr, 0, sizeof(ifr));
   strscpy(ifr.ifr_name, dev, IFNAMSIZ);
 
index e475b9d..6d83206 100644 (file)
@@ -167,7 +167,7 @@ chk_if_changed(struct olsr_if *iface)
    * First check if the interface is set DOWN
    */
 
-  if ((ifp->int_flags & IFF_UP) == 0) {
+  if ((getInterfaceLinkState(iface->name) == LINKSTATE_DOWN) || (ifp->int_flags & IFF_UP) == 0) {
     OLSR_PRINTF(1, "\tInterface %s not up and running - removing it...\n", iface->name);
     goto remove_interface;
   }
@@ -532,7 +532,7 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
 
   ifs.int_flags = ifr.ifr_flags;
 
-  if ( (ifs.int_flags & IFF_UP) == 0) {
+  if ((getInterfaceLinkState(iface->name) == LINKSTATE_DOWN) || ((ifs.int_flags & IFF_UP) == 0)) {
     OLSR_PRINTF(debuglvl, "\tInterface not up & running - skipping it...\n");
     return 0;
   }