首页 > 其他分享 >STM32 LwIP学习过程问题总结(一):LwIP ping不通,抓包发现ICMP校验和为0x0000

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

时间:2024-03-12 10:33:05浏览次数:29  
标签:LwIP 定义 例程 CHECKSUM ping 校验 0x0000 ICMP GEN

一、问题

今天在将之前的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宏。

 

标签:LwIP,定义,例程,CHECKSUM,ping,校验,0x0000,ICMP,GEN
From: https://www.cnblogs.com/fuyunxiansen/p/18067645

相关文章

  • 关于Flask中View function mapping is overwriting an existing endpoint function
    关于Flask中Viewfunctionmappingisoverwritinganexistingendpointfunction首次编辑:24/3/10/11:03最后编辑:24/3/10/11:57引子背景本来是在写个人网站,以前的代码中,几乎每个视图函数都有类似于:@app.route("/")defindex(): try: returnsend_file("index.html") e......
  • 前端页面使用js模拟ping命令
    letuserIpAddress='';//创建XMLHttpRequest对象varxhr=newXMLHttpRequest();xhr.open('GET','https://api.ipify.org/?format=json');//调用第三方API获取IP地址xhr.onload=function(){if(xhr.status===......
  • .NET Core AutoMapping 对象映射器转换
    先在NuGet程序包里下载这个文件然后新建一个类继承:ProfileusingAutoMapper;usingRBAC_Domain;usingRBAC_Domain.DTO;namespaceRBAC_Service.MyProFiles{///<summary>///转换对象映射器类///</summary>publicclassMappingProfile:Profile......
  • 网络问题排查必备利器:Pingmesh
    背景当今的数字化世界离不开无处不在的网络连接。无论是日常生活中的社交媒体、电子商务,还是企业级应用程序和云服务,我们对网络的依赖程度越来越高。然而,网络的可靠性和性能往往是一个复杂的问题,尤其是在具有大规模分布式架构的系统中。在过去,网络监控主要依赖于传统的点对点(poi......
  • 关于SpringMVC中@RequestMapping的params参数
    @RequestMapping注解的params参数同一个url,只要params不同,springmvc也是会区分匹配的。@PostMapping("/reduceProductStock")publicStringreduceProductStock(@RequestParamLongproductId,@RequestParamIntegerquantity){productService.reduceProductStock(pr......
  • LWIP RAW接口TCP与UDP部分函数解析
    RAWTCP接口tcp_input()函数voidtcp_input(structpbuf*p,structnetif*inp) --->staticerr_ttcp_process(structtcp_pcb*pcb) --->staticvoidtcp_receive(structtcp_pcb*pcb) --->>TCP_EVENT_RECV(pcb,recv_data,ERR_OK,err);//调用用户注册......
  • Go 100 mistakes - #86: Sleeping in unit tests
      ......
  • 题解 CF1523H Hopping Around the Array
    \(\texttt{link}\)题意数轴上有\(n\)个点,每个点有属性\(a_i\),在第\(i\)个点可以花费\(1\)的步数移动至\([i,i+a_i]\)中任意一个点。定义一次操作为选出一个\(i\),使\(a_i\getsa_i+1\)。\(q\)组询问,每次给出\(l,r,k\),求有\(k\)次操作机会时,从第\(l\)个点走到......
  • P5837 [USACO19DEC] Milk Pumping G 题解
    原题传送门思路只用堆每一个点跑一边最短路,在用当前点到点\(n\)的距离,再用当前点的\(f\)乘上\(10^6\)除以刚刚算出的值即可。代码#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<queue>usingnamespacestd;#defin......
  • P7154 Sleeping Cows 题解
    传送门题意:给定两个数组\(a_i,b_i\),若\(a_i\leb_j\),则他俩可配对。求极大匹配的方案数。(极大不是最大,最大一定是极大)先考虑最大匹配方案数怎么求。把\(a\)和\(b\)从小到大排序。则每个\(a_i\)能匹配的\(b\)都是一段后缀,且随着\(i\)增大,这个后缀越来越小。于是从......