資料報在Linux中的流程

2021-08-21 23:30:43 字數 1198 閱讀 7697

1.中斷處理函式中:

網絡卡收到一幀------------------------〉

引發中斷-------------------〉

cpu呼叫相應的中斷處理函式(指向此網絡卡驅動中的相應的處理函式)(把此packet讀到ram中)--------------------〉

呼叫netif_rx函式來打上timestamp,並把此skb放入到cpu設定的佇列中-----------------〉

標記軟中斷(__cpu_raise_softirq)---------------------〉中斷完成。

2.當軟中斷被呼叫時(一共在三個地方呼叫),呼叫net_rx_softirq(其實就是net_rx_action()函式)來處理網路方面的軟中斷。-----------------〉

net_rx_action()根據資料報的協議型別在陣列ptype_base[16]裡找到相應的協議,並從中知道了接收的處理函式,然後把資料報交給處理函式,這樣就交給了上層處理,實際呼叫處理函式是通過net_rx_action()裡的pt_prev->func()這一句。例如如果資料報是ip協議的話,ptype_base[eth_p_ip]->func()(ip_rcv()),這樣就把資料報交給了ip協議。根據包的型別,查詢系統中註冊了的相應的包處理函式,對於ipv4的ip包,呼叫ip_rcv-------------〉

nf_ip_pre_routing--------------〉

ip_rcv_finish(進行對此包的路由操作)---------------------〉

根據路由的結果,呼叫ip_local_deliver(給本機的包)/ip_forwardd(要**的包)/ip_error()(出現錯誤的包)/ip_mr_input()(多播包的處理)ip_forward:要進行**的包,check ttl, mtu, call nf_ip_forwards,--------------〉

ip_forwmard_finish(check other ip options for forwardd!)-------------------〉

ip_send(如果需要分片,則呼叫ip_fragment,否則呼叫ip_finish_output()(call nf_ip_post_routing,然後時ip_finish_output2(填充鏈路層頭部到skb結構中)--------------〉

hh->hh_output/dsr->neighbour->output

Linux核心資料報處理流程 資料報接收 2

四 網絡卡的資料接收 核心如何從網絡卡接受資料,傳統的經典過程 1 資料到達網絡卡 2 網絡卡產生乙個中斷給核心 3 核心使用i o指令,從網絡卡i o區域中去讀取資料 我們在許多網絡卡驅動中,都可以在網絡卡的中斷函式中見到這一過程。但是,這一種方法,有一種重要的問題,就是大流量的資料來到,網絡卡會...

Linux核心資料報處理流程 資料報接收 3

五 佇列層 1 軟中斷與下半部 當用中斷處理的時候,為了減少中斷處理的工作量,比如,一般中斷處理時,需要遮蔽其它中斷,如果中斷處理時間過長,那麼其它中斷 有可能得不到及時處理,也以,有一種機制,就是把 不必馬上處理 的工作,推遲一點,讓它在中斷處理後的某乙個時刻得到處理。這就 是下半部。下半部只是乙...

資料報在不同網段上的傳輸流程

對於資料報在不同網段上傳輸這一問題,lz參考一些資料,覺得用資料報源目標位址狀態的變化能更直觀的表示這一流程的進行,以下lz用乙個例子描述這一過程。pc1 r1 r2 webserver pc1 為網路a中的一台主機,webserver為網路b中的web伺服器,路由器r1 r2分別為網路a b的閘道...