Andrew Boyson / net

Dependents:   oldheating gps motorhome heating

Revision:
144:6bd5c54efc7d
Parent:
133:a37eb35a03f1
Child:
145:206bf0d073c7
--- a/tcp/tcpsend.c	Thu May 09 07:47:12 2019 +0000
+++ b/tcp/tcpsend.c	Sun May 12 17:17:49 2019 +0000
@@ -6,6 +6,7 @@
 #include     "net.h"
 #include  "action.h"
 #include     "tcp.h"
+#include  "tcpbuf.h"
 #include  "tcphdr.h"
 #include     "tcb.h"
 #include     "ip4.h"
@@ -45,23 +46,15 @@
             return false;
     }    
 }
-static int addApplicationData(void* pPacket, uint16_t port, uint32_t start, int mss, int todo)
-{
-    int dataLength = 0;
+static int addApplicationData(int *pDataLength, void* pPacket, uint16_t port, uint32_t start, int mss, char* pAppData)
+{    
     char* pData = (char*)pPacket + TcpHdrSizeGet();
     switch (port)
     {
-        case 80:
-            HttpSendReply(&dataLength, pData, start, mss, todo);
-            break;
-        case 443:
-            HttpsSendReply(&dataLength, pData, start, mss, todo);
-            break;
-        default:
-            break;
-    }    
-        
-    return dataLength;
+        case  80: return HttpSendReply (pDataLength, pData, start, mss, pAppData);
+        case 443: return HttpsSendReply(pDataLength, pData, start, mss, pAppData);
+        default:  return 0; //0: not started; +1: started; -1: finished
+    }
 }
 static int preparePacket(void* pPacket, struct tcb* pTcb, int dataLength, int* pSize)
 {
@@ -103,22 +96,12 @@
             {
                 if (pTcb->bytesSentToRem - pTcb->bytesAckdByRem < pTcb->window)
                 {
-                    if (pTcb->todo && pTcb->postComplete && MsTimerAbsolute(pTcb->delayUntil)) //don't send response until any post has completed
+                    //0: not started; +1: started; -1: finished
+                    int state = addApplicationData(&dataLength, pPacket, pTcb->locPort, pTcb->bytesSentToRem - 1, pTcb->remMss, pTcb->appData);
+                    if (state == TCP_APP_FINISHED || state == TCP_APP_NOT_STARTED && pTcb->rcvdFin)
                     {
-                        dataLength = addApplicationData(pPacket, pTcb->locPort, pTcb->bytesSentToRem - 1, pTcb->remMss, pTcb->todo);
-                        if (dataLength < pTcb->remMss)
-                        {
-                            TcpHdrFIN     = true;
-                            pTcb->sentFin = true;
-                        }
-                    }
-                    else
-                    {
-                        if (pTcb->rcvdFin)
-                        {
-                            TcpHdrFIN     = true;
-                            pTcb->sentFin = true;
-                        }
+                        TcpHdrFIN     = true;
+                        pTcb->sentFin = true;
                     }
                 }
             }
@@ -162,10 +145,10 @@
             
         case TCB_ESTABLISHED:
         case TCB_CLOSE_FIN_WAIT:
-            if (pTcb->todo)
+            if (pTcb->appStarted)
             {
-                dataLength = addApplicationData(pPacket, pTcb->locPort, seqNum - 1, pTcb->remMss, pTcb->todo);
-                if (dataLength < pTcb->remMss)
+                bool added = addApplicationData(&dataLength, pPacket, pTcb->locPort, seqNum - 1, pTcb->remMss, pTcb->appData);
+                if (added && dataLength < pTcb->remMss)
                 {
                     TcpHdrFIN     = true;
                     pTcb->sentFin = true;