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