我正在實現一個IP頭壓縮協議作爲一個可加載的內核模塊,它需要一個IPv4頭文件並將其壓縮爲較小的頭文件(我們稱之爲「iphc」頭文件)。完成壓縮IP頭的Xmit
爲此,對於傳出數據包,我使用了netfilter鉤子在路由決策完成後抓取數據包。然後,我想用IPHC標頭(壓縮IP)替換IP標頭,將ethertype改爲別的東西,將它從堆棧(以太網)發送出去。從我所看到的情況來看,當我在NF_IP_POST_ROUTING
掛鉤處攔截數據包時,MAC頭還沒有被添加。
的幾個問題,我有:
鑑於我是更換IP報頭,將影響到以太網的找到MAC硬件地址的能力?我在
ip_finish_output2()
函數中看到,它們採用skbuff中的dst值(使用skb_dst()
函數)在鄰居表中搜索ARP條目。如果我只是用IPHC頭換出IP頭並更改協議,ARP查找是否會失敗?我認爲我沒有碰過skbuff中的「dst」字段。對於我來說,僅僅用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;
我在這裏失去了一些東西?謝謝!