(基于linux-2.6.x)
从代码上看,Linux对VLAN的处理方式如下。
1. vlan的处理,主要是依靠网卡本身。
有的网卡不支持vlan,如老的3com网卡3c501。
intel的ixgb(PRO/10GbE)和e1000(PRO/1000)网卡是支持vlan的。
其他的一些网卡驱动,从代码上来看,还未完整支持。
例如,有个网卡驱动(源码文件:drivers\net\spider_net.c),
vlan相关代码上的注释上说,/* further enhancement... yet to do */
2. 网卡对vlan的处理
VLAN tag插入/移除 都是由网卡完成的。
vlan报文的过滤也是由网卡完成的。
Linux协议栈通过驱动中的接口,注册vlan相关信息。
驱动再将这些信息写到芯片中。
rtl8169_rx_vlan_tag(desc, skb);
从代码上看,Linux对VLAN的处理方式如下。
1. vlan的处理,主要是依靠网卡本身。
有的网卡不支持vlan,如老的3com网卡3c501。
intel的ixgb(PRO/10GbE)和e1000(PRO/1000)网卡是支持vlan的。
其他的一些网卡驱动,从代码上来看,还未完整支持。
例如,有个网卡驱动(源码文件:drivers\net\spider_net.c),
vlan相关代码上的注释上说,/* further enhancement... yet to do */
2. 网卡对vlan的处理
VLAN tag插入/移除 都是由网卡完成的。
vlan报文的过滤也是由网卡完成的。
Linux协议栈通过驱动中的接口,注册vlan相关信息。
驱动再将这些信息写到芯片中。
因此,网卡驱动从网卡接收队列中收到的报文,已经不带VLAN tag了。
下面是r8169.c网卡驱动收到报文后,做的部分处理。
由于驱动收到的报文,已经不带vlan tag,因此skb->protocol的值就是普通的以太网类型。
skb->protocol = eth_type_trans(skb, dev);rtl8169_rx_vlan_tag(desc, skb);