From a0e1ad10eab7324637d5cbbc6ca2e89e5d826137 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Tue, 15 Jan 2019 15:46:32 +0100 Subject: [PATCH] ethtool: Make sure advertise is actually set when autonegotiation is used --- man/systemd.link.xml | 6 +++--- src/udev/net/ethtool-util.c | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/man/systemd.link.xml b/man/systemd.link.xml index f74edd0186b..ec0314dec3f 100644 --- a/man/systemd.link.xml +++ b/man/systemd.link.xml @@ -369,8 +369,8 @@ common transmission parameters, such as speed, duplex mode, and flow control. When unset, the kernel's default will be used. - Note that if autonegotiation is enabled, speed, duplex and advertise settings are - read-only. If autonegotation is disabled, speed, duplex and advertise settings are writable + Note that if autonegotiation is enabled, speed and duplex settings are + read-only. If autonegotation is disabled, speed and duplex settings are writable if the driver supports multiple link modes. @@ -481,7 +481,7 @@ Advertise= This sets what speeds and duplex modes of operation are advertised for auto-negotiation. - The supported values are: + This implies AutoNegotiation=yes. The supported values are: Supported advertise values diff --git a/src/udev/net/ethtool-util.c b/src/udev/net/ethtool-util.c index a1eb6902aac..0dcec03f670 100644 --- a/src/udev/net/ethtool-util.c +++ b/src/udev/net/ethtool-util.c @@ -583,7 +583,7 @@ int ethtool_set_glinksettings(int *fd, const char *ifname, struct link_config *l struct ifreq ifr = {}; int r; - if (link->autonegotiation != 0) { + if (link->autonegotiation != AUTONEG_DISABLE && eqzero(link->advertise)) { log_info("link_config: autonegotiation is unset or enabled, the speed and duplex are not writable."); return 0; } @@ -612,9 +612,11 @@ int ethtool_set_glinksettings(int *fd, const char *ifname, struct link_config *l if (link->port != _NET_DEV_PORT_INVALID) u->base.port = link->port; - u->base.autoneg = link->autonegotiation; + if (link->autonegotiation >= 0) + u->base.autoneg = link->autonegotiation; if (!eqzero(link->advertise)) { + u->base.autoneg = AUTONEG_ENABLE; memcpy(&u->link_modes.advertising, link->advertise, sizeof(link->advertise)); memzero((uint8_t*) &u->link_modes.advertising + sizeof(link->advertise), ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NBYTES - sizeof(link->advertise)); -- 2.47.3