2017-01-24 15 views
2

Пожалуйста, помогите мне получить настройки 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 = &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 возвращает неправильные значения? В чем проблема?

ответ

0

Проблема вызвана следующим опечатка:

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

Вы имели в виду, чтобы проверить значение r, но вы по ошибке проверить s вместо этого. Если вы исправите эту ошибку, я верю, что вы получите сообщение об ошибке (EOPNOTSUPP, Operation не поддерживается).

+0

Да, вы правы. Когда я исправил опечатку, я получил сообщение об ошибке «Ошибка #r». Итак, как мне получить информацию об ethtool? – user7461659

+0

@ user7461659, формулировка '/ usr/include/linux/ethtool.h' может помочь:' ВАЖНО. При внедрении новых инструментов пользовательского пространства сначала попробуйте ETHTOOL_GLINKSETTINGS, и если это не удается, используйте ETHTOOL_GSET для запроса ... ' – wick