Пожалуйста, помогите мне получить настройки ethtool (скорость, дуплекс, автонейг).Как получить настройки 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_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 = ð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 возвращает неправильные значения? В чем проблема?
Да, вы правы. Когда я исправил опечатку, я получил сообщение об ошибке «Ошибка #r». Итак, как мне получить информацию об ethtool? – user7461659
@ user7461659, формулировка '/ usr/include/linux/ethtool.h' может помочь:' ВАЖНО. При внедрении новых инструментов пользовательского пространства сначала попробуйте ETHTOOL_GLINKSETTINGS, и если это не удается, используйте ETHTOOL_GSET для запроса ... ' – wick