diff options
| author | Felix Fietkau | 2024-09-04 10:09:38 +0000 |
|---|---|---|
| committer | Felix Fietkau | 2024-09-05 08:12:07 +0000 |
| commit | 61c606d6e66b132f602135e0f0fda5f532b588e9 (patch) | |
| tree | 306806e26e4aa60196f7d14dc8e02fe6c8456da0 | |
| parent | cd2a7964f2c09994c09388a76e1a9c6aef4297a2 (diff) | |
| download | netifd-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.c | 32 |
1 files changed, 7 insertions, 25 deletions
@@ -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); |