gpt4 book ai didi

c++ - 如何获取ethtool设置?

转载 作者:太空狗 更新时间:2023-10-29 12:41:33 24 4
gpt4 key购买 nike

请帮我获取 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 返回不正确的值?有什么问题?

最佳答案

肯定是这段代码有问题

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

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


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

关于c++ - 如何获取ethtool设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41822920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com