summaryrefslogtreecommitdiff
path: root/device.c
diff options
context:
space:
mode:
authorHans Dedecker <dedeckeh@gmail.com>2015-09-01 14:43:58 +0200
committerFelix Fietkau <nbd@openwrt.org>2015-09-02 17:30:12 +0200
commit3224b809c359107b04c067cc00e652729030c735 (patch)
tree5d88e318682098ee26203064055648c246375d6a /device.c
parentd1c9d4bc6a6925fc3b39c1c4062c2b9082a4e161 (diff)
downloadnetifd-3224b809c359107b04c067cc00e652729030c735.tar.gz
device: Don't call set_state for external device in device_claim
The function set_state disable is not called for external devices in device_release which means for external vlan/macvlan devices they won't be deleted. As a result of this the set_state enable call for external devices by device_claim fails as vlan/macvlan devices cannot be created since the device already exists in the kernel. Therefore move the external device check from device_set_state to device_claim so external vlan/macvlan devices are not created again and can also be external. Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
Diffstat (limited to 'device.c')
-rw-r--r--device.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/device.c b/device.c
index 0d73138..21b436f 100644
--- a/device.c
+++ b/device.c
@@ -81,9 +81,6 @@ static int set_device_state(struct device *dev, bool state)
return -1;
}
- if (dev->external)
- return 0;
-
if (state)
system_if_up(dev);
else
@@ -324,7 +321,7 @@ void device_broadcast_event(struct device *dev, enum device_event ev)
int device_claim(struct device_user *dep)
{
struct device *dev = dep->dev;
- int ret;
+ int ret = 0;
if (dep->claimed)
return 0;
@@ -335,7 +332,9 @@ int device_claim(struct device_user *dep)
return 0;
device_broadcast_event(dev, DEV_EVENT_SETUP);
- ret = dev->set_state(dev, true);
+ if (!dev->external)
+ ret = dev->set_state(dev, true);
+
if (ret == 0)
device_broadcast_event(dev, DEV_EVENT_UP);
else {