线缆检测
而线缆检测会读取实际的插线情况,并和PSR(白名单)上配置的情况进行对比,如果有不符合预期的插线会进行告警。
线缆告警:
- 0x28000033(Cable.UBNotPresent)代表对于某个组件的线缆配置,当前线缆连线缺了
- 0x28000031(Cable.UBIncorrectConnection)代表对于某个IEU,A1口预期连BCU的B1,A2口预期连BCU的B2,但是IEU A1口连了BCU B2口,连错了。
- 0x28000035(Cable.UnitNotSupported)代表对于某个IEU的口,连了BCU的A口,但是在配置中不需要连A口。
- 0x2800003D(Cable.UnitUBNotPresent)线缆连线缺失的特殊情况,在部分场景下支持将缺线精确到具体的线缆上。
1. 线缆信息
pcie_device通过SMC命令字读取线缆信息,有如下内容:
| 信息 | 说明 | 举例 |
|---|---|---|
| UID | 组件ID,对于同一型号组件唯一 | "00000001040302023940" |
| SrcPortName | 源端端口标识,确定线缆在BCU上的源端端口 | "A1a" |
| TargetPortId | 对端端口ID,确定线缆在组件上的端口编号 | 17 |
| Index | 所接CPU的ID,部分机型没有 | 1 |
| BCUIndex | 所接BCU的ID,部分不通过TopoNode区分BCU的机型有 | 1 |
1.1 线缆信息能确定什么
线缆信息可以确定某一个BCU上的源端端口,它插了哪个型号的组件的哪个端口,它从哪个BCU的哪个CPU出。
1.2 线缆信息不能确定什么
线缆信息不能精确到具体的组件,它只能确定对端是某个型号的组件,如下图中将两个同UID组件的线交叉,依靠线缆检测信息无法检测错插
插法1:正常连接
插法2:交叉错插
2. 线缆告警事件
线缆告警事件分为四种类型,分别对应不同的线缆连接异常场景。告警检测流程如下:
2.1 线缆错插告警(0x28000031)
告警代码: Cable.UBIncorrectConnection
告警含义: 线缆在基础板(BCU)的一端连接正确,但在对端组件(IEU/EXU/SEU)上的端口连接错误。
触发条件(TOPO_STATUS.INCORRECT_CONNECTION = 2):
- 线缆检测信息中的SrcPortName与白名单配置中的SrcPortName匹配
- 线缆检测信息中的TargetPortID与白名单配置中的TargetPortID不匹配
一般情况:
说明: 配置要求A1a接端口17、A2a接端口33,但实际A1a接了端口33、A2a接了端口17,触发线缆错插告警。
告警位置: BCU(基础板),精确到基础板UBC丝印(如A1a、A2a)。
关键日志:
- 日志路径:
dump_info\LogDump\app.log - 关键字:
INCORRECT_CONNECTION、BizTopoMonitor
2.2 组件不支持告警(0x28000035)
告警代码: Cable.UnitNotSupported
告警含义: 线缆连接了BCU上的某个UBC端口,但该端口在白名单配置中未被使用(未配置SrcPortName)。
触发条件(TOPO_STATUS.UNIT_NOT_SUPPORT = 3):
- 线缆检测信息中的UID不在白名单配置中
- 或线缆检测信息中的SrcPortName不在白名单配置的SrcPortName列表中
一般情况:
说明: 白名单只配置了A1a和A2a端口,但实际线缆连接了A3a端口,触发组件不支持告警。
告警位置: BCU(基础板),精确到基础板UBC丝印。
特殊情况(FlexIO/EXU):
对于FlexIO和EXU组件,当config.matched_times == 0时,状态为UNIT_NOT_EXIT(组件不存在),而非UNIT_NOT_SUPPORT。这是因为FlexIO/EXU可能存在多种配置,未匹配成功时不一定是不支持。
2.3 线缆漏插告警(0x28000033)
告警代码: Cable.UBNotPresent
告警含义: 对于某个组件的线缆配置,当前实际连接的线缆数量少于白名单配置要求的数量。
触发条件(TOPO_STATUS.INCOMPLETE_CONNECTION = 5):
- connected_times > 0(有线缆连接)
- matched_times < #config.src_ports_name(连接数量少于配置数量)
一般情况:
说明: 白名单配置要求连接A1a、A2a、A3a三个端口,但实际只连接了A1a,触发线缆漏插告警。
告警位置: PSR,精确到组件UID和组件丝印。
特殊情况(SEU硬盘背板):
SEU组件的线缆漏插告警有特殊逻辑,需要结合bios加载状态和RAID卡存在情况判断:
- bios未加载完成时: 状态为IGNORE_VALUE(255),不产生告警,防止BMC重启时误告警
- 发现RAID卡时: 状态为MATCHED,不告警(因为RAID卡可能通过其他方式连接)
- bios加载完成且无RAID卡: 状态为INCOMPLETE_CONNECTION,产生线缆漏插告警
关键代码逻辑(topo_monitor.lua):
-- SEU场景特殊处理
if is_seu then
status = def.TOPO_STATUS.IGNORE_VALUE -- bios未加载完时忽略
end
if is_seu and monitor.has_raid then
status = def.TOPO_STATUS.MATCHED -- 有raid卡时不告警
end
if is_seu and monitor.bios_complete_count >= SMBIOS_CHECK_COUNT and not monitor.has_raid then
status = def.TOPO_STATUS.INCOMPLETE_CONNECTION -- 无raid卡时告警
end2.4 线缆精细化漏插告警(0x2800003D)
告警代码: Cable.UnitUBNotPresent
告警含义: 基于PSR的线缆漏插告警,针对组件上行连接器的必插线缆漏插情况,告警精确到组件上的线缆位置丝印。
触发条件:
- 组件存在(UID匹配)
- 组件上行连接器的某些必插线缆未连接
- 基于所有配置的共同最大子集判断必插线缆
判断逻辑: 线缆精细化告警通过计算所有配置的共同最大子集来确定必插线缆。只有属于必插线缆的端口漏插才会产生精细化告警。
一般情况:
说明: 配置中有两种插法,插法1要求A1a和A2a都插,插法2只要求A1a。因此A1a是必插线缆(共同最大子集),A2a是可选线缆。当A1a未连接时,触发精细化告警;当只有A2a未连接时,只产生普通漏插告警。
共同最大子集计算:
假设组件有两种配置:
- 配置1:SrcPortName = ["A1a", "A2a"],TargetPortID = [17, 33]
- 配置2:SrcPortName = ["A1a"],TargetPortID = [17]
共同最大子集为:["A1a"] -> TargetPortID = [17]
只有端口17的线缆漏插才会触发精细化告警,端口33的线缆漏插只触发普通漏插告警。
告警位置: IEU(组件CSR),精确到组件线缆丝印。
关键代码逻辑(topo_monitor.lua):
-- 找共同最大子集
self.solid_config[k].target_ports_largest_subset = self.solid_config[k].target_ports_lists[1]
for _, target_port_id_list in pairs(self.solid_config[k].target_ports_lists) do
temp_set = {}
for _, target_port in pairs(self.solid_config[k].target_ports_largest_subset) do
if cmn.find(target_port_id_list, target_port) ~= nil then
table.insert(temp_set, target_port)
end
end
self.solid_config[k].target_ports_largest_subset = temp_set
end3. 一键收集中的线缆信息
在一键收集日志中可以找到线缆连接信息,在/dump_info/AppDump/cable_info,如:
[BizTopoMonitor] BCU1 Port: name=A1a, status=1, unit=[uid=00000001040302023940, index=1, port_id=17]
[BizTopoMonitor] BCU1 Port: name=A2a, status=1, unit=[uid=00000001040302023940, index=1, port_id=33]4. 小结
告警是在BCU(基础板),精确到基础板UBC丝印。
- 0x28000031(Cable.UBIncorrectConnection),UB线缆或连接器连接错误。
- 0x28000035(Cable.UnitNotSupported),组件不支持。
告警是在PSR,精确到组件UID、组件丝印。
- 0x28000033(Cable.UBNotPresent),UB线缆不在位或连接器未插稳
告警是在IEU(组件CSR),精确到组件线缆丝印。
- 0x2800003D(Cable.UnitUBNotPresent),组件UB线缆不在位或连接器未插稳
5. 代码流程
组件线缆不在位,组件UBC精细化告警