我想将skb推送到Linux网络堆栈的prerouting
点。有没有办法做到这一点?
我使用了dev_queue_xmit()
和netif_rx()
函数,但我认为它们不能在Linux网络堆栈的prerouting
点推送skb。
答案 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实现开始检查表,过滤器等的地方。