免费注册 查看新帖 |

Chinaunix

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

[网络子系统] vlan tag是在内核还是网卡驱动的时候剥掉的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-26 08:30 |只看该作者 |倒序浏览
最近看内核代码的关于vlan 部分,有个地方没搞明白:

按照网上的说法,对于那些支持vlan的网卡,是由物理网卡来进行vlan tag的添加删除,对于那些不支持vlan的网卡,如果收到带vlan tag的报文,则直接丢弃。

拿intelIntel Corporation 82576 Gigabit Network Connection 这块网卡来说,函数igb_process_skb_fields()中确实有对vlan的处理__vlan_hwaccel_put_tag()。但是这里有两个问题: 如果网卡不支持vlan,是在哪段代码里决定丢掉的? 如果网卡支持vlan,那么刚才的处理函数中并没有对skb->data的指针处理,也就是说报文还是完整的,送到kernel去的报文还是带了vlan tag?

另外一处是内核中的,按照这个函数__netif_receive_skb_core的处理,只要报文带了vlan tag(0x8100或是0x88a,都会调用函数vlan_untag,那岂不是意味着内核是默认能接收带vlan tag的报文,而且默认会把tag剥掉?

还有,vlan_tx_tag_present这个函数到底代表了什么意思? 按照这个函数的字面意思,应该是去检查CFI/DEI这个bit,可是这个bit的意思是说mac是否是标准格式或者要不要丢弃这个报文(DEI, 802.1AD),但是看代码里用它来判断要不要做vlan处理,这是怎么回事?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2014-09-27 12:45 |只看该作者
回复 1# eaglec83
对于那些不支持vlan的网卡,如果收到带vlan tag的报文,则直接丢弃。

如果内核支持vlan,是不会丢弃的,硬件不做软件可以做。

如果网卡不支持vlan,是在哪段代码里决定丢掉的?

802.1q的协议号和IP协议号不一样,如果内核没有按装VLAN的模块,找不到对应的上层协议就被内核丢弃罗。

如果网卡支持vlan,那么刚才的处理函数中并没有对skb->data的指针处理,也就是说报文还是完整的,送到kernel去的报文还是带了vlan tag?

这个没法答你。因为没有接触过这类网卡,不过理论上,应该是网卡送上来的报文已经没有VLAN标记了,最起码协议号应该已变回IP的协议号了。

那岂不是意味着内核是默认能接收带vlan tag的报文,而且默认会把tag剥掉?

是的,只要打开内核的802.1q模块,内核本身可以通过软件去处理。


还有,vlan_tx_tag_present这个函数到底代表了什么意思? 按照这个函数的字面意思,应该是去检查CFI/DEI这个bit,可是这个bit的意思是说mac是否是标准格式或者要不要丢弃这个报文(DEI, 802.1AD),但是看代码里用它来判断要不要做vlan处理,这是怎么回事?

硬件处理流程相关的,我没法答你。

网络经验不多,有什么疑问,请其它网友补充吧。




   

论坛徽章:
0
3 [报告]
发表于 2014-09-28 13:00 |只看该作者
恩,前两天又把相关的代码读了一遍,tinnal的解释很合理,我也觉得应该是这样的
唯一的就是我没看到网卡驱动代码里对vlan tag处理的地方,intel igb系列的网卡,如果报文是带vlan tag的,网卡的staterr标记位里会置E1000_RXD_STAT_VP,此时的报文应该就已经不带vlan  tag了
不过这个标志位我一直没找到置位的地方

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
4 [报告]
发表于 2014-09-28 19:08 |只看该作者
大家怎么都不好好看代码了呢?


你在代码里搜索一下E1000_RXD_STAT_VP不就能找出来了吗。

就在igb_clean_rx_irq_adv函数里就有判断。

为发防止你再问,给你百度了一篇文章出来。
http://blog.csdn.net/crazycoder8848/article/details/17075455

如果还不够,请自己google去。

论坛徽章:
0
5 [报告]
发表于 2014-09-28 20:53 |只看该作者
这份文档我之前就已经看了
这个标志位确实没找到,还是用grep在整个linux源代码里搜索的
我是需要看哪里置位的,不是用的地方
估计我们看的内核版本不是同一个,我看的 3.14.19版本

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
6 [报告]
发表于 2014-09-28 22:00 |只看该作者
回复 5# eaglec83


    这是3.14的标准内核代码的。
http://lxr.free-electrons.com/so ... main.c?v=3.14#L6883

如果你的代码和它的不一样,那就是你们自己改过igb的代码,把它给改没了。

这代码一直到3.16都还有:
http://lxr.free-electrons.com/so ... gb/igb_main.c#L6974
除非你们自己删了,不然不可能没有。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
7 [报告]
发表于 2014-09-28 22:36 |只看该作者
回复 5# eaglec83

抱歉,刚看到你写的是:
我是需要看哪里置位的,不是用的地方


你是不是平常不怎么开发驱动?
这类问题,驱动工程师很熟。
整个e1000_adv_rx_desc都不是由软件去设的,而是由网卡硬件去设的。因此你搜不到设它的地方。

建议你去百度一下一些网卡驱动的分析文档看看。你也可以到intel网站下一些官网的网卡手册看看。


   

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
8 [报告]
发表于 2014-09-28 22:50 |只看该作者
intel的手册也给你找了:
http://www.intel.com/content/www ... troller-manual.html
具体到你的内容,请看5.3.4节。

如果想学好,老老实实就看手册。不要害怕,看不下去就一天只看一两章。看得多了就不再排斥了。一个合格的驱动工程师的基本能力。

论坛徽章:
0
9 [报告]
发表于 2014-09-29 09:53 |只看该作者
谢谢tinnal
我确实不是做驱动的,只是最近搞个项目,我想研究一下vlan到底是网卡剥掉的还是内核剥掉的,
内核收到不同的报文对我后续的处理可能有影响
回复 8# Tinnal


   

论坛徽章:
0
10 [报告]
发表于 2014-09-29 10:00 |只看该作者
文档里确实很详细,刚看了5.3.3.5, 应该是在硬件部分就剥掉vlan tag了,信息会被存储起来
不过这样有另外一个问题,tcpdump应该是内核收包的时候做的,既然skb数据里的vlan 信息已经没有了,为什么tcpdump还能dump到带vlan的报文?难道是tcpdump自己会用skb->vlan_tci重组报文?
回复 8# Tinnal


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP