2011-04-14 52 views
0

我想在NF_HOOK_LOCAL_OUT內部在現有IP數據包上添加IP標頭。我面臨的問題是skb擴展函數(例如copy/clone/expand/reallocate header)分配一個新的sk_buff。我們不能返回這個新分配的指針,因爲netfilter鉤子函數不再(內核版本2.6.31)傳遞skb指針的地址(通過值傳遞)。我如何解決這個問題如下: 1.我用skb_header_realloc()得到了一個新的skb。這從skb複製所有數據。 2.我修改了新的skb(稱爲skb2)來預先添加新的IP標頭,在新的IP標頭中設置適當的值。 3.使用skb_morph()將skb2的內容替換原始skb的內容(在Netfilter鉤子函數中傳遞)。返回NF_ACCEPT。從Netfilter掛鉤中擴展數據包標頭

這是實現我的目標的唯一方法嗎?有沒有更有效的解決方案?除了IP重組代碼之外,還有其他skb_morph用例嗎?

回答

1

這個工作對我來說,在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; 

希望它能幫助。

+0

謝謝弗雷德。它適用於較小的更正:pskb_expand_head在成功時回覆0。所以檢查應該改爲if(0!= pskb_expand_head(skb,sizeof(struct iphdr) - skb_headroom(skb),0,GFP_ATOMIC))。 – Gandhar 2011-06-21 10:10:20

+0

我忘了添加一些東西到這個職位。我使用了kfree_skb,因爲我正在返回NF_STOLEN。你可以返回NF_DROP,但是你不能釋放skb。 NF_DROP會告訴應用程序數據包未能發送。但NF_STOLEN不。 – Fred 2011-06-21 16:03:52