【问题标题】:How to prevent kernel from passing packets to network layer?如何防止内核将数据包传递到网络层?
【发布时间】:2012-12-19 12:49:31
【问题描述】:

网卡接收到的帧会由驱动处理,然后由Linux内核传递到协议栈的上层。

有没有一种简单的方法可以防止内核将数据包传递到网络层?这样我就可以从数据链路层接收帧并自己处理所有数据包(也许应用层程序会被重写)?

我认为重新编译内核是必要的,是否应该通过修改 softirq 中的代码或 netif_rx 之类的函数或每个 cpu 的列表队列中的代码来完成?

其实我和一些同学正在尝试在用户空间实现一个简化版的TCP/IP协议栈进行练习,而我们才刚刚开始。我正在阅读一些书籍,如 UNP、APUE2、TCP/IP 插图 v1、v2、Linux 网络架构、linux 源代码等。我确实有一些其他问题,我需要发布另一个问题吗?

【问题讨论】:

  • 你想做什么?修改内核可能没那么容易。
  • 您确实应该描述您要解决的问题。以下答案之一建议使用 netfilter。另一种选择可能是使用 pcap 库直接获取原始数据包。在我们知道您真正想要解决的问题之前,我们不会知道您的正确答案是什么。
  • 我编辑了我的问题,真的期待一些进一步的建议。

标签: linux sockets


【解决方案1】:

如果你只想自己处理数据包,你可以使用内核模块netfilter并实现一些钩子。您可以轻松找到一些代码示例。

在您的不同钩子中,您可以选择处理数据包并将其返回给内核或丢弃它。这只是一个要更改的返回码。

给出一些代码和主题解释的文章:http://www.linuxjournal.com/article/7184

此解决方案可行,实施起来也不难,但不确定它是否是解决问题的自然方法。

【讨论】:

  • 是的,这行得通。它与我想要的有点不同,但实现起来更简单。也许我需要找到一些可以丢弃 arp 数据包的防火墙,以便所有数据包都受到控制
【解决方案2】:

DPDK 听起来像是您正在寻找的东西。

【讨论】:

    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2019-02-12
    • 2021-12-11
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多