天天看點

linux核心網卡中斷收發包

1、網卡中斷收發包上半部注冊

        1.1、網卡驅動調用request_irq(dev->irq, i596_interrupt, 0, "i82596", dev)函數申請中斷号并傳入中斷上半部處理函數;

        1.2、request_irq将網卡驅動注冊的中斷号和中斷上半部處理函數添加到ino_buket中斷連結清單;

2、中斷上半部的執行

        2.1、cpu在收到硬體發出的中斷時,通過在ino_buket中斷連結清單查找對應中斷号的中斷上半部處理函數并執行;

        2.2、中斷上半部處理函數讀取網卡寄存器狀态:

                a、若為發包中斷:

                        1、讀取發包狀态,發包成功調dev_kfree_skb_irq置位發包中斷下半部标志,發包失敗進行統計計數後調dev_kfree_skb_irq置位發包中斷下半部标志;

                         2、清除硬體中斷标記;

                b、若為收包中斷:

                         1、讀取收包狀态:若網卡硬體收包成功,申請skb_buffer,将網卡硬體中的包拷貝到skb并在skb中記錄網卡裝置和以太協定類型後調netif_rx;

                         2、netif_rx函數

                                 a、若為輪詢收包調輪詢收包接口進行收包後釋放skb;

                                 b、若為中斷收包,中斷收包隊列有空閑空間将skb入隊到中斷收包隊列後退出;若中斷收包隊列無空

繼續閱讀