lwIP - A Lightweight TCP/IP stack - Bugs: bug #62071, [LINGER] lwip_close() function...
You are not allowed to post comments on this tracker with your current authentication level.
bug #62071: [LINGER] lwip_close() function never returns
Submitter: | Ilgiz <wanderer> | ||
Submitted: | Thu 17 Feb 2022 06:47:06 AM UTC | ||
Category: | TCP | Severity: | 3 - Normal |
Item Group: | Faulty Behaviour | Status: | None |
Privacy: | Public | Assigned to: | None |
Open/Closed: | Open | Planned Release: | None |
lwIP version: | 2.1.3 |
Attached Files
Depends on the following items: None found
Items that depend on this one: None found
Carbon-Copy List
There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.
Follow 4 latest changes.
Date | Changed by | Updated Field | Previous Value | => | Replaced by |
---|---|---|---|---|---|
2022-02-17 | wanderer | Attached File | - | ![]() |
Added targe_1.c, #52871 |
Attached File | - | ![]() |
Added targe_2.c, #52872 | ||
Attached File | - | ![]() |
Added main_1.c, #52873 | ||
Attached File | - | ![]() |
Added main_2.c, #52874 |
Hi,
I tried to use the linger option in my application, but encountered random freezes. After some investigation, it was found that the lwip_close() function never returns if linger is enabled with a non-zero timeout. But this does not happen regularly, the stars must converge in the sky. It was found that the hang occurs in two scenarious.
First scenario (Active close):
1) TCP connection is established(pcb->state==ESTABLISHED) and no unsent and unacked data (conn->pcb.tcp->unsent==NULL&& conn->pcb.tcp->unacked==NULL);
2) Call lwip_shutdown(socket,SHUT_WR);
3) Enable linger with timeout by calling lwip_setsockopt()
4) Without any delay call lwip_close()
5) The other side normally closed the connection before the linger timeout occurs.
In this case, tcp will be deallocated (moved to tcp_tw_pcbs list and after deallocated in tcp_slowtmr()) so that the api_msg.c layer will never know about it.
Second scenario (Passive close):
1)TCP connection is established(pcb->state==ESTABLISHED),no unsent and unacked data (conn->pcb.tcp->unsent==NULL&& conn->pcb.tcp->unacked==NULL);
2)FIN received from remote(remote side started connection shutdown);
3)Call lwip_shutdown(socket,SHUT_WR);
4)Enable linger with timeout by calling lwip_setsockopt();
5)Without any delay call lwip_close();
Important there was no call to the lwip_recv() function between getting FIN and calling lwip_setsockopt, lwip_close. Calling lwip_recv() changes the behavior due to the TF_RXCLOSED flag set.
Also in both scenarios, the unsent and unpacked lists must be empty before the shutdown operation begins. Otherwise everything works fine (lwip_close() does not freeze).
To reproduce and understand, I have prepared code snippets for the device (lwIP) and PC (Windows).
To reproduce the first scenario:
target_1.c - snippet code for targe with LwIP;
main_1.c - full application(server) for PC (Windows);
To reproduce the second scenario:
target_2.c - snippet code for targe with LwIP;
main_2.c - full application(server) for PC (Windows);
The application on the PC side must be started before the target.