2008-01-15 Kieran Mansley
* tcp_out.c: BUG20511. Modify persist timer to start when we are
prevented from sending by a small send window, not just a zero
send window.
diff --git a/CHANGELOG b/CHANGELOG
index ca190ea..baf194a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -592,6 +592,12 @@
++ Bug fixes:
+
+ 2008-01-15 Kieran Mansley
+ * tcp_out.c: BUG20511. Modify persist timer to start when we are
+ prevented from sending by a small send window, not just a zero
+ send window.
+
2008-01-09 Jonathan Larmour
* opt.h, ip.c: Rename IP_OPTIONS define to IP_OPTIONS_ALLOWED to avoid
conflict with Linux system headers.
diff --git a/src/core/tcp_out.c b/src/core/tcp_out.c
index c80e637..c46e4b8 100644
--- a/src/core/tcp_out.c
+++ b/src/core/tcp_out.c
@@ -510,11 +510,7 @@
ntohl(seg->tcphdr->seqno), pcb->lastack));
}
#endif /* TCP_CWND_DEBUG */
- if (seg != NULL && pcb->snd_wnd == 0 && pcb->persist_backoff == 0) {
- /* prepare for persist timer */
- pcb->persist_cnt = 0;
- pcb->persist_backoff = 1;
- } /* data available and window allows it to be sent? */
+ /* data available and window allows it to be sent? */
while (seg != NULL &&
ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
LWIP_ASSERT("RST not expected here!",
@@ -579,8 +575,16 @@
}
seg = pcb->unsent;
}
- pcb->flags &= ~TF_NAGLEMEMERR;
- return ERR_OK;
+
+ if (seg != NULL && pcb->persist_backoff == 0 &&
+ ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > pcb->snd_wnd) {
+ /* prepare for persist timer */
+ pcb->persist_cnt = 0;
+ pcb->persist_backoff = 1;
+ }
+
+ pcb->flags &= ~TF_NAGLEMEMERR;
+ return ERR_OK;
}
/**