alias : Fix interface aliased on top of a static interface not getting active
authorHans Dedecker <dedeckeh@gmail.com>
Thu, 31 Mar 2016 10:18:27 +0000 (12:18 +0200)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 31 Mar 2016 10:29:08 +0000 (12:29 +0200)
An interfaces referring to a static interface is not getting active when doing a network
reload or ifup.
The problem is triggered by alias_set_device which is not clearing the pending update
(mostly a null device due to the previous down event) when the same device is set as the
current device via alias_notify_device.
As a result alias_set_device_state when called will overwrite the device with an invalid
pending device meaning the interface will not be set available anymore and thus will
stay down.

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
alias.c

diff --git a/alias.c b/alias.c
index 1f23da08ac5e66eab4f2b6569013f7fc0d098673..e4bb700fb216f61ae81b4f76a630749c11ef1de4 100644 (file)
--- a/alias.c
+++ b/alias.c
@@ -34,8 +34,15 @@ static const struct device_type alias_device_type;
 
 static void alias_set_device(struct alias_device *alias, struct device *dev)
 {
-       if (dev == alias->dep.dev)
+       if (dev == alias->dep.dev) {
+               if (alias->update) {
+                       device_remove_user(&alias->new_dep);
+                       alias->update = false;
+                       if (dev)
+                               device_set_present(&alias->dev, true);
+               }
                return;
+       }
 
        device_set_present(&alias->dev, false);
        device_remove_user(&alias->new_dep);