LwIP BUG之TCP连接丢失
来源:互联网 发布:暗黑团队毁魔兽 知乎 编辑:程序博客网 时间:2024/06/05 03:43
LwIP所有版本包括最新的2.0版本具有以下缺陷,当用户使用raw编程并在err或poll回调函数中操作了内核全局tcp_active_pcbs链表(最典型的,比如进行了重连操作),将有可能导致链表异常,严重情况下,链表中的很多tcp_pcb会丢失,从而导致部分连接没有任何反应,出现假死的现象。
具体信息为(以1.4.1为例),在tcp.c文件的tcp_slowtmr函数中,截取如下部分。
请参考下面的蓝色步骤(1)->(2)->(3)->(4)->(5)->(6),该流程路径会引发问题。红色部分为需要添加的代码以修正这个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)的步骤,从而引起全局链表中其他正常控制块消失,其他连接假死。
具体信息为(以1.4.1为例),在tcp.c文件的tcp_slowtmr函数中,截取如下部分。
请参考下面的蓝色步骤(1)->(2)->(3)->(4)->(5)->(6),该流程路径会引发问题。红色部分为需要添加的代码以修正这个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)的步骤,从而引起全局链表中其他正常控制块消失,其他连接假死。
阅读全文
0 0
- LwIP BUG之TCP连接丢失
- LwIP BUG之TCP连接丢失
- LWIP之TCP通信
- LWIP之TCP
- LwIP之TCP
- LWIP[转]LwIP BUG之ARP缓存
- LwIP多TCP连接问题
- LwIP BUG之ARP缓存
- LWIP 修改ip TCP发送 连接状态
- LWIP之TCP层接收相关
- LWIP之TCP层发送相关
- LWIP之TCP层发送相关
- LWIP之TCP层接收相关
- LWIP之TCP层发送相关
- LWIP之TCP层接收相关
- STM32移植lwip之建立tcp服务器
- STM32移植lwip之建立tcp客户端
- STM32移植lwip之硬件连接
- Android---RecyclerView 刷新与加载更多
- 小程序
- 右值引用与移动构造函数、移动赋值
- #define
- UVA11549 计算机谜题(Floyd判圈算法)
- LwIP BUG之TCP连接丢失
- 获取范围内的随机数
- 关于<c:ForEach/>中属性varStatus的详解
- 关于React.js的一些知识点(实时更新)
- it感悟
- Tensorflow使用slim工具(vgg16模型)实现图像分类与分割
- 运维 10/04 ssh
- 简单理解绝对路径和相对路径
- 阿里巴巴Java开发规约扫描插件-Alibaba Java Coding Guidelines 在idea上安装使用教程