初步分析结论:
bmc_network/1.120.38@openubmc/stable#d6d55fb9dec08cce21729860e98651fb%1784284406.66 的 manufacture_dft.lua:50 在 BMC 重启后执行 MGMT 口 PHY 识别时崩溃(mdio_ctor 为 boolean,MDIO 模块初始化失败未判空),DFT 结果无法回传,导致 MP19 nic_magloop_test MGMT fail。
51.04 使用的旧版 bmc_network 无此崩溃路径,故回退 Pass。修复需落在闭源仓 bmc_network,当前无源码。
问题描述
Expected:MP19 对 MGMT 口执行自环测试(base/self_loop)并回传成功。
Actual:DFT 结果查询返回失败(return:0f 31 00 90 80 80);回退 另一个版本 后同板 Pass,为确定性版本回归。
环境信息
证据链(dump 时间线,2026-09-15)
| — |
— |
— |
| 03:02:10 |
第 1 次 MGMT 自环(BMC 重启前)。MDIO 路径当时可用:PHY 读 identifier 282、enable/disable phy loop mode 成功 |
物理自环失败:net_dft.c(197) recv failed errno:2、recv data is not correct,重试约 40s 全部 ret=-1 → Failed |
| 03:12:06 |
第 2 次尝试,仅一次 recv timout failed |
Succeed(ret=0),链路可恢复 |
| 03:19 |
BMC 重启(测试流程) |
— |
| 03:23:05 |
第 3 次:manufacture_dft.lua(49) get_phy_identifier start! → 4ms 后崩溃 |
MGMT 测试最终 fail |
崩溃原文(LogDump/app.log:5485-5486):
2026-09-15 03:23:05.993312 bmc_network NOTICE: manufacture_dft.lua(49): get_phy_identifier start!
2026-09-15 03:23:05.993817 bmc_network ERROR: app_preloader.lua(232):
.../bmc/apps/bmc_network/lualib/dft_eth/manufacture_dft.lua:225:
app(bmc_network/service/main) count(1) pcall failed(
.../dft_eth/manufacture_dft.lua:50: attempt to index upvalue 'mdio_ctor' (a boolean value))
假设与排查过程
-
**假设 1:测试工具侧问题。**排除——回退 51.04 同板 Pass,且 dump 内无测试工具异常。
-
**假设 3:bmc_network 代码版本回归。**支持——崩溃栈明确指向 manufacture_dft.lua:50;对照 其他分支使用的 bmc_network 1.110.43/1.121.13 字节码,其中已出现 retry_get_identifier(PHY 识别重试/容错)字符串常量,说明新版已加该容错。
直接原因(事实)
get_phy_identifier 中 mdio_ctor 是对 MDIO 驱动模块(libsoc_adapter.mdio)require/pcall 的结果,取值为 boolean(false),即模块初始化失败;line 50 未判空直接索引/调用,LuaJIT 抛出 attempt to index upvalue 'mdio_ctor' (a boolean value),整个 dft_eth worker pcall 失败,DFT 结果无法回传。
触发条件(推断)
BMC 重启后 MGMT 口(eth3)PHY 的 MDIO 访问路径未就绪;叠加 03:02 首次自环时链路曾真实 down(errno:2/ENOTCONN),说明该口 PHY/链路初始化本身不稳定。51.04 的旧版 bmc_network 无此崩溃路径(推断),故回退 Pass。
修复方案(建议,待 bmc_network 属主评审)
-- 现状(推断): mdio_ctor 为 pcall(require, 'libsoc_adapter.mdio') 结果,失败时为 boolean false
-- line 50: mdio_ctor.xxx(...) -- 未判空直接索引,触发崩溃
-- 修复:
local function get_phy_identifier(phy_addr)
log:notice('get_phy_identifier start!')
if type(mdio_ctor) ~= 'table' then
log:error('mdio ctor unavailable, skip phy identifier (phy_addr=%s)', tostring(phy_addr))
return nil -- 走 DFT 失败结果回传, 而不是崩溃
end
-- ... 原识别逻辑
end
答案内容由AI生成,仅供参考:
问题结论
根因:bmc_network 1.81.8 版本中 manufacture_dft.lua:50 在 BMC 重启后执行 MGMT 口 PHY 识别时发生崩溃。崩溃原因是 mdio_ctor 为 boolean 值(false),即 MDIO 模块初始化失败后未做判空处理,导致 LuaJIT 抛出异常,DFT 结果无法回传,最终 MP19 nic_magloop_test MGMT 测试失败。
回退验证:51.04 版本使用的旧版 bmc_network 无此崩溃路径,故同板回退后测试 Pass,确认为确定性版本回归问题。
点击此处查看详细分析解答
根据您提供的问题描述和上下文信息,我对 DFT 网卡 MGMT 自环测试失败 的问题进行了综合分析。以下是结论:
问题结论
根因:bmc_network 1.81.8 版本中 manufacture_dft.lua:50 在 BMC 重启后执行 MGMT 口 PHY 识别时发生崩溃。崩溃原因是 mdio_ctor 为 boolean 值(false),即 MDIO 模块初始化失败后未做判空处理,导致 LuaJIT 抛出异常,DFT 结果无法回传,最终 MP19 nic_magloop_test MGMT 测试失败。
回退验证:51.04 版本使用的旧版 bmc_network 无此崩溃路径,故同板回退后测试 Pass,确认为确定性版本回归问题。
证据链分析
根据 dump 时间线(2026-09-15),整个测试过程可分为三个阶段:
| 时间 |
事件 |
结果 |
| 03:02:10 |
第 1 次 MGMT 自环(BMC 重启前):MDIO 路径可用,PHY 读 identifier 282、enable/disable phy loop mode 成功 |
物理自环失败:net_dft.c(197) recv failed errno:2,重试约 40s 全部 ret=-1 → Failed |
| 03:12:06 |
第 2 次尝试,仅一次 recv timout failed |
Succeed(ret=0),链路可恢复 |
| 03:19 |
BMC 重启(测试流程) |
— |
| 03:23:05 |
第 3 次:manufacture_dft.lua(49) get_phy_identifier start! → 4ms 后崩溃 |
MGMT 测试最终 fail |
崩溃原文(LogDump/app.log:5485-5486):
2026-09-15 03:23:05.993312 bmc_network NOTICE: manufacture_dft.lua(49): get_phy_identifier start!
2026-09-15 03:23:05.993817 bmc_network ERROR: app_preloader.lua(232):
.../bmc/apps/bmc_network/lualib/dft_eth/manufacture_dft.lua:225:
app(bmc_network/service/main) count(1) pcall failed(
.../dft_eth/manufacture_dft.lua:50: attempt to index upvalue 'mdio_ctor' (a boolean value))
根因分析
直接原因(事实)
get_phy_identifier 中的 mdio_ctor 是对 MDIO 驱动模块(libsoc_adapter.mdio)require/pcall 的结果。当模块初始化失败时,其取值为 boolean(false),而 line 50 未判空直接索引/调用,LuaJIT 抛出 attempt to index upvalue 'mdio_ctor' (a boolean value) 异常,导致整个 dft_eth worker 的 pcall 失败,DFT 结果无法回传。
触发条件(推断)
BMC 重启后,MGMT 口(eth3)PHY 的 MDIO 访问路径未就绪。叠加 03:02 首次自环时链路曾真实 down(errno:2/ENOTCONN),说明该口 PHY/链路初始化本身不稳定。51.04 的旧版 bmc_network 无此崩溃路径,故回退 Pass。
假设排查过程
| 假设 |
结论 |
依据 |
| 测试工具侧问题 |
排除 |
回退 51.04 同板 Pass,且 dump 内无测试工具异常 |
| PHY 硬件故障 |
不成立为唯一原因 |
第 1 次失败(PHY 可读、链路曾 down)与第 3 次失败(崩溃)表现不同,且 51.04 同板复测 Pass |
| bmc_network 代码版本回归 |
支持 |
崩溃栈明确指向 manufacture_dft.lua:50;对照 5290 分支使用的 bmc_network 1.110.43/1.121.13 字节码,已出现 retry_get_identifier(PHY 识别重试/容错)字符串常量,说明新版已加容错 |
| 源码在本工作区可修复 |
排除 |
穷举搜索 bare/ 93 仓、工作区全量 *.lua、5290 构建树均无 bmc_network 源码(仅有 LuaJIT 字节码);GitCode 公开镜像 openUBMC/bmc_network main 分支仅 20 文件、无 dft_eth;artifactory 上 1.81.8 配方 400 不可得。bmc_network 为闭源 conan 预编译组件 |
修复方案(建议)
注意:bmc_network 为闭源组件,以下修复需由 bmc_network 属主评审并落地。
1. 崩溃修复(核心)
-- 现状(推断): mdio_ctor 为 pcall(require, 'libsoc_adapter.mdio') 结果,失败时为 boolean false
-- line 50: mdio_ctor.xxx(...) -- 未判空直接索引,触发崩溃
-- 修复:
local function get_phy_identifier(phy_addr)
log:notice('get_phy_identifier start!')
if type(mdio_ctor) ~= 'table' then
log:error('mdio ctor unavailable, skip phy identifier (phy_addr=%s)', tostring(phy_addr))
return nil -- 走 DFT 失败结果回传, 而不是崩溃
end
-- ... 原识别逻辑
end
2. 容错增强(对齐新版本)
- 对齐 bmc_network 1.110.43+ 的 MDIO 就绪重试(
retry_get_identifier)逻辑,避免单次未就绪即判失败。
3. 版本管理
- 由 bmc_network 属主确认修复版并做 MP19 DFT 回归验证。
- 2280V3 分支 manifest pin
1.81.8 升级为修复版本。
补充说明
- DFT 测试相关命令:获取装备模式(
1Fh)、使能/禁止 DFT 命令(20h)、获取测试项内容(41h)、启动/停止测试(42h)、获取测试结果(43h)均为标准 IPMI 命令,可用于问题复现和验证。
- DFT 测试项 ID 0x4A:根据知识库记录,0x4A 是 BMC Net Port Loopback Test 成功执行所需的 DFT 测试项 ID,若测试项缺失则测试失败。
- 组件版本信息:问题设备使用的 bmc_network 为 1.81.8(闭源 conan 预编译组件),与 OpenUBMC 环境中其他版本(如 1.70.42、1.80.62、1.110.45 等)为不同版本线。