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;
 }
 
 /**