Linux 接受数据包过程

数据包到达产生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处理函数中,取出数据包并处理。
在这里插入图片描述

4.netif_receive_skb调用deliver_skb将报文传给正确的协议处理函数。
pt_prev = pakcet_type,处理函数即IP的处理函数或者ARP处理函数等。
在这里插入图片描述

此时设备缓冲区的数据已经被拷贝到内存中,即每个设备文件内,下面解释IP的接受处理过程
在这里插入图片描述

其中先取出一个数据包,然后ip_rcv_finish。
在这里核心是查找路由,判断是本地还是远端等,然后des_input执行转发或者deliver到上层。
在这里插入图片描述

这里关注ip_local_deliver,首先判断分片
在这里插入图片描述在这里插入图片描述

在这里调用了协议的处理函数,与初始化串起来。

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值