LPe32002-AP网卡mctp初始化异常终止问题

基于openubmc 2509版本

测试时发现LPe32002-AP网卡温度未获取:

跟踪代码发现在create_mctp_endpoint时突然终止:
我加的打印如下:

执行结果如下:

在mctpd日志中发现一条报错:这里似乎把该卡的msg_types识别成了0


且该对象查看报错:

mctp_lib.get_endpoint_and_transport属于闭源sdk,不能继续跟踪,应该是该闭源sdk中出现了死循环或者不可捕捉错误,希望帮忙确认一下原因。

答案内容由AI生成,仅供参考:

LPe32002-AP 网卡 MCTP 初始化异常终止问题分析(基于 openUBMC 25.09 版本)

问题概述

在使用 openUBMC 25.09 版本测试时,发现 LPe32002-AP 网卡的温度传感器读数为 0,表明带外通信未能正常获取设备信息。进一步跟踪代码发现,create_mctp_endpoint 流程在调用 mctp_lib.get_endpoint_and_transport未打印后续日志(如“5”或“6”),说明该函数调用后流程被异常终止或阻塞。

由于 mctp_lib.get_endpoint_and_transport 属于 闭源 SDK 组件,无法直接查看其内部实现逻辑,但可结合现有知识库信息和系统行为,对问题进行综合排查与定位。


关键代码分析与执行路径

根据用户提供的日志和代码片段,执行流程如下:

function c_network_adapter:create_mctp_endpoint_for_others(msg_type)
    log:notice("... %$$$ 1")
    while count < max_retry do
        log:notice("... %$$$ 2")
        if self.DevBus ~= 0 ... then
            log:notice("... %$$$ 3")
            local phy_addr = mctp_lib.bdf_to_phy_addr(...)
            log:notice("... %$$$ 4") -- ✅ 已打印
            local ok, endpoint, transport = pcall(mctp_lib.get_endpoint_and_transport, ...)
            log:notice("... %$$$ 5") -- ❌ 未打印 → 说明 pcall 内部发生不可捕获异常或陷入死循环
            if not ok then ... end
            log:notice("... %$$$ 6") -- ❌ 未打印
        end
    end
end

关键观察点:

  • pcall 本应捕获 Lua 层面的错误并返回 ok=false,但 既没有返回异常,也没有继续执行后续代码
  • 意味着:
    1. 闭源函数未正常返回(如:无限等待、死锁、内部死循环);
    2. 底层阻塞在 I/O 操作(如 PCIe 配置空间访问超时、MCTP 探测超时);
    3. 触发了非 Lua 异常(如 C 层段错误导致进程崩溃)。

:warning: 在 openUBMC 系统中,若 Lua 调用的 C 闭源库发生严重异常(如段错误),可能导致 Lua VM 崩溃而无任何日志输出。


mctp_lib.get_endpoint_and_transport 的作用机制

尽管该函数为闭源,但可通过上下文推断其核心逻辑:

组件 说明
mctp_lib 提供 MCTP 协议栈支持,用于创建传输层(Transport)和端点对象(Endpoint),实现 BMC 与 PCIe 设备之间的管理通信。
get_endpoint_and_transport(bus, module_name, phy_addr, msg_type) 根据物理地址(phy_addr)和消息类型(msg_type)向 MCTP 栈请求建立通信通道。

:white_check_mark: 典型逻辑流程应如下:

  1. 通过 phy_addr(由 BDF 转换而来)定位 PCIe 设备;
  2. 向设备发送 MCTP 发现请求(如 Get Endpoint ID);
  3. 等待设备响应;
  4. 若成功,创建 TransportEndpoint 对象,注册到 D-Bus;
  5. 返回对象引用。

:magnifying_glass_tilted_left: 当前行为异常解释:

  • 函数调用后无返回 → 极可能卡在第 2~3 步,即 MCTP 探针未收到设备响应,且 闭源库未设置合理超时机制,导致长时间阻塞甚至死锁。

根本原因分析

结合文档、知识图谱及用户现象,推断可能原因如下:

:white_check_mark: 1. MCTP over PCIe 链路未建立或设备未响应

  • LPe32002-AP 是否真正支持 MCTP?
    • 搜索结果显示:LPE31002-AP 在 SR 文件中配置了 SupportedMctp=true,说明其支持 MCTP。
    • 推测 LPe32002-AP 同样支持,但需确认其 SR 文件中是否正确定义了:
      "SupportedMctp": true,
      "SupportedMctpOverPcie": true
      
    • 缺失 SR 配置会导致 mctp_lib 无法识别为 MCTP 设备,从而在探测阶段无限等待。

:white_check_mark: 2. PCIe 物理链路或枚举异常

  • 日志显示 BDF 为 23:0.0bdf_to_phy_addr(23,0,0) 得到 phy_addr=22
  • 若 PCIe 枚举不完整或链路不稳定,mctp_lib 将无法访问设备配置空间,导致探测失败。
  • 建议检查:
    • dmesg 是否有 PCIe link down 或 bus timeout 报错;
    • 是否在设备完全初始化前过早调用 MCTP 创建。

:white_check_mark: 3. mctp_lib.get_endpoint_and_transport 缺乏超时机制(已知风险)

  • 多个文档指出:
    • openUBMC 的 mctp_lib 和 MCTP 相关组件为闭源,调试困难;
    • 在 openUBMC 25.06 时存在“inject 手动注入 endpoint”问题,更新至 25.09 后修复 → 表明早期版本存在 endpoint 上树失败的问题。

来自文档 #6《南向网卡驱动适配指南》

“方式一(NCSI over MCTP over PCIe + SMBus)”:框架会根据 SR 配置使用 SMBus 传输创建 MCTP。

若未正确配置传输介质,mctp_lib 可能误走 SMBus 路径,而 LPe 卡仅支持 PCIe MCTP → 导致探测失败。

:white_check_mark: 4. 闭源库内部段错误导致无日志崩溃

  • 虽然使用了 pcall,但如果 mctp_lib 是 C/C++ 实现的动态库,未处理的段错误(Segmentation Fault)会直接终止进程,不会被 Lua 捕获。
  • 此时将无后续日志输出,现象与当前完全一致。

解决方案与排查建议

:white_check_mark: 1. 核查 SR 文件配置

确保 LPe32002-AP 的 .sr 文件中包含以下字段:

"SupportedMctp": true,
"SupportedMctpOverPcie": true,
"Model": "LPe32002-AP"

并验证是否正确引用到 hardware_config 目录,且 network_adapter 能识别该型号。


:white_check_mark: 2. 检查 MCTP 绑定与 endpoint 是否创建成功

登录 BMC 后执行:

# 查看 MCTP Binding 信息
busctl --user introspect bmc.kepler.mctpd /bmc/kepler/Systems/1/Mctp/MctpBinding

# 查看 BmcEid 和 BmcPhyAddr 是否设置
busctl --user get-property bmc.kepler.mctpd /bmc/kepler/Systems/1/Mctp/MctpBinding BmcEid
busctl --user get-property bmc.kepler.mctpd /bmc/kepler/Systems/1/Mctp/MctpBinding BmcPhyAddr

:white_check_mark: 预期值:BmcEid ≠ 0, BmcPhyAddr ≠ 0
:cross_mark: 若为 0,则 MCTP 协议栈未初始化或失败。


:white_check_mark: 3. 使用 tracemctp 工具抓包分析

利用 tracemctp 工具监听 MCTP over PCIe 流量:

# 启动追踪
tracemctp start

# 重启 network_adapter 或插拔网卡
systemctl restart network_adapter

# 查看是否有以下报文交互
tracemctp dump

期望看到:

  • MCTP_MSG_TYPE_DISCOVERY_REQ
  • MCTP_MSG_TYPE_DISCOVERY_RSP

若无响应: 说明设备未启用 MCTP 或 PCIe 通信异常。


:white_check_mark: 4. 添加超时保护机制(应用层规避)

由于闭源库可能无超时机制,建议在 Lua 层增加守护逻辑:

local function create_with_timeout(bus, mod_name, phy_addr, msg_type, timeout_sec)
    local result = { success = false, endpoint = nil, transport = nil }
    local co = coroutine.create(function()
        local ok, ep, tp = pcall(mctp_lib.get_endpoint_and_transport, bus, mod_name, phy_addr, msg_type)
        result.success = ok and ep and tp
        result.endpoint = ep
        result.transport = tp
    end)

    -- 启动协程,并用定时器监控
    local timer = setTimeout(timeout_sec * 1000, function()
        if coroutine.status(co) == "suspended" then
            log:warning("mctp endpoint creation timed out, killing coroutine")
            result.success = false
        end
    end)

    local _, res = coroutine.resume(co)
    clearTimeout(timer)
    return result.success, result.endpoint, result.transport
end

:white_check_mark: 即使闭源函数卡住,也能通过超时中断流程,防止系统挂死。


:white_check_mark: 5. 升级至最新 patch 版本或联系 SDK 支持

  • 文档 #5《openUBMC 25.09 版本发布说明》提到:

    支持 Ncsi Over Mctp/I2C/SMBUS 协议获取网卡信息

  • 但仍需确认是否已修复 MCTP endpoint 卡死类问题。

:telephone_receiver: 建议:

  • 向 openUBMC 社区或闭源 SDK 提供商提交该 issue,要求确认 mctp_lib.get_endpoint_and_transport 是否存在 超时缺失段错误隐患
  • 请求提供 带日志版本的 mctp_lib,便于定位问题。

结论

:red_exclamation_mark: 核心结论:
LPe32002-AP 网卡 MCTP 初始化失败,根本原因极可能是 mctp_lib.get_endpoint_and_transport 在探测设备时因链路异常或闭源库缺陷而无限阻塞或崩溃。

:white_check_mark: 总结与建议

项目 结论
是否支持 MCTP :white_check_mark: 极大概率支持(参考 LPE31002)
是否 SR 配置正确 :warning: 需人工核查 .sr 文件
是否 PCIe 链路正常 :warning: 需检查 dmesg 与 BDF 枚举
是否 mctp_lib 卡死 :white_check_mark: 极高概率(无返回、无错误)
是否需要超时机制 :white_check_mark: 强烈建议在 Lua 层增加
是否为已知问题 :white_check_mark: 类似问题曾在 25.06 存在,25.09 宣称修复

推荐操作清单

  1. :white_check_mark: 检查 LPe32002-AP 的 .sr 文件是否声明 SupportedMctp=true
  2. :white_check_mark: 使用 busctl 检查 BmcEidBmcPhyAddr 是否非零;
  3. :white_check_mark: 使用 tracemctp 抓包确认 MCTP 探测报文是否发出及响应;
  4. :white_check_mark: 在 Lua 中增加协程超时机制,防止死锁;
  5. :white_check_mark: 排查内核 PCIe 日志,确认设备枚举正常;
  6. :telephone_receiver: 提交问题至 openUBMC 社区或 SDK 团队,请求排查闭源库缺陷。

:pushpin: 备注
在闭源组件主导的关键路径上,必须引入应用层保护机制,避免因底层阻塞导致整个服务不可用。建议推动 openUBMC 社区将 MCTP 相关组件逐步开源或提供诊断版本,以提升可观测性与可维护性。

相关链接:

  1. 南向适配网迅网卡经验分享
  2. 资源协作接口中的变量是在哪定义的
  3. 米尔开发板ncsi over mctp测试
  4. openubmc是否支持mctp over smbus进行带外管理?
  5. 板卡兼容性列表中的 lpe31002-ap 网卡支持mctp带外信息获取吗?

fc卡卡在create_mctp_endpoint问题是因为FC卡的固件版本过低,不支持pldm over mctp。需要更新到14.2版本以上。

但是create_mctp_endpoint接口,是否应该增加一个超时机制,并返回一定的错误提示信息,而不是一直堵塞在接口里。