ethtool ioctl返回未填充的ethtool_link_settings

时间:2018-03-30 11:23:55

标签: c++ c linux ioctl

我尝试使用Ethtool ioctl API从我的网卡中检索链接速度数据,但我只是在ethtool_link_settings实例中获得了零。使用ethtool命令行工具返回预期值,我的NIC驱动程序支持较新的ETHTOOL_GLINKSETTINGS API。

#include <iostream>
#include <cstring>

#include <linux/ethtool.h>
#include <linux/sockios.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <unistd.h>

int main()
{
    auto ifn = if_nameindex();
    auto fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

    for (auto i = ifn; i->if_name; ++i) {
        // Skip the loopback
        if (i->if_index == 1) {
            continue;
        }

        std::cout << "Testing: " << i->if_name << std::endl;

        auto ifr = ifreq{};
        std::strncpy(ifr.ifr_name, i->if_name, IF_NAMESIZE);

        auto msg = ethtool_link_settings{};
        msg.cmd = ETHTOOL_GLINKSETTINGS;
        ifr.ifr_data = reinterpret_cast<char*>(&msg);

        if (ioctl(fd, SIOCETHTOOL, &ifr) == -1) {
            std::cerr << "ioctl fail: " << strerror(errno) << std::endl;
        }

        std::cout << "\tSpeed: " << msg.speed
                  << "\n\tDuplex: " << static_cast<int>(msg.duplex)
                  << "\n\tPort: " << static_cast<int>(msg.port)
                  << std::endl;
    }

    close(fd);
    if_freenameindex(ifn);
    return EXIT_SUCCESS;
}

结果:

Testing: enp0s3
    Speed: 0
    Duplex: 0
    Port: 0
Testing: enp0s8
    Speed: 0
    Duplex: 0
    Port: 0
Testing: enp0s9
    Speed: 0
    Duplex: 0
    Port: 0
Testing: enp0s10
    Speed: 0
    Duplex: 0
    Port: 0

我确定我做了些蠢事,但我无法看到它。

1 个答案:

答案 0 :(得分:1)

link_mode_masks_nwords的{​​{1}}的{​​{1}}字段的注释中包含一些令人钦佩的神秘注释,ETHTOOL_GLINKSETTINGS进行了一些握手,因此您需要调用它的不仅仅是一次。

我已经通过使用ethtool command的代码对您的代码进行了调整, 执行ETHTOOL_GLINKSETTINGS命令:

struct ethtool_link_settings