admin管理员组

文章数量:1642498

数据包到达产生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