Linux kernel 在netfilter钩子中对数据包进行分段

Linux kernel 在netfilter钩子中对数据包进行分段,linux-kernel,netfilter,Linux Kernel,Netfilter,我正在编写一个netfilter钩子,它向数据包添加一个填充,因此数据包的大小在这里增加。我希望数据包的每一个片段都有填充。因此,当钩子看到数据包大小将超过MTU时,它应该首先对数据包进行分段,并为每个分段添加填充。在netfilter挂钩中执行此操作的最佳方法是什么?我尝试调用ip\u fragment(),但无法为其提供正确的输出函数 static int ip_fragment(struct sock *sk, struct sk_buff *skb,

我正在编写一个netfilter钩子,它向数据包添加一个填充,因此数据包的大小在这里增加。我希望数据包的每一个片段都有填充。因此,当钩子看到数据包大小将超过MTU时,它应该首先对数据包进行分段,并为每个分段添加填充。在netfilter挂钩中执行此操作的最佳方法是什么?我尝试调用
ip\u fragment()
,但无法为其提供正确的输出函数

static int ip_fragment(struct sock *sk, struct sk_buff *skb,
                       unsigned int mtu,
                       int (*output)(struct sock *, struct sk_buff *));
我尝试了
ip\u output()
函数,但它不起作用,因为它不是导出的符号。此外,我不确定这是否合法

另一个问题是代码将钩子中的数据包分割成碎片,并最终调用
okfn()
。我不想重新实现碎片代码,所以有更好的方法吗

我还需要尝试的另一种方法是,通过名称空间中的接口路由数据包,该名称空间具有较低的MTU,最后,当连接到钩子时,它已经具有正确的MTU

tap0(MTU:1450)--->[veth0…namespaceX | def.namespace…veth1]->eth0(MTU:1500)

有没有更简单有效的方法