數據包網卡驅動到網絡層的大體流程
發表于:2007-07-04來源:作者:點擊數:
標簽:
java script:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)"> Re: 請問網卡驅動是怎么向ip層返回數據的??(重發) [ re: wheelz ] 網卡接收到數據,先申請sk_buff,把數據DMA到sk_buff,然后調用netif_rx,把數據包
javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)"> Re: 請問網卡驅動是怎么向ip層返回數據的??(重發) [re: wheelz] | |
|
網卡接收到數據,先申請sk_buff,把數據DMA到sk_buff,然后調用netif_rx,把數據包加入隊列。此后的處理就與網卡無關了。
后續處理是在softirq中(以前叫bottom_half)。每次中斷返回前內核會檢查softirq隊列。對于網絡數據包接收,會調用處理函數net_rx_action。(初始化網絡的時候在net_dev_init函數中將NET_RX_SOFTIRQ指向了net_rx_action,請查閱代碼)。 (注意:以上處理過程是常規的方法?,F在一般采用POLL方法,處理過程會有所不同)
net_rx_action ---> process_backlog ----> netif_receive_skb
在netif_receive_skb中根據注冊的網絡協議調用相關接口。對于IP協議就是ip_rcv,開始數據包的IP層之旅。
下面就到了PRE_ROUTING的HOOK點了。接著就是找路、判斷是LOCAL_IN還是FORWARD、按各自的方式處理。
|
原文轉自:http://www.kjueaiud.com