现在的位置: 首页 > 综合 > 正文

16.3.2 接收网络数据recv()

2013年10月10日 ⁄ 综合 ⁄ 共 505字 ⁄ 字号 评论关闭

16.3.2  接收网络数据recv()

网络数据接收依次经过网卡驱动和协议栈程序,以DM9000A网卡为例进行介绍接收数据的过程。

如图16.11所示,网卡在一个数据包到来时,会产生一个硬中断,网络驱动程序会执行中断处理过程:首先申请一个skb结构及pkt_len+5大小的内存用于保存数据,然后便将接收到的数据从网卡复制到这个skb的数据部分中。当数据从网卡中成功接收后,调用netif_rx(skb)进一步处理数据,将skb加入到相应的input_pkt_queue队列中,并调用netif_rx_schedule(),会产生一个软中断来执行网络协议栈的例程。这样,中断的上半部已完成,以下的工作则交由中断的下半部来实现。

如图16.12所示,下半部的内核守护线程do_softirq(),将执行net_rx_action(),对数据进行处理。IP层输入处理程序轮询处理输入队列中的每个IP数据,在整个队列处理完毕后返回。IP层验证IP首部的校验和,处理IP选项,验证IP主机地址和正确性等,并调用相应协议(TCP或者UDP等)处理程序。接收的进程在网络协议栈处理完毕后会收到唤醒的信号,并收到发送来的网络数据。

抱歉!评论已关闭.