[PATCH 2/2] leds: trigger: netdev: refactor netdev_event_requires_handling()
From: Tobias Junghans <hidden>
Date: 2025-06-10 11:46:50
Also in:
linux-leds
Subsystem:
led subsystem, the rest · Maintainers:
Lee Jones, Pavel Machek, Linus Torvalds
If there are network devices with the same name in different namespaces, ledtrig-netdev gets confused easily and switches between these devices whenever there are NETDEV_CHANGENAME/NETDEV_REGISTER notifications. This happens since ledtrig-netdev only checks for device name equality regardless of previous associations with another network device with the same name. Real world example: eth0 is the primary physical network interface and ledltrig-netdev is associated with that interface. If now Docker creates a virtual Ethernet interface (vethXXXX), moves it to the container's net namespace and renames it to eth0, ledtrig-netdev switches to this device and the LED no longer blinks for the original (physical) network device. Fix this by refactoring the conditions under which to handle netdev events: - For processing NETDEV_REGISTER events, the device name has to match and no association with a net_dev must exist. - For processing NETDEV_CHANGENAME events, the associated and notified network device have to match. Alternatively the device name has to match and no association with a net_dev must exist. - For all other events, the associated and notified network device have to match. Signed-off-by: Tobias Junghans <redacted> --- drivers/leds/trigger/ledtrig-netdev.c | 29 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-)
diff --git a/drivers/leds/trigger/ledtrig-netdev.c b/drivers/leds/trigger/ledtrig-netdev.c
index 6e16619719fe..a3f30e6f74b4 100644
--- a/drivers/leds/trigger/ledtrig-netdev.c
+++ b/drivers/leds/trigger/ledtrig-netdev.c@@ -578,15 +578,28 @@ static const struct attribute_group *netdev_trig_groups[] = { static bool netdev_event_requires_handling(unsigned long evt, struct net_device *dev, struct led_netdev_data *trigger_data) { - if (evt != NETDEV_UP && evt != NETDEV_DOWN && evt != NETDEV_CHANGE - && evt != NETDEV_REGISTER && evt != NETDEV_UNREGISTER - && evt != NETDEV_CHANGENAME) - return false; - - if (!(dev == trigger_data->net_dev || - (evt == NETDEV_CHANGENAME && !strcmp(dev->name, trigger_data->device_name)) || - (evt == NETDEV_REGISTER && !strcmp(dev->name, trigger_data->device_name)))) + switch (evt) { + case NETDEV_REGISTER: + if (trigger_data->net_dev || + strcmp(dev->name, trigger_data->device_name)) + return false; + break; + case NETDEV_CHANGENAME: + if (trigger_data->net_dev != dev && + (trigger_data->net_dev || + strcmp(dev->name, trigger_data->device_name))) + return false; + break; + case NETDEV_UNREGISTER: + case NETDEV_UP: + case NETDEV_DOWN: + case NETDEV_CHANGE: + if (trigger_data->net_dev != dev) + return false; + break; + default: return false; + } return true; }
--
2.43.0