Thu 11 Sep 2014 09:22:11 AM UTC, original submission:
in tcp_out.c() : tcp_enqueue_flags()
if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue_flags: too long queue %"U16_F" (max %"U16_F")\n",
pcb->snd_queuelen, TCP_SND_QUEUELEN));
will cause hangup in some cases, which can be partially fixed by:
if ((pcb->snd_queuelen > TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {
LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue_flags: too long queue %"U16_F" (max %"U16_F")\n",
pcb->snd_queuelen, TCP_SND_QUEUELEN));
but this seems not the entire solution:
quote from Simon on this bug by email:
"This seems like a bug in lwIP, but your fix is not really correct. It might solve your specific problem, but only because of your current pcb->snd_queuelen state. A more general fix might have to detect that only a FIN should be enqueued and ignore the TCP_SND_QUEUELEN counter in this case."
but I'm not deep enough into LWIP for that...
|