|
|
|
@ -749,6 +749,7 @@ void tcp_slowtmr(struct lwip_tcp_ctx *ctx) |
|
|
|
tcp_pcb_purge(pcb); |
|
|
|
tcp_pcb_purge(pcb); |
|
|
|
if (prev != NULL) { |
|
|
|
if (prev != NULL) { |
|
|
|
prev->next = pcb->next; |
|
|
|
prev->next = pcb->next; |
|
|
|
|
|
|
|
prev->next_owner = PCB_NEXT_SLOWTMR; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
ctx->active_pcbs = pcb->next; |
|
|
|
ctx->active_pcbs = pcb->next; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -787,7 +788,13 @@ void tcp_slowtmr(struct lwip_tcp_ctx *ctx) |
|
|
|
// ---- process TIME-WAIT PCBs ----
|
|
|
|
// ---- process TIME-WAIT PCBs ----
|
|
|
|
prev = NULL; |
|
|
|
prev = NULL; |
|
|
|
pcb = ctx->tw_pcbs; |
|
|
|
pcb = ctx->tw_pcbs; |
|
|
|
|
|
|
|
int tw_iter = 0; |
|
|
|
while (pcb != NULL) { |
|
|
|
while (pcb != NULL) { |
|
|
|
|
|
|
|
if (++tw_iter > TCP_TW_MAX) { |
|
|
|
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_ALL, "TW_PCBS LOOP in tcp_slowtmr: %d iterations, aborting pcb=%p state=%d port=%u next_owner=%d", tw_iter, (void*)pcb, pcb->state, pcb->local_port, pcb->next_owner); |
|
|
|
|
|
|
|
tcp_abort(pcb); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
pcb_remove = 0; |
|
|
|
pcb_remove = 0; |
|
|
|
|
|
|
|
|
|
|
|
if ((uint32_t)(ctx->ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { |
|
|
|
if ((uint32_t)(ctx->ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { |
|
|
|
@ -799,6 +806,7 @@ void tcp_slowtmr(struct lwip_tcp_ctx *ctx) |
|
|
|
tcp_pcb_purge(pcb); |
|
|
|
tcp_pcb_purge(pcb); |
|
|
|
if (prev != NULL) { |
|
|
|
if (prev != NULL) { |
|
|
|
prev->next = pcb->next; |
|
|
|
prev->next = pcb->next; |
|
|
|
|
|
|
|
prev->next_owner = PCB_NEXT_SLOWTMR; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
ctx->tw_pcbs = pcb->next; |
|
|
|
ctx->tw_pcbs = pcb->next; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -1016,7 +1024,13 @@ static void tcp_kill_timewait(struct lwip_tcp_ctx *ctx) |
|
|
|
if (!ctx) return; |
|
|
|
if (!ctx) return; |
|
|
|
inactivity = 0; |
|
|
|
inactivity = 0; |
|
|
|
inactive = NULL; |
|
|
|
inactive = NULL; |
|
|
|
|
|
|
|
int tw_iter = 0; |
|
|
|
for (pcb = ctx->tw_pcbs; pcb != NULL; pcb = pcb->next) { |
|
|
|
for (pcb = ctx->tw_pcbs; pcb != NULL; pcb = pcb->next) { |
|
|
|
|
|
|
|
if (++tw_iter > TCP_TW_MAX) { |
|
|
|
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_ALL, "TW_PCBS LOOP in tcp_kill_timewait: %d iterations, aborting pcb=%p state=%d port=%u next_owner=%d", tw_iter, (void*)pcb, pcb->state, pcb->local_port, pcb->next_owner); |
|
|
|
|
|
|
|
tcp_abort(pcb); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
if ((uint32_t)(ctx->ticks - pcb->tmr) >= inactivity) { |
|
|
|
if ((uint32_t)(ctx->ticks - pcb->tmr) >= inactivity) { |
|
|
|
inactivity = ctx->ticks - pcb->tmr; |
|
|
|
inactivity = ctx->ticks - pcb->tmr; |
|
|
|
inactive = pcb; |
|
|
|
inactive = pcb; |
|
|
|
@ -1080,8 +1094,8 @@ struct tcp_pcb *tcp_alloc(struct lwip_tcp_ctx *ctx, uint8_t prio) |
|
|
|
pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND16(TCP_WND); |
|
|
|
pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND16(TCP_WND); |
|
|
|
pcb->ttl = 64; |
|
|
|
pcb->ttl = 64; |
|
|
|
pcb->mss = INITIAL_MSS; |
|
|
|
pcb->mss = INITIAL_MSS; |
|
|
|
pcb->rto = 3000 / TCP_SLOW_INTERVAL; |
|
|
|
pcb->rto = (int16_t)(ctx->rto_min_ms / TCP_SLOW_INTERVAL); |
|
|
|
pcb->sv = 3000 / TCP_SLOW_INTERVAL; |
|
|
|
pcb->sv = (int16_t)(ctx->rto_min_ms / TCP_SLOW_INTERVAL); |
|
|
|
pcb->rtime = -1; |
|
|
|
pcb->rtime = -1; |
|
|
|
pcb->cwnd = 1; |
|
|
|
pcb->cwnd = 1; |
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "tcp_alloc: cwnd=%u snd_buf=%u mss=%u snd_wnd=%u", pcb->cwnd, pcb->snd_buf, pcb->mss, pcb->snd_wnd); |
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "tcp_alloc: cwnd=%u snd_buf=%u mss=%u snd_wnd=%u", pcb->cwnd, pcb->snd_buf, pcb->mss, pcb->snd_wnd); |
|
|
|
|