如何在内核空间中编写数据包

时间:2012-04-02 16:38:29

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

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

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

请建议我在内核空间中将数据包写入文件的一种好方法。如果有人有使用拼接的想法/例子,我将非常感激。日Thnx。

1 个答案:

答案 0 :(得分:0)

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

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

然而,无论如何你想要这样做,这是一篇很好的文章 - http://www.linuxjournal.com/node/8110/print