[PATCH net-next] net: uevent: also pass network device driver

Til Kaiser posted 1 patch 6 days, 16 hours ago
net/core/net-sysfs.c | 7 +++++++
1 file changed, 7 insertions(+)
[PATCH net-next] net: uevent: also pass network device driver
Posted by Til Kaiser 6 days, 16 hours ago
Currently, for uevent, the interface name and
index are passed via shell variables.

This commit also passes the network device
driver as a shell variable to uevent.

Signed-off-by: Til Kaiser <mail@tk154.de>
---
 net/core/net-sysfs.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 05cf5347f25e..67aad5ca82f8 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -2000,6 +2000,7 @@ EXPORT_SYMBOL_GPL(net_ns_type_operations);
 static int netdev_uevent(const struct device *d, struct kobj_uevent_env *env)
 {
 	const struct net_device *dev = to_net_dev(d);
+	const char *driver = netdev_drivername(dev);
 	int retval;
 
 	/* pass interface to uevent. */
@@ -2012,6 +2013,12 @@ static int netdev_uevent(const struct device *d, struct kobj_uevent_env *env)
 	 * and is what RtNetlink uses natively.
 	 */
 	retval = add_uevent_var(env, "IFINDEX=%d", dev->ifindex);
+	if (retval)
+		goto exit;
+
+	if (driver[0])
+		/* pass driver to uevent. */
+		retval = add_uevent_var(env, "DRIVER=%s", driver);
 
 exit:
 	return retval;
-- 
2.47.0
Re: [PATCH net-next] net: uevent: also pass network device driver
Posted by Jakub Kicinski 6 days, 13 hours ago
On Fri, 15 Nov 2024 19:33:46 +0100 Til Kaiser wrote:
> Currently, for uevent, the interface name and
> index are passed via shell variables.
> 
> This commit also passes the network device
> driver as a shell variable to uevent.

Can you add more information to the commit message for the 'why'?

I'm guessing this can only be used for local one off hacks, or 
can a generic (eg distro level) naming policy benefit from the driver
name?
Re: [PATCH net-next] net: uevent: also pass network device driver
Posted by Til Kaiser 5 days, 18 hours ago
Hi, thanks for the response.

I have added a short explanation to the commit message.

I aim to retrieve the network interface's driver when it
gets created on the Linux OpenWrt OS. OpenWrt doesn't use
udev but uses its own hotplug implementation where the driver
name isn't available per a shell variable.

As I mentioned in my commit message, I could add the driver
query to the hotplug implementation. But I think it might also
be beneficial for other Linux OS that the driver name comes
directly from the Linux Kernel.

Furthermore, I think it's more comfortable for a user that he
can directly check the driver name through the sysfs uevent file.

Kind regards
Til

Changes in v2:
 - Updated the commit message to clarify the purpose of the patch.
[PATCH net-next v2] net: sysfs: also pass network device driver to uevent
Posted by Til Kaiser 5 days, 18 hours ago
Currently, for uevent, the interface name and
index are passed via shell variables.

This commit also passes the network device
driver as a shell variable to uevent.

One way to retrieve a network interface's driver
name is to resolve its sysfs device/driver symlink
and then substitute leading directory components.

You could implement this yourself (e.g., like udev from
systemd does) or with Linux tools by using a combination
of readlink and shell substitution or basename.

The advantages of passing the driver directly through uevent are:
 - Linux distributions don't need to implement additional code
   to retrieve the driver when, e.g., interface events happen.
 - There is no need to create additional process forks in shell
   scripts for readlink or basename.
 - If a user wants to check his network interface's driver on the
   command line, he can directly read it from the sysfs uevent file.

Signed-off-by: Til Kaiser <mail@tk154.de>
---
 net/core/net-sysfs.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 05cf5347f25e..67aad5ca82f8 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -2000,6 +2000,7 @@ EXPORT_SYMBOL_GPL(net_ns_type_operations);
 static int netdev_uevent(const struct device *d, struct kobj_uevent_env *env)
 {
 	const struct net_device *dev = to_net_dev(d);
+	const char *driver = netdev_drivername(dev);
 	int retval;
 
 	/* pass interface to uevent. */
@@ -2012,6 +2013,12 @@ static int netdev_uevent(const struct device *d, struct kobj_uevent_env *env)
 	 * and is what RtNetlink uses natively.
 	 */
 	retval = add_uevent_var(env, "IFINDEX=%d", dev->ifindex);
+	if (retval)
+		goto exit;
+
+	if (driver[0])
+		/* pass driver to uevent. */
+		retval = add_uevent_var(env, "DRIVER=%s", driver);
 
 exit:
 	return retval;
-- 
2.47.0
Re: [PATCH net-next v2] net: sysfs: also pass network device driver to uevent
Posted by Jakub Kicinski 3 days, 9 hours ago
On Sat, 16 Nov 2024 17:30:30 +0100 Til Kaiser wrote:
> Currently, for uevent, the interface name and
> index are passed via shell variables.
> 
> This commit also passes the network device
> driver as a shell variable to uevent.
> 
> One way to retrieve a network interface's driver
> name is to resolve its sysfs device/driver symlink
> and then substitute leading directory components.
> 
> You could implement this yourself (e.g., like udev from
> systemd does) or with Linux tools by using a combination
> of readlink and shell substitution or basename.
> 
> The advantages of passing the driver directly through uevent are:
>  - Linux distributions don't need to implement additional code
>    to retrieve the driver when, e.g., interface events happen.
>  - There is no need to create additional process forks in shell
>    scripts for readlink or basename.
>  - If a user wants to check his network interface's driver on the
>    command line, he can directly read it from the sysfs uevent file.

Thanks for the info, since you're working on an open source project 
- I assume your exact use case is not secret, could you spell it 
out directly? What device naming are you trying to achieve based on
what device drivers? In my naive view we have 200+ Ethernet drivers 
so listing Ethernet is not scalable. I'm curious what you're matching,
how many drivers you need to list, and whether we could instead add a
more general attribute...

Those questions aside, I'd like to get an ack from core driver experts
like GregKH on this. IDK what (if any) rules there are on uevents.
The merge window has started so we are very unlikely to hear from them
now, all maintainers will be very busy. Please repost v3 in >=two weeks
and CC Greg (and whoever else is reviewing driver core and/or uevent
changes according to git logs).
-- 
pw-bot: defer