从Netfilter挂钩中扩展数据包头

我想在NF_HOOK_LOCAL_OUT内的现有IP数据包上添加IP标头。我面临的问题是skb扩展功能(例如copy / clone / expand / reallocate标头)分配了新的sk_buff。我们不能返回这个新分配的指针,因为netfilter钩子函数(内核版本2.6.31)不再传递skb指针的地址(按值传递)。我如何解决此问题如下: 1.我使用skb_header_realloc()获得了一个新的skb。这将从skb复制所有数据。 2.我修改了新的skb(称为skb2),以在新的IP头之前添加新的IP头,并在新的IP头中设置适当的值。 3.使用skb_morph()用skb2的内容替换原始skb的内容(在Netfilter挂钩函数中传递)。返回NF_ACCEPT。 这是实现我的预期的唯一方法吗?有没有更有效的解决方案?还有skb_morph的其他用例(除了IP重组代码)?     
已邀请:
这对我来说适用于2.6内核:
...
struct iphdr* iph;
if (skb_headroom(skb) < sizeof(struct iphdr))
  if (0 != pskb_expand_head(skb, sizeof(struct iphdr) - skb_headroom(skb), 0, GFP_ATOMIC)) {
    printk(\"YOUR FAVOURITE ERROR MESSAGE\");
    kfree_skb(skb);
    return NF_STOLEN;
  }
iph = (struct iphdr*) skb_push(skb, sizeof(struct iphdr));
//Fill ip packet
return NF_ACCEPT;
希望能帮助到你。     

要回复问题请先登录注册