lwip timer and core locking

Use this forum for requesting small changes in ChibiOS. Large changes should be discussed in the development forum. This forum is NOT for support.
vysocan
Posts: 3
Joined: Tue Feb 18, 2014 7:22 pm
Has thanked: 3 times

lwip timer and core locking

Postby vysocan » Thu Jun 17, 2021 2:19 pm

Hello,

for past year I'm using liwp in my application running on STM32F4xx. I have a few services running like dhcp, httpd, sntp, all running fine only until I added mqtt client. Then my application started to misbehave, looking into problems I found out that lwip needs for sure a core locking that is enabled by defaults in chibios port static_lwipopts.h but not implemented. If there is not so many processes running lwip runs for a while even without it, but adding frequent mqtt publish messages take it down.

Second is I think a bug in lwip port file sys_arch.c. Since lwip timer needs when calling sys_now() a u32_t counter. When using OSAL_ST_FREQUENCY other then exactly 1000 seems not to work, since it does not overflow on 32 bit boundary. Like me, using default OSAL_ST_FREQUENCY=10000 all lwip timers stop to work after 4.9 days. Causing various error on not clearing closed packets, DHCP and so on. It took me quite some time to wait 5 days for every change to show, until I realized it is sys ticks :)

I'm including my proposed changes.

Also it is needed to add to end of every project lwipopts.h

Code: Select all

#if LWIP_TCPIP_CORE_LOCKING
void lwip_assert_core_locked(void);
#define LWIP_ASSERT_CORE_LOCKED() lwip_assert_core_locked();
#endif


And of course to start to use the LOCK_TCPIP_CORE / UNLOCK_TCPIP_CORE, like:

Code: Select all

 LOCK_TCPIP_CORE();
  httpd_init();
  UNLOCK_TCPIP_CORE();

whenever the lwip function needs a core lock.
Attachments
patch.zip
(1.95 KiB) Downloaded 201 times

Return to “Small Change Requests”

Who is online

Users browsing this forum: No registered users and 9 guests