FreeBSD 上的网络接口状态跟踪

问题描述 投票:0回答:2

我正在将一些软件移植到 FreeBSD 12(它从未在 FreeBSD 上运行过)。该软件需要跟踪系统网络接口并对状态变化立即做出反应。假定以 root 权限运行。在 FreeBSD 7 中,存在

kevent
和 EVFILT_NETDEV 的组合,但该标志已从 FreeBSD 8 及更高版本中删除,没有明确的替代品。

我知道有一种方法可以使用

getifaddrs
检索接口,但不知道如何继续并在
AF_INET
AF_INET6
设备上设置处理程序来跟踪向上/向下事件。

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

有人可以告诉我正确的方向吗?也许是一些 libdev* 系统范围的库?

谢谢。

c freebsd systems-programming
2个回答
1
投票

找到了使用devd的多路复用管道的相应库。它被称为

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

此外,它还有一个严重的缺点,它

poll
DevdCtl::Consumer::EventsPending
中零超时的套接字,这大大增加了CPU使用率。


-1
投票

有效果吗?

如果是这样,如果你能分享一个例子那就太棒了!

我想监控CARP状态。在 devd.conf 文件中,语法为

notify 101 {
    match "system"          "CARP";
    match "subsystem"       "10@em0";
    match "type"            "(MASTER|BACKUP|INIT)";
    action "do_something";
};

但是如何使用 DevdCtl::Event::NOTIFY 和 DevdCtl::Consumer 来轮询更改?

© www.soinside.com 2019 - 2024. All rights reserved.