裏取りステータス: Code-verified
sonic-swss/orchagent/portsorch.cpp L948-953 で SAI_PORT_ATTR_HOST_TX_SIGNAL_ENABLE capability query、L959-981 で SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY の switch attribute 設定、L1366 / L6024-6038 で port 単位の HOST_TX_SIGNAL_ENABLE set ロジックを確認(verified 2026-05-09)。
CMIS モジュール管理拡張(host_tx_signal / host_tx_ready の同期)¶
概要¶
ASIC 側 SerDes は SWSS の PortsOrch(→ vendor SAI)が、CMIS モジュール側は PMON の xcvrd が制御するという二段構成だが、両者を 「ASIC が high-speed signal を送り始めてからモジュール初期化を始める」 順で同期させる必要がある。従来は STATE_DB.PORT.host_tx_ready フラグを PortsOrch が SAI Admin UP の戻りで即立てる 設計だったが、以下のギャップがあった1:
- ASIC ポート初期化に時間がかかり、Admin UP 戻り直後に signal が出ていないケース(特に BiDi 等の新世代 transceiver)
- モジュール未挿入時に ASIC が signal を出しっぱなしになり、隣接ポートへのクロストーク・EMI・transceiver 寿命短縮を招く
本拡張は Module 挿抜と high-speed signal 送出を SW 側から制御し、host_tx_ready を SAI 非同期通知で更新する仕組みを追加する。新 SAI 機能を 対応プラットフォームのみで有効化し、非対応では従来挙動を維持する後方互換設計1。
動作仕様¶
新 SAI 属性 / 通知¶
| SAI シンボル | 用途 |
|---|---|
SAI_PORT_ATTR_HOST_TX_SIGNAL_ENABLE |
port object 属性。SW 側から high-speed signal 送出を許可/禁止 |
SAI_PORT_ATTR_HOST_TX_READY_STATUS |
現在 ASIC が signal を出しているか(warm-boot 後 query 用) |
SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY |
非同期通知。signal 開始/停止を SDK→SWSS に伝える |
ASIC FW は 両方 (HOST_TX_SIGNAL_ENABLE = TRUE AND Admin UP) が成立して初めて high-speed signal を出す。片方が落ちれば停止する1。
TRANSCEIVER_INFO 連動¶
sequenceDiagram
participant Mod as Module
participant Pmon as Pmon/xcvrd
participant State as STATE_DB
participant POA as PortsOrch
participant SAI as vendor SAI/SDK
Mod->>Pmon: 挿抜検知
Pmon->>State: TRANSCEIVER_INFO entry add/del
POA->>State: subscribe TRANSCEIVER_INFO
State-->>POA: INSERTION/REMOVAL
POA->>SAI: set HOST_TX_SIGNAL_ENABLE = true/false
Note over SAI: Admin UP 達成時のみ signal 送出
SAI-->>POA: PORT_HOST_TX_READY_NOTIFY (start/stop)
POA->>State: PORT.host_tx_ready = true/false
Note over POA,State: xcvrd は host_tx_ready を購読し<br>CMIS ステートマシン起動
PortsOrch は init 時に SAI capability 問い合わせを行い、HOST_TX_SIGNAL_ENABLE / HOST_TX_READY_NOTIFY のサポート可否を確認する。サポート時のみ TRANSCEIVER_INFO subscribe と通知 consumer を有効化する1。
バックワード互換挙動¶
| プラットフォーム | host_tx_ready の立ち方 |
|---|---|
| 新拡張サポート | SAI 非同期通知到達後に立てる |
| 非サポート | Admin UP の SAI call が SUCCESS で戻った直後に立てる(旧挙動) |
ポート作成時、新 SAI 属性 default が TRUE(互換性のため)なので、サポート platform では PortsOrch が 明示的に FALSE にセットしてから運用する1。
warm-boot¶
warm-boot 後は HOST_TX_READY_NOTIFY は再発行されない。PortsOrch::initializePort() 内で SAI_PORT_ATTR_HOST_TX_READY_STATUS を query して STATE_DB.PORT.host_tx_ready を再構築する1:
attr.id = SAI_PORT_ATTR_HOST_TX_READY_STATUS;
status = sai_port_api->get_port_attribute(port.m_port_id, 1, &attr);
m_portTable->set(port.m_alias, {{"host_tx_ready", attr.value.u32 ? "true" : "false"}});
制限事項¶
- 対応 SDK / FW が必要。非対応 platform では従来挙動のため、unterminated transmission 問題 / 早すぎる CMIS init 問題は解決しない1
- 既定値が TRUE のため、PortsOrch 側で port 作成時の明示 FALSE 設定が抜けると signal が出っぱなしになる
- module 挿抜検知が
TRANSCEIVER_INFO経由に依存するため、xcvrd の振る舞いに連動
干渉する機能¶
- PortsOrch.AdminStatus: signal 出現条件は signal_enable AND admin_up。AdminStatus 変更で signal も連動停止
- xcvrd / CMIS state machine:
host_tx_ready=trueを待ってモジュール init を開始する設計は変更なし - warm-reboot: 通知ベースから query ベースへフォールバック
トラブルシューティング¶
redis-cli -n 6 hget "PORT_TABLE|<port>" host_tx_ready(STATE_DB)redis-cli -n 6 hgetall "TRANSCEIVER_INFO|<port>"でモジュール挿抜状態- ASIC 側 capability: vendor SAI のログまたは debug 系コマンドで
HOST_TX_SIGNAL_ENABLE/HOST_TX_READYの値確認
コマンド例: CMIS module 状態確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。
# CMIS 対応 transceiver の状態と FW
show interfaces transceiver info Ethernet0
show interfaces transceiver eeprom Ethernet0
redis-cli -n 6 hgetall 'TRANSCEIVER_INFO|Ethernet0'
コマンド例: CMIS module 状態確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。
# CMIS 対応 transceiver の状態と FW
show interfaces transceiver info Ethernet0
show interfaces transceiver eeprom Ethernet0
redis-cli -n 6 hgetall 'TRANSCEIVER_INFO|Ethernet0'
単体テスト1¶
sonic-sairedis/unittest/lib/TestSwitch.cpp/meta/TestNotificationFactory.cppを新通知に追従- 新規
meta/TestNotificationHostTxReadyEvent.cppで通知ハンドラ sonic-swss/tests/mock_tests/portsorch_ut.cppに PortsOrch の新フローsonic-swss/tests/test_warm_reboot.pyで warm-reboot 後 host_tx_ready 検証