Я пишу модуль ядра, которому нужна информация об интерфейсах локальной машины, точно так же, как те, которые перенастраиваются простой командой «ifconfig», я много искал, но ничего не нашел.
Есть ли модуль ядра, который возвращает именно то, что делает простой ifconfig?
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
ну, я хотел бы получить IP-адрес интерфейса, его MAC, его статус, количество пакетов с ошибками и потерянных пакетов, и есть ли способ получить скорость или пропускную способность канала на этом интерфейсе?
- person Varda Elentári; 12.04.2012
@ Кристоф Провост Вы имеете в виду
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