假设我实现了一个解析RX数据包的内核驱动程序,并根据EthType决定将其传递给用户空间。什么是#34;官方"在Linux内核中这样做的方法?
我唯一想到的是用户应用程序打开内核的套接字并监听它,而内核将满足条件的数据包(例如特定的EthType)推送到套接字缓冲区。我当然不准确,但我希望你明白我的观点:)。
还有其他方法吗?
感谢。
答案 0 :(得分:0)
当数据包到达NIC时,首先将这些数据包复制到内核缓冲区,然后复制到用户空间,通过socket()访问,然后在用户空间中调用read()/ write() 。您可能需要参考Kernel Network Flow了解更多详情。
此外,NIC可以直接将数据包复制到绕过CPU的DMA中。请参阅:What happens after a packet is captured?
答案 1 :(得分:0)
您可以使用Netfilter框架实现目标。 Netfilter框架有助于拦截ingrees / egrees数据包。在内核/网络堆栈中可以拦截数据包的点在Netfilter中称为HOOKS。我们可以编写一个内核模块,它可以挂钩任何这些HOOKS。内核模块必须具有我们定义的函数,它可以解析数据包及其标头,而不是决定是丢弃数据包,将其发送到内核堆栈,将其排入用户空间等。
我们感兴趣的数据包可以在IP_PREROUTING挂钩处截取,并通过从我们的函数返回NF_QUEUE来排队。数据包将排队,任何应用程序都可以访问。
请浏览Netfilter文档。
此致 罗伊