ethtool: Factored out similar ethtool link settings for virtual devices to core

Three virtual devices (ibmveth, virtio_net, and netvsc) all have
similar code to set link settings and validate ethtool command. To
eliminate duplication of code, it is factored out into core/ethtool.c.

Signed-off-by: Cris Forno <cforno12@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Cris Forno 2020-02-28 14:12:04 -06:00 committed by David S. Miller
parent 68e2c37690
commit 70ae1e127b
2 changed files with 45 additions and 0 deletions

View file

@ -420,4 +420,10 @@ struct ethtool_rx_flow_rule *
ethtool_rx_flow_rule_create(const struct ethtool_rx_flow_spec_input *input);
void ethtool_rx_flow_rule_destroy(struct ethtool_rx_flow_rule *rule);
bool ethtool_virtdev_validate_cmd(const struct ethtool_link_ksettings *cmd);
int ethtool_virtdev_set_link_ksettings(struct net_device *dev,
const struct ethtool_link_ksettings *cmd,
u32 *dev_speed, u8 *dev_duplex);
#endif /* _LINUX_ETHTOOL_H */

View file

@ -459,6 +459,24 @@ static int load_link_ksettings_from_user(struct ethtool_link_ksettings *to,
return 0;
}
/* Check if the user is trying to change anything besides speed/duplex */
bool ethtool_virtdev_validate_cmd(const struct ethtool_link_ksettings *cmd)
{
struct ethtool_link_settings base2 = {};
base2.speed = cmd->base.speed;
base2.port = PORT_OTHER;
base2.duplex = cmd->base.duplex;
base2.cmd = cmd->base.cmd;
base2.link_mode_masks_nwords = cmd->base.link_mode_masks_nwords;
return !memcmp(&base2, &cmd->base, sizeof(base2)) &&
bitmap_empty(cmd->link_modes.supported,
__ETHTOOL_LINK_MODE_MASK_NBITS) &&
bitmap_empty(cmd->link_modes.lp_advertising,
__ETHTOOL_LINK_MODE_MASK_NBITS);
}
/* convert a kernel internal ethtool_link_ksettings to
* ethtool_link_usettings in user space. return 0 on success, errno on
* error.
@ -581,6 +599,27 @@ static int ethtool_set_link_ksettings(struct net_device *dev,
return err;
}
int ethtool_virtdev_set_link_ksettings(struct net_device *dev,
const struct ethtool_link_ksettings *cmd,
u32 *dev_speed, u8 *dev_duplex)
{
u32 speed;
u8 duplex;
speed = cmd->base.speed;
duplex = cmd->base.duplex;
/* don't allow custom speed and duplex */
if (!ethtool_validate_speed(speed) ||
!ethtool_validate_duplex(duplex) ||
!ethtool_virtdev_validate_cmd(cmd))
return -EINVAL;
*dev_speed = speed;
*dev_duplex = duplex;
return 0;
}
EXPORT_SYMBOL(ethtool_virtdev_set_link_ksettings);
/* Query device for its ethtool_cmd settings.
*
* Backward compatibility note: for compatibility with legacy ethtool, this is