问题描述
OpenUBMC通过MCTP over SMBus通信。MCTP Set EID命令通信正常。但是OEM指令出现 Mctp request timeout。
环境信息
-
操作系统:
-
软件版本:OpenUBMC2609
-
硬件配置:米尔开发板hi3093,网卡与开发板i2c_8直连
期望结果
NC-SI over MCTP的OEM命令能够及时送达ncsi层,驱动去解析。
实际结果
出现Mctp request timeout,报文在mctp层就丢了。
个人分析
% tracemctp start
============= SMBus_OEM capture [SEND] =============
D4 1F 22 21 01 1E 08 C8 02 00 01 00 09 50 00 00
08 00 00 00 00 00 00 00 00 00 00 EE 9E 02 00 00
00 FF FE BF 50 3E
============= SMBus_OEM capture [RECV] =============
D4 1F 2E D5 01 08 1E C0 02 00 01 00 09 D0 00 00
14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 EE
9E 82 00 00 00 00 2D 00 24 00 00 00 00 FF FD BE
F3 81 FF 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00
【app.log日志】
1970-01-01 00:18:56.801700 general_hardware NOTICE: mcu_service.lua(35): start serial task for update mcu version
1970-01-01 00:19:00.802265 devmon ERROR: mctp.cpp(71): [MCTP_DBG] mctp::request ENTRY, name=0103_106/2, data_len=8, timeout=0ms
1970-01-01 00:19:00.802636 devmon ERROR: mctp.cpp(74): [MCTP_DBG] mctp::request TX hex: 00 00 EE 9E 02 00 00 00
1970-01-01 00:19:00.802964 devmon ERROR: mctp.cpp(94): [MCTP_DBG] mctp::request → D-Bus call, dest=bmc.kepler.mctpd, path=/bmc/kepler/Systems/1/Mctp/Endpoint/0103_106/2, iface=bmc.kepler.Systems.Mctp.PCIeEndpoint
1970-01-01 00:19:00.812443 devmon ERROR: chip.cpp(580): [MCTP_DBG] data_access START, chip=Chip_SmbusChip_0103, op=WRITE, addr=0xD4, offset=31, len=36, mask=0x00000000
1970-01-01 00:19:00.812911 devmon ERROR: chip.cpp(582): [MCTP_DBG] data_access in_buffer (36B): 22 21 01 1E 08 C8 02 00 01 00 09 50 00 00 08 00 00 00 00 00 00 00 00 00 00 EE 9E 02 00 00 00 FF FE BF 50 3E
1970-01-01 00:19:00.813509 devmon ERROR: i2c.cpp(289): [MCTP_DBG] bus_i2c::write ENTRY, id=8, addr=0xD4, len=36, delay=200ms, hex=D4 1F 22 21 01 1E 08 C8 02 00 01 00 09 50 00 00 08 00 00 00 00 00 00 00 00 00 00 EE 9E 02 00 00 …
1970-01-01 00:19:01.017714 devmon ERROR: i2c.cpp(294): [MCTP_DBG] bus_i2c::write ← i2c_drv->write ret=0
1970-01-01 00:19:01.018182 devmon ERROR: chip.cpp(611): [MCTP_DBG] data_access END, chip=Chip_SmbusChip_0103, op=WRITE, ret=0, out_len=0
1970-01-01 00:19:01.018637 devmon ERROR: chip.cpp(580): [MCTP_DBG] data_access START, chip=Chip_SmbusChip_0103, op=READ, addr=0xD4, offset=31, len=129, mask=0x00000000
1970-01-01 00:19:01.018969 devmon ERROR: chip.cpp(582): [MCTP_DBG] data_access in_buffer (0B): (empty)
1970-01-01 00:19:01.019301 devmon ERROR: i2c.cpp(260): [MCTP_DBG] bus_i2c::read ENTRY, offset=31, protocol_flag=0, len=129
1970-01-01 00:19:01.019519 devmon ERROR: i2c.cpp(273): [MCTP_DBG] bus_i2c::read → branch: normal_read
1970-01-01 00:19:01.019962 devmon ERROR: i2c.cpp(165): [MCTP_DBG] normal_read ENTRY, id=8, addr=0xD4, offset=31, offsetWidth=1, len=129
1970-01-01 00:19:01.021917 devmon ERROR: i2c.cpp(169): [MCTP_DBG] normal_read → tx hex: D4 1F
1970-01-01 00:19:01.035033 devmon ERROR: i2c.cpp(194): [MCTP_DBG] normal_read ← i2c_drv->read OK, rx len=129, rx hex: 2E D5 01 08 1E C0 02 00 01 00 09 D0 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 EE 9E 82 00 00 00 00 2D 00 24 00 00 00 00 FF FD BE F3 81 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1970-01-01 00:19:01.035671 devmon ERROR: chip.cpp(605): [MCTP_DBG] data_access out_buffer (129B): 2E D5 01 08 1E C0 02 00 01 00 09 D0 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 EE 9E 82 00 00 00 00 2D 00 24 00 00 00 00 FF FD BE F3 81 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1970-01-01 00:19:01.036030 devmon ERROR: chip.cpp(611): [MCTP_DBG] data_access END, chip=Chip_SmbusChip_0103, op=READ, ret=0, out_len=129
1970-01-01 00:19:01.047873 hardware DEBUG: smbus_protocol.cpp(95): smbus_protocol: unmatch crc, crc from data: 0, computed crc: 189
1970-01-01 00:19:02.285935 power_mgmt NOTICE: power_mgmt_app.lua(391): [power_mgmt] init OK
1970-01-01 00:19:05.795148 interface NOTICE: libcrypt.c(378): create rsa key success.
1970-01-01 00:19:15.805225 devmon ERROR: mctp.cpp(108): [MCTP_DBG] mctp::request FAILED, name=0103_106/2, exception: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
1970-01-01 00:19:15.805587 devmon ERROR: ne6000_card.cpp(242): Failed to get temperatures from OEM 0x02
1970-01-01 00:19:15.811267 hardware DEBUG: sysv_rwlock_embedded.c(116): [rwlock][wrlock:acquired] semid=0 readers=0 writers=1 waiting_writers=0 write_pending=0
1970-01-01 00:19:15.811496 hardware DEBUG: sysv_rwlock_embedded.c(116): [rwlock][unlock_write:after] semid=0 readers=0 writers=0 waiting_writers=0 write_pending=0
1970-01-01 00:19:15.817879 mctpd DEBUG: mctp_engine.lua(364): [System1]mctp_engine: request timeout, key=30:27136:0:9, timeout_ms=15000
1970-01-01 00:19:15.818700 mctpd DEBUG: errors.lua(62): ep_ncsi.lua:55 > ep_mctp.lua:98 > mctp_engine.lua:427: The Mctp request timeout.
【nic端日志】
[LOG_DBG] Smbus [BMC write] Done, Total len: 38, Data: d4 1f 22 21 01 1e 08 c8 02 00 01 00 09 50 00 00 08 00 00 00 00 00 00 00 00 00 00 ee 9e 02 00 00 00 ff fe bf 50 3e
[LOG_DBG] MCTP [Slave TX] Prepared 51 bytes total (Tx start from pos 3)
[LOG_DBG] Smbus [Slave TX Ready] (0x1F) len: 51, Data: d4 1f d5 2e d5 01 08 1e c0 02 00 01 00 09 d0 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ee 9e 82 00 00 00 00 2d 00 24 00 00 00 00 ff fd be f3 81
[LOG_DBG] Smbus [BMC read] Done, Tx bytes: 51, Data: d4 1f d5 2e d5 01 08 1e c0 02 00 01 00 09 d0 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ee 9e 82 00 00 00 00 2d 00 24 00 00 00 00 ff fd be f3 81
【网卡端crc计算】
crc计算的时候是在前面补3个字节,地址(d4) 命令字(1F)地址|1(d5).也就是d4 1f d5 2E D5 01 08 1E C0 02 00 01 00 09 D0 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 EE 9E 82 00 00 00 00 2D 00 24 00 00 00 00 FF FD BE F3 81,最后计算的crc;
【报文分析】
D4 1F 2E [3 header]
D5 01 08 1E C0 02 00 01 00 09 D0 00 00 14 00 00
00 00 00 00 00 00 00 00 00 00 00 00 EE 9E 82 00
00 00 00 2D 00 24 00 00 00 00 FF FD BE F3 [46]
81 【第47B crc】
AI分析read报文的格式和crc没有问题,但是"hardware DEBUG: smbus_protocol.cpp(95): smbus_protocol: unmatch crc, crc from data: 0, computed crc: 189" 这个日志看起来又是获取crc的位置不对?AI读取mctp源代码,smbus_protocol.cpp中取 PEC 用了 data.size() 而非 byte_count,是否是因为这个原因?
网卡端只发送了50B,但是i2c.cpp中增加的调试日志和mctp的跟踪日志都看到,rx len是129,这个是否会有影响?