新浪博客

嵌入式以太网协议栈之--【5】关于lwip偶尔一两次PING不通的问题查找

2013-11-15 17:33阅读:
ethernet_input: dest:00:80:48:12:34:56, src:00:e0:66:59:9d:ad, type:800
pbuf_header: old a000622c new a000623a (-14)
ip_input: iphdr->dest 0x6408a8c0 netif->ip_addr 0x6408a8c0 (0x8a8c0, 0x8a8c0, 0x64000000)
ip_input: packet accepted on interface en
ip_input:
IP header:
+-------------------------------+
| 4 | 5 | 0x00 | 60 | (v, hl, tos, len)
+-------------------------------+
| 27478 |000| 0 | (id, flags, offset)
+-------------------------------+
| 64 | 1 | 0x7dae | (ttl, proto, chksum)
+-------------------------------+
| 192 | 168 | 8
| 8 | (src)
+-------------------------------+
| 192 | 168 | 8 | 100 | (dest)
+-------------------------------+
ip_input: p->len 60 p->tot_len 60
pbuf_header: old a000623a new a000624e (-20)
icmp_input: ping
pbuf_header: old a000624e new a000622c (34)
pbuf_header: old a000622c new a000624e (-34)
pbuf_header: old a000624e new a000623a (20)
ip_output_if: en0
以上是ping地通的情形,以下是ping不通的情形
ethernet_input: dest:00:80:48:12:34:56, src:00:e0:66:59:9d:ad, type:800
pbuf_header: old a0006848 new a0006856 (-14)
ip_input: iphdr->dest 0x6408a8c0 netif->ip_addr 0x6408a8c0 (0x8a8c0, 0x8a8c0, 0x64000000)
ip_input: packet accepted on interface en
ip_input:
IP header:
+-------------------------------+
| 4 | 5 | 0x00 | 60 | (v, hl, tos, len)
+-------------------------------+
| 27479 |000| 0 | (id, flags, offset)
+-------------------------------+
| 64 | 1 | 0x7dad | (ttl, proto, chksum)
+-------------------------------+
| 192 | 168 | 8 | 8 | (src)
+-------------------------------+
| 192 | 168 | 8 | 100 | (dest)
+-------------------------------+
ip_input: p->len 60 p->tot_len 60
pbuf_header: old a0006856 new a000686a (-20)
icmp_input: ping
icmp_input: checksum failed for received ICMP echo
pbuf_free(a0006838)
pbuf_free: deallocating a0006838
发现差别就在输出了IP头后的几下几行
ip_input: p->len 60 p->tot_len 60 ip.c551行执行,之后一直会到580行调用icmp_input()函数
pbuf_header: old a0006856 new a000686a (-20) 进入icmp_input函数后,icmp.c的第93行调用pbuf_header()后输出
icmp_input: ping icmp.c的第132行输出
icmp_input: checksum failed for received ICMP echo 会出错时就在icmp.c的137行判断到不等于0
上面第四行出现错误,接下来着重看是如何判断到icmp.c137行不为0的原因:
1、inet_chksum_pbuf函数是判断pbuf的校验和的函数,通过阅读core文件夹里面的inet_chksum.c源文件,源文件的开始就有很详细的英文描述了,LWIP内部自带了3大套校验算法,其中默认是第2种,可以通过在lwipopts.h头文件自行宏定义使用哪一种#define LWIP_CHKSUM_ALGORITHM 2,当然,可以可以自己宏定义#define LWIP_CHKSUM lwip_standard_chksum写自己的较验函数。这里试了3种(第3种好像好一点),发现都会有存在校验错误,所以初步断定,不是检验算法的问题,得找找其它问题。
2、对比了一下网卡发出的ping数据包,及板子调试接口打印出来收到的ping数据包,发现两边的checksum分明就是一模一样的,并且各数据都没有发生变化,也不可能是校验算法有问题吧,初步确定是数据接收到时放在内存还是对的,过了一段时间不知什么原因数据被改变了,再拿去检验,那应该是内存的问题。
3、最后发现,是由于把lwip的缓存全部放在了SDRAM上不行,如果把内存放在片内,问题解决,证明是外部SDRAM的驱动没写好,当初忽略SDRAM是因为它在顺序的字节、半字、字方式一直读写都没问题,但现在是当作以太网的缓存了,读写的数据不一定是顺序的,并且目前SDRAM跑在120MHz时钟。后续再重新编写SDRAM驱动。

我的更多文章

下载客户端阅读体验更佳

APP专享