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、按各自的方式处理。