chain914
(芯网动力-chain)
2026 年4 月 16 日 02:35
1
平台:米尔3093开发板,I2C-8用于SMBus_OEM
代码:2603版本
问题:
对于应答超过OpenUBMC MCTPD服务的MTU(当前实测应该是128Bytes)报文,需要切片。
网卡对长应答按照MTU=64进行分片,在BMC读走网卡首个分片后(MCTP头部SOM = 1, EOM=0)、BMC未读取后续分片。想请教一下如何才能让BMC读走所有分片。
需要分片的应答报文有:
端口报文统计(NC-SI 标准命令 0x18)
光模块信息(NC-SI OEM命令)
下图是“端口报文统计”应答的交互过程:
不知道是应答报文首个分片错误,还是其他?
chain914
(芯网动力-chain)
2026 年4 月 20 日 01:13
4
未来会考虑在SMBus_OEM增加支持组合MCTP多帧么?
OEM命令还好说,可以重新定义成短的应答。
标准NC-SI命令0x18(获取端口统计)的Response有200字节左右。并且OpenUBMC也支持显示端口报文统计。
硬件上好像不太好支持,smbus的缓冲区只有256字节大小。
chain914
(芯网动力-chain)
2026 年4 月 23 日 07:24
8
256字节应该够了,主要是NC-SI标准命令0x18(获取端口统计)的Response是204个字节左右。加上MCTP和SMBus头部也不会超。
还有MCTP重组,应该是在MCTP层吧,数据已经被从SMBus层读走了。 对基于BMC Master → 网卡 slave这个I2C固定主从关系下使用MCTP,BMC的MCTP层应该根据读到的MCTP头部的SOM、EOM决定是否要继续读取(当然读取间隔应该可配置)。
我想问下,网卡发多帧数据的话,是上一帧发完后就准备发下一帧数据吗
chain914
(芯网动力-chain)
2026 年4 月 23 日 08:03
10
是的。
不过对于OpenUBMC的SMBus_OEM模式下,都是BMC做Master,去读网卡吧,不是网卡主动发的。
当前我这里网卡作为slave,NC-SI层是一把组好全部Response内容、传到MCTP层后,根据MTU切片放到队列。
然后从队列中取1个分片出来放到I2C slave的 “Read”缓存中,等待BMC发起读操作;网卡一直查询“Read”缓存状态、如果“Read”缓存被BMC读空后,网卡就再从队列取一个分片放到“Read”缓存中;如此循环直到队列中所有分片被BMC读走。
现在我的网卡处理这一块还不完善,遇到有分片残留在发送队列中没被BMC读走,就造成BMC发送后续Request、读取Response时,读到的是残留在队列里之前的Response分片。
按照MCTP的规范是要求在收到新的Request时,需要中断处理之前Reques、清除未发送的Response的。
我也实现过跟OpenBMC的multi-master对接,网卡有Response要发送时,将I2C控制器从slave模式切换到master模式,发完1个分片就发第2个分片、直到全部分片发完。
当前我看网讯的同学也在跟你讨论SMBus Multi-Master的模式,貌似还不稳定,就暂时没调这个方式。
oem是BMC做主。我以为你说是这个是标准的smbus,那个是网卡做主BMC做从