PHY 链路拓扑¶
概述¶
网络堆栈中的 PHY 链路拓扑表示旨在表示任何给定以太网链路的硬件布局。
从用户空间的角度来看,以太网接口只不过是一个 struct net_device
,它通过传统的 ioctl 和 ethtool netlink 命令公开配置选项。在设计这些配置 API 时,基本假设是链路看起来像这样
+-----------------------+ +----------+ +--------------+
| Ethernet Controller / | | Ethernet | | Connector / |
| MAC | ------ | PHY | ---- | Port | ---... to LP
+-----------------------+ +----------+ +--------------+
struct net_device struct phy_device
需要配置 PHY 的命令将通过 net_device.phydev 字段到达 PHY 并执行相关的配置。
当使用 SFP 收发器时(尽管这并非唯一特定情况),这种假设在更复杂的拓扑结构中会失效。
这里,我们有两个基本场景。要么 MAC 能够输出串行接口,可以直接馈送到 SFP 插槽,例如 SGMII、1000BaseX、10GBaseR 等。
然后,链路拓扑看起来像这样(当插入 SFP 模块时)
+-----+ SGMII +------------+
| MAC | ------- | SFP Module |
+-----+ +------------+
知道某些模块嵌入了 PHY,实际链路更像是
+-----+ SGMII +--------------+
| MAC | -------- | PHY (on SFP) |
+-----+ +--------------+
在这种情况下,SFP PHY 由 phylib 处理,并通过其 SFP 上游操作由 phylink 注册。
现在,一些以太网控制器无法输出串行接口,因此我们无法直接将它们连接到 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()
链接到 net_device 的所有 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 操作将列出所有网络设备中的所有 PHY。DUMP 命令接受在请求中传递 ETHTOOL_A_HEADER_DEV_INDEX
或 ETHTOOL_A_HEADER_DEV_NAME
,以将 DUMP 过滤到单个网络设备。
然后可以使用 ETHTOOL_A_HEADER_PHY_INDEX
字段在以下 ethnl 命令中传递检索到的索引作为请求参数
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 索引可以传递给其他请求,如果存在且不相关,则会静默忽略它。