C语言 FreeBSD上的网络接口状态跟踪

wdebmtf2  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(101)

我正在将一些软件移植到FreeBSD 12(它从未在FreeBSD上运行过)。该软件需要跟踪系统网络接口,并立即对状态更改做出React。它假定以root权限运行。在FreeBSD 7中有kevent和EVFILT_NETDEV的组合,但这个标志已经从FreeBSD 8和更高版本中删除,没有明确的替代品。
我知道有一种方法可以使用getifaddrs检索接口,但不知道如何继续并在AF_INETAF_INET6设备上设置处理程序来跟踪up/down事件。
devd看起来很有希望,因为它可以捕获相应的IFNET事件,可惜它禁止在目标系统上调整devd.conf,因此我需要在我的sfw中实现类似的机制。我没有太多的时间来检查devd的源代码,即使我已经尝试过了,它使它更加神秘。
有谁能告诉我正确的方向吗?也许是一些libdev* 系统范围的库?
谢谢.

kb5ga3dv

kb5ga3dv1#

找到使用devd的多路复用管道的相应库。它被称为libdevdctl,其源代码驻留在/usr/src/lib/libdevdctl中,用C++编写,没有额外的依赖关系。DevdCtl::Event::NOTIFYDevdCtl::Consumer的组合就足够了。出于某种原因,/usr/lib中的共享库被称为libprivatedevdctl.so,并根据nm输出暴露所需的接口。我认为它只是一个内部库,所以更容易获取源代码并在软件中使用。
此外,它有一个严重的缺点,它pollDevdCtl::Consumer::EventsPending中零超时的套接字,这大大增加了CPU的使用率。

相关问题