linux内核--网卡接收数据包的函数调用关系

网卡中断函数 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

你可能感兴趣的:(网络协议)