免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1739 | 回复: 6
打印 上一主题 下一主题

一个内核网络数包处理的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-02 17:37 |只看该作者 |倒序浏览
这个问题困扰我很久了

(中间略去细节)
  每个cpu都有一个专门的数据结构softnet_data保存了网卡接收的skb链表input_pkt_queue,和等设备的积压队列 poll_list。
每当中断产生时,如果积压队列poll_list不为空时会轮询调用每个网卡的poll处理函数(非napi方式为 process_backlog处理)。
netif_receive_skb()将数据包传上协议栈,如果设备自身注
process_backlog将取出input_pkt_queue队头的数据加以处理(netif_receive_skb()将数据包传上协议栈),并进行配额值计算来判断是否超出。
我的问题是,怎样将input_pkt_queue中的数据包的接收设备与poll_list设备对应起来,来判断是否为该poll_list的设备接收的包。难道无论是否为本网卡接收的包,他也一并处理

论坛徽章:
0
2 [报告]
发表于 2010-06-02 17:43 |只看该作者
只是在input_pkt_queue没有包时,才将设备从poll_list中删除。
很是费解!

论坛徽章:
0
3 [报告]
发表于 2010-06-02 17:55 |只看该作者
按照程序 的处理来看,它只是顺序处理了input_pkt_queue头中的数据包,而不管此包是否为自己接收。

论坛徽章:
0
4 [报告]
发表于 2010-06-02 18:01 |只看该作者
napi方式是不用input_pkt_queue队列的,因此不存在你所疑惑的问题

论坛徽章:
0
5 [报告]
发表于 2010-06-02 18:25 |只看该作者
感谢4楼回复
这里讨论的是非napi的方式,
是否在调用设备的poll函数处理input_pkt_queue中的数据时,不会判断包是否为自己接收

论坛徽章:
0
6 [报告]
发表于 2010-06-03 09:54 |只看该作者
回复 5# xiapan83


    对于非NAPI方式的处理,当数据包添加到input_pkt_queue队列时,它的dev已经确定,因此softnet_data结构的中的backlog_dev,它只是用于非NAPI驱动的虚拟网络设,不代表具体的网络设备。通过该虚拟网络设备的poll回调函数(process_backlog)在接收报文软中断中,从非NAPI的接口层缓存队列input_pkt_queue中获取报文向上层传递,并不存在对应的关系,即所有非NAPI方式都由process_backlog()处理。

论坛徽章:
0
7 [报告]
发表于 2010-06-03 15:06 |只看该作者
感谢lmarsin,我大概了解了。这部分我再仔细分析 一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP