【问题标题】:How to get ethtool settings?如何获取 ethtool 设置?
【发布时间】:2017-01-24 08:02:31
【问题描述】:

请帮我获取 ethtool 设置(速度、双工、自动调节)。

如果我使用 ETHTOOL_GSET,我会得到 ethtool 设置。但是在编写的 ethtool.h 中使用 ETHTOOL_GLINKSETTINGS 而不是 ETHTOOL_GSET。我不知道如何使用 ETHTOOL_GLINKSETTINGS。

ETHTOOL_GSET

#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/ethtool.h>
#include <linux/sockios.h>

int main()
{
    int s; // socket
    int r; // result

    struct ifreq ifReq;
    strncpy(ifReq.ifr_name, "enp3s0", sizeof(ifReq.ifr_name));

    struct ethtool_cmd ethtoolCmd;
    ethtoolCmd.cmd = ETHTOOL_GSET;
    ifReq.ifr_data = &ethtoolCmd;

    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s != -1)
    {
        r = ioctl(s, SIOCETHTOOL, &ifReq);
        if (s != -1)
        {
            printf("%s | ethtool_cmd.speed = %i \n", ifReq.ifr_name, ethtoolCmd.speed);
            printf("%s | ethtool_cmd.duplex = %i \n", ifReq.ifr_name, ethtoolCmd.duplex);
            printf("%s | ethtool_cmd.autoneg = %i \n", ifReq.ifr_name, ethtoolCmd.autoneg);
        }
        else
            printf("Error #r");

        close(s);
    }
    else
        printf("Error #s");

    return 0;
}

结果:

enp3s0 | ethtool_cmd.speed = 1000 
enp3s0 | ethtool_cmd.duplex = 1
enp3s0 | ethtool_cmd.autoneg = 1

ETHTOOL_GLINKSETTINGS

#include <stdio.h>
#include <string.h>
#include <net/if.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/ethtool.h>
#include <linux/sockios.h>

int main()
{
    int s; // socket
    int r; // result

    struct ifreq ifReq;
    strncpy(ifReq.ifr_name, "enp3s0", sizeof(ifReq.ifr_name));

    struct ethtool_link_settings ethtoolLinkSettings;
    ethtoolLinkSettings.cmd = ETHTOOL_GLINKSETTINGS;
    ifReq.ifr_data = &ethtoolLinkSettings;

    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s != -1)
    {
        r = ioctl(s, SIOCETHTOOL, &ifReq);
        if (s != -1)
        {
            printf("%s | ethtool_link_settings.speed = %i \n", ifReq.ifr_name, ethtoolLinkSettings.speed);
            printf("%s | ethtool_link_settings.duplex = %i \n", ifReq.ifr_name, ethtoolLinkSettings.duplex);
            printf("%s | ethtool_link_settings.autoneg = %i \n", ifReq.ifr_name, ethtoolLinkSettings.autoneg);
        }
        else
            printf("Error #r");

        close(s);
    }
    else
        printf("Error #s");

    return 0;
}

结果:

enp3s0 | ethtool_link_settings.speed = 0 
enp3s0 | ethtool_link_settings.duplex = 45
enp3s0 | ethtool_link_settings.autoneg = 0

为什么 ETHTOOL_GLINKSETTINGS 返回不正确的值?有什么问题?

【问题讨论】:

    标签: c++ c linux ioctl


    【解决方案1】:

    问题是由以下错字引起的:

    r = ioctl(s, SIOCETHTOOL, &ifReq);
        if (s != -1)
    

    您本想检查r 的值,但您错误地检查了s。 如果你更正那个错误,我相信你会得到一个错误(EOPNOTSUPP,Operation not supported)。

    【讨论】:

    • 是的,你是对的。当我更正错字时,我收到了错误消息“Error #r”。那么如何获取有关 ethtool 的信息呢?
    • @user7461659,/usr/include/linux/ethtool.h 的措辞可能会有所帮助:IMPORTANT, When implementing new user-space tools, please first try ETHTOOL_GLINKSETTINGS, and if it fails, use ETHTOOL_GSET to query...
    【解决方案2】:

    这段代码肯定有问题

    r = ioctl(s, SIOCETHTOOL, &ifReq);
        if (s != -1)
    

    如何解决此问题并不能解决问题,并且无法使用 ETHTOOL_GLINKSETTINGS 查询接口属性。查看头文件可以看出这一点。

    
    from /usr/include/linux/ethtool.h 
    
    1532 /**                                                                             
    1533  * struct ethtool_link_settings - link control and status                       
    1534  *                                                                              
    1535  * IMPORTANT, Backward compatibility notice: When implementing new              
    1536  *  user-space tools, please first try %ETHTOOL_GLINKSETTINGS, and              
    1537  *  if it succeeds use %ETHTOOL_SLINKSETTINGS to change link                    
    1538  *  settings; do not use %ETHTOOL_SSET if %ETHTOOL_GLINKSETTINGS                
    1539  *  succeeded: stick to %ETHTOOL_GLINKSETTINGS/%SLINKSETTINGS in                
    1540  *  that case.  Conversely, if %ETHTOOL_GLINKSETTINGS fails, use                
    1541  *  %ETHTOOL_GSET to query and %ETHTOOL_SSET to change link                     
    1542  *  settings; do not use %ETHTOOL_SLINKSETTINGS if                              
    1543  *  %ETHTOOL_GLINKSETTINGS failed: stick to                                     
    1544  *  %ETHTOOL_GSET/%ETHTOOL_SSET in that case.       
    

    我确实看到了与报告相同的行为,并观察到使用 ETHTOOL_GSET 报告的正确值

    ETHTOOL_GSET

    ~/working/exp$./ethtool-exp ens33
    ens33 | ethtool_cmd.speed = 1000 
    ens33 | ethtool_cmd.duplex = 1 
    ens33 | ethtool_cmd.advertising= 239 
    ens33 | ethtool_cmd.autoneg = 1 
    ens33 | ethtool_cmd.port= 0 
    ens33 | ethtool_cmd.phy_address= 0 
    ens33 | ethtool_cmd.transceiver= 0 
    ens33 | ethtool_cmd.maxrxpkt= 0 
    ens33 | ethtool_cmd.maxtxpkt= 0 
    

    ETHTOOL_GLINKSETTINGS

    ~/working/exp$./ethtool-glink ens33
    ens33 | ethtool_link_settings.speed = 0 
    ens33 | ethtool_link_settings.duplex = 0 
    ens33 | ethtool_link_settings.autoneg = 0 
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2011-08-07
      • 2013-12-02
      • 2012-03-05
      • 1970-01-01
      相关资源
      最近更新 更多