2013-01-05 33 views
6

网卡接收的帧将由驱动程序处理,然后由Linux内核传递到协议栈的上层。如何防止内核传递数据包到网络层?

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

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

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

+0

你想做什么?改变内核可能并不那么容易。 – prehistoricpenguin

+0

你真的应该描述你试图解决的问题。下面的答案之一表明netfilter。另一种选择可能是使用pcap库直接获取原始数据包。直到我们知道你真正想要解决什么问题时,我们才会知道你的正确答案。 – chetan

+0

我编辑了我的问题,真的期待一些进一步的建议。 –

回答

2

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

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

第二十从而使该主题的一些代码和说明:http://www.linuxjournal.com/article/7184

该解决方案将工作,并没有太难以实现,但不知道它的到RESOLV你的问题的自然方式。

+0

是的,这个工程。这与我想要的有点不同,但实施起来更简单。也许我需要找到一些防火墙,它可以丢弃ARP数据包,以便所有数据包都受到控制 –

0

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