首页 » 科学 » 低廉甜头Linux治理的收集交换机_端口_芯片

低廉甜头Linux治理的收集交换机_端口_芯片

乖囧猫 2025-01-17 03:55:38 0

扫一扫用手机浏览

文章目录 [+]
小编
原文:

https://blog.brixit.nl/making-a-linux-managed-network-switch/

低廉甜头Linux治理的收集交换机_端口_芯片 科学

有时,定制的 5 端口千兆交流机便是办理方案。

网络交流机是大略的设备,数据包进入,数据包输出。
幸运的是,人们已经找到了如何使其变得繁芜的方法,并发明了管理型交流机。
常日,这是通过添加一个用于配置设置的 Web 界面并查看端口状态等信息来实现的。
如果您有更昂贵的交流机,那么您乃至可以访问一些备用接口,如 Telnet 和串行掌握年夜驾口。
然而,还有一整类管理型交流机,人们最初并没有想到。
这些是消费级路由器内部的网络交流机。
这些路由器是小型 Linux 设备,内部有一个交流机芯片,一个或多个端口内部连接到 CPU,别的端口在外部作为物理端口。

来自 mikrotik.com 的 Mikrotik RB2011 框图
这里有一个这样的设备的例子,实际上已经有了干系文档。
我一贯认为这些连接到交流机的端口的配置只是 Web 界面的一个很好的抽象,但我惊异地创造,在 Linux 中的 DSA 和 switchdev 子系统中,这些端口实际上是完备正常事情的“本地”网络端口。
不幸的是,由于这实际上只在集成路由器内部可用,以是很难进行试验。
在这个图上显示为一条线的实际上是路由器的 SoC 和交流机通过 SGMII 总线(在这种情形下可能是 RGMII)以及管理总线(要么是 SMI,要么是 MDIO)的连接。
网络交流机有很多这样有趣的缩写,纵然写出全名,如果不理解它们是如何组合在一起的,也险些没故意义。
利用这个别系掌握标准的现成交流机根本不可能,由于没有暴露交流机芯片所需的连接。
以是只剩下一个选择...
制作我自己的千兆网络交流机
制作我自己的网络交流机该当不会那么难吧?这些东西的价格相称于一杯咖啡,而且很可能是高度集成的,才能达到这个价格点。
由于我在互联网上没有看到任何低廉甜头的交流机,我猜那些芯片一定很难得到...
不,很随意马虎得到。
乃至还有这些芯片的 datasheet(数据手册)。
以是我创建了一个新的 KiCad 项目,并开始创建一些封装和符号。
我很高兴有任何数量的数据手册可用于此芯片,由于对付 Realtek 设备来说,常日情形并非如此,但它仍旧非常有限。
我乞助于探求任何具有类似 Realtek 芯片事理图的设备,以理解如何集成它,并查看了大量关于如何在设计中实现以太网的文档。
该芯片的实现最初看起来非常繁芜,它须要大约 7 个不同的电源网络,并且有几个文档记录非常差的通信接口。
在查看了其他实现后,彷佛最大略的供电办法是将所有电压范围重叠的网络连接在一起,然后只须要一个 3.3V 和 1.1V 的稳压器。
额外的通信总线是为了我彷佛不须要的所有额外端口。
我选择的交流机芯片是 RTL8367S,这是一种非常广泛利用的 5 端口千兆交流机芯片,但实际上它不是 5 端口芯片。
它是一个 7 端口交流机芯片,个中 5 个端口具有集成的 PHY,两个用于 CPU 连接。
来自 RTL8367S 数据手册的 CPU 连接框图
然而,我的操持不同,虽然有这些 CPU 端口可用,但实际上 Linux switchdev 子系统中不须要将 CPU 连接到这些端口。
相反,我将通过网络电缆连接到交流机的端口 0,并且就 switchdev 驱动程序而言,中间没有以太网 PHY。
下一个障碍是交流机芯片的配置,有几种可用的配置系统,而数据手册并没有真正描述要使其作为常规的哑交流机正常事情所需的最小设置。
总结一下芯片的配置选项:
•芯片上有 8 个引脚,在启动时会被读取。
这些引脚与端口的 led 引脚共享,这使得设计非常烦人。
将设置从上拉切换到下拉也须要将 led 连接到不同的方向。
•有一个 i2c 总线可以连接到 eeprom 芯片。
不过,我须要这个引脚与 SMI 总线共享,以使这个芯片与 Linux 通信。
有引脚配置可以从两个 eeprom 大小范围中选择一个,但没有进一步解释这个设置实际上改变了什么。
•有一个 SPI 总线,支持连接 NOR 闪存芯片。
根据启动引脚的配置,这可以存储配置寄存器或嵌入式 8051 内核的固件。
SPI 总线引脚也与 CPU 网络端口之一共享。
•有一个可用的串行端口,但据我预测,除非在 8051 中加载了固件,否则它可能根本不起浸染。
我想出的办理办法是订购一块电路板,然后用不同的办法焊接连接,直到它事情为止。
我添加了一个终极不须要的闪存芯片的封装,对付所有的配置引脚,我添加了焊接跳线。
我去掉了所有的 led,由于要使它可配置会非常困难。
下一步是弄清楚如何精确地实现以太网。
已经有很多关于这方面的文档,它们都让千兆以太网听起来须要完美的精度工程、阻抗管理的电路板和以太网之神的祝福才能事情。
这彷佛与这些交流机的构建非常便宜而且彷佛事情得很好的现实不符。
以是我决定打开一个交流机,检讨在实际设计中实际利用了多少这些耦合电容器和阻抗匹配平面。
答案彷佛是这并不主要。
这是我现在终极得到的设计,但它不是我测试 PCB 上的设计。
不过我第一次就险些做对了:D
主要的部分彷佛是匹配对偏斜,但匹配 4 对网络线的长度完备没有用,这紧张是由于网络电缆的 4 对双绞线的绞合率不同,以是这些线在电缆内部的长度已经有很大的不同。
变压器和 RJ45 插孔之间的对有自己的接地平面,通过电容器与主接地耦合。
变压器后的对则在主板的接地添补上。
我在最初的电路板版本中犯的缺点是忘却了将变压器开关侧中央抽头连接到地的电容器,使得该侧的旗子暗记参考到电路板地。
这使得以太网无法正常事情,以是我不得不手动在电路板上切割眇小的痕迹,以断开与地的短路。
在我的测试设置中,电容器根本不存在,所有的中央抽头都悬空。
这彷佛事情得很好,但终极的设计确实添加了那个电容器。
在以太网变压器上切割接地走线
终极的结果是这个轻微有点奇怪的千兆交流机。
它有 4 个端口朝向一个方向,一个朝向后面,通过 2.54mm 排针供电。
我还添加了一个 USB Type-C 连接器的封装,以便在不引出杜邦线的情形下轻松供电。
将其连接到 Linux
对付我的测试设置,我选择了 PINE64 A64-lts 板,由于它的连接器大致在我想要的位置。
它不是 x86 平台也很主要,由于配置须要变动设备树,在不该用设备树的平台上无法做到这一点。
首先须要的是为该板重新构建内核,由于大多数内核根本没有启用这些内核模块。
为此,我启用了以下选项:
•CONFIG_NET_DSA:分布式交流架构系统 •CONFIG_NET_DSA_TAG_RTL8_4:为该瑞昱交流芯片供应端口标记 •CONFIG_NET_SWITCHDEV:网络交流机的驱动系统 •CONFIG_NET_DSA_REALTEK、CONFIG_NET_DSA_REALTEK_SMI、CONFIG_NET_DSA_REALTEK_RTL8365MB:实际的交流芯片驱动程序
然后更繁芜的部分是弄清楚如何实际加载这统统。
理论上,可以为此创建一个设备树覆盖,并通过 U-Boot 加载它。
我决定不这样做,而是为 A64-lts 板打补丁设备树,由于我反正要重修内核。
我终极得到的设备树变动是这样的:

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-lts.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-lts.dtsindex 596a25907..10c1a5187 100644--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-lts.dts+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-lts.dts@@ -18,8 +18,78 @@ led { gpios = <r_pio 0 7 GPIO_ACTIVE_LOW>; / PL7 / }; };++switch {+compatible = "realtek,rtl8365rb";+mdc-gpios = <pio 2 5 GPIO_ACTIVE_HIGH>; // PC5+mdio-gpios = <pio 2 7 GPIO_ACTIVE_HIGH>; // PC7+reset-gpios = <pio 8 5 GPIO_ACTIVE_LOW>; // PH5+realtek,disable-leds;++mdio {+compatible = "realtek,smi-mdio";+#address-cells = <1>;+#size-cells = <0>;++ethphy0: ethernet-phy@0 {+reg = <0>;+};++ethphy1: ethernet-phy@1 {+reg = <1>;+};++ethphy2: ethernet-phy@2 {+reg = <2>;+};++ethphy3: ethernet-phy@3 {+reg = <3>;+};++ethphy4: ethernet-phy@4 {+reg = <4>;+};+};++ports {+#address-cells = <1>;+#size-cells = <0>;++port@0 {+reg = <0>;+label = "cpu";+ethernet = <emac>;+};++port@1 {+reg = <1>;+label = "lan1";+phy-handle = <ethphy1>;+};++port@2 {+reg = <2>;+label = "lan2";+phy-handle = <ethphy2>;+};++port@3 {+reg = <3>;+label = "lan3";+phy-handle = <ethphy3>;+};++port@4 {+reg = <4>;+label = "lan4";+phy-handle = <ethphy4>;+};+};+}; };

它加载了带有 realtek, rtl8365rb 的交流机驱动程序,该驱动程序支持包括我在本设计中利用的 RTL8367S 在内的全体瑞昱交流机芯片系列。
我从文档示例中删除了 CPU 端口,只添加了 5 个常规交流机端口的定义。
主要的部分是在 port@0 中,这是我的交流机上向后的端口,连接到 A64-lts,我将其链接到 emac,这是对打算机以太网端口的引用。
别的的端口则链接到交流机芯片中的相应 PHY。
在代码的顶部还定义了 3 个 GPIO,它们链接到交流机 PCB 上的 SDA/SCL 和 Reset,以使通信事情。
系统启动后的结果是这样的:

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: eth0: <BROADCAST,MULTICAST> mtu 1508 qdisc noop state DOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff3 lan1@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff4 lan2@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff5 lan3@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff6 lan4@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff

我这里有正常的 eth0 设备,然后我有在设备树中定义的交流机端口的 4 个接口。
为了让它实际做点什么,这些接口实际上须要先上线:

$ ip link set eth0 up$ ip link set lan1 up$ ip link set lan2 up$ ip link set lan3 up$ ip link set lan4 up$ ip link1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1508 qdisc mq state UP qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff3: lan1@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff4: lan2@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff5: lan3@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff6: lan4@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff

现在交流机已启动,您可以看到我有一根电缆插入了第三个端口。
这个别系与很多 Linux 网络连接,以是它与很多工具都能“开箱即用”。
例如:
•将几个局域网端口添加到标准的 Linux 网桥中,switchdev 系统将在交流机芯片中将这些端口桥接在一起,因此 Linux 不必转发该流量。
•像 ethtool lan3 这样的东西可以正常事情以获取有关链接的信息。
利用 ethtool -S lan3 可以得到所有标准状态返复书息,个中包括已由交流机完备处理的数据包。
限定
有几件事情使得这不是很好用。
首先,须要构建自定义网络交流机或拆开现有交流机并找到精确的连接。
在常规打算机/做事器上实际上不可能利用此系统,由于您须要设备树来为此配置内核,而大多数打算机没有内核掌握的 GPIO 引脚可用于连接交流机。
据我所知,也无法在打算机侧利用不固定的网络端口,USB 网络接口没有设备树节点句柄可用于设置管道端口。
这些限定中的一些可能有机会办理,大概有一些奇怪的 USB 设备会在 GPIO 子系统上暴露引脚,大概有一种方法可以在不该用 ARM 设备的情形下加载 switchdev,但这肯定须要更多的文档......

标签:

相关文章