原始引用地址: 记录一个海思TOE的BUG
time: 2020.5.3 17:57
发现的过程
最近在做onvif开发时,有x86的验证的功能没有问题,移动到海思Hi3536上简单运行貌视也很正常。但是多次测试后,发现有时在接收一些onvif数据时,不能正常接收,直到超时。一些杂牌的相机频繁出问题,海康大华的几乎不出问题,很是奇怪。
分析测试
- 同样的程序,在x86上正常,arm版很容易复现问题
- 通过在交换机上通过tcpdump抓包,发现摄像头已把所有数据返回;但是调试arm程序程序发现,arm程序只能接收一个mtu长度的数据(就是第一包数据),后续数据一直是阻塞等待,直到超时也没有接收到。
- 测试时发现确实是海康的几乎不复现此问题,抓包时发现海康的数据包明显比较出问题的数据少。
- 经过比较长时间的苦恼的debug,,,,,,没有一点头绪!数据到了网卡,但是程序中接口没有接收到tcp数据。突然想到了海思里面有个TOE的功能,如果开启与正常的编程有些区别。于是查看了手册等相关文档,好像关系不大。于是禁用TOE功能,很神奇,在海思上测试好多次,与X86相同,没有复现问题。
经过上面的分析测试,确认是TOE的问题。但是怎么解决问题?难道是gsoap的问题,因为出问题的地方是gsoap生成代码!!!试了另外的老的版本,新的版本,,问题依旧!!!!google各种错误信息,无解。
又是一个较长时间的苦恼的debug,,,,,,
分析下问题的原因好像与数据包的长度有关。短的数据不易出问题,长的数据容易出问题。再看下gsoap生成的代码,缓冲buf是64k,这个64k与TOE中默认的相同!
估计就是TOE一个攒的着数据,直到足够大才往上返回!!但是onvif的数据一个没有到足够大的条件。所以直到数据超时了,数据也没返回来。
好吧过程就不多说了,我现在也忘的差不多了。直接说结果吧
结论
如果想让ONVIF的SOAP接口在TOE状态下正常使用,应该把onvif/stdsoap2.h 中SOAP_BUFLEN(默认为65536, 也就是64k)改为一个比较小的值,我改为20*1024,多次测试后认为问题解决。