¿Cómo identificar que una de las interfaces del puente (SW bridge en Linux) está inactiva?

0

Tengo una tabla. Esta placa tiene dos interfaces una eth0 y otra usb0. eth0 El puerto está conectado a la red. y usb0 el puerto está conectado a otro dispositivo Con la ayuda de bridge-utils, puedo configurar un software bridge(br0) sobre el tablero con eth0 y usb0 como sus elementos. Ahora mi problema es si usb0 el lado está abajo o no está funcionando, entonces ¿hay alguna forma de saber que usb0 está inactivo o no está funcionando o no está funcionando?

Traté de usar SIOCGIFCONF comando ioctl y SIOCGIFFLAGS(IFF_UP and IFF_RUNNING) para saber si alguna interfaz está inactiva o no se está ejecutando. Pero con SIOCGIFCONF Recibo información sobre una sola interfaz br0 y no sobre usb0 o eth0y br0 está arriba y funcionando y funcionando.

Cualquier sugerencia sera apreciada.


fuente
Y no puedes simplemente el estado UP de las interfaces con ip link show eth0 (igual para usb0)?
ott--
Salida de ip link show usb0 cuando usb0 no se está ejecutando: # ip link show usb0 2: usb0: & lt; NO-CARRIER, BROADCAST, MULTICAST, UP & gt; mtu 1500 qdisc pfifo_fast master br0 qlen 1000 link / ether c6: df: ac: 7a: e0: 5d brd ff: ff: ff: ff: ff: ff Así que con & lt; NO-CARRIER & gt ;, el enlace ip muestra que el lado usb0 no se está ejecutando. Está bien. Ahora mi problema es por qué el comando ioctl de SIOCGIFCONF no muestra todas las interfaces usb0, eth0, br0. ¿Por qué esta llamada ioctl solo está listando solo la interfaz br0? porque si no muestra la lista usb0, entonces no puedo diagnosticar el estado de usb0. ¿Necesito usar alguna otra llamada ioctl o algún otro método?
Ese ioctl () obviamente no es de ayuda en ese caso. Yo sugeriría un script que extrae las interfaces de un brctl show y luego consulta cada interfaz.
ott--

Respuestas:

0

Creo que el estado del sistema de archivos sysfs de usb0 podría ser detectado.

Hoy vi el código fuente de bride-utilities, donde encontré eso. brctl show comando recopila información sobre sus interfaces usando el sistema de archivos sysfs (sys / class / net / br0 / brif /).

Entonces, atravesé ese sistema de archivos sysfs y verifiqué el valor en / sys / class / net / br0 / brif / usb0 / state expediente. Cuando la interfaz usb0 se está ejecutando, en ese caso la salida de

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

En caso de que la interfaz usb0 no se esté ejecutando, entonces:

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

Entonces, ahora puedo conocer el estado de la interfaz usb0 que forma parte del puente br0 analizando el valor de / sys / class / net / br0 / brif / usb0 / state expediente.

Ahora tengo las siguientes formas de conocer el estado de la interfaz usb0:

1.Cuestione continuamente este ... / valor del archivo de estado y luego tome una decisión (no me gusta esta idea).

2. Abra un socket de enlace de red y escuche los grupos de multidifusión RTMGRP_LINK (interfaz de red crear / eliminar / subir / bajar) y luego, con la notificación del kernel, podría determinar el estado de usb0.

3.Utilizando udev: http://www.signal11.us/oss/udev/ (libudev - Interfaz de monitorización) podríamos monitorear la notificación del evento de cambio de estado y luego actuar.

Estoy tratando de usar udev. E intentaré publicar una solución completa después de que la implementé.


fuente