]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
ethtool-util: make ethtool_set_wol() take password
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 6 Oct 2021 12:49:39 +0000 (21:49 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 6 Oct 2021 12:57:14 +0000 (21:57 +0900)
src/shared/ethtool-util.c
src/shared/ethtool-util.h
src/udev/net/link-config.c

index 618ec8d2c3573c52e68bb71ce1518534f3a08042..ee7be4635fa77e312d48f929883045c53b64a7a2 100644 (file)
@@ -400,7 +400,12 @@ int ethtool_get_permanent_macaddr(int *ethtool_fd, const char *ifname, struct et
                 dest = _v;                             \
         } while(false)
 
-int ethtool_set_wol(int *ethtool_fd, const char *ifname, uint32_t wolopts) {
+int ethtool_set_wol(
+                int *ethtool_fd,
+                const char *ifname,
+                uint32_t wolopts,
+                const uint8_t password[SOPASS_MAX]) {
+
         struct ethtool_wolinfo ecmd = {
                 .cmd = ETHTOOL_GWOL,
         };
@@ -413,7 +418,8 @@ int ethtool_set_wol(int *ethtool_fd, const char *ifname, uint32_t wolopts) {
         assert(ethtool_fd);
         assert(ifname);
 
-        if (wolopts == UINT32_MAX)
+        if (wolopts == UINT32_MAX && !password)
+                /* Nothing requested. Return earlier. */
                 return 0;
 
         r = ethtool_connect(ethtool_fd);
@@ -425,6 +431,14 @@ int ethtool_set_wol(int *ethtool_fd, const char *ifname, uint32_t wolopts) {
         if (ioctl(*ethtool_fd, SIOCETHTOOL, &ifr) < 0)
                 return -errno;
 
+        if (wolopts == UINT32_MAX) {
+                /* When password is specified without valid WoL options specified, then enable
+                 * WAKE_MAGICSECURE flag if supported. */
+                wolopts = ecmd.wolopts;
+                if (password && FLAGS_SET(ecmd.supported, WAKE_MAGICSECURE))
+                        wolopts |= WAKE_MAGICSECURE;
+        }
+
         if ((wolopts & ~ecmd.supported) != 0) {
                 _cleanup_free_ char *str = NULL;
 
@@ -435,16 +449,29 @@ int ethtool_set_wol(int *ethtool_fd, const char *ifname, uint32_t wolopts) {
                 wolopts &= ecmd.supported;
         }
 
+        if (!FLAGS_SET(wolopts, WAKE_MAGICSECURE))
+                /* When WAKE_MAGICSECURE flag is not set, then ignore password. */
+                password = NULL;
+
         UPDATE(ecmd.wolopts, wolopts, need_update);
+        if (password &&
+            memcmp(ecmd.sopass, password, sizeof(ecmd.sopass)) != 0) {
+                memcpy(ecmd.sopass, password, sizeof(ecmd.sopass));
+                need_update = true;
+        }
 
-        if (!need_update)
+        if (!need_update) {
+                explicit_bzero_safe(&ecmd, sizeof(ecmd));
                 return 0;
+        }
 
+        r = 0;
         ecmd.cmd = ETHTOOL_SWOL;
         if (ioctl(*ethtool_fd, SIOCETHTOOL, &ifr) < 0)
-                return -errno;
+                r = -errno;
 
-        return 0;
+        explicit_bzero_safe(&ecmd, sizeof(ecmd));
+        return r;
 }
 
 int ethtool_set_nic_buffer_size(int *ethtool_fd, const char *ifname, const netdev_ring_param *ring) {
index cc06558931759da4b9aff4c739c54c3472afaf34..c57ff1a2b5abcc231df26fb3d52a6f5ea8b1812a 100644 (file)
@@ -164,7 +164,7 @@ int ethtool_get_link_info(int *ethtool_fd, const char *ifname,
                           int *ret_autonegotiation, uint64_t *ret_speed,
                           Duplex *ret_duplex, NetDevPort *ret_port);
 int ethtool_get_permanent_macaddr(int *ethtool_fd, const char *ifname, struct ether_addr *ret);
-int ethtool_set_wol(int *ethtool_fd, const char *ifname, uint32_t wolopts);
+int ethtool_set_wol(int *ethtool_fd, const char *ifname, uint32_t wolopts, const uint8_t password[SOPASS_MAX]);
 int ethtool_set_nic_buffer_size(int *ethtool_fd, const char *ifname, const netdev_ring_param *ring);
 int ethtool_set_features(int *ethtool_fd, const char *ifname, const int features[static _NET_DEV_FEAT_MAX]);
 int ethtool_set_glinksettings(int *ethtool_fd, const char *ifname,
index ca0522c3042cde6f04dc69ac2f0a471c367ddc09..4802a0bf3ee1c6da76d106ba70121ce2be2e6c77 100644 (file)
@@ -329,7 +329,7 @@ static int link_config_apply_ethtool_settings(int *ethtool_fd, const LinkConfig
                                                  port_to_string(config->port));
         }
 
-        r = ethtool_set_wol(ethtool_fd, name, config->wol);
+        r = ethtool_set_wol(ethtool_fd, name, config->wol, NULL);
         if (r < 0) {
                 _cleanup_free_ char *str = NULL;