2512版本:
I350 4千兆光口网卡;
打印了781这一行(creating mctp transport and endpoint with bdf=3:0.0 phy_addr=3, msg_types=2),但是未输出791行(register mctp transport and endpoint(phy: %s) successful)
openUBMC_NCSI-0246.tar.gz (7.0 MB)
2512版本:
I350 4千兆光口网卡;
打印了781这一行(creating mctp transport and endpoint with bdf=3:0.0 phy_addr=3, msg_types=2),但是未输出791行(register mctp transport and endpoint(phy: %s) successful)
openUBMC_NCSI-0246.tar.gz (7.0 MB)
答案内容由AI生成,仅供参考:
最终结论:
当前MCTP Endpoint创建失败,极有可能是I350网卡固件不支持MCTP协议,导致get_endpoint_and_transport接口阻塞。建议优先确认硬件兼容性,并升级固件;同时在代码中增加超时处理,避免系统级卡死。
当MCTP Endpoint未创建成功时,可以通过以下步骤进行系统性定位与排查。
根据日志显示:
creating mctp transport and endpoint with bdf=3:0.0 phy_addr=3, msg_types=2register mctp transport and endpoint (phy: %s) successfulmctp_lib.get_endpoint_and_transport 调用失败或阻塞,导致后续流程中断。结合日志和知识库信息,MCTP Endpoint创建失败的根本原因通常集中在以下几类:
get_endpoint_and_transport 接口调用失败或卡死该函数是创建MCTP通信链路的核心:
local ok, endpoint, transport = pcall(mctp_lib.get_endpoint_and_transport, bus, MODULE_NAME_NETWORK_ADAPTER, phy_addr, msg_type)
pcall 捕获异常,则说明底层MCTP通信建立失败。
结论:当前I350网卡可能因固件不支持MCTP通信,导致
get_endpoint_and_transport阻塞或失败。
MCTP可通过不同物理层传输:
若以下任一环节异常,Endpoint无法建立:
MctpBinding和Endpoint对象
注意:若为SMBus类型Endpoint,需确认CSR中配置了
TargetPhyAddr(常为I2C从设备地址),否则Endpoint无法注册。
mctpd 是MCTP通信的核心守护进程:
可通过以下方式验证:
# 查看mctpd资源树是否存在相关Endpoint
busctl --user tree bmc.kepler.mctpd
# 或使用mdbctl命令查看
mdbctl
> lsobj Endpoint
若无对应Endpoint_3_2或类似对象,则说明mctpd未成功创建Endpoint。
get_endpoint_and_transport 是否阻塞查看是否有后续错误日志或堆栈卡死:
pcall 外层加定时器,避免无限等待
改进建议:参考社区反馈,应在
create_mctp_endpoint中添加超时控制和重试机制。
解决方案:
- 联系网卡厂商获取支持MCTP的固件版本
- 在BIOS或驱动层面启用MCTP功能
使用命令检查mctpd是否已创建Endpoint:
# 进入mdbctl环境
mdbctl
> lsobj Endpoint
预期输出示例:
Endpoint_3_2
Endpoint_4_2
...
若缺少 phy_addr=3 对应的Endpoint,则说明:
mctp_eid_table 未添加配置mctpd 初始化失败确认 MCTP_EID_Table 中是否包含对应设备信息:
mctp_eid_table:add_eid_info(module_name, msg_src_eid, phy_addr, msg_type, medium_type)
应包含:
phy_addr=3msg_type=2(通常代表NCSI)medium_type=15(PCIe)可通过日志搜索:
mctp_eid_table: add eid info, module_name=network_adapter, ..., phy_addr=3, ...
如无此日志,说明配置缺失或初始化未完成。
启用MCTP通信报文打印功能,定位底层交互问题:
tracemctp 命令# 开启指定Endpoint的报文追踪
tracemctp start phy_addr=3 msg_type=2
在脚本中插入日志捕获逻辑:
local c_mctp_engine = require 'mctp_engine'
c_mctp_engine:enable_pcie_capture()
参考文档:鲲鹏BMC调试网卡部件
确认PCIe卡的BDF地址是否正确:
DevBus=3, DevDevice=0, DevFunction=0 → BDF=3:0.0
通过BIOS或 lspci 验证该设备是否存在且可访问。
同时确认 bdf_to_phy_addr 映射是否正确:
local phy_addr = mctp_lib:bdf_to_phy_addr(3, 0, 0) → 应为3
| 项目 | 状态 | 建议 |
|---|---|---|
get_endpoint_and_transport 是否返回 |
添加超时机制,提升鲁棒性 | |
| 网卡固件是否支持MCTP | 联系厂商升级至支持MCTP的版本 | |
| mctpd资源树中是否存在Endpoint | 使用 mdbctl lsobj Endpoint 验证 |
|
| MCTP EID表是否注册 | 搜索 add eid info, phy_addr=3 |
|
| 是否启用报文追踪 | 否 | 使用 tracemctp start 定位通信细节 |
最终结论:
当前MCTP Endpoint创建失败,极有可能是I350网卡固件不支持MCTP协议,导致get_endpoint_and_transport接口阻塞。建议优先确认硬件兼容性,并升级固件;同时在代码中增加超时处理,避免系统级卡死。
看下mctp的资源树是否有Routing为3的对象,没有可能是bdf错误或者imu枚举的时候网卡没有响应
你看下bdf计算的phy_addr就行,这个phy_addr和Routing是一一对应的
这里应该是只有4:0:0这个,6那个是BMC
你好,我这适配一张网卡也遇到了mctp endpoint未创建成功的问题,日志与楼主提供的一致,在mctpd组件中创建网卡endpoint对象失败。
mctp资源树上没有对应网口Routing对象,想咨询下这种情况是只有bdf错误或者imu枚举的时候网卡没有响应这两种情况吗?还有没有其他情况导致这类问题?
BMC页面显示的网卡bdf与OS显示的bdf一致,bdf没有错误;
imu枚举的时候网卡没有响应,这个情况是网卡方面的问题吗?比如固件驱动版本或者网卡硬件问题?有没有相关的调试手段用于定位这种问题啊?比如通过mctp调试命令去获取网卡信息啥的?AI助手中提到的tracemctp没有相关命令。