Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 14 章: Platform / Port / Optics を参照。
裏取りステータス: code-verified
sonic-swss/orchagent/portsorch.cpp:3709 の setPortLinkTraining()、link_training_failure_map / link_training_rx_status_map、SAI_PORT_ATTR_SUPPORTED_LINK_TRAINING_MODE 参照 (L3199)、m_lt_cfg / m_link_training 更新 (L4872-4909) を確認。CLI 側は sonic-utilities/scripts/intfutil の display_link_training_status() / generate_link_training_status()、port/porthlpr.cpp の getLinkTrainingStr() を確認。sonic-yang-models/yang-models/sonic-port.yang:112 に leaf link_training を確認。
ポートリンクトレーニング(IEEE 802.3 clause 72/93 / SAI 動的 FIR)¶
読み手が知りたいこと¶
- リンクトレーニング(LT)とは何で、なぜ必要なのか
media_settings.jsonの静的 FIR とどう違うのか- どの port で使えるか(ASIC 制約)
- auto-negotiation と一緒に有効化していいのか
- LT が trained にならない時の見方
結論¶
LT は CR/KR 系で送受信が 動的に FIR の等化係数を擦り合わせる IEEE 802.3 clause 72/93 のプロトコル1。SONiC は既存 SAI 属性 + SAI_PORT_ATTR_SUPPORTED_LINK_TRAINING_MODE(per-port 能力)を使って on/off と状態取得を CONFIG_DB / STATE_DB に揃える。auto-neg との同時利用可否は ASIC ごとに異なる。
動作仕様¶
SAI 属性¶
| 属性 | 種別 | 用途 |
|---|---|---|
SAI_PORT_ATTR_LINK_TRAINING_ENABLE |
CREATE_AND_SET, bool | LT 有効化 |
SAI_PORT_ATTR_LINK_TRAINING_FAILURE_STATUS |
READ_ONLY, enum | 失敗要因 |
SAI_PORT_ATTR_LINK_TRAINING_RX_STATUS |
READ_ONLY, enum | trained/not trained |
SAI_PORT_ATTR_SUPPORTED_LINK_TRAINING_MODE |
READ_ONLY, bool | per-port サポート |
ベンダ SAI 要件: 未対応属性アクセスはエラー返却で swss/syncd を crash させない、デフォルトは disabled1。
スキーマ¶
CONFIG_DB: PORT|<port> link_training = "on"|"off"
APPL_DB: PORT_TABLE link_training を伝搬
STATE_DB: PORT_TABLE link_training_status を 7 値で公開
link_training_status の値1:
| 値 | 意味 |
|---|---|
off |
無効 |
on |
有効。詳細未取得 |
trained |
調整成功 |
not_trained |
有効だが未調整 |
frame_lock |
training frame の同期 |
snr_low |
SNR 低下しきい値 |
timeout |
過程タイムアウト |
PortsOrch のフロー¶
flowchart TB
BOOT[起動] --> Q[per-port<br/>SUPPORTED_LINK_TRAINING_MODE]
Q --> CAP[Port::m_port_cap_lt]
CAP --> CFG[CONFIG_DB link_training 受信]
CFG --> CHK{cap=true?}
CHK -- false --> SKIP[拒否 / ログ]
CHK -- true --> AN{auto-neg?}
AN -- yes --> ANRULE[ASIC ルール依存]
AN -- no --> SET[SAI に反映]
ANRULE --> SET
SET --> SAVE[pre-emphasis 要求は replay]
起動時に PortsOrch が syncd に per-port LT 能力を問い合わせ Port::m_port_cap_lt に保持する。AN との共存可否は ASIC 実装次第1。
📋 検証エビデンス: sonic-net/SONiC/doc/port_link_training/port-link-training-design.md#L270-L290 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/port_link_training/port-link-training-design.md#L270-L290 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
During system startup, PortsOrch should query for the per-port link-training abilities from syncd, and have these per-port flags maintained in the m_port_cap_lt field of Port object.
判断根拠: m_port_cap_lt + AN 共存 + pre-emphasis replay 仕様の根拠。
ステータスポーラ¶
PortsOrch のタイマースレッドが全 port を順に巡回。発火/停止条件1:
- LT 有効化 / LT 有効ポートのリンクダウン → 起動
- LT 無効化 / LT 有効ポートのリンクアップ → 停止
リンクが立ってる間は STATE_DB を頻繁に更新せず、確立直後と障害時だけ集中ポーリングする設計。
media_settings.json との関係¶
媒体ごとの 静的 TX FIR を書き込む従来方式は補完関係1:
- LT 非対応 / silicon・port: 静的 FIR を使う
- LT 対応 (CR/KR): LT で動的に調整、pre-emphasis 要求は LT 更新時に replay
設定¶
| Table | Key | フィールド |
|---|---|---|
PORT |
<port> |
link_training (on / off) |
出力例:
Interface LT Oper LT Admin Oper Admin
----------- ----------- ---------- ------ -------
Ethernet0 trained on up up
Ethernet32 not trained on down up
制限事項¶
HLD の Limitations は N/A のみ1。実運用上:
- 対象 media は CR / KR backplane / SFP copper が主。すべての media で動くわけではない
- LT 対応は per-port。
m_port_cap_lt=falseの port は要求が実行されない - auto-negotiation との同時利用は ASIC 制約に依存
干渉する機能¶
- auto-negotiation: ASIC によって排他 / 併用可。
LT Oper=not_trainedのままになる場合あり media_settings.json: 静的 FIR。LT 有効 port では LT が優先、要求は replay 対象として保持- warmboot: SAI / 下位 layer は warmboot 中 LT 値に関わらず port を flap させてはならない1
- gearbox: 本 HLD scope 外
トラブルシューティング¶
# LT が trained にならない
show interfaces link-training status Ethernet0
# not_trained / snr_low / timeout → 物理問題(ケーブル品質 / 距離)
# off のまま → m_port_cap_lt が false。ASIC サポート要確認
# AN と同時有効でリンクが立たない
config interface autoneg Ethernet0 off # AN を切って LT 単独で再評価