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