【问题标题】:how to write packets in kernel space如何在内核空间中写入数据包
【发布时间】:2012-04-02 16:38:28
【问题描述】:

我正在使用 netfilter 过滤数据包。现在,我需要将这些数据包数据放入文件中。我知道我们不能直接从内核读取/写入文件(感染,我们不应该),但最近我知道我们可以使用拼接来做到这一点。

以前,我尝试将所有数据包复制到用户空间,然后将它们转储到文件中,但它的运行速度非常慢,并且我丢失了数据包。我尝试使用 netlink 并尝试使用标准 udp 套接字从内核空间复制到用户空间。使用这种方法我没有得到很好的结果,因为我的数据包率非常高。

请建议我一种在内核空间内将数据包写入文件的好方法。如果有人有使用拼接的想法/示例,将不胜感激。谢谢。

【问题讨论】:

  • 我认为你应该检查一下link

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

您是否尝试过使用原始套接字提升套接字的优先级?当需要更快的套接字操作时,这通常可以解决问题。我仍然觉得从内核空间写入文件是一个坏主意,特别是如果您必须将数据包数据转储到文件中。

如果您认为,copy_to_user 延迟是导致延迟的原因(理想情况下不应该,但极端情况下,是的)尝试从内核分配一块内存并映射到用户空间。并从这个池中进行 skbuff 分配。然后,对门铃进行常规套接字或网络链接。然后从用户空间,你可以直接从这个区域访问数据包。它有些工作,但在极端条件下应该有所帮助。

但是,如果您仍然想这样做,这里有一篇不错的文章 - http://www.linuxjournal.com/node/8110/print

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2011-05-22
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多