数据包网卡驱动到网络层的大体流程
发表于: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,请查阅代码)。 (注意:以上处理过程是常规的方法。现在一般采用POLL方法,处理过程会有所不同)
net_rx_action ---> process_backlog ----> netif_receive_skb
在netif_receive_skb中根据注册的网络协议调用相关接口。对于IP协议就是ip_rcv,开始数据包的IP层之旅。
下面就到了PRE_ROUTING的HOOK点了。接着就是找路、判断是LOCAL_IN还是FORWARD、按各自的方式处理。
|
原文转自:http://www.ltesting.net