FreeBSD 上的网络接口状态跟踪

Network interfaces status tracking on FreeBSD

我正在将一些软件移植到 FreeBSD 12(从来没有 运行 在 FreeBSD 上)。该软件需要跟踪系统网络接口并立即对状态变化做出反应。假定 运行 具有 root 权限。在 FreeBSD 7 中有 kevent 和 EVFILT_NETDEV 的组合,但此标志已从 FreeBSD 8 及更高版本中删除,没有明确的替换。

我知道有一种方法可以使用 getifaddrs 检索接口,但不知道如何继续并在 AF_INETAF_INET6 设备上设置处理程序来跟踪 up/down事件。

devd 看起来很有前途,因为它可以捕获相应的 IFNET 事件,唉,在目标系统上禁止调整 devd.conf,因此我需要在我的系统中实现类似的机制旧金山。我没有太多时间去检查 devd 的源代码,尽管我已经尝试过了,这让它变得更加神秘。

谁能告诉我正确的方向?也许是一些 libdev* 系统范围的库?

谢谢。

找到使用 devd 多路复用管道的相应库。它被称为 libdevdctl,其源代码位于 /usr/src/lib/libdevdctl,用 C++ 编写,没有额外的依赖项。 DevdCtl::Event::NOTIFYDevdCtl::Consumer 的组合就足够了。由于某种原因,/usr/lib 中的共享库被称为 libprivatedevdctl.so,并且根据 nm 输出公开了所需的接口。我认为它只是一个内部库,因此更容易获取源代码并按原样在您的软件中使用。

此外,它有一个严重的缺点,它 pollDevdCtl::Consumer::EventsPending 中零超时的套接字,这大大增加了 CPU 使用率。