Logo

Linux 核心

6.16.0-rc4

快速搜尋

目錄

  • 開發流程
  • 提交補丁
  • 行為準則
  • 維護者手冊
  • 所有開發流程文件
  • 核心 API
  • 驅動程式 API
  • 子系統
    • 核心子系統
    • 人機介面
    • 網路介面
      • 網路
      • NetLabel
      • InfiniBand
      • ISDN
      • MHI
    • 儲存介面
    • 其他子系統
  • 鎖定
  • 許可規則
  • 編寫文件
  • 開發工具
  • 測試指南
  • 駭客指南
  • 追蹤
  • 故障注入
  • Livepatching
  • Rust
  • 管理
  • 構建系統
  • 報告問題
  • 使用者空間工具
  • 使用者空間 API
  • 韌體
  • 韌體和裝置樹
  • CPU 架構
  • 未分類文件
  • 翻譯

本頁

  • 顯示原始碼

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 索引可以傳遞給其他請求,如果存在且不相關,這些請求將靜默忽略它。

©The kernel development community. | Powered by Sphinx 5.3.0 & Alabaster 0.7.16 | Page source