2

我正在實現一個IP頭壓縮協議作爲一個可加載的內核模塊,它需要一個IPv4頭文件並將其壓縮爲較小的頭文件(我們稱之爲「iphc」頭文件)。完成壓縮IP頭的Xmit

爲此,對於傳出數據包,我使用了netfilter鉤子在路由決策完成後抓取數據包。然後,我想用IPHC標頭(壓縮IP)替換IP標頭,將ethertype改爲別的東西,將它從堆棧(以太網)發送出去。從我所看到的情況來看,當我在NF_IP_POST_ROUTING掛鉤處攔截數據包時,MAC頭還沒有被添加。

的幾個問題,我有:

  1. 鑑於我是更換IP報頭,將影響到以太網的找到MAC硬件地址的能力?我在ip_finish_output2()函數中看到,它們採用skbuff中的dst值(使用skb_dst()函數)在鄰居表中搜索ARP條目。如果我只是用IPHC頭換出IP頭並更改協議,ARP查找是否會失敗?我認爲我沒有碰過skbuff中的「dst」字段。

  2. 對於我來說,僅僅用IPHC頭替換IP頭,改變Ethertype並將它發送回堆棧就足夠了嗎?或者我應該發送它自己直接沒有它返回到ip_finish_output2

出於某種原因,如果我做的#2,我的代碼崩潰。下面是我想要做的後,我鉤到NF_IP_POST_ROUTING網絡過濾器鉤子(SKB在通過)的樣本:

struct iphc *my_hdr; 

/* stripping the IPv4 header from skbuff */ 
skb_pull(skb, sizeof (struct iphdr)); 

/* adding my header skb */ 
skb_push(skb, IPHC_HDR_SIZE); 

/* reset network header */ 
skb_reset_network_header(skb); 

my_hdr = (struct iphc *)skb; 

my_hdr->field1 = 1; 
my_hdr->field2 = 2; 

/* change ethertype */ 
skb->protocol = __constant_htons(ETH_P_IPHC); 

return NF_ACCEPT; 

我在這裏失去了一些東西?謝謝!

回答

0

skb_pull()和skb_push()不能在不知道skb-> data當前指向的位置的情況下使用。

當分組在NF_IP_POST_ROUTING截獲,最有可能的是skb->數據所指向的框架,這也是MAC報頭的開頭的開始。

因此,在進行任何skb_push()操作之前,您應該先使用skb_pull()先取出MAC頭,然後取出IP頭。然後將數據(MAC + IPHDR)縮減爲(MAC + IPHC)和skb_push()組合的(MAC + IPHC) - 或者您可以先推送IPHC然後再推送MAC。

有關這些skb函數的詳細信息,請參閱skbuff.h,可以在skb上找到一個很好的教程here