请帮助我获得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 = ðtoolCmd;
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_闪烁设置
#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 = ðtoolLinkSettings;
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返回不正确的值?问题是什么?
3条答案
按热度按时间tv6aics11#
该问题是由以下排印错误引起的:
您本想检查
r
的值,但错误地检查了s
。如果您更正了该错误,我相信您将得到一个错误(EOPNOTSUPP,不支持操作)。amrnrhlw2#
这段代码肯定有问题
但修复此问题并不能解决问题,而且无法使用ETHTOOL_GLINKSETTINGS查询接口属性。查看头文件即可了解这一点。
我确实看到了与报告的行为相同的行为,并观察到使用
ETHTOOL_GSET
报告了正确的值使用
ETHTOOL_GSET
具有
ETHTOOL_GLINKSETTINGS
fnx2tebb3#
正如您在ethtool.c中的函数
do_ioctl_glinksettings()
中所看到的,您应该在ethtoolLinkSettings
缓冲区后面为可变大小的成员map_supported
、map_advertising
和map_lp_advertising
保留一些空间(只能通过link_mode_masks
间接访问)。作为第一次调用
ioctl()
的结果,您将得到link_mode_masks_nwords
中这些成员的真实的大小(带负号)。然后将link_mode_masks_nwords
设置为该实际大小(非负数),并再次调用ioctl()
。然后您将得到实际数据。例如(未检测)