使用mctp lib获取资源树上smbus协议的Endpoint和Transport对象

// 此模板仅供参考,如果不适用可以修改

问题描述

[在这里详细描述您遇到的问题]

get_endpoint_and_transport获取资源树上smbus协议的Endpoint和Transport对象的正确方式

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

  • 硬件配置:[如 CPU、内存等]

重现步骤

参考文档mctpd使用说明 | 文档中心 | openUBMC

方案一:local ok, endpoint, transport = pcall(mctp_lib.get_endpoint_and_transport, bus, MODULE_NAME, phy_addr, msg_type, position),增加positon

方案二:local ok, endpoint, transport = pcall(mctp_lib.get_endpoint_and_transport, bus, MODULE_NAME, position + phy_addr, msg_type),不增加position,拼接position .. phy_addr为字符串后传入,例如 “010107_73“

期望结果

[您希望实现什么]

获取资源树上smbus协议的Endpoint和Transport对象。

实际结果

[实际发生了什么,包含错误信息]

方案一获取不到smbus endpoint。

对应transport

方案二可以获取到smbus endpoint。

对应transport

应该要获取到的endpoint

从实际结果来看方案二正常工作,是mctp lib没有实现对传入position的操作吗?

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

使用方案二可以。

分析结论

[详细总结您对此问题的分析结论]

怀疑是闭源mctp lib内部没有做拼接操作。

@huangzhiyu 黄哥,帮忙看下这个问题。

mctpd什么版本的

mctpd/1.110.3@openubmc/stable

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

推测结论

根据现有上下文,无法直接确认 mctp_lib 内部是否忽略了 position 参数,但可以肯定:

  • 正确的调用方式是拼接 positionphy_addr 为单个字符串传入(方案二)。
  • 资源树中 SMBus 协议的 Endpoint 和 Transport 对象均以 {position}_{phyAddr} 格式命名(如 /bmc/kepler/Systems/1/Mctp/Endpoint/010107_73)。

如果需要验证内部实现细节,建议参考 openUBMC 官方文档(见提供的链接)或通过 busctl 命令直接观察 D-Bus 对象树的实际结构(如 busctl tree bmc.kepler.mctpd)。

点击此处查看详细分析解答

根据提供的知识图谱和文档内容,关于 mctp_lib.get_endpoint_and_transport 函数的具体使用方式(如参数拼接规则)并未获得完整说明。但可以从已有信息中梳理出资源树上 SMBus 协议 的 Endpoint 和 Transport 对象的获取路径及组织方式。

关键实体与关系梳理

  • MCTP Over SMBus:一种通信模型,将 MCTP 协议承载于 SMBus 之上,用于系统组件之间的管理通信。
  • Endpoint:MCTP 通信中的逻辑节点,由唯一 EID 和物理地址标识。在资源树中的路径如 /bmc/kepler/Systems/1/Mctp/Endpoint/010107_73(其中 010107_73 代表模块名与物理地址的组合)。
  • Transport:MCTP 传输层对象,对应路径如 /bmc/kepler/Systems/1/Mctp/Transport/010107_73/bmc/kepler/Systems/1/MctpTransport/73/2
  • MctpBinding:绑定组件,定义 MCTP 与物理总线(如 SMBus)的关联,包含 BmcEid(BMC 的 EID)和 BmcSMBusPhyAddr(物理地址)等属性。
  • create_mctp_endpoint_for_smbus:用于为缺少原生 MCTP 支持的设备创建 SMBus 上的 MCTP 端点。

实际结果分析

用户提供的两种调用方案中:

  • 方案一pcall(mctp_lib.get_endpoint_and_transport, bus, MODULE_NAME, phy_addr, msg_type, position) —— 结果失败,无法获取到 Endpoint。
  • 方案二pcall(mctp_lib.get_endpoint_and_transport, bus, MODULE_NAME, position .. phy_addr, msg_type) (例如传入 "010107_73")—— 结果成功,获取了正确的 Endpoint 和 Transport。

从知识图谱中的资源树结构可以看出,Endpoint 的标识符为组合格式 position_phyAddr(如 010107_73),而非将 position 作为独立参数传入。因此 方案二符合实际资源树中的标识符组织方式

推测结论

根据现有上下文,无法直接确认 mctp_lib 内部是否忽略了 position 参数,但可以肯定:

  • 正确的调用方式是拼接 positionphy_addr 为单个字符串传入(方案二)。
  • 资源树中 SMBus 协议的 Endpoint 和 Transport 对象均以 {position}_{phyAddr} 格式命名(如 /bmc/kepler/Systems/1/Mctp/Endpoint/010107_73)。

如果需要验证内部实现细节,建议参考 openUBMC 官方文档(见提供的链接)或通过 busctl 命令直接观察 D-Bus 对象树的实际结构(如 busctl tree bmc.kepler.mctpd)。

@huangzhiyu 黄哥,有啥进展,结论吗?

本地复现了下是有问题,还在定位

好的,黄哥,我有个PR涉及到这个问题支持网迅OCP网卡:SF200T-C201,SF200T-L101,SF400T-C201,SF400T-L201带外获取信息-network_adapter-AtomGit | GitCode

可以帮忙初步评估下这个问题会影响到我的PR合入吗?谢谢。

这周就要合入了,有点急,麻烦看一下,谢谢。

可以先通过手动拼接Position_phyaddr,这样也能获取,后面在改也行

好的,谢谢

:handshake::handshake: