summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Dedecker <dedeckeh@gmail.com>2016-06-06 14:58:32 +0200
committerFelix Fietkau <nbd@nbd.name>2016-06-06 15:42:01 +0200
commitca2f99575937b183618e425a73b45bcc277b5541 (patch)
tree4f57fbdb9549992bc760596db0c39a461a57648f
parent29521f9a232f039318fd8525c410b3127836626f (diff)
downloadnetifd-ca2f99575937b183618e425a73b45bcc277b5541.tar.gz
device: Fix dotted vlan interface staying down
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>
-rw-r--r--device.c8
-rw-r--r--device.h3
-rw-r--r--system-linux.c2
3 files changed, 11 insertions, 2 deletions
diff --git a/device.c b/device.c
index a4d804e..fa3d00f 100644
--- a/device.c
+++ b/device.c
@@ -477,6 +477,14 @@ device_create_default(const char *name, bool external)
}
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)
{
struct device *dev;
diff --git a/device.h b/device.h
index b069a2b..e13e435 100644
--- 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);
diff --git a/system-linux.c b/system-linux.c
index 90b0775..eb785b5 100644
--- a/system-linux.c
+++ b/system-linux.c
@@ -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;