STM32 LwIP學習過程問題總結(一):LwIP ping不通,抓包發現ICMP校驗和為0x0000

fyxs發表於2024-03-12

一、問題

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

相關文章