笔者定位,驱动小白,为了给自己搭建尽量系统的驱动知识库,所以将自己调试驱动过程中所碰到的问题以及解决方法进行记录分析,供后期参考,也请广大同仁多多指教。
此次所记载问题与网卡驱动相关的,这里关于底层的网卡驱动框架就不介绍了,主要描述所发现的问题,解决问题的思路,以及解决问题的过程。
当MPC8247板卡对pc进行连续ping操作时,当ping的次数达到第52次之后,53次就停住了。
在驱动层进行了一些错误排查,并没有发现什么问题。于是在ping指令调用的驱动层接口中添加了打印,发现第53次ping操作,根本就没有进入该驱动层接口。产生的想法就是对正常情况与异常情况进行对比,从输入ping指令到驱动这一过程中到底哪一步出现了异常。
整个ping指令的操作过程还是比较复杂以及漫长的,要经历shell层、网路协议栈、驱动层。光靠记忆力来跟代码还是很费劲的,在这里推荐利用画图软件进行跟踪比如(visio或其他)。至于图我在这里就不展现了。
第53次与之前52次的过程大致相同,主要差别发生在ipnet_handle_singal(sig)中得到体现。在正常的情况下,改接口处理的信号类型为IPNET_SIG_SENDMSG,而异常情况下,产生的信号类型为POLL_SIG。从此接口进行反推,找到了出现问题的具体原因为sock->snd_bytes的值大于sock->send_max_bytes。对比其他平台的情况(比如ppc8360),sock->snd_bytes的值一般是不会发生改变的。联想到驱动层原因为网卡发送时未正常清理TBD(发送描述符),最后进入驱动查看原因是由于清理TBD的条件设置不当。解决问题。