Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 14 章: Platform / Port / Optics を参照。
裏取りステータス: code-verified
sonic-utilities/sfputil/main.py で read-eeprom (L1812-) / write-eeprom (L1862-) サブコマンドを確認。-n/--page (hex) / -o/--offset (click.IntRange(0, MAX_EEPROM_OFFSET)) / --size / --no-format / --wire-addr (sff8472 用) / --verify (write 後リードバック比較) を実装。get_overall_offset_sff8472 ヘルパで sff8472 wire-addr (a0h/a2h) を解決し、sfp.read_eeprom(flat_offset, size) / sfp.write_eeprom(overall_offset, len(bytes), bytes) の platform API を呼ぶ。NotImplementedError 経路も Sfp.read_eeprom() is currently not implemented for this platform で返却。
sfputil read-eeprom / write-eeprom(page+offset 単位の生 EEPROM 読み書き)¶
概要¶
光モジュールやケーブル(CMIS QSFP-DD / SFF-8636 QSFP+ / SFF-8472 SFP)の EEPROM を page + offset + size で直接読み書きするための CLI を sfputil に追加する。既存の platform API sfp.read_eeprom / sfp.write_eeprom は overall offset 1 本 しか取らず、ユーザは規格ごとの page→overall 変換を手で行う必要があった。新 CLI はこの変換と入力 validation を肩代わりする1。
動作仕様¶
CLI(2 個追加)¶
sfputil read-eeprom1:
Options:
-p, --port <logical_port_name> Logical port name [required]
-n, --page <page> EEPROM page number [required]
-o, --offset <offset> EEPROM offset (page 内) [required]
-s, --size <size> 読込バイト数 [required]
--wire-addr TEXT SFF-8472 のみ (a0h / a2h)
--no-format ヘキサダンプでなく hex 連結
sfputil write-eeprom1:
Options:
-p, --port <logical_port_name> [required]
-n, --page <page> [required]
-o, --offset <offset> [required]
-d, --data <data> hex string [required]
--wire-addr TEXT SFF-8472 のみ
--verify 書込後に read してベリファイ
規格別 validation 規則¶
| 規格 | passive cable | active cable | 注 |
|---|---|---|---|
| CMIS | page 0 のみ。offset 0-255 | page 0-255。page 0 は 0-255、それ以外は 128-255 | active の page 存在は cable user manual に責任を委譲 |
| SFF-8636 / SFF-8436 | 同上 | 同上 | 同上 |
| SFF-8472 | wire A0h のみ。offset 0-128 |
wire A0h/A2h。各 0-255 |
--wire-addr 必須、case insensitive |
size > (page サイズ − offset) は invalid。例:
sfputil read-eeprom -p Ethernet0 -n 0 -o 255 -s 2 # invalid: 255+2=257 で page 0 範囲外
sfputil read-eeprom -p Ethernet0 -n 1 -o 0 -s 1 # invalid: page 1 は offset >=128
内部ロジック¶
flowchart TB
IN[CLI 引数<br/>port/page/offset/size/wire_addr] --> V[規格別 validation]
V -->|invalid| ERR[エラー]
V -->|valid| TYPE[xcvr 種別判定<br/>CMIS / SFF-8636 / SFF-8472]
TYPE --> CONV[page+offset → overall offset 変換]
CONV --> API[platform_api.sfp.read_eeprom<br/>または write_eeprom]
API -->|NotImplementedError| NI[「unsupported by vendor」]
API -->|other Exception| FAIL[read/write 失敗を表示]
API -->|OK| OUT[hex dump / 書込成功]
要点1:
- 規格ごとの page-to-overall 変換は sonic-utilities 側で実装(platform API は触らない)
- ベンダ実装が
NotImplementedErrorを上げた場合は 「unsupported」を専用にハンドル し、その他例外は read/write 失敗扱い - RJ45 ポートは対象外(EEPROM が無い)
--verify フラグ¶
write 直後に同 page+offset+size を read して 書いた値と一致 するかを確認。一致しなければエラー1:
sfputil write-eeprom -p Ethernet0 -n 0 -o 100 -d 4a44 --verify
Error: Write data failed! Write: 4a44, read: 0000.
設定¶
関連する CONFIG_DB¶
該当なし。本機能は EEPROM 直接アクセス であり CONFIG_DB は使わない。
関連する CLI¶
sfputil read-eeprom, sfputil write-eeprom(上記)
設定例¶
# CMIS の page 0 から 32 byte
sfputil read-eeprom -p Ethernet0 -n 0 -o 0 -s 32
# SFF-8472 の A2h 領域から DDM
sfputil read-eeprom -p Ethernet0 -n 0 -o 96 -s 10 --wire-addr a2h
# CMIS module level command を発行する書込
sfputil write-eeprom -p Ethernet0 -n 0 -o 26 -d 08 --verify
制限事項¶
- ベンダの platform plugin が
sfp.read_eeprom/sfp.write_eepromを実装していないと使えない1 - RJ45 ポートは対象外1
- active cable の page 存在チェックは「完璧にはできない」と HLD 自身が認めている1。手元の cable / module の datasheet 照合はユーザ責任
- HLD は
Open/Action itemsに項目記載なし。warmboot / fastboot 影響もN/A1
干渉する機能¶
- xcvrd / xcvrd_utilities: pmon の transceiver daemon が同じ EEPROM を周期的に読んでいる。
write-eepromで破壊的変更をすると xcvrd 側のキャッシュとも齟齬が出うる - DOM / SFP monitoring: A2h 領域の Diagnostic Monitoring Interface を上書きすると DOM 表示が壊れる
- media_settings.json / port auto-negotiation: TX FIR や interface_type の設定が transceiver の vendor 領域を読んでいる場合は注意
- secure module / NVR: 一部 module は write protect / signed firmware 領域を持つ。
write-eepromでアクセスすると硬い失敗を返す可能性
トラブルシューティング¶
# vendor plugin が未実装
sfputil read-eeprom -p Ethernet0 -n 0 -o 0 -s 16
# → "Sfp read/write feature is not implemented" 等
# 読めるが値が想定と違う
# 1) page 番号と wire address (SFF-8472) の取り違いを確認
# 2) size が page 境界を跨いでいないか
sfputil read-eeprom -p Ethernet0 -n 0 -o 128 -s 200 # invalid
# write が反映されない
sfputil write-eeprom ... --verify
# モジュールの read-only 領域 / page 不在の可能性
参考リンク¶
- CONFIG_DB: PORT
- CLI: show platform
- CLI: show interfaces
- Topics: Platform / Port / Optics
- Glossary
- Reference 索引