open_softirq建立型別與handler的對應關係。
void open_softirq(int nr, void (*action)(struct softirq_action*), void *data)
netif_rx將收到的包放到softnet_data的input_pkt_queue中,之後呼叫netif_rx_schedule(&queue->backlog_dev)將裝置加入poll_list佇列。netif_rx_schedule中呼叫設定軟中斷對應標誌位。
do_irq中斷處理結束處,呼叫irq_exit(),其中判斷當cpu沒有處理中斷,並且存在要執行的bh時(檢查之前設定的標記),呼叫invoke_softirq。invoke_softirq就是do_softirq。do_softirq檢查存在掛起的軟中斷,則呼叫__do_softirq。其中呼叫open_softirq中註冊的action函式處理,在處理過程中可以有新的軟中斷被設定,這些軟中斷也會被處理,直到處理完或者超過規定的次數,如果超過了次數而還有未處理的軟中斷,則會啟動ksoftirqd程序處理剩餘的軟中斷。
接收資料的軟中斷處理函式為net_rx_action(),**用poll_list佇列中註冊的poll函式,對於收包來說是process_backlog(在net_dev_init中註冊)。
queue->backlog_dev.poll = process_backlog;
process_backlog從queue->input_pkt_queue中取出skb並呼叫netif_receive_skb(skb)。
存在兩個鍊錶
static struct list_head ptype_base[16]; /* 16 way hashed list */
static struct list_head ptype_all; /* taps */
協議呼叫dev_add_pack時會將packet_type加入相應佇列。在netif_receive_skb中會遍歷這兩個佇列,呼叫deliver_skb。deliver_skb()呼叫packet_type中指定的函式通知相應協議處理skb。對於ip4,這個函式就是ip_rcv。
對於napi,不使用softnet_data中的input_pkt_queue,而是使用裝置維護的私有佇列。netrx_if也是針對非napi。napi方式中poll_list是裝置鍊錶,poll函式由各裝置提供。對於非napi,poll_list中只有乙個裝置,就是softnet_data中的backlog_dev,也被稱為偽裝置,它的poll函式是process_backlog。l
isis receive 收包流程
如下 int isis receive struct thread thread 主要流程 1 收包 rx,呼叫註冊的處理函式,例如isis receive bcast p2p 2 處理報文 handle 3 處理下乙個 read on 處理報文的邏輯如下,static int isis handl...
硬中斷和軟中斷
中斷是一種電訊號,當裝置有某種事件發生時,它就會產生中斷,通過匯流排把電訊號傳送給中斷控制器。如果中斷的線是啟用的,中斷控制器就把電訊號傳送給處理器的某個特定引腳。處理器於是立即停止自己正在做的事,跳到中斷處理程式的入口點,進行中斷處理。由與系統相連的外設 比如網絡卡 硬碟 自動產生的。主要是用來通...
jrtplib V3 11 1 收包流程
最近在看 jrtplib的收包流程,看了這篇文章 jrtplib接收資料報流程 只是用的庫老了點 v3.7 的,寫的也太長了,不夠簡練,於是自己寫乙份 v3.11.1的簡練點的收包流程說明,撿重點,無關的流程略過。rtp包的接收入口函式 int rtpsession poll 流程 一 的剖析 說明...