ethtool ioctl 返回未填充的 ethtool_link_settings

     2023-02-22     98

关键词:

【中文标题】ethtool ioctl 返回未填充的 ethtool_link_settings【英文标题】:ethtool ioctl returns unpopulated ethtool_link_settings 【发布时间】:2018-03-30 11:23:54 【问题描述】:

我正在尝试使用 Ethtool ioctl API 从我的 NIC 中检索链接速度数据,但我只是在 ethtool_link_settings 实例中得到零。使用ethtool 命令行工具返回预期值,我的网卡驱动支持更新的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

我确定我在做一些愚蠢的事情,但我看不到。

【问题讨论】:

您可以尝试使用 ETHTOOL_GSET 而不是 ETHTOOL_GLINKSETTINGS 吗? (在这种情况下使用auto msg = ethtool_cmd; 而不是auto msg = ethtool_link_settings; 【参考方案1】:

埋在/usr/include/linux/ethtool.hstruct ethtool_link_settingslink_mode_masks_nwords 字段的 cmets 中是一些令人钦佩的神秘 cmets,ETHTOOL_GLINKSETTINGS 会进行一些握手,因此您需要多次调用它。

我已使用ethtool command 的代码将您的代码调整为 执行 ETHTOOL_GLINKSETTINGS 命令:

#include <iostream>
#include <cstring>

#include <linux/ethtool.h>
#include <linux/sockios.h>
#include <linux/netlink.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) 
        struct 
                struct ethtool_link_settings req;
                __u32 link_mode_data[3 * 127];
             ecmd;

        // 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);

        ecmd.req.cmd = ETHTOOL_GLINKSETTINGS;
        ifr.ifr_data = reinterpret_cast<char*>(&ecmd);

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

        if (ecmd.req.link_mode_masks_nwords >= 0 || ecmd.req.cmd != ETHTOOL_GLINKSETTINGS)
            return 1;

        ecmd.req.link_mode_masks_nwords = -ecmd.req.link_mode_masks_nwords;

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

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

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

【讨论】:

ethtool 获取永久 MAC 地址返回全 0

】ethtool获取永久MAC地址返回全0【英文标题】:ethtoolgetpermanentMACaddressreturnsall0\'s【发布时间】:2013-09-0507:38:16【问题描述】:我需要读取网络适配器的永久(烧录)MAC地址。由于MAC地址很容易被欺骗,我需要读取写在EEPROM上的真... 查看详情

管道到标准输入时使用ioctl填充winsize结构(代码片段)

我正在尝试使用ioctl()检索终端的宽度,但在管道或重定向到标准输入时它不起作用。我设法通过解析tputcols的结果来绕过这个问题,但是使用外部命令感觉很脏。此外,我认为这使得它不太便携,因为Windows不使用与bourne兼容的sh... 查看详情

ioctl返回-1的一个bug查找

最近调试SmartCard驱动的时候发现ioctl返回值为-1,明明很正常的一个驱动,在别的地方都能正常跑,居然有问题;一直百思不得其解,开内核log,居然没有执行到驱动设备Ioctl函数里面,第一时间想到的就是参数对不上,继续查找... 查看详情

错误 C2065:“IOCTL_NDISUIO_OPEN_DEVICE”:未声明的标识符

】错误C2065:“IOCTL_NDISUIO_OPEN_DEVICE”:未声明的标识符【英文标题】:errorC2065:\'IOCTL_NDISUIO_OPEN_DEVICE\':undeclaredidentifier【发布时间】:2010-03-3009:34:53【问题描述】:我面临“错误C2065:\'IOCTL_NDISUIO_OPEN_DEVICE\':代码下方未声明的标... 查看详情

为啥 ioctl 返回“错误地址”

】为啥ioctl返回“错误地址”【英文标题】:whydoesioctlreturn"badaddress"为什么ioctl返回“错误地址”【发布时间】:2013-04-0216:50:50【问题描述】:我使用下面的代码从嵌入式板的SPI端口输出数据(olimeximx233-micro--这不是板特... 查看详情

WDF 内部 IOCTL 不返回输出

】WDF内部IOCTL不返回输出【英文标题】:WDFInternalIOCTLNotReturningOutput【发布时间】:2016-07-2720:25:33【问题描述】:我目前正在编写一个公开虚拟COM端口的驱动程序。在驱动程序中,我从端口FDO将内部IOCTL发送到堆栈下方,由PDOIO队... 查看详情

SqlDataAdapter 未填充 DataTable

...时,SqlDataAdapter没有填充DataTable>这里是运行存储过程并返回填充的DataTable的函数;publicDataTablegetAssetClassifications(int 查看详情

NestJs mongoose 嵌套填充未按预期工作

...有一个地址我想将客户连同人员及其地址一起填充。它只返回人员的数据,但不返回 查看详情

Linux ioctl 返回值由谁解释?

】Linuxioctl返回值由谁解释?【英文标题】:Linuxioctlreturnvalueinterpretedbywho?【发布时间】:2015-08-2115:01:34【问题描述】:我正在使用自定义内核字符设备,该设备有时会为其ioctl()返回较大的负值(大约为数千,例如-2000)。在用户... 查看详情

Dropwizard休眠字段未填充

...和对象布尔值。记录了SQL休眠执行,当我运行它时,它会返回给定用户的用户表中的所有字段,包括boolean值(tr 查看详情

ioctl(sock, SIOCETHTOOL, &ifr) 为啥它总是返回-1

】ioctl(sock,SIOCETHTOOL,&ifr)为啥它总是返回-1【英文标题】:ioctl(sock,SIOCETHTOOL,&ifr)whyitsreturning-1allthetimeioctl(sock,SIOCETHTOOL,&ifr)为什么它总是返回-1【发布时间】:2013-05-0715:44:39【问题描述】:/*同一段代码对两个不同版本的Lin... 查看详情

表单未预先填充Angular 8

...ar8【发布时间】:2020-07-0515:41:07【问题描述】:我有一个返回对象数组的API服务。每个对象都有两个字段名称和用法。我正在动态创建一个表单,其中表单字段的数量等于数组中的对象数量。表单字段的名称是name,它应该预先... 查看详情

ioctl() 用于 C 中的套接字编程

...程序中读取缓冲区中的字符数。但是,有时,当缓冲区的填充延迟时,ioctl()会将其误解为消息的结尾。如果我要使用ioctl()来了解传入消息的长度,如何避免这种情况。另外我不知道我将收到的消息的大小,因此我无法在静态缓... 查看详情

ajax 在 asp.net 中返回一个未定义的对象

】ajax在asp.net中返回一个未定义的对象【英文标题】:ajaxisreturninganundefinedobjectinasp.net【发布时间】:2019-02-0920:31:20【问题描述】:这是c#中的getter方法,它获取用户通过查询输入的单词的含义,然后将它们填充到数据表中,然后... 查看详情

pytorchtorch.empty()函数(返回填充有未初始化数据的张量。张量的形状由可变的参数大小定义)(代码片段)

fromhttps://pytorch.org/docs/1.1.0/torch.html#torch.emptytorch.empty(*sizes,out=None,dtype=None,layout=torch.strided,device=None,requires_grad=False,pin_memory=False)→TensorRet 查看详情

jQuery数据表未填充

...有一个jQuery数据表,通过Web服务API获取数据。我可以看到返回的数据格式正确,但表格没有显示数据。我有一个“提交”按钮,单击该按钮可获取数据并重绘表格。我在“成功”函数中放了一个断点,可以看到json数据。aspx页面... 查看详情

来自 JQuery 填充字段的值未绑定到 MVC 模型

...发.on(\'change\')。一旦发生这种情况,就会执行AJAX调用,返回用户的数据,禁用并填充链接到模型属 查看详情

FireBase 实时数据库:回收站视图未填充

...题描述】:我的回收站视图打开,显示黑屏几秒钟,然后返回到我的登录活动。这是我的适配器类...importandroid.view.LayoutInflater;importandroid.view.View;importand 查看详情