]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
ethtool: introduce ethtool_get_permanent_macaddr()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 7 Jan 2019 11:16:18 +0000 (20:16 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 8 Jan 2020 08:51:56 +0000 (17:51 +0900)
Will be used in later commits.

src/shared/ethtool-util.c
src/shared/ethtool-util.h

index 3119b2b92e3b86dc629fb1119dee5e8725ac57ec..e10948d6125d05cba3734f86fc4484dd338730ba 100644 (file)
@@ -3,6 +3,7 @@
 #include <net/if.h>
 #include <sys/ioctl.h>
 #include <linux/ethtool.h>
+#include <linux/netdevice.h>
 #include <linux/sockios.h>
 
 #include "conf-parser.h"
@@ -217,6 +218,46 @@ int ethtool_get_link_info(int *fd, const char *ifname,
         return 0;
 }
 
+int ethtool_get_permanent_macaddr(int *fd, const char *ifname, struct ether_addr *ret) {
+        _cleanup_free_ struct ethtool_perm_addr *epaddr = NULL;
+        struct ifreq ifr;
+        int r;
+
+        assert(fd);
+        assert(ifname);
+        assert(ret);
+
+        if (*fd < 0) {
+                r = ethtool_connect_or_warn(fd, false);
+                if (r < 0)
+                        return r;
+        }
+
+        epaddr = malloc(offsetof(struct ethtool_perm_addr, data) + MAX_ADDR_LEN);
+        if (!epaddr)
+                return -ENOMEM;
+
+        epaddr->cmd = ETHTOOL_GPERMADDR;
+        epaddr->size = MAX_ADDR_LEN;
+
+        ifr = (struct ifreq) {
+                .ifr_data = (caddr_t) epaddr,
+        };
+        strscpy(ifr.ifr_name, IFNAMSIZ, ifname);
+
+        r = ioctl(*fd, SIOCETHTOOL, &ifr);
+        if (r < 0)
+                return -errno;
+
+        if (epaddr->size != 6)
+                return -EOPNOTSUPP;
+
+        for (size_t i = 0; i < epaddr->size; i++)
+                ret->ether_addr_octet[i] = epaddr->data[i];
+
+        return 0;
+}
+
 int ethtool_set_speed(int *fd, const char *ifname, unsigned speed, Duplex duplex) {
         struct ethtool_cmd ecmd = {
                 .cmd = ETHTOOL_GSET
index d408bcd90a0b514deed5be6d3d3046a4abe22fc5..80bfffd6e94d8029a70796204c4835c53921cfea 100644 (file)
@@ -2,6 +2,7 @@
 #pragma once
 
 #include <macro.h>
+#include <net/ethernet.h>
 #include <linux/ethtool.h>
 
 #include "conf-parser.h"
@@ -91,6 +92,7 @@ int ethtool_get_driver(int *fd, const char *ifname, char **ret);
 int ethtool_get_link_info(int *fd, const char *ifname,
                           int *ret_autonegotiation, size_t *ret_speed,
                           Duplex *ret_duplex, NetDevPort *ret_port);
+int ethtool_get_permanent_macaddr(int *fd, const char *ifname, struct ether_addr *ret);
 int ethtool_set_speed(int *fd, const char *ifname, unsigned speed, Duplex duplex);
 int ethtool_set_wol(int *fd, const char *ifname, WakeOnLan wol);
 int ethtool_set_nic_buffer_size(int *fd, const char *ifname, netdev_ring_param *ring);