【问题标题】:Network interfaces status tracking on FreeBSDFreeBSD 上的网络接口状态跟踪
【发布时间】:2021-09-30 06:52:01
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • 您是否在邮件列表或 irc 上询问了开发人员常去的地方?
  • @Rob 不,我认为邮件列表是针对更重要的问题(如错误),这会触发太多人。
  • 这是一个错误的假设。

标签: c freebsd systems-programming


【解决方案1】:

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

此外,它还有一个严重的缺点,它polls 套接字在DevdCtl::Consumer::EventsPending 中具有零超时,这会大大增加 CPU 使用率。

【讨论】:

    猜你喜欢
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多