device: Turn off all running interfaces at startup
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Mon, 9 Jul 2012 09:24:48 +0000 (12:24 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 9 Jul 2012 12:30:50 +0000 (09:30 -0300)
Turning off running interfaces that have IP address,
causes all routes related to those interfaces to be
removed by kernel. This way connman will get a fresh
start without any extra and obsolete routes around.

src/device.c

index ec732b8..75fa7f7 100644 (file)
@@ -1186,6 +1186,54 @@ list:
        return FALSE;
 }
 
+static void cleanup_devices(void)
+{
+       /*
+        * Check what interfaces are currently up and if connman is
+        * suppose to handle the interface, then cleanup the mess
+        * related to that interface. There might be weird routes etc
+        * that are related to that interface and that might confuse
+        * connmand. So in this case we just turn the interface down
+        * so that kernel removes routes/addresses automatically and
+        * then proceed the startup.
+        *
+        * Note that this cleanup must be done before rtnl/detect code
+        * has activated interface watches.
+        */
+
+       char **interfaces;
+       int i;
+
+       interfaces = __connman_inet_get_running_interfaces();
+
+       if (interfaces == NULL)
+               return;
+
+       for (i = 0; interfaces[i] != NULL; i++) {
+               connman_bool_t filtered;
+               int index;
+
+               filtered = __connman_device_isfiltered(interfaces[i]);
+               if (filtered == TRUE)
+                       continue;
+
+               index = connman_inet_ifindex(interfaces[i]);
+               if (index < 0)
+                       continue;
+
+               DBG("cleaning up %s index %d", interfaces[i], index);
+
+               connman_inet_ifdown(index);
+
+               /*
+                * ConnMan will turn the interface UP automatically so
+                * no need to do it here.
+                */
+       }
+
+       g_strfreev(interfaces);
+}
+
 int __connman_device_init(const char *device, const char *nodevice)
 {
        DBG("");
@@ -1196,6 +1244,8 @@ int __connman_device_init(const char *device, const char *nodevice)
        if (nodevice != NULL)
                nodevice_filter = g_strsplit(nodevice, ",", -1);
 
+       cleanup_devices();
+
        return 0;
 }