我正在编写一个netfilter挂钩,它会在数据包中添加一个填充,这样就可以增加数据包的大小。我希望padding与数据包的每个片段一起发生。因此,当钩子看到数据包大小超出MTU时,它应首先对数据包进行分段并将填充添加到每个片段。在netfilter钩子中执行此操作的最佳方法是什么?我试着调用ip_fragment()
,但我无法给它一个正确的输出函数。
static int ip_fragment(struct sock *sk, struct sk_buff *skb,
unsigned int mtu,
int (*output)(struct sock *, struct sk_buff *));
我尝试了ip_output()
函数,但它不起作用,因为它不是导出的符号。此外,我不确定这是否合法。
另一个问题是代码在钩子本身碎片化数据包并最终调用okfn()
。我不想重新实现碎片代码,所以有更好的方法吗?
我还要尝试的另一种方法是,将数据包路由到具有较低MTU的命名空间中的接口,最后当它挂钩时,它已经具有正确的MTU。
tap0(MTU:1450)--->[veth0...namespaceX|def.namespace...veth1]----->eth0(MTU:1500)
是否有更简单有效的方法?