linux核心--網絡卡接收資料包的函式呼叫關係
阿新 • • 發佈:2019-01-05
網絡卡中斷函式 e1000_intr()
-------->加入napi連結串列 __napi_schedule()
-------->啟動napi軟中斷 __raise_softirq_irqoff()
-------->軟中斷處理函式 net_rx_action()
-------->取napi連結串列節點,並針對該網絡卡輪詢收包 poll()
-------->輪詢完成 napi_complete()
-------->若有網絡卡組包功能及進行組包 napi_gro_complete()
-------->網絡卡接收完成,傳遞到協議棧netif_receive_skb()
-------->__netif_receive_skb()
-------->__netif_receive_skb_core()
-------->查詢所有的網路協議處理函式 list_for_each_entry_rcu(ptype, &ptype_all, list) ,由dev_add_pack註冊
-------->傳遞給協議處理函式 deliver_skb()
-------->進入一個協議處理函式atomic_inc(&skb->users)加一,釋放kfree_skb(skb)減一,最後一次真正釋放空間__kfree_skb
-------->加入napi連結串列 __napi_schedule()
-------->啟動napi軟中斷 __raise_softirq_irqoff()
-------->軟中斷處理函式 net_rx_action()
-------->取napi連結串列節點,並針對該網絡卡輪詢收包 poll()
-------->輪詢完成 napi_complete()
-------->若有網絡卡組包功能及進行組包 napi_gro_complete()
-------->網絡卡接收完成,傳遞到協議棧netif_receive_skb()
-------->__netif_receive_skb()
-------->__netif_receive_skb_core()
-------->查詢所有的網路協議處理函式 list_for_each_entry_rcu(ptype, &ptype_all, list) ,由dev_add_pack註冊
-------->傳遞給協議處理函式 deliver_skb()
-------->進入一個協議處理函式atomic_inc(&skb->users)加一,釋放kfree_skb(skb)減一,最後一次真正釋放空間__kfree_skb