+ -
当前位置:首页 → 问答吧 → 协议栈对VLAN(8021Q)处理的问题?

协议栈对VLAN(8021Q)处理的问题?

时间:2007-06-19

来源:互联网

1,普通报文进入VLAN端口,不会带有VLAN tag,这样就不会流向vlan_skb_recv(),那么,系统在那里检查数据报应该走的VLAN信息?

2,报文发送的时候,怎么调用到vlan_dev_hard_start_xmit()?除非系统有这个虚拟端口的路由表?

3,两个网口一旦设置为VLAN,是否就按照交换口处理,不再配置IP?VLAN和端口IP有什么关系?
谢谢!

作者: wchtalk   发布时间: 2007-06-19

>>1,普通报文进入VLAN端口,不会带有VLAN tag,这样就不会流向vlan_skb_recv(),那么,系统在那里检查数据报应该走的VLAN信息?

不属于任何vlan接口eth0.x,属于进入的接口eth0

>>2,报文发送的时候,怎么调用到vlan_dev_hard_start_xmit()?除非系统有这个虚拟端口的路由表?

或者给vlan接口配置了ip(同时也就有了路由),或处于桥模式

>>3,两个网口一旦设置为VLAN,是否就按照交换口处理,不再配置IP?VLAN和端口IP有什么关系?

彼此独立

作者: qtdszws   发布时间: 2007-06-19

其实linux中vlan的实现原理很简单,就是进入的vlan包被vlan_skb_recv试图分解到对应的ethx.y设备中(如果没有找到对应的vlan设备,丢包),然后让skb->dev指向该vlan设备,最后调用netif_rx.

作者: qtdszws   发布时间: 2007-06-19



QUOTE:
原帖由 qtdszws 于 2007-6-19 12:30 发表于 3楼  
其实linux中vlan的实现原理很简单,就是进入的vlan包被vlan_skb_recv试图分解到对应的ethx.y设备中(如果没有找到对应的vlan设备,丢包),然后让skb->dev指向该vlan设备,最后调用netif_rx.



谢谢。

不过,这个情况,针对Trunk模式,可以接收到带有VLAN ID的数据报文。但是,如果不在Trunk模式下,VLAN ID就没有了,只是一个普通的数据报文。这样的情况下,如何进行VLAN处理?

另外,我们一般说,“把eth0,eth1做在一个VLAN里面”这话该怎么理解?放在一个VLAN里面,那么现在进入eth0的数据报文就要受到VLAN约束,如果这个报文不是Trunk报文,就无法到达vlan_skb_recv()?

作者: wchtalk   发布时间: 2007-06-19

我感觉不要把linux下vlan的实现和交换机中vlan的实现相混淆

我猜测switch把没有打vlan标记的包归入vlan 1

>>不过,这个情况,针对Trunk模式,可以接收到带有VLAN ID的数据报文。但是,如果不在Trunk模式下,VLAN ID就没有了,只是一个普通的数据报文。这样的情况下,如何进行VLAN处理?

linux中属于进入设备ethx

>>另外,我们一般说,“把eth0,eth1做在一个VLAN里面”这话该怎么理解?放在一个VLAN里面,那么现在进入eth0的数据报文就要受到VLAN约束,如果这个报文不是Trunk报文,就无法到达vlan_skb_recv()?

我认为vlan就是一个桥
linux中
brctl addbr vlan1
brctl addif vlan1 eth0//no trunk
brctl addif vlan1 eth1 //no trunk
brctl addif vlan1 eth2.1 //trunk

作者: qtdszws   发布时间: 2007-06-19

看来对linux network 涉及较深,以后有些问题要向你请教.阁下对网卡驱动很了解.

[ 本帖最后由 AIXHP 于 2007-6-19 17:20 编辑 ]

作者: AIXHP   发布时间: 2007-06-19

谢谢,qtdszws

Linux的VLAN和交换机的VLAN实现差别还是很大的,我理解了。

作者: wchtalk   发布时间: 2007-06-20



QUOTE:
原帖由 wchtalk 于 2007-6-20 09:08 发表于 7楼  
谢谢,qtdszws

Linux的VLAN和交换机的VLAN实现差别还是很大的,我理解了。


能否说说你的理解?

作者: platinum   发布时间: 2007-06-21

linux的VLAN感觉只是对Trunk VLAN的支持,也就是进来的数据报文带有VLAN tag。所以,你没办法把它看作交换机端口做VLAN。但是,交换机不这样,它对进来的所有的包都要检查是否数据特定的VLAN域。也就是协议栈的二层表应该有VLAN字段。Linux是没有二层字段的。

理解不准请补充。

作者: wchtalk   发布时间: 2007-06-22

有道理,感觉 Linux 的 VLAN 有点像支持三层的交换机做完 TRUNK 后的样子
但是,如果按照类似 qtdszws 的方法不知能否实现
brctl addif BR eth0.1
brctl addif BR eth1.2
brctl addif BR eth2.3
eth0.1、eth1.2、eth2.3 分别是三个不同的 VLAN ID 的三个不同网卡,将他们做成 BRIDGE,是否可以实现类似于交换机三个网口不同 VLAN 的情况?
由于没有实际环境测试,只是一种推测

作者: platinum   发布时间: 2007-06-22

我觉得vlan  不是BRIDGE 。交换机的 VLAN 实现也是用LINUX系统实现的。

只是说teg vlan 是需要通过TUNK口连接。也就是说带有VLAN 的ID 的包是要通过TUNK传送到相应的VLAN。

作者: yjbjtg   发布时间: 2007-10-09

lz,,,针对2.6内核的vlan源码包,,有吗,,,share一下吧,,,谢谢

作者: raindy1234   发布时间: 2008-11-24

热门下载

更多