summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau2024-09-04 10:09:38 +0000
committerFelix Fietkau2024-09-05 08:12:07 +0000
commit61c606d6e66b132f602135e0f0fda5f532b588e9 (patch)
tree306806e26e4aa60196f7d14dc8e02fe6c8456da0
parentcd2a7964f2c09994c09388a76e1a9c6aef4297a2 (diff)
downloadnetifd-61c606d6e66b132f602135e0f0fda5f532b588e9.tar.gz
device: simplify external device settings handling
Use the normal set_state function, but leave out the system_if_up/down part. Fixes a race condition that prevented properly applying device settings Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r--device.c32
1 files changed, 7 insertions, 25 deletions
diff --git a/device.c b/device.c
index 9cfb565..0ec3409 100644
--- a/device.c
+++ b/device.c
@@ -166,11 +166,13 @@ static int set_device_state(struct device *dev, bool state)
dev->orig_settings.flags &= dev->settings.flags;
system_if_apply_settings(dev, &dev->settings, dev->settings.flags);
- system_if_up(dev);
+ if (!dev->external)
+ system_if_up(dev);
system_if_apply_settings_after_up(dev, &dev->settings);
} else {
- system_if_down(dev);
+ if (!dev->external)
+ system_if_down(dev);
system_if_apply_settings(dev, &dev->orig_settings, dev->orig_settings.flags);
/* Restore any settings present in UCI which may have
@@ -726,17 +728,7 @@ int device_claim(struct device_user *dep)
device_broadcast_event(dev, DEV_EVENT_SETUP);
device_fill_default_settings(dev);
- if (dev->external) {
- /* Get ifindex for external claimed devices so a valid */
- /* ifindex is in place avoiding possible race conditions */
- device_set_ifindex(dev, system_if_resolve(dev));
- if (!dev->ifindex)
- ret = -1;
-
- system_if_get_settings(dev, &dev->orig_settings);
- } else
- ret = dev->set_state(dev, true);
-
+ ret = dev->set_state(dev, true);
if (ret == 0)
device_broadcast_event(dev, DEV_EVENT_UP);
else {
@@ -764,8 +756,7 @@ void device_release(struct device_user *dep)
return;
device_broadcast_event(dev, DEV_EVENT_TEARDOWN);
- if (!dev->external)
- dev->set_state(dev, false);
+ dev->set_state(dev, false);
if (dev->active)
return;
@@ -849,9 +840,6 @@ device_create_default(const char *name, bool external)
}
dev->default_config = true;
- if (external)
- system_if_apply_settings(dev, &dev->settings, dev->settings.flags);
-
device_check_state(dev);
return dev;
@@ -880,7 +868,6 @@ __device_get(const char *name, int create, bool check_vlan)
if (dev) {
if (create > 1 && !dev->external) {
- system_if_apply_settings(dev, &dev->settings, dev->settings.flags);
dev->external = true;
device_set_present(dev, true);
}
@@ -1208,11 +1195,6 @@ device_apply_config(struct device *dev, struct device_type *type,
enum dev_change_type change;
change = device_set_config(dev, type, config);
- if (dev->external) {
- system_if_apply_settings(dev, &dev->settings, dev->settings.flags);
- change = DEV_CONFIG_APPLIED;
- }
-
switch (change) {
case DEV_CONFIG_RESTART:
case DEV_CONFIG_APPLIED:
@@ -1224,7 +1206,7 @@ device_apply_config(struct device *dev, struct device_type *type,
int ret = 0;
device_set_present(dev, false);
- if (dev->active && !dev->external) {
+ if (dev->active) {
ret = dev->set_state(dev, false);
if (!ret)
ret = dev->set_state(dev, true);