我正在开发一个嵌入式系统,该系统将使用基于端口的 Ethertype DSA (Marvell) 帧标记协议通过“管道”以太网链路(例如 eth0)将运行 Linux 的处理器连接到以太网交换机,以便 Linux 内核呈现用户空间为交换机的每个用户端口(例如lan1、lan2、lan3)提供单独的以太网链路。
据我了解,这通常是通过固定的无 phy 管道(例如 xMII)以及处理器和交换机之间的 MDIO 链路来完成的,以便处理器可以配置和控制物理用户端口。
我想在接收硬件之前进行一些软件开发,因此我想“伪造”MDIO 链路,或者以其他方式配置内核,以便它在普通(配备 PHY 的网络)上使用基于端口的 EDSA 帧标记) 以太网端口,导致帧布局如下:
7 6 5 4 3 2 1 0
. . . . . . . . .
0 +---+---+---+---+---+---+---+---+
| Ether Destination Address |
+6 +---+---+---+---+---+---+---+---+
| Ether Source Address |
+6 +---+---+---+---+---+---+---+---+ --
| Prog. DSA Ether Type [15:8] | |
+1 +---+---+---+---+---+---+---+---+ |
| Prog. DSA Ether Type [7:0] | | EDSA tag
+1 +---+---+---+---+---+---+---+---+ |
| Reserved (0x00 0x00) | |
+2 +---+---+---+---+---+---+---+---+ | --
| Mode |b29| Switch Device | | |
+1 +---+---+---+---+---+---+---+---+ | |
| Switch Port |b18|b17|b16| | |
+1 +---+---+---+---+---+---+---+---+ | | DSA tag
| PRI [2:0] |b12| VID [11:8] | | |
+1 +---+---+---+---+---+---+---+---+ | |
| VID [7:0] | | |
+1 +---+---+---+---+---+---+---+---+ -- --
| Ether Length/Type |
+2 +---+---+---+---+---+---+---+---+
. . . . . . . . .
...其中Switch Port
对应于交换机的用户端口号。
内核模块的文档dsa_loop
并dsa_loop_bdinfo
暗示这些可能是合适的,并且源代码似乎链接.netdev = "eth0"
到一些用户端口("lan1".."lan4"
),但即使我可以modprobe dsa_loop
进入我的内核,我也没有看到内核创建的任何虚拟端口设备(我是用于ifconfig -a
显示网络设备)。
~# lsmod
Module Size Used by
dsa_loop 16384 0
dsa_core 118784 1 dsa_loop
执行此操作时,modprobe dsa_loop
我看到对 的调用dsa_loop_init
,但没有对 的调用dsa_loop_drv_probe
。
所以我想我有几个问题:
dsa_loop
和模块是否dsa_loop_init
旨在允许在“正常”以太网链路上执行 EDSA 标记?- 这些模块打算如何使用?
- 是否有其他方法可以配置 Linux 来执行此操作而无需访问交换机 MDIO?