Logo

Linux 内核

6.13.0-rc6

快速搜索

目录

  • 开发流程
  • 提交补丁
  • 行为准则
  • 维护者手册
  • 所有开发流程文档
  • 核心 API
  • 驱动程序 API
  • 子系统
    • 核心子系统
    • 人机界面
    • 网络接口
      • 网络
      • NetLabel
      • InfiniBand
      • ISDN
      • MHI
    • 存储接口
    • 其他子系统
  • 锁定
  • 许可规则
  • 编写文档
  • 开发工具
  • 测试指南
  • 黑客指南
  • 跟踪
  • 故障注入
  • 实时补丁
  • Rust
  • 管理
  • 构建系统
  • 报告问题
  • 用户空间工具
  • 用户空间 API
  • 固件
  • 固件和设备树
  • CPU 架构
  • 未分类的文档
  • 翻译

本页

  • 显示源代码

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 索引可以传递给其他请求,如果存在且不相关,则会静默忽略它。

©内核开发社区。 | 由 Sphinx 5.3.0 & Alabaster 0.7.16 强力驱动 | 页面源