device: Fix dotted vlan interface staying down
authorHans Dedecker <dedeckeh@gmail.com>
Mon, 6 Jun 2016 12:58:32 +0000 (14:58 +0200)
committerFelix Fietkau <nbd@nbd.name>
Mon, 6 Jun 2016 13:42:01 +0000 (15:42 +0200)
Using the config below a dotted vlan interface stays down as get_vlan_device
does not find the device due to the aliased device stacked on top of the base
device.
As all devices; aliased devices being the exception; are in the device list
use device_find to find the device when setting the link state

config interface 'test'
    option proto 'static'
    option ipaddr '192.168.2.1'
    option netmask '255.255.255.0'

config interface 'test2'
    option ifname '@test.1'
    option proto 'dhcp'

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
device.c
device.h
system-linux.c

index a4d804e..fa3d00f 100644 (file)
--- a/device.c
+++ b/device.c
@@ -476,6 +476,14 @@ device_create_default(const char *name, bool external)
        return dev;
 }
 
+struct device *
+device_find(const char *name)
+{
+       struct device *dev;
+
+       return avl_find_element(&devices, name, dev, avl);
+}
+
 struct device *
 device_get(const char *name, int create)
 {
index b069a2b..e13e435 100644 (file)
--- a/device.h
+++ b/device.h
@@ -241,7 +241,8 @@ void device_set_default_ps(bool state);
 
 void device_init_virtual(struct device *dev, const struct device_type *type, const char *name);
 int device_init(struct device *iface, const struct device_type *type, const char *ifname);
-void device_cleanup(struct device *iface);
+void device_cleanup(struct device *dev);
+struct device *device_find(const char *name);
 struct device *device_get(const char *name, int create);
 void device_add_user(struct device_user *dep, struct device *iface);
 void device_remove_user(struct device_user *dep);
index 90b0775..eb785b5 100644 (file)
@@ -495,7 +495,7 @@ static int cb_rtnl_event(struct nl_msg *msg, void *arg)
        if (!nla[IFLA_IFNAME])
                goto out;
 
-       struct device *dev = device_get(nla_data(nla[IFLA_IFNAME]), false);
+       struct device *dev = device_find(nla_data(nla[IFLA_IFNAME]));
        if (!dev)
                goto out;