2013-05-18 142 views
1

當與內核模塊代碼的sk_buff處理,我看到很多代碼示例使用兩種sk_buff上的ip_hdr()是否可以保證正常工作?

(struct iphdr *)skb_network_header(skb) //skb is an instance of (struct sk_buff*) 

或功能ip_hdr(),這是真的一樣(調用skb_network_header和鑄造)。這安全嗎?如果我們對sk_buff來自哪裏沒有任何假設,是否可以通過檢查來確保網絡協議確實是IP?

編輯:這可能是由於可以有一個sk_buff唯一可能的網絡協議是IP,但我仍然希望看到一個「證明」或解釋。例如,如果我在Linux內核中實現自己的協議,並且網絡協議頭可能是其他內容?我如何確保網絡傳輸協議確實是IP?

回答

0

回答我自己,因爲當時我找到了一個更全面的答案。

可以通過sk_buff結構的'protocol'字段來確保協議是IP。例如:

if (skb->protocol != htons(ETH_P_IP)) return ERROR_NOT_IP; //ERROR_NOT_IP defined by me 

struct iphdr* ip_header = ip_hdr(skb); //Now that we know the protocol we can use ip_hdr() 
0

skb引用套接字緩衝區,這是用於表示和管理Linux內核中數據包的數據結構。
而Linux網絡系統的實現是獨立於特定協議而設計的。
Socket buffer in Linux Kernel network system會給你更多的細節。

對你的問題:
調用skb_network_header()的調用者應該保證他知道協議。證明:你可以找到很多對skb_network_header()的引用,包括arp_hdr(),ipv6_hdr(),ip_hdr()等。調用arp_hdr()來將網絡頭部轉換爲aprhdr的調用者將保證協議是ARP。

相關問題