校验和:CC_BASE、CC_EXT、CC_DMI 与 CMIS 页面
每份管理规范都会用一个或多个校验和来保护自己的身份信息块,校验和是一个字节,让主机在信任 EEPROM 内容之前,先判断它是否损坏或写了一半。校验和的计算很简单,却很容易被遗忘:编辑之后忘记更新校验和,是刚编码完的模块被判定为无效最常见的原因。
算法
所有校验和都遵循同一规则:把覆盖范围内的字节当作无符号 8 位数值相加,只保留和的低 8 位 (对 256 取模)。不使用 CRC,也不涉及多项式。
sum = 0
对范围内的每个字节 b:
sum = (sum + b) & 0xFF
checksum = sum
示例:某 10GBASE-SR SFP 的前五个字节为 03 04 07 10 00 → 3 + 4 + 7 + 16 + 0 = 30 = 1Eh。一直加到 byte 62,结果就是 CC_BASE。
各校验和的位置
| 规范 | 校验和 | 位置 | 覆盖范围 |
|---|---|---|---|
| SFF-8472 (SFP) | CC_BASE | A0h 字节 63 | A0h 字节 0–62 |
| SFF-8472 | CC_EXT | A0h 字节 95 | A0h 字节 64–94 |
| SFF-8472 | CC_DMI | A2h 字节 95 | A2h 字节 0–94(阈值和校准常数) |
| SFF-8636 (QSFP) | CC_BASE | 字节 191 | 上页 00h 字节 128–190 |
| SFF-8636 | CC_EXT | 字节 223 | 字节 192–222 |
| INF-8077i (XFP) | CC_BASE | 字节 191 | 字节 128–190 |
| INF-8077i | CC_EXT | 字节 223 | 字节 192–222 |
| CMIS | 页校验和 | 页 00h 字节 222 | 页 00h 字节 128–221 |
| CMIS | 页校验和 | 页 01h 字节 255 | 页 01h 字节 130–254(128–129 保存备用固件版本,不计入校验) |
| CMIS | 页校验和 | 页 02h 字节 255 | 页 02h 字节 128–254 |
| CMIS | 页校验和 | 页 04h 字节 255 | 页 04h 字节 128–254 |
没有任何校验和覆盖的区域:厂商自定义区(SFP A0h 96–127、QSFP 224–255、CMIS 223–255)、用户 EEPROM、实时监测值和标志位、QSFP page 03h 的阈值,以及 CMIS 通道页。厂商可以在厂商自定义区中加入自己的完整性校验字段,但那些不属于规范的一部分。
主机如何处理校验和
| 行为 | 校验和错误时的结果 |
|---|---|
| 校验 CC_BASE(大多数交换机和路由器) | 模块显示为无效、不支持或EEPROM 校验和错误;端口可能被 errdisable;激光器通常保持关闭 |
| 同时校验 CC_EXT | 结果相同,或者只记录日志,取决于具体平台 |
| 校验 CC_DMI | DDM 显示为不支持,或数值被忽略;链路本身不受影响 |
| 忽略校验和(许多 NIC,部分开放式交换机) | 模块可以正常工作;错误只会在工具中显示 |
校验和错误和身份信息问题会一起报告,因此如果模块同时存在策略限制问题,两个消息会互相掩盖,分不清究竟是哪一个;先检查校验和,这是成本最低的排查步骤。故障现象对照表: 故障现象索引。
什么时候必须重新计算
- 编辑覆盖范围内的任何内容之后:厂商名称、型号、序列号、日期代码、合规代码、波长、长度、选项、功率等级。
- 在 SFP 上应用阈值或校准常数之后(CC_DMI)。
- 从另一个模块恢复部分镜像之后。
- 厂商自定义区、用户 EEPROM 或 A2h 控制字节的更改不需要重新计算。
操作顺序:编辑 → 重新计算所有受影响的校验和 → 写入 → 回读 → 校验。如果在数据写入之前 先写入校验和字节,就会留下一段时间窗口,一旦在此期间断电,模块就会变成无效状态。
校验和与厂商锁定
校验和正确是必要条件,但不是充分条件。严格的平台还会检查厂商信息块,在锁定设计中,还会检查厂商自定义区里的一段专有签名,而这段签名是规范定义的校验和完全不知道的。CC_BASE 校验通过、但身份信息仍被拒绝,这种情况属于厂商锁定问题,而不是校验和问题,参见: 厂商锁定, 厂商字段。
在 CodingBox 中
CodingBox 会在每次写入时自动重新计算 CC_BASE、CC_EXT、CC_DMI 和 CMIS 页校验和,并在读取模块时高亮显示不匹配的情况:Check transceiver 或 EEPROM editor 中出现红色的校验和字段,说明模块在别处被编辑过但没有修正校验和,或者 EEPROM 已损坏。
各校验和在相邻字节中的具体位置: SFF-8472 A0h(63、95), A2h(95), SFF-8636 上层页(191、223), CMIS 上层页(222、255), XFP(191、223)。