OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5762|回复: 5

STM32+LWIP+ICMP ping电脑时,电脑接收到的icmp报文校验和跟我发送出去的不一样,求大神解救!!!

[复制链接]

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
发表于 2018-11-15 16:34:54 | 显示全部楼层 |阅读模式
9金钱
本帖最后由 ylsljp 于 2018-11-15 16:40 编辑

STM32+LWIP+ICMP ping电脑时,电脑接收到的icmp报文校验和跟我发送出去的不一样,求大神解救!!!!!!!!!!!!!!!!!!!!!!

为啥上存不了图片了,要一点一点的贴代码,好坑。。。。。。

struct raw_pcb *ping_pcb;
__IO uint16_t NetCheckTime = 0;
__IO uint32_t PingSeqNum = 0;

unsigned char Icmp_Init(void)
{
    ping_pcb = raw_new(IP_PROTO_ICMP);
    if(!ping_pcb)
    {
        return 0;
    }
    return 1;
}

//网络状态周期性检测
void Net_Periodic_Check(void)
{
        if(NetCheckTime == 1000)
        {
                if(NetStates == ALLCATION)                                                                //已经分配了地址,开始ping网关
                {
                        Ping_Send();                                                                             //ping内网
                }
                else if(NetStates == CONNINTER)                                                        //已经连上内网,开始ping外网
                {
                        
                }
                NetCheckTime = 0;
        }
}

void Ping_Send(void)
{
        struct pbuf *pbuff;
        struct ip_addr ipAddr;
        struct icmp_echo_hdr *iecho;

        //本机IP
        //ipAddr = netif.ip_addr;
        IP4_ADDR(&ipAddr,  192, 168, 111, 44);
        ip_addr_set(&ping_pcb->local_ip, &ipAddr);

        //目标IP        //ipAddr = netif.gw;
        IP4_ADDR(&ipAddr,  192, 168, 111, 49);
        ip_addr_set(&ping_pcb->remote_ip, &ipAddr);

        pbuff = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr), PBUF_RAM);
        if(!pbuff)
        {
                return;
        }
        
        //组装icmp的报文
        iecho = (struct icmp_echo_hdr *)pbuff->payload;
        iecho->type = 8;                                                                                                  //类型
        iecho->code = 0;                                                                                                 //code
        iecho->id = htons(0x8899);                                                                                   //id
        iecho->seqno = htons(++PingSeqNum);                                                                  //报文序列号
        iecho->chksum = 0;                                                                                            //校验和清0
        iecho->chksum = inet_chksum(pbuff->payload, sizeof(struct icmp_echo_hdr));               //重算校验和
        
        //发送ping数据包
        raw_sendto(ping_pcb, pbuff, &ping_pcb->remote_ip);
        pbuf_free(pbuff);
}

在 raw_sendto(ping_pcb, pbuff, &ping_pcb->remote_ip) 发送icmp数据前,我在KEIL里Watch1上看到 iecho 的类型是8,code是0,校验和是0x656f,id是0x9988,序列号是0x0100。


但是电脑上用Wireshark抓到的数据跟发送的不一样,校验和不同,校验和变成0x0000了,
Internet Control Message Protocol
    Type: 8 (Echo (ping) request)
    Code: 0
    Checksum: 0x0000 [incorrect, should be 0x6f65]
    Identifier (BE): 34969 (0x8899)
    Identifier (LE): 39304 (0x9988)
    Sequence number (BE): 1 (0x0001)
    Sequence number (LE): 256 (0x0100)
    [No response seen]
        [Expert Info (Warn/Sequence): No response seen to ICMP request in frame 10583]
        [No response seen to ICMP request in frame 10583]
        [Severity level: Warn]
        [Group: Sequence]

求大神解救!!!!!!!!!!!!















最佳答案

查看完整内容[请看2#楼]

解决了,《 iecho->chksum = inet_chksum(pbuff->payload, sizeof(struct icmp_echo_hdr)); 》这样应该注释掉。在icmp_input函数的ICMP_ECHO分支里有这样一句话/* To use the Checksum Offload Engine for the putgoing ICMP packets, the ICMP checksum field should be set to 0, this is required only for Tx ICMP*/
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2018-11-15 16:34:55 | 显示全部楼层
解决了,《 iecho->chksum = inet_chksum(pbuff->payload, sizeof(struct icmp_echo_hdr)); 》这样应该注释掉。在icmp_input函数的ICMP_ECHO分支里有这样一句话/* To use the Checksum Offload Engine for the putgoing ICMP packets,
                        the ICMP checksum field should be set to 0, this is required only for Tx ICMP*/
回复

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2018-11-15 19:09:01 | 显示全部楼层
求各路大神帮帮忙
回复

使用道具 举报

3

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2015-10-28
在线时间
56 小时
发表于 2020-5-28 13:17:51 | 显示全部楼层
楼主还能发我一份2625517263@qq.com,感谢
回复

使用道具 举报

12

主题

73

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-5-2
在线时间
45 小时
 楼主| 发表于 2020-5-28 16:46:45 | 显示全部楼层
本帖最后由 ylsljp 于 2020-5-28 16:50 编辑
alangada 发表于 2020-5-28 13:17
楼主还能发我一份,感谢

C:\Users\Administrator\Desktop\1111111.jpg
C:\Users\Administrator\Desktop\222222222222.jpg
C:\Users\Administrator\Desktop\333333333.jpg
非常简单的,一个初始化函数,一个ping函数,然后在icmp.c文件的icmp_input函数中添加一个case ICMP_ER:
        {
                //这里表示能ping通服务器,可根据需要自行添加
                break;
        }
分支就行了
333333333.jpg
1111111.jpg
222222222222.jpg
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2021-8-2
在线时间
11 小时
发表于 2021-8-19 10:36:59 | 显示全部楼层
新手求源码,liu_zx1213@163.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 19:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表