如何从linux内核模块确定网络设备速度

时间:2010-05-15 02:59:06

标签: linux kernel

我有一个Linux内核模块,需要找到给定网络接口的速度(即“eth0”)。对于Linux 2.6.31,我如何找到速度(配置/协商)?

1 个答案:

答案 0 :(得分:4)

每个网络驱动程序都有针对此类功能的“ethtool”实现。但是您可能需要一个通用函数,它可以为您提供通用netdev结构的速度。您可以查看net/core/net-sysfs.c并了解它如何实现/ sys / class / net接口。例如:

static ssize_t show_speed(struct device *dev,
          struct device_attribute *attr, char *buf)
{
    struct net_device *netdev = to_net_dev(dev);
    int ret = -EINVAL;

    if (!rtnl_trylock())
        return restart_syscall();

    if (netif_running(netdev) &&
        netdev->ethtool_ops &&
        netdev->ethtool_ops->get_settings) {
        struct ethtool_cmd cmd = { ETHTOOL_GSET };

        if (!netdev->ethtool_ops->get_settings(netdev, &cmd))
            ret = sprintf(buf, fmt_dec, ethtool_cmd_speed(&cmd));
    }
    rtnl_unlock();
    return ret;
}