[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250610114029.268938-3-tobias.junghans@inhub.de>
Date: Tue, 10 Jun 2025 13:40:20 +0200
From: Tobias Junghans <tobias.junghans@...ub.de>
To: Lee Jones <lee@...nel.org>,
Andrew Lunn <andrew@...n.ch>,
linux-leds@...r.kernel.org,
netdev@...r.kernel.org
Cc: Tobias Junghans <tobias.junghans@...ub.de>
Subject: [PATCH 2/2] leds: trigger: netdev: refactor netdev_event_requires_handling()
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 <tobias.junghans@...ub.de>
---
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
Powered by blists - more mailing lists