- 论坛徽章:
- 0
|
最近看内核代码的关于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处理,这是怎么回事?
|
|