Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 14 章: Platform / Port / Optics を参照。
裏取りステータス: code-verified
sonic-utilities/sfputil/main.py で read-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 コマンドで確認すると以下のような出力が得られる:
これは 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 への書込はモジュール状態に影響するため運用注意
参考リンク¶
- CONFIG_DB: PORT
- CLI: show platform
- CLI: show interfaces
- Topics: Platform / Port / Optics
- Glossary
- Reference 索引