免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2717 | 回复: 6

[网络子系统] netif_receive_skb()没看明白,请教一下 [复制链接]

论坛徽章:
0
发表于 2017-03-07 14:55 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2017-03-07 16:24 |显示全部楼层
那些handle_XXX的代码如果想让包处理流程结束的话,都得显式的处理pt_prev。

把代码写成这样就是为了在normal case下避免无谓的skb copy/clone,或者说节省一次skb_free。

论坛徽章:
0
发表于 2017-03-07 16:59 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2017-03-09 10:33 |显示全部楼层
回复 3# ymc4444

看内核代码一定要联系上下文环境,二楼已经说的很清楚了,静下心来捋一捋代码,不要着急,你就会发现:
后续那些handle_ing(skb, &pt_prev, &ret, orig_dev),handle_bridge(skb, &pt_prev, &ret, orig_dev)和handle_macvlan(skb, &pt_prev, &ret, orig_dev)接口都都把pt_prev作为两级指针传进去了,然后你再进到每个handle_XXX()里面去,看看它们是在干什么就全都明白了。你真当kernel大牛们是在随便设计内核API和它们的参数的么?

最后,二楼的后半句“把代码写成这样就是为了在normal case下避免无谓的skb copy/clone,或者说节省一次skb_free。”你自己再去体会体会。。。

论坛徽章:
0
发表于 2017-03-28 22:41 |显示全部楼层
http://bbs.chinaunix.net/thread-1933943-1-1.html 可以参考这个, 个人觉得pt_prev语义上还是针对prev(vious), 有点"匹配上一个"的意思 (注意add 一个entry到ptype_all是"add to head"), 更认同这个帖子三楼@卖萌犯法的回答

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2017-04-06 17:00 |显示全部楼层
自定义的ptype函数跟强制插入/内联的函数(handle_xxx)有本质的不同,
前者得到数据包的copy,不影响原始报文的流程(最后一个ptype[type]是终结点);
后者可以终止整个data path(跳过所有的ptype[type],但要保证所有的ptype[ALL]被调用——比如tcpdump依赖的af_packet)。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2017-04-17 16:29 |显示全部楼层
回复 1# ymc4444


之所以这样写的原因是:

1、协议处理程序会在处理完毕后调用kfree_skb()函数准备释放该skb,因此会导致skb->users减1

2、因为可能存在多个协议处理程序,所以前一个ptype会在处理完毕进行kfree_skb,于是就需要借助deliver_skb来增加一下skb->users的计数,否则后面的ptype就没有机会了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP