PHY 链路拓扑¶
概述¶
网络堆栈中的 PHY 链路拓扑表示旨在表示任何给定以太网链路的硬件布局。
从用户空间的角度来看,以太网接口只不过是一个 struct net_device
,它通过传统的 ioctls 和 ethtool netlink 命令公开配置选项。设计这些配置 API 的基本假设是链路看起来像
+-----------------------+ +----------+ +--------------+
| Ethernet Controller / | | Ethernet | | Connector / |
| MAC | ------ | PHY | ---- | Port | ---... to LP
+-----------------------+ +----------+ +--------------+
struct net_device struct phy_device
需要配置 PHY 的命令将通过 net_device.phydev 字段到达 PHY 并执行相关配置。
当例如使用 SFP 收发器时(虽然这不是唯一的特定情况),这种假设在更复杂的拓扑中会失效。
这里,我们有 2 个基本场景。要么 MAC 能够输出一个串行接口,可以直接馈送到 SFP 插槽,例如 SGMII、1000BaseX、10GBaseR 等。
然后,链路拓扑如下所示(当插入 SFP 模块时)
+-----+ SGMII +------------+
| MAC | ------- | SFP Module |
+-----+ +------------+
知道一些模块嵌入了 PHY,实际链路更像是
+-----+ SGMII +--------------+
| MAC | -------- | PHY (on SFP) |
+-----+ +--------------+
在这种情况下,SFP PHY 由 phylib 处理,并通过 phylink 的 SFP 上游操作注册。
现在一些以太网控制器无法输出串行接口,因此我们无法直接将它们连接到 SFP 插槽。但是,一些 PHY 可以用作媒体转换器,将非串行 MAC MII 接口转换为馈送到 SFP 的串行 MII 接口
+-----+ RGMII +-----------------------+ SGMII +--------------+
| MAC | ------- | PHY (media converter) | ------- | PHY (on SFP) |
+-----+ +-----------------------+ +--------------+
这就是拥有单个 net_device.phydev 指针的模型显示其局限性的地方,因为我们现在链路上有 2 个 PHY。
phy_link 拓扑框架旨在提供一种跟踪链路上每个 PHY 的方法,供内核驱动程序和子系统使用,但也向用户空间报告拓扑,允许在配置命令中定位单个 PHY。
API¶
struct phy_link_topology
是每个网络设备资源,在网络设备创建时初始化。一旦初始化,就可以通过以下方式将 PHY 注册到拓扑
phy_link_topo_add_phy()
除了将 PHY 注册到拓扑之外,此调用还会为 PHY 分配一个唯一的索引,然后可以将其报告给用户空间以引用此 PHY(类似于 ifindex)。此索引是一个 u32,范围从 1 到 U32_MAX。值 0 保留用于指示 PHY 尚未属于任何拓扑。
然后可以通过以下方式从拓扑中删除 PHY
phy_link_topo_del_phy()
这些函数已经挂接到 phylib 子系统中,因此通过 phy_attach_direct()
链接到网络设备的所有 PHY 将自动加入网络设备的拓扑。
如果 SFP 上游是 phylink(因此,没有媒体转换器),SFP 模块上的 PHY 也会自动注册。
可用作 SFP 上游的 PHY 驱动程序需要调用 phy_sfp_attach_phy()
和 phy_sfp_detach_phy()
,它们可以用作 struct sfp_upstream_ops
的 .attach_phy / .detach_phy 实现。
UAPI¶
存在一组 netlink 命令来查询用户空间的链路拓扑,请参阅 Documentation/networking/ethtool-netlink.rst
。
拥有拓扑表示的全部意义在于在 struct phy_device
中分配 phyindex 字段。此索引使用 ETHTOOL_MSG_PHY_GET
ethtnl 命令报告给用户空间。执行 DUMP 操作将导致列出所有 net_device 中的所有 PHY。DUMP 命令接受在请求中传递 ETHTOOL_A_HEADER_DEV_INDEX
或 ETHTOOL_A_HEADER_DEV_NAME
以将 DUMP 筛选到单个 net_device。
然后可以使用以下 ethnl 命令使用 ETHTOOL_A_HEADER_PHY_INDEX
字段作为请求参数传递检索到的索引
ETHTOOL_MSG_STRSET_GET
从给定的 PHY 获取统计信息字符串集ETHTOOL_MSG_CABLE_TEST_ACT
和ETHTOOL_MSG_CABLE_TEST_ACT
,用于在链路上的给定 PHY 上执行电缆测试(很可能是最外面的 PHY)ETHTOOL_MSG_PSE_SET
和ETHTOOL_MSG_PSE_GET
用于 PHY 控制的 PoE 和 PSE 设置ETHTOOL_MSG_PLCA_GET_CFG
、ETHTOOL_MSG_PLCA_SET_CFG
和ETHTOOL_MSG_PLCA_GET_STATUS
用于设置 PLCA(物理层冲突避免)参数
请注意,PHY 索引可以传递给其他请求,如果存在且不相关,这些请求将静默忽略它。