EEPROM 改码:密码与原理
多年工程讨论沉淀下的核心认知:光模块兼容性不是固件问题——而是通过 I²C 读取的 EEPROM 中的识别字符串。 交换机拒绝一个模块,仅仅是因为它不认识其中的厂商字符串。正是这个事实解释了“把所有模块都编码成 Cisco——几乎哪里都能用”这一常见做法,也解释了整个编码工具市场的存在。
密码存放在哪里
写入模块存储器的受保护区域,需要在写入前把一个 4 字节密码写到固定地址:
| 模块类型 | 存储器块 | 密码偏移量 |
|---|---|---|
| SFP / SFP+ | A2h(I²C 地址 0x51) | 0x7B–0x7E |
| QSFP / XFP | A0h | 0x7B |
常见密码
| 密码 | 说明 |
|---|---|
00 00 10 11 | MSA 默认值——第一个该尝试的 |
00 00 00 00、FF FF FF FF | 常见的默认值 |
9B B0 3D FA | 在不少模块上见过 |
4F 43 50 00 | ASCII 编码的 “OCP” |
部分厂商的 QSFP-DD 模块自带独有的固定默认密码,还有一些基于微处理器的模块使用会变化的可变密码——这对任何想暴力破解的人来说都是一个陷阱。
为什么暴力破解不是办法
守护整个存储器映射的厂商级密码,暴力破解大约需要 100 多天;即便是主机级的 ASCII 密码,也要耗时近三天。实际可行的路径是建立一个已知代码和密码的数据库,从原厂模块中采集而来——这才是编码工具真正的价值所在,而不是 I²C 硬件本身(那部分很简单)。
自制编程器的坑
- 廉价的 CH341A 编程器不会计算 SFP 校验和。 写入一份没有有效 CC_BASE/CC_EXT 的镜像,得到的模块会被交换机拒绝。你需要一个能自动重新计算校验和的工具。
- 有些交换机只能写入地址 0x50,因此 0x51 上的密码从交换机本身无法触及——需要专用的编程器板卡。
- EEPROM 写保护引脚——有些厂家在生产时把 WP 接到 Vcc,使模块在现场被锁定、无法写入。
来自现场的案例
- 编码成某厂商身份的模块,在另一厂商的交换机上无法自动协商;重新编码为该交换机自身的厂商字符串后,立刻就通了。
- 部分光模块厂商按设计出货未编码的模块,预期由买家自行为目标平台编码。
- DWDM 模块通过同一个管理接口调谐波长,与编码用的是同一套接口。
在 CodingBox 中操作
- 读取模块;它会自动保存到code database,写入前会先取一份备份。
- 在保护存储区与密码中设置表地址、密码地址和密码值——数据库中已知的密码会自动应用。
- 在 EEPROM editor 中编辑厂商、型号及其他身份字段。 CC_BASE 和 CC_EXT 会为你自动重新计算。
- 写入选定的页,然后读回验证。用 核实光模块中的命令在交换机上检查模块。
只为你有权获得的互操作性对模块编码,并遵守所在组织及厂商的政策。
编辑前先弄清哪个字节保存什么:SFF-8472 A0h 映射、 SFF-8636 高位页映射、 CMIS 高位页映射、 XFP 映射。
各厂商的目标型号及其命名规则:OEM 型号;各平台在写入后各自检查什么: 各 NOS 如何校验模块。