背景
我目前正在研究一种使用 Beaglebone Black 作为基板的设备,并且在分线引脚上连接了第三方 MAC/PHY。
问题
我们希望将一个接口上收到的所有以太网数据包双向转发到另一个接口。在两个接口之间配置网桥非常简单:
ip link add name br0 type bridge
ip link set dev br0 up
ip link set eth0 up
ip link set eth1 up
ip link set dev eth0 master br0
ip link set dev eth1 master br0
在我开始传输 VLAN 标记帧之前,这种方法一直很好用。如果我用 VLAN ID 0 或 1 标记帧,则帧会被转发。不幸的是,VLAN 标记在传输到另一个接口之前就被丢弃了。如果我用任何其他 VLAN ID 标记,则不会转发帧。
解决方案尝试 1
我尝试的第一件事是使用 ebtables:
ebtables -A FORWARD -i br0 --vlan-id 2 -j ACCEPT
这没有任何效果。即使有,扩展性也不会很好——我必须为所有我想使用的 VLAN ID 添加一个条目。
解决方案尝试 2
我尝试的第二件事是桥接子接口:
ip link add name br0.2 type bridge
ip link set dev br0.2 up
vconfig add eth0 1
vconfig add eth1 2
ip link set dev eth0.2 up
ip link set dev eth1.2 up
ip link set dev eth0.2 master br0.2
ip link set dev eth1.2 master br0.2
这部分可行,但与解决方案 1 一样,存在同样的扩展问题。我说它部分可行,是因为 VLAN 标记数据部分丢失。使用tcpdump --x -i ethX
,我在将 VLAN 标记帧传输到 Beaglebone 的板载以太网接口 (eth0) 时观察到以下情况:
- 当数据包到达时
eth0
,整个 VLAN 标签都存在。 - 当数据包到达时
eth0.2
,VLAN 标签已被剥离。 - 当数据包到达时
br0.2
,VLAN 标记仍然不存在。 - 当数据包到达时
eth1.2
,VLAN 标记仍然不存在。 - 当数据包到达时
eth1
,会出现具有正确 ID 的 VLAN 标记,但优先级已丢失。
当它通过这个接口链时,有没有什么方法可以保留整个 VLAN 标签?
解决方案尝试 3
VLAN 感知桥接
ip link add name br0 type bridge vlan_filtering 1
ip link set dev br0 up
ip link set eth0 up
ip link set eth1 up
ip link set dev eth0 master br0
ip link set dev eth1 master br0
bridge vlan add vid 2-4094 dev br0 self
bridge vlan add vid 2-4094 dev eth0 master
bridge vlan add vid 2-4094 dev eth1 master
这可能是一个理想的解决方案,因为它不会受到解决方案 2 的扩展问题的影响。但是,当启用 VLAN 转发时,TI 以太网交换机的驱动程序无法初始化。TI CPSW 驱动程序报告错误,称它无法在接口上初始化 VLAN 转发。