一、问题

今天在将之前的STM32 LwIP1.4.1版本程序移植到2.1.2版本上时,发现ping不同,但是开发板有ICMP回复包,黄颜色警告checksum为0x0000。说明LwIP移植应该是没问题,数据处理这一块出错了。

在网上找了下相关的错误,ST论坛有个问题和我这个一样。

Hardware IPv4 checksum on an STM32F407 is not working

意思就是使用软件校验和能正常使用,但是使用硬件校验和时ICMP数据包的校验为0x0000。问题原因lwipopts.h文件中硬件校验和宏定义下是没有添加以下宏定义

  /* CHECKSUM_CHECK_ICMP==0: Check checksums by hardware for incoming ICMP packets.*/
#define CHECKSUM_GEN_ICMP 0

二、解决方法

按照上文的思路,我也看了一下我自己工程文件的lwipopts.h代码果然没有添加这个宏,在添加相关宏定义后就能够正常ping通了。

以下是之前lwip1.4.1 lwipopts.h使用的宏定义:

下面的是STSW-STM32070官方例程中的。

三、思考

先说结论:正点原子lwip例程使用的lwip源码是修改过的
以上虽然解决了问题,但是之前lwip1.4.1的例程为什么也能正常跑通呢?
通过查看之前的lwip1.4.1源码发现
不定义CHECKSUM_GEN_ICMP 0的话CHECKSUM_GEN_ICMP 默认为1,也就是ICMP使用软件校验和,但是如果STM32开启硬件校验和的话,STM32会丢弃该帧也就出错了。
这个是lwip1.4.1 opt.h中的宏定义,那为什么不会出错呢?

查找了ICMP check相关的代码发现icmp.c文件是被修改过了,下面的代码也就说定义了CHECKSUM_BY_HARDWARE,在处理ICMP包时就会使用硬件校验,而不需要宏定义定义 CHECK_GEN_ICMP。注释也说明了是ST修改。

单从这一块代码看,修改改后和之前没什么区别,可能是有什么原因CHECK_GEN_ICMP要置1,这个也不纠结了,但是回过头看ST的STSW-STM32070官方例程中的ICMP.c文件。

这一段代码也没有修改过,应该是之后例程优化改回来了,而正点原子的例程代码是参考了之前的修改过的ST官方源码。所以在我是用lwip2.1.2进行移植的时候使用硬件校验和就需要定义CHECK_GEN_ICMP宏。

STM32 LwIP学习过程问题总结(一):LwIP ping不通,抓包发现ICMP校验和为0x0000的更多相关文章

  1. 最近ES遇到discover老是失败问题,ping主节点和node节点正常,抓包发现了大量的retransmission、tcp out of order、dup ack问题。

    最近ES遇到discover老是失败问题,ping主节点和node节点正常,抓包发现了大量的retransmission.tcp out of order.dup ack问题. Explanation ...

  2. 解决WINDOWS防火墙开启后Ping不通

    WINDOWS系统由于安全考虑,当开启防火墙时,默认不允许外主机对其进行ping功能,即别的电脑ping不通本机.别的主机ping不通本机是因为本机的防火墙关闭了ICMP回显功能,只要把这回显功能打开 ...

  3. cnentos中进行bond网卡配置,一切配置无问题,就是ping不通宿主机

    服务器网口绑定   1. ifcfg-bond0   DEVICE=bond0 ONBOOT=yes IPADDR=192.168.100.64 NETMASK=255.255.255.0   2. ...

  4. 【Linux】【通信】1.ping不通

    关于为什么ping不通有很多种原因,但直接的表象就网络之间没有成功进行通讯: 在构建虚拟机和win之间的交互时,主要使用了3种网络模式: 桥接bridge VMnet0 主机host     VMne ...

  5. 解决内网主机ping不通网关能ping内网

    有一台笔记本电脑可以自动获取IP,可以和内网其他主机互相PING通,就是PING 不通网关,只能上内网,不能上外网,IP换到其他主机上也可以上外网,说明路由器上没什么限制.路由器也查了,电脑也重装了, ...

  6. 开发板ping不通主机和虚拟机的看过来(转载)!

    前几天在做uboot下用tftp下载文件到开发板的实验时,为了能解决开发板ping不通主机和虚拟机的问题,可谓绞尽脑汁,正所谓久病成医,虽然为了这一小问题废了我那么长时间,但我在解决问题的同时也学到了 ...

  7. 【整理】虚拟机和主机ping不通解决办法

     检查几个方面: 1.检查虚拟网卡有没有被禁用2.检查虚拟机与物理机是否在一个VMNet中3.检查虚拟机的IP地址与物理机对应的VMNet是否在一个网段4.检查虚拟机与物理机的防火墙是否允许PING, ...

  8. ping不通 www.baidu.com 163.com

    可以试试这个命令:netsh winsock reset ping不通,但是可以上网,原因有以下几个: 1.远程主机禁止ping 2.firewall禁止ping,icmp 3.dns解析有问题 fr ...

  9. 虚拟机ping不通主机,但是主机可以ping通虚拟机(转载)

    我在Windows7系统安装了虚拟机,通过虚拟机安装了Ubuntu13.04,我设置的主机与虚拟机的连接方式是桥接,安装好后,发现虚拟机ping不通主机,但是主机可以ping通虚拟机. 我的操作是:关 ...

  10. virtualbox -centos ping不通外网

    centos上配置网卡自动获取ip 在路由器上配置了ip和mac绑定.ping不通外网.删除路由器上的静态mac绑定后OK,不明

随机推荐

  1. springboot多模块打包报错问题根因分析:Unable to find main class

    问题背景: 项目结构为springboot多模块,其中有四个模块bean.utils.user.ems,其中user和ems模块为主程序,包含启动类,其他两个模块为其服务,提供依赖 问题分析: 查看u ...

  2. 年末将至,Java 开发者必须了解的 16 个Java 顶级开源项目!

    年末将至,值得你关注的16个Java 开源项目! 本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb/JavaGuide ([Java学习+面试 ...

  3. Java执行Shell和传输文件

    特性: 多线程批量执行 多密码尝试 引入依赖: <dependency> <groupId>ch.ethz.ganymed</groupId> <artifa ...

  4. PHP截取文章内容

    <?php /** * 实现中文字串截取无乱码的方法. */ function getSubstr($string, $start, $length) { if (mb_strlen($stri ...

  5. 零基础入门学习Java课堂笔记 ——day06

    面向对象(中) 1.封装 "高内聚,低耦合" 高内聚:类内部的细节自己完成,不允许外部干涉 低耦合:仅暴露少量方法给外部使用 属性私有 在Java中可以通过private关键字给方 ...

  6. 小知识:grep过滤以#号开头的注释行 和 空行

    xtts的配置文件,有很多注释不想直接去掉的情况下,想清楚的看到目前设置了哪些参数,可以用grep过滤查看: grep -vE '^#|^$' xtt.properties 效果如下: [oracle ...

  7. 《ASP.ENT Core 与 RESTful API 开发实战》-- (第4章)-- 读书笔记(上)

    第 4 章 资源操作 4.1 项目创建 从本章起,我们将创建一个在线图书馆项目,通过这个 Web API 应用程序来实际地熟悉并掌握如何使用 ASP.NET Core 创建 RESTful API 应 ...

  8. Python实现二叉查找

    搜索 搜索是在一个项目集合中找到一个特定项目的算法过程.搜索通常的答案是真的或假的,因为该项目是否存在. 搜索的几种常见方法:顺序查找.二分法查找.二叉树查找.哈希查找 二分法查找 二分查找又称折半查 ...

  9. CF1878C Vasilije in Cacak 题解

    题目传送门 简化题意 有 \(t\) 组询问,每次询问是否能从 \(1 \sim n\) 中选择 \(k\) 个数使得它们的和为 \(x\). 解法 考虑临界情况,从 \(1 \sim n\) 中选择 ...

  10. 使用 lspci 和 setpci 调试 PCIe 问题

    lspci 命令和 setpci 命令均为 Linux 发行版中原生可用的命令. 这 2 条命令均可提供多级输出,适合在不同时间点用于查看 PCI 总线上训练的不同组件的功能和状态.其中大部分功能均可 ...