LwIP BUG之TCP连接丢失

3079人阅读 评论(0) 收藏 举报
分类:

注:本文转自老衲五木的博客!

LwIP所有版本包括最新的2.0版本具有以下缺陷,当用户使用raw编程并在err或poll回调函数中操作了内核全局tcp_active_pcbs链表(最典型的,比如进行了重连操作),将有可能导致链表异常,严重情况下,链表中的很多tcp_pcb会丢失,从而导致部分连接没有任何反应,出现假死的现象。
    具体信息为(以1.4.1为例),在tcp.c文件的tcp_slowtmr函数中,截取如下部分。
    请参考下面的蓝色步骤(1)->(2)->(3)->(4)->(5)->(6),该流程路径会引发问题。代码第10行为需要添加的代码以修正这个BUG。

tcp_slowtmr_start:
prev = NULL;
pcb = tcp_active_pcbs;
if (pcb == NULL) {
	LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
}
while (pcb != NULL) {
	if (pcb->last_timer == tcp_timer_ctr) {	//(4)已经处理过的连接不再被处理
	 
	  prev = pcb;         			//需要在源代码中加上这句,否则会引起tcp_pcb丢失
	  pcb = pcb->next;
	  continue;
}
pcb->last_timer = tcp_timer_ctr;
....

if (pcb_remove) { 				//(1)某种错误后需要移除连接  //(5)第二次循环,如果也出现有需要移除的连接
	if (prev != NULL) {
		prev->next = pcb->next;
	} else {
		tcp_active_pcbs = pcb->next;	//(6)如果不加红色部分,则代码直接进入这里,tcp_active_pcbs被强制改写成pcb->next, 节点丢失!!!!!
	}

	tcp_active_pcbs_changed = 0;
	TCP_EVENT_ERR(err_fn, err_arg, ERR_ABRT); 	//(2)这里可能进行重连操作
	if (tcp_active_pcbs_changed) {  
		goto tcp_slowtmr_start; 	//(3)重连后跳回到标号tcp_slowtmr_start
	}
}


该问题发生的场景:至少有两个TCP客户端,并且两个客户端在会在err或者poll回调函数中进行重连,系统里面可以存在其他多个tcp连接(服务器或客户端均可)。如果前述两个客户端启动后,对应的两个服务器均不在线(或者通信过程中poll发生错误),则这两个客户端会不断在err回调函数中进行重连,重连将引发上述(1)~(6)的步骤,从而引起全局链表中其他正常控制块消失,其他连接假死。


查看评论

关于LWIP协议栈连续多次tcp_write后失败的解决过程

前段时间一直在调试lwip协议栈的问题,在stm32F107上实现一个C/S 架构的通信程序。项目初期的时候设计的是B/S架构的控制,然后在使用过程中发现了些限制,因为芯片自身的RAM有限,所以跑B/...
  • mmz_xiaokong
  • mmz_xiaokong
  • 2017-03-08 14:11:47
  • 773

LWIP[转]LwIP BUG之ARP缓存

转自老衲五木的新浪博客 在1.4.1中,ARP数据缓存存在一个很明显的缺陷。当IP层试图发送一个IP包时,如果这个目的IP地址在ARP中找不到对应的MAC地址,那么这个IP包会被首先缓存在ARP...
  • unsv29
  • unsv29
  • 2016-11-11 08:58:21
  • 406

移植 LWIP 1.4.1 到 ucosii 的总结

1 下载LwIP 很简单,到LwIP的官方网站即可:http://savannah.nongnu.org/projects/lwip/。如果你不想看看其它内容(可能对你会很重要),就只是想得到源码,...
  • since_2000
  • since_2000
  • 2016-12-21 20:56:35
  • 1706

tcp_listen_input函数分析

1.调用流程:     tcp_input接收IP层递交上来的数据包,获取TCP首部长度(包括选项部分),将p指针移向pbuf的有效数据部分,     根据TCP报头,遍历tcp_active_p...
  • Ivan804638781
  • Ivan804638781
  • 2017-07-10 22:35:56
  • 313

Lwip连接个数被限制

 发现MEMP_NUM_NETCONN这个值太小了  导致后面的连接分配不到内存      将其改大些就可以了...
  • u014678728
  • u014678728
  • 2018-03-02 17:32:08
  • 69

关于LWIP断开网线后重连问题(热插拔问题)

最近在弄STM32+LWIP协议,在网络拔掉网线情况下,无法重新连接。网上找了好多方法都没有实现,着实郁闷!后来无意间看到了暂时解决这一问题的方法,虽然不是那么完美,但最算能解决问题。分享给大家。 ...
  • sunymen
  • sunymen
  • 2014-07-17 16:38:11
  • 13456

lwip断线重连问题7.7

问题描述: 客户端用一个固定的端口连接远方服务器,首次连接建立后,关闭服务器,此时客户端检测到连接断开,自动每隔一定时间尝试重新连接。要求在远程服务器再次启动后,自动恢复客户端到服务器的连接。 ...
  • guojing3625
  • guojing3625
  • 2013-07-12 16:40:59
  • 2490

LwIP之内存管理和配置

LwIP中的内存管理      LwIP中的有两种方式的内存,heap和pool。老衲五木的《LwIP协议栈源码详解》将heap称之为动态内存堆,将pool称为动态内存池。      heap像是...
  • wjjontheway
  • wjjontheway
  • 2013-06-13 22:12:37
  • 3007

lwip tcp_tw_pcbs list problem in tcp_slowtmr()

lwip tcp_tw_pcbs list problem in tcp_slowtmr() I have been having a problem in the tcp_slowtmr() ...
  • kc87654321
  • kc87654321
  • 2015-07-10 14:18:05
  • 699

[转载]关于LWIP协议栈连续多次tcp_write后失败的解决过程

前段时间一直在调试lwip协议栈的问题,在stm32F107上实现一个C/S 架构的通信程序。项目初期的时候设计的是B/S架构的控制,然后在使用过程中发现了些限制,因为芯片自身的RAM有限,所以跑B/...
  • bobbat
  • bobbat
  • 2014-12-24 11:18:14
  • 2215
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 169万+
    积分: 1万+
    排名: 1160
    博客专栏
    最新评论
    友情链接