diff --git a/src/shared/ethtool-util.c b/src/shared/ethtool-util.c index f77f6943ca..4ca90615f3 100644 --- a/src/shared/ethtool-util.c +++ b/src/shared/ethtool-util.c @@ -501,16 +501,26 @@ static int set_features_bit( return found ? 0 : -ENODATA; } -int ethtool_set_features(int *ethtool_fd, const char *ifname, const int *features) { +int ethtool_set_features(int *ethtool_fd, const char *ifname, const int features[static _NET_DEV_FEAT_MAX]) { _cleanup_free_ struct ethtool_gstrings *strings = NULL; struct ethtool_sfeatures *sfeatures; struct ifreq ifr = {}; - int i, r; + bool have = false; + int r; assert(ethtool_fd); assert(ifname); assert(features); + for (size_t i = 0; i < _NET_DEV_FEAT_MAX; i++) + if (features[i] >= 0) { + have = true; + break; + } + + if (!have) + return 0; + r = ethtool_connect(ethtool_fd); if (r < 0) return r; @@ -525,8 +535,8 @@ int ethtool_set_features(int *ethtool_fd, const char *ifname, const int *feature sfeatures->cmd = ETHTOOL_SFEATURES; sfeatures->size = DIV_ROUND_UP(strings->len, 32U); - for (i = 0; i < _NET_DEV_FEAT_MAX; i++) - if (features[i] != -1) { + for (size_t i = 0; i < _NET_DEV_FEAT_MAX; i++) + if (features[i] >= 0) { r = set_features_bit(strings, netdev_feature_table[i], features[i], sfeatures); if (r < 0) { log_debug_errno(r, "ethtool: could not find feature, ignoring: %s", netdev_feature_table[i]); diff --git a/src/shared/ethtool-util.h b/src/shared/ethtool-util.h index 7d28766624..f0fc40b059 100644 --- a/src/shared/ethtool-util.h +++ b/src/shared/ethtool-util.h @@ -88,7 +88,7 @@ int ethtool_get_link_info(int *ethtool_fd, const char *ifname, 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_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); +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, int autonegotiation, const uint32_t advertise[static N_ADVERTISE], uint64_t speed, Duplex duplex, NetDevPort port);