chiark / gitweb /
udev - link-setup - expose ID_NET_DRIVER
authorTom Gundersen <teg@jklm.no>
Fri, 21 Feb 2014 15:54:00 +0000 (16:54 +0100)
committerTom Gundersen <teg@jklm.no>
Fri, 21 Feb 2014 20:00:39 +0000 (21:00 +0100)
This is the same as shown by 'ethtool -i <ifname>', and is sometimes
set even though DRIVER is not.

src/udev/net/ethtool-util.c
src/udev/net/ethtool-util.h
src/udev/net/link-config.c
src/udev/net/link-config.h
src/udev/udev-builtin-net_setup_link.c

index c644f91d02d749b9e41f400ea411652a4390bf48..aaba94c2fb71c3da5194f8a482c9e4b91ab09129 100644 (file)
@@ -63,6 +63,29 @@ int ethtool_connect(int *ret) {
         return 0;
 }
 
+int ethtool_get_driver(int fd, const char *ifname, char **ret) {
+        struct ifreq ifr;
+        struct ethtool_drvinfo ecmd;
+        int r;
+
+        zero(ecmd);
+        ecmd.cmd = ETHTOOL_GDRVINFO;
+
+        zero(ifr);
+        strscpy(ifr.ifr_name, IFNAMSIZ, ifname);
+        ifr.ifr_data = (void *)&ecmd;
+
+        r = ioctl(fd, SIOCETHTOOL, &ifr);
+        if (r < 0)
+                return -errno;
+
+        *ret = strdup(ecmd.driver);
+        if (!*ret)
+                return -ENOMEM;
+
+        return 0;
+}
+
 int ethtool_set_speed(int fd, const char *ifname, unsigned int speed, Duplex duplex)
 {
         struct ifreq ifr;
index c8638f22ec7a7199492c57b1c76b1229822f440e..f44de5076a8b06dbb27679dd81dd6a04a19df2b6 100644 (file)
@@ -42,6 +42,7 @@ typedef enum WakeOnLan {
 
 int ethtool_connect(int *ret);
 
+int ethtool_get_driver(int fd, const char *ifname, char **ret);
 int ethtool_set_speed(int fd, const char *ifname, unsigned int speed, Duplex duplex);
 int ethtool_set_wol(int fd, const char *ifname, WakeOnLan wol);
 
index e8389c9be07df039888bbb7eeb9229db7b33b39e..40b1d7f7bc84ceb4316f24c193df8ab0033c314c 100644 (file)
@@ -90,16 +90,17 @@ int link_config_ctx_new(link_config_ctx **ret) {
 static int link_config_ctx_connect(link_config_ctx *ctx) {
         int r;
 
-        if (ctx->ethtool_fd >= 0 && ctx->rtnl)
-                return 0;
-
-        r = ethtool_connect(&ctx->ethtool_fd);
-        if (r < 0)
-                return r;
+        if (ctx->ethtool_fd == -1) {
+                r = ethtool_connect(&ctx->ethtool_fd);
+                if (r < 0)
+                        return r;
+        }
 
-        r = sd_rtnl_open(&ctx->rtnl, 0);
-        if (r < 0)
-                return r;
+        if (!ctx->rtnl) {
+                r = sd_rtnl_open(&ctx->rtnl, 0);
+                if (r < 0)
+                        return r;
+        }
 
         return 0;
 }
@@ -442,6 +443,27 @@ int link_config_apply(link_config_ctx *ctx, link_config *config, struct udev_dev
         return 0;
 }
 
+int link_get_driver(link_config_ctx *ctx, struct udev_device *device, char **ret) {
+        const char *name;
+        char *driver;
+        int r;
+
+        r = link_config_ctx_connect(ctx);
+        if (r < 0)
+                return r;
+
+        name = udev_device_get_sysname(device);
+        if (!name)
+                return -EINVAL;
+
+        r = ethtool_get_driver(ctx->ethtool_fd, name, &driver);
+        if (r < 0)
+                return r;
+
+        *ret = driver;
+        return 0;
+}
+
 static const char* const mac_policy_table[] = {
         [MACPOLICY_PERSISTENT] = "persistent",
         [MACPOLICY_RANDOM] = "random"
index 9d2eaff37cc44884e2f3e512a3b07f22dfc4c132..24fdb87e4c5c013e5eb9e15cfd56a2d4a6c1b4da 100644 (file)
@@ -83,6 +83,8 @@ bool link_config_should_reload(link_config_ctx *ctx);
 int link_config_get(link_config_ctx *ctx, struct udev_device *device, struct link_config **ret);
 int link_config_apply(link_config_ctx *ctx, struct link_config *config, struct udev_device *device, const char **name);
 
+int link_get_driver(link_config_ctx *ctx, struct udev_device *device, char **ret);
+
 const char *name_policy_to_string(NamePolicy p) _const_;
 NamePolicy name_policy_from_string(const char *p) _pure_;
 
index b7ba8c90609c5b6dc023fe0c16e87005d78b357a..3cd384e94dc8ecf144dc039317175fc9bc7a959c 100644 (file)
@@ -26,6 +26,7 @@
 static link_config_ctx *ctx = NULL;
 
 static int builtin_net_setup_link(struct udev_device *dev, int argc, char **argv, bool test) {
+        _cleanup_free_ char *driver = NULL;
         const char *name;
         link_config *link;
         int r;
@@ -35,6 +36,10 @@ static int builtin_net_setup_link(struct udev_device *dev, int argc, char **argv
                 return EXIT_FAILURE;
         }
 
+        r = link_get_driver(ctx, dev, &driver);
+        if (r >= 0)
+                udev_builtin_add_property(dev, test, "ID_NET_DRIVER", driver);
+
         r = link_config_get(ctx, dev, &link);
         if (r < 0) {
                 if (r == -ENOENT) {