在資料報接收過程的那篇筆記中可以知道,在資料報的處理函式netif_receive_skb中,會先看ptype_all中是否有註冊的協議,如果有,則呼叫相應的處理函式,然後再到ptype_base中,找到合適的協議,將skb傳送到相關協議的處理函式.比如ip協議(ip_rcv)或者arp(arp_rcv)等等.此篇筆記講的是有關ptype_all和ptype_base的相關知識點.
ptype_base和ptype_all在核心中儲存的情況如下圖:
可以看到,ptype_base為乙個hash表,而ptype_all為乙個雙向鍊錶.每乙個裡面註冊的協議都用乙個struct packet_type表示.
struct packet_type
;
其中需要注意的是dev引數,此引數表明了協議只處理來自dev指向device的資料,當dev=null時,表示該協議處理來自所有device的資料.這樣,當註冊自己的協議時,就可以指定自己想要監聽或者接收的device.
其中註冊和登出協議的函式為:
dev_add_pack(...)和dev_remove_pack(...)
這兩個函式很簡單,分別如下:
void dev_add_pack(struct packet_type *pt)
#endif
if (pt->type == htons(eth_p_all)) else
br_write_unlock_bh(br_netproto_lock);
}
此函式判斷協議型別,然後加到ptype_base或者ptype_all中.
void dev_remove_pack(struct packet_type *pt)
else
for (; (*pt1) != null; pt1 = &((*pt1)->next))
}br_write_unlock_bh(br_netproto_lock);
printk(kern_warning "dev_remove_pack: %p not found.\n", pt);
}
此函式也很簡單,只是把協議從相關的鍊錶中移除.
下面以ip協議為例子來看看相關的實現:
ip協議結構體的定義如下:
static struct packet_type ip_packet_type =
;
當ipv4協議棧初始化時,會呼叫ip_init.之後,所有協議型別為eth_p_ip的包都會交由ip_rcv處理.**如下:
void __init ip_init(void)
這樣在系統啟動之後,ip協議便被註冊到ptype_base鍊錶中,相應的處理函式為ip_rcv.
arp協議和其他型別的協議(在ptype_base或者ptype_all中的)的執行過程同理.
本人初學網路,水平很菜,如有錯誤,希望看到的朋友們及時指出,不勝感激.
ps1:記得剛來實驗室的時候,做的截包模組的第一種方法是用的netfilter,第二種方法主要就是用到的這塊知識.現在總結起來,覺得還算簡單,當初卻用了很長時間,想想,真是難者不會,會者不難啊.今天看書的時候,好像又發現了另外一種方法可以實現我的要求,記錄在ps2上.
ps2:在資料鏈路層截包的另一種方法:用pf_packet socket type.linux可以用此型別套節字直接從鏈路層截獲或者注入資料.傳送資料時,直接傳送到dev_queue_xmit.而接收函式時,可以在資料報通過路由之前截獲到.如tcpdump和ethereal都是用到了此套接字.那麼總結起來可以看出,截獲資料報至少可以有三種方法實現,第一種的netfilter是在協議棧中截獲資料報,而利用ptype_all或者ptype_base和後面這種套節字的方法是在鏈路層截獲資料報.
kernel網路協議棧初始化
kernel的網路初始化順序 core initcall sock init fs initcall inet init subsys initcall net dev init device initcall 裝置驅動初始化 網路基礎系統初始化 第一步,使用core initcall初始化巨集修飾...
ZigBee協議棧初始化網路啟動流程
zigbee的基本流程 由協調器的組網 建立pan id 終端裝置和路由裝置發現網路以及加入網路。1.1 進入程式入口main zmain.c中 c code int main void main 1.2 給任務新增id sapi.c中 c code 1.3 初始化zigbee協議棧網路 c cod...
網路引數初始化
神經網路一般依靠隨機梯度下降法進行模型訓練和引數更新,網路的最終效能與收斂得到的最優解直接相關,而收斂效果實際上又很大程度取決於網路引數最開始的初始化。理想的網路引數初始化使模型訓練事半功倍,相反,糟糕的初始化方案不僅會影響網路收斂甚至會導致 梯度瀰散 或 致使訓練失敗。因此我們應選擇合適的初始化方...