如何在Linux网络堆栈的特定点推送skb?

时间:2014-01-13 08:00:44

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

我想将skb推送到Linux网络堆栈的prerouting点。有没有办法做到这一点? 我使用了dev_queue_xmit()netif_rx()函数,但我认为它们不能在Linux网络堆栈的prerouting点推送skb。

enter image description here

3 个答案:

答案 0 :(得分:2)

我并不完全清楚这个skb来自哪里。在userland中,有两种方法可以做到这一点。一种是使用tun设备(并简单地写入数据包)。另一种是使用libpcap(它具有在所有接收内容中隐藏发送原始数据包的鲜为人知的特征)。

您说要通过注册ioctl(可能意味着添加您自己的ioctl)然后从用户空间调用ioctl来执行此操作。当你无需修改内核就可以实现这一目标时,为什么要这样做并不是很明显。但是,如果您确实想要这样做,我要做的就是遵循tun驱动程序使用的路径,并执行相当于write() - tun设备的操作在您的新ioctl中。这可能意味着有一个类似tun的界面,可以作为数据包的来源。我怀疑系统中的数据包需要各种源接口。

答案 1 :(得分:1)

我怀疑您希望libpcap或libnetfilter_queue此后统称为userland queuing。 Userland排队会将符合某些规则(您定义)的所有数据包路由到您的用户态应用程序。 dev_queue_ *和netif_ *函数适用于内核级路由,与用户态应用程序无关。

Userland排队具有性能影响,根据您使用的库,您必须使用特定方法将数据包重新注入netfilter队列。

答案 2 :(得分:0)

我认为您正在寻找的函数是ip_queue_xmit(),这是IPV4实现开始检查表,过滤器等的地方。