コンテンツにスキップ

Topics で読み物として読む

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

裏取りステータス: code-verified

sonic-utilities/sfputil/main.pyread-eeprom (L1812-) / write-eeprom (L1862-) サブコマンドを確認。--page (-n) / --offset (-o) / --size / --no-format / --wire-addr(sff8472 用)/ --verify(write 後リードバック比較)の各オプション、および get_overall_offset_sff8472 ヘルパによる sff8472 wire-addr ハンドリング、sfp.read_eeprom(flat_offset, size) / sfp.write_eeprom(overall_offset, len(bytes), bytes) 経路をすべて確認。sfp.read_eeprom() is currently not implemented for this platform の ERROR_NOT_IMPLEMENTED 経路もエラー処理として実装されている。

sfputil read-eeprom / write-eeprom(ページ + オフセット指定で SFP/QSFP EEPROM 操作)

概要

既存 platform API sfp.read_eeprom / sfp.write_eeprom「全体 offset」 しか取らず、ユーザは規格毎に page/offset の合算を自前計算する必要があった。本機能は page と offset を直接渡せる sfputil サブコマンド read-eeprom / write-eeprom を追加し、cable type 毎の妥当性検査を入れる1

動作仕様

CLI

sfputil read-eeprom -p <port> -n <page> -o <offset> -s <size> [--no-format] [--wire-addr a0h|a2h]
sfputil write-eeprom -p <port> -n <page> -o <offset> -d <hex> [--wire-addr a0h|a2h] [--verify]
  • --no-format: 整形なし生 hex
  • --wire-addr: sff8472 (SFP) のみ。a0h / a2h
  • --verify: 書き込み後リードバックして比較

1:

sfputil read-eeprom -p Ethernet0 -n 0 -o 100 -s 2
        00000064 4a 44                                            |..|

sfputil write-eeprom -p Ethernet0 -n 0 -o 100 -d 4a44 --verify
Error: Write data failed! Write: 4a44, read: 0000.

page / offset 範囲チェック1

規格 passive cable active cable
CMIS page 0 / offset 0-255 page 0-255、page 0 (0-255)、他 (128-255)
sff8436 / sff8636 同上 同上
sff8472 wire A0h / offset 0-128 wire A0h (0-255) + A2h (0-255)
  • offset + size が page 範囲を超えるなら無効
  • page>0 で offset<128 は lower memory で、CMIS / sff8636 active 系では無効
  • active cable の page existence は 完全検証不可。ユーザがケーブルマニュアル参照で担保1

検証例:

sfputil read-eeprom -p Ethernet0 -n 0 -o 255 -s 2  # invalid (255+2=257)
sfputil read-eeprom -p Ethernet0 -n 1 -o 0   -s 1  # invalid (page 1 では offset>=128)

実装方針

  • sonic-utilities/sfputil に 2 サブコマンド追加1
  • 内部で page/offset → 全体 offset への変換を規格別に実装し、既存 sfp.read_eeprom / sfp.write_eeprom を呼ぶ
  • vendor 未対応 (NotImplementedError) は明示的にハンドル
  • それ以外のエラーは read/write 失敗として扱う
  • RJ45 ポートは対象外1

既知の問題

Mellanox スイッチで非 Mellanox 光トランシーバーが PLUGGED-ERR 状態になる(#265)

Mellanox スイッチに非 Mellanox ブランドの光トランシーバーを接続すると PLUGGED-ERR 状態になり、リンクが確立しない場合がある。mlxlink コマンドで確認すると以下のような出力が得られる:

Recommendation: The cable is not supported.

これは Mellanox スイッチのファームウェアがベンダーロック(特定ブランドの光モジュールのみ許可)を実装している場合に発生する。

解決策: Mellanox サポートに連絡し、ベンダー制限を解除したファームウェアを取得する(非公開ファームウェア。サポート契約が必要)。ONYX 時代は fae cable-stamping-unlock コマンドが存在したが、SONiC での同等コマンドは未実装。

# トランシーバーの状態確認
mlxlink -d /dev/mst/mt<device>_pci_cr0 -p <port_number>
show interfaces transceiver eeprom Ethernet<N>

制限事項

  • vendor の platform API 実装が前提。未実装 vendor では NotImplementedError1
  • active cable の page 存在チェックは完全には行わない
  • RJ45 不可
  • warm/fast-boot 影響なし、メモリ消費影響なし1

干渉する機能

  • sfputil 既存サブコマンド: 同じ CLI ツールに追加される
  • sonic_platform_base.sfp_base.SfpBase.read_eeprom / write_eeprom: 下位 API
  • xcvrd / pmon: EEPROM への書込はモジュール状態に影響するため運用注意

参考リンク

引用元