Есть ли модуль ядра, который возвращает именно то, что делает простой ifconfig?

Я пишу модуль ядра, которому нужна информация об интерфейсах локальной машины, точно так же, как те, которые перенастраиваются простой командой «ifconfig», я много искал, но ничего не нашел.


person Varda Elentári    schedule 12.04.2012    source источник
comment
Проверьте исходный код ifconfig и посмотрите, что он делает (или проверьте с помощью strace), а затем проверьте исходные коды ядра linux на предмет того, что делают сетевые драйверы при выполнении этих системных вызовов. Например, ioctl SIOCGIFHWADDR, SIOCGIFADDR и так далее.   -  person Albert Veli    schedule 12.04.2012
comment
Например, проверьте net/core/dev.c Функция __dev_get_by_name() там выглядит интересно. Вероятно, вы можете использовать это и получить некоторую информацию об интерфейсе из возвращаемой структуры.   -  person Albert Veli    schedule 12.04.2012


Ответы (2)


Вы можете получить всю эту информацию через struct net_device так или иначе. Как сказал Альберт Вели, вы можете получить этот указатель struct net_device, используя __dev_get_by_name().

Если вы сообщите нам, какая информация вам нужна конкретно, мы могли бы даже указать вам на правильные поля.

Найти MAC-адрес довольно просто:

struct net_device *dev = __dev_get_by_name("eth0");
dev->dev_addr; // is the MAC address
dev->stats.rx_dropped; // RX dropped packets. (stats has more statistics)

Найти IP-адрес довольно сложно, но не невозможно:

struct in_device *in_dev = rcu_dereference(dev->ip_ptr);
// in_dev has a list of IP addresses (because an interface can have multiple)
struct in_ifaddr *ifap;
for (ifap = in_dev->ifa_list; ifap != NULL;
         ifap = ifap->ifa_next) {
    ifap->ifa_address; // is the IPv4 address
}

(Ничего из этого не тестировалось при компиляции, поэтому возможны опечатки.)

person Kristof Provost    schedule 12.04.2012
comment
ну, я хотел бы получить IP-адрес интерфейса, его MAC, его статус, количество пакетов с ошибками и потерянных пакетов, и есть ли способ получить скорость или пропускную способность канала на этом интерфейсе? - person Varda Elentári; 12.04.2012
comment
@ Кристоф Провост Вы имеете в виду ifap = ifap->ifa_next вместо ifap = ifa1->ifa_next? - person Trần Việt Hoàng; 21.08.2018

См., например, функцию in6_dump_addrs в net/ipv6/addrconf.c, чтобы узнать, как получить адреса. Для свойств ссылки, таких как адрес уровня ссылки, см. вместо этого core/rtnetlink.c. ifconfig и его ioctl устарели (в Linux), так что лучше не думать в терминах этой программы с ошибками.

person jørgensen    schedule 12.04.2012