admin管理员组文章数量:1642218
数据包到达产生PKT arrive中断,某驱动程序的中断服务例程响应中断。
1.当中断到来,首先判断是否报文接收中断,如果是那么必定完成如下工作:
skb=dev_alloc_skb(GFP_ATOMIC)
skb->protocol=eth_type_trans(skb,dev)
2.触发软中断,ISR返回
首先通过netif_rx从设备驱动程序中收到一个报文
在enqueue_to_backlog中,这块的意思是,先判断是否队列不空,如果队列中还有报文,那么先把收到的报文挂到队列中,然后就返回,因为软中断已经开启了。如果队列为空,开启软中断,然后再enqueue操作。
在开启软中断函数中,标记一个软中断的产生。软中断被处理的时机,一个是中断发生的时候,一个是系统发生进程调度的时刻,当可以处理软中断的时候,系统会检查NET_RX_SOFTIRQ软中断,若有则调用net_rx_action。
这个软中断在net/core/dev.c/net_dev_init()中
3.软中断调用设备定义poll函数,接收报文。
在net_rx_action中,调用poll来处理报文
如果设备就是backlog_dev,就会调用process_backlog,在net_dev_init中初始化
在poll处理函数中,取出数据包并处理。
4if_receive_skb调用deliver_skb将报文传给正确的协议处理函数。
pt_prev = pakcet_type,处理函数即IP的处理函数或者ARP处理函数等。
此时设备缓冲区的数据已经被拷贝到内存中,即每个设备文件内,下面解释IP的接受处理过程
其中先取出一个数据包,然后ip_rcv_finish。
在这里核心是查找路由,判断是本地还是远端等,然后des_input执行转发或者deliver到上层。
这里关注ip_local_deliver,首先判断分片
在这里调用了协议的处理函数,与初始化串起来。
版权声明:本文标题:Linux 接受数据包过程 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729331945a1196500.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论