sysfs, ifreq, IOCTL или ??? для программного мониторинга состояния сети

У нас есть встроенная SoC под управлением BusyBox Linux (ядро 2.6.x), и нам необходимо отслеживать или, по крайней мере, своевременно замечать, когда сетевое соединение пропадает или появляется (отслеживание других событий было бы хорошо, но не обязательно) .

Я долго гуглил и читал темы SO, и, кажется, есть масса разных ответов в зависимости от конкретной задачи, конкретной ОС, фаз луны и т. д.

Наши конкретные критерии:

  • Мы смотрим изнутри программы C, поэтому код C предпочтительнее, чем вызовы командной строки.
  • Хотя интерфейс есть всегда, мы не можем гарантировать, что он есть или когда-либо работал (я видел комментарии к некоторым примерам, которые работают только тогда, когда интерфейс up, даже если ссылка down)
  • Было бы неплохо не проводить опрос, а отправлять/перехватывать сообщения об изменении состояния по мере их возникновения. Я полагаю, что ядро ​​уже может получать такие сообщения от драйвера, но я не уверен, есть ли что-нибудь, к чему мы можем подключиться?

Я сузил вероятные кажущиеся ответы до нескольких кандидатов, но не могу определить, какой из них самый приятный (наименее накладные, самые надежные, с наименьшей вероятностью поломки в будущих версиях):

  • cat sys/class/net/eth0/operstate
  • cat sys/class/net/eth0/carrier (Я не могу найти хорошего объяснения разницы между этими двумя)
  • Использование ifreq или различных последовательностей вызовов ioctl для чтения состояния сокета (мне это кажется беспорядочным) в соответствии с ответами здесь и здесь (более аккуратный вид).
  • Как-то ловить сообщения об изменении статуса???

person John U    schedule 27.05.2014    source источник


Ответы (1)


Вы можете использовать inotify для проверки файла /sys/class/net/eth0/operstate. Inotify позволяет отслеживать различные события в указанном файле или каталоге, например. СОЗДАВАЙТЕ, ИЗМЕНЯЙТЕ, ПИШИТЕ и т.д.

Вы можете увидеть рабочий пример здесь

person Arshan    schedule 27.05.2014