如何识别其中一个桥接接口(Linux 中的 SW 桥接)已关闭?

如何识别其中一个桥接接口(Linux 中的 SW 桥接)已关闭?

我有一块主板。这块主板有两个接口,一个eth0和另一个usb0eth0端口连接到网络。usb0端口连接到另一个设备。借助 bridge-utils,我能够bridge(br0)在主板上安装一个软件,并以eth0usb0作为其元素。现在我的问题是,如果usb0一侧关闭或未运行,那么有什么方法可以知道 usb0 一侧关闭或不工作或未运行?

我尝试使用SIOCGIFCONFioctl 命令来SIOCGIFFLAGS(IFF_UP and IFF_RUNNING)了解是否有任何接口处于关闭状态或未运行状态。但SIOCGIFCONF我只获得有关一个​​接口 br0 的信息,而没有有关usb0或的信息eth0,并且br0该接口已启动并正在运行。

任何建议,将不胜感激。

答案1

我认为使用 sysfs 文件系统可以检测 usb0 的状态。

今天我看到了bride-utilities的源代码,我发现brctl 显示命令使用 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

因此,现在我可以通过分析以下值来了解作为 br0 桥一部分的 usb0 接口的状态:/sys/class/net/br0/brif/usb0/state文件。

现在我有以下方法来了解 usb0 接口的状态:

1.不断轮询这个.../状态文件值,然后做出决定(我不喜欢这个想法)。

2.打开一个 netlink 套接字并监听 RTMGRP_LINK(网络接口创建/删除/启动/关闭事件)多播组,然后通过内核通知我可以确定 usb0 的状态。

3.使用udev:http://www.signal11.us/oss/udev/(libudev - 监控接口)我们可以监控状态改变事件通知,然后采取行动。

我正在尝试使用 udev。实施后将尝试发布完整的解决方案。

相关内容