コンテンツにスキップ

Topics で読み物として読む

この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 14 章: Platform / Port / Optics を参照。

裏取りステータス: code-verified(命名差分あり)

sonic-sairedis/syncd/MdioIpcServer.{h,cpp}Syncd.cpp での m_mdioIpcServer = std::make_shared<MdioIpcServer>(m_vendorSai, m_commandLineOptions->m_globalContext) を確認済み。HLD の VendorPai 相当は sonic-sairedis/syncd/VendorSai.h (class VendorSai) として実装。gearbox_config.jsonphys[].lib_name も device 配下に存在(Arista 等)。ただし: phy_access_lib_name / mdio_cl22_only は HLD 文書のみで device 側 JSON には未浸透。単一 gbsyncd docker の方針も sonic-buildimage/platform/components/docker-gbsyncd-{credo,broncos,agera2,milleniob} のように vendor 別 docker が並存しており、HLD の "single gbsyncd docker" は完全には達成されていない。

NPU MDIO アクセスと gbsyncd 単一 docker 化

概要

外部 PHY (gearbox) を制御するために gbsyncd は PAI library を使う。PHY が接続される MDIO バスは platform により異なり、(a) FPGA/CPLD ベースで Linux kernel driver + sysfs 経由のもの と (b) switch NPU の MDIO busSAI 経由でアクセスするもの の 2 系統がある1。後者では syncd と gbsyncd の プロセス間通信(IPC) が必要になる。本 HLD は (i) NPU MDIO 経由のアクセスを Unix socket IPC で実現し、(ii) PAI library と MDIO access library を runtime ロード することで 単一 gbsyncd docker で全 platform を扱えるようにする設計。

動作仕様

コンポーネント関係

flowchart LR
  subgraph syncd_docker["syncd docker"]
    SY["syncd<br/>VendorSai"]
    MS["MdioIpcServer<br/>Unix socket /tmp/..."]
    SY --> NPU[NPU SAI]
    SY --- MS
  end
  subgraph gbsyncd_docker["gbsyncd docker (単一)"]
    GB["syncd instance<br/>--paiInstance N"]
    VP["VendorPai class<br/>VendorSai 継承"]
    GB --> VP
    VP -. dlopen .-> PAI["PAI library<br/>vendor 別"]
    VP -. dlopen .-> MAL[MDIO access lib]
    MAL -.->|"sysfs or<br/>IPC client"| EXT
  end
  EXT[(External PHY)]
  MAL -- Unix socket --> MS
  MS --> NPU

IPC

  • IPC は Unix domain socket、syncd 側に MdioIpcServer クラスが新設され、独立スレッドで listen/accept/read/reply を行う1
  • gbsyncd 側は MDIO IPC client動的ライブラリとして実装。kernel sysfs ベース platform では同じ抽象の sysfs MDIO アクセス lib を選べる
  • IPC 速度は PHY firmware download が現実的時間で完了する ことが要件
  • デバッグでは IPC 部分を socat 等で simulate 可能

VendorPai クラス

  • VendorSai を継承する新クラス1
  • コンストラクタで PAI library pathMDIO access library path を引数に取り、両者を runtime に dlopen する
  • これにより gbsyncd docker 1 つで vendor 別 PAI / MDIO 実装に切替可能になる
int syncd_main(int argc, char **argv) {
    ...
    if (commandLineOptions->m_paiInstance >= 0) {
        auto vendorSai = std::make_shared<VendorPai>(
            commandLineOptions->m_paiInstance,
            commandLineOptions->m_contextConfig);
        ...
    } else {
        auto vendorSai = std::make_shared<VendorSai>();
        ...
    }
}

コマンドライン

gbsyncd 内で動く syncd instance は --paiInstance (-i <N>) を受ける1-x <gearbox_config.json> で gearbox 設定ファイルパス、-i N が config 内 phys[N] を選ぶインデックスになる。

gearbox_config.json の拡張

phys 配列の各要素に次のキーが追加される1:

key 内容
phy_id 既存。PHY 番号
lib_name PAI library のファイル名(dlopen 対象)
phy_access_lib_name MDIO access library のファイル名(IPC client / sysfs lib)
mdio_cl22_only この PHY が IEEE 802.3 Clause 22 のみ使う場合に true

MDIO Clause 22 / 45

アドレス空間 port × reg
Clause 22 32 reg × 32 port × 32 addr 古い PHY 向け
Clause 45 65,536 reg × 32 dev × 32 port 10G+ で標準

SAI switch api に clause 22 用 MDIO read/write 関数が追加され、SaiInterface に clause 45/22 の virtual 関数、VendorSai がそれを override する1

Warm boot

  • IPC socket の生成 / 接続手順は coldboot と同一1
  • platform 側ソフトは warm boot 中に外部 PHY を reset しないことが必須
📋 検証エビデンス: sonic-net/SONiC/doc/gearbox/gearbox_mdio-HLD.md#L82-L94 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)

出典:

sonic-net/SONiC/doc/gearbox/gearbox_mdio-HLD.md#L82-L94 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)

抜粋:

Our design choice is to use the Unix socket as the IPC mechanism. Our design has the MDIO IPC server
in the syncd daemon with its own thread. A new syncd class MdioIpcServer is added to start a new thread,
to create an unix socket, to listen on the socket, to accept connection and to read/reply IPC messages.

判断根拠: Unix socket IPC + MdioIpcServer 採用の根拠。

制限事項

  • HLD 検証は Broadcom NPU でのみ。他 vendor は未確認1
  • --enableBulk のような他フラグとの兼ね合いはスコープ外
  • 外部 PHY firmware download の時間制約が IPC 設計の制約に直結

干渉する機能

  • Gearbox Manager (gearbox_mgr_design.md): 親 framework
  • syncd(NPU 用)と gbsyncd(PHY 用)の責務分離
  • gearbox_config.json: PHY topology 記述
  • platform.json / port_config.ini: PHY を介する port の表現
  • xcvrd / media_settings: PHY の前段に位置する optic 制御

引用元

関連 Topics


  1. sonic-net/SONiC doc/gearbox/gearbox_mdio-HLD.md @ 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06