来自NIC的以太网帧

问题描述:

我正在为最近工作的网络项目寻求帮助和意见建议。这需要Linux机器成为被动网络设备。来自NIC的以太网帧

网络数据包从一个网络接口进来并从另一个接口(net-eth0 - > Linux PC - eth1 - > net)出来,而不对数据进行任何修改。

即将在Linux系统上运行的应用程序将仅更改数据包的顺序。这将是一个“愚蠢的”网络模拟器应用程序。

第一个实现是使用RAW套接字进行的,每当数据包到达用户空间时调用read(),并且在将以太网数据包发送到NIC时调用write()。

我想知道是否有比RAW套接字更实用,更直接的方式,绕过Linux的网络堆栈。

+0

你不能绕过Linux网络堆栈,他们这样做的方式可能是最简单的方法。 你是什么意思的实际? –

+0

实用的方法是实现的技术部分。套接字的实现需要一个具有非阻塞IO的tx-rx机制,这是我在第一个地方利用select()和pthreads实现的。是否有更好的设计理念? 此外我正在寻找一种方式,中间系统不会处理所有的网络流量。只有仿真应用程序应该在两个接口之间运行。 – cyberrobot

+0

你可以做的是创建一个'netfilter'钩子并让它接收你的数据包,然后立即发送它们。这样你的数据包就不必传送到用户空间,你可以在内核空间内进行更快的处理。 –

如果你想要绕过内核,Linux中的DPDK和FreeBSD中的NetMap都可以做到这一点。

事实上,这可以在Linux的dpdk中完成。在dpdk树的examples文件夹中有l3fw和l2fwd示例应用程序,这可能会激励你。另请考虑使用vpp,一个由Linux Foundation托管的fd.io项目,它可以使用dpdk。

Rami Rosen