У меня есть доска. Эта плата имеет два интерфейса: один eth0 и другой usb0 . Порт eth0 связан с сетью. и порт usb0 подключен к другому устройству. С помощью bridge-utils я могу установить программный bridge(br0) через плату с eth0 и usb0 качестве его элементов. Теперь моя проблема в том, что если сторона usb0 не работает или не работает, то есть ли способ узнать, что сторона usb0 не работает или не работает или не работает?

Я попытался использовать SIOCGIFCONF ioctl и SIOCGIFFLAGS(IFF_UP and IFF_RUNNING) чтобы узнать, работает ли какой-либо интерфейс или нет. Но с SIOCGIFCONF я получаю информацию только об одном интерфейсе br0, а не о usb0 или eth0 , а br0 работает, работает и работает.

Мы ценим любые предложения.

1 ответ1

0

Я думаю, что при использовании файловой системы sysfs можно было обнаружить состояние usb0.

Сегодня я увидел исходный код утилиты-невесты, где обнаружил, что команда brctl show собирает информацию о своих интерфейсах, используя файловую систему sysfs(sys/class/net/br0/brif/).

Итак, я прошел через эту файловую систему sysfs и проверил значение в файле /sys/class/net/br0/brif/usb0/state . Когда интерфейс usb0 работает, в этом случае вывод

/ # cat /sys/class/net/br0/brif/usb0/state
    3

Если интерфейс usb0 не запущен, то:

/ # cat /sys/class/net/br0/brif/usb0/state
    0

Итак, теперь я могу узнать состояние интерфейса usb0, который является частью моста br0, проанализировав значение файла /sys/class/net/br0/brif/usb0/state .

Теперь у меня есть следующие способы узнать статус интерфейса usb0:

1.Постоянно опрашивайте это .../ состояние файла, а затем принимайте решение (мне не нравится эта идея).

2.Откройте сокет netlink и прослушайте группы многоадресной рассылки RTMGRP_LINK (события создания / удаления / вверх / вниз сетевого интерфейса), а затем с помощью уведомления ядра я могу определить состояние usb0.

3.Используя udev:http://www.signal11.us/oss/udev/ (libudev - интерфейс мониторинга), мы можем отслеживать уведомление об изменении состояния и затем действовать.

Я пытаюсь использовать Udev. И постараюсь опубликовать полное решение после его реализации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .