From f4f44f9fc11d0ee9e0dbaf3323d095af32e8b0ef Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Wed, 3 Feb 2010 14:09:56 +0000
Subject: [PATCH] Re-add Webserver uIP application polling, apply patch to uIP
 by Andrew Ruder to fix corrupt TCP streams when multiple applications are
 used and the applications are polled for more data.

---
 Projects/Webserver/Lib/uIPManagement.c | 15 +++++++++++++++
 Projects/Webserver/Lib/uip/uip.c       |  2 ++
 2 files changed, 17 insertions(+)

diff --git a/Projects/Webserver/Lib/uIPManagement.c b/Projects/Webserver/Lib/uIPManagement.c
index 37080dfd7..90629b893 100644
--- a/Projects/Webserver/Lib/uIPManagement.c
+++ b/Projects/Webserver/Lib/uIPManagement.c
@@ -175,6 +175,21 @@ static void uIPManagement_ProcessIncommingPacket(void)
 /** Manages the currently open network connections, including TCP and (if enabled) UDP. */
 static void uIPManagement_ManageConnections(void)
 {
+	/* Poll TCP connections for more data to send back to the host */
+	for (uint8_t i = 0; i < UIP_CONNS; i++)
+	{
+		uip_poll_conn(&uip_conns[i]);
+
+		/* If a response was generated, send it */
+		if (uip_len > 0)
+		{
+			/* Add destination MAC to outgoing packet */
+			uip_arp_out();
+
+			RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len);
+		}
+	}
+
 	/* Manage open connections for timeouts */
 	if (timer_expired(&ConnectionTimer))
 	{
diff --git a/Projects/Webserver/Lib/uip/uip.c b/Projects/Webserver/Lib/uip/uip.c
index 1abefd5dc..22a72043f 100644
--- a/Projects/Webserver/Lib/uip/uip.c
+++ b/Projects/Webserver/Lib/uip/uip.c
@@ -689,6 +689,7 @@ uip_process(u8_t flag)
   if(flag == UIP_POLL_REQUEST) {
     if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED &&
        !uip_outstanding(uip_connr)) {
+	uip_len = uip_slen = 0;
 	uip_flags = UIP_POLL;
 	UIP_APPCALL();
 	goto appsend;
@@ -794,6 +795,7 @@ uip_process(u8_t flag)
       } else if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) {
 	/* If there was no need for a retransmission, we poll the
            application for new data. */
+	uip_len = uip_slen = 0;		   
 	uip_flags = UIP_POLL;
 	UIP_APPCALL();
 	goto appsend;
-- 
GitLab