A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.

Dependents:   oldheating gps motorhome heating

Revision:
78:9d8fc88df405
Parent:
77:6cb7d92c37f3
Child:
79:f50e02fb5c94
--- a/tcp/tcprecv.c	Wed Oct 31 20:22:01 2018 +0000
+++ b/tcp/tcprecv.c	Mon Nov 05 19:27:19 2018 +0000
@@ -17,9 +17,18 @@
 //Payload variables
 static struct tcb* pTcb;
 
-static void logReset(char* message)
+static void logReset(char* fmt, ...)
 {
-    if (TcpTrace) { LogTime("TCP sent RST - "); Log(message); Log("\r\n"); }
+    if (TcpTrace)
+    {
+        if (NetTraceNewLine) Log("\r\n");
+        va_list argptr;
+        va_start(argptr, fmt);
+        LogTime("TCP sent RST - ");
+        LogV(fmt, argptr);
+        Log("\r\n");
+        va_end(argptr);
+    }
 }
 
 static void logTraceBack(void (*traceback)(void), char* fmt, ...)
@@ -70,6 +79,12 @@
 
 int TcpHandleReceivedPacket(void (*traceback)(void), int sizeRx, void* pPacketRx, int* pSizeTx, void* pPacketTx, int ipType, int remArIndex)
 {
+    if (remArIndex < 0)
+    {
+        LogTimeF("Invalid remote AR index %d", remArIndex);
+        return DO_NOTHING;
+    }
+    
     TcpHdrReadFromPacket(pPacketRx);
     
     int dataLength =   sizeRx - TcpHdrSizeGet();
@@ -95,7 +110,7 @@
     }
     
     //Get the Transmission Control Block
-    pTcb = TcbGetExisting(TcpHdrSrcPort);
+    pTcb = TcbGetExisting(ipType, remArIndex, TcpHdrSrcPort);
     if (!pTcb) pTcb = TcbGetEmpty();
     if (!pTcb) //Bomb out if no more tcbs are available
     {
@@ -124,7 +139,7 @@
     {
         if (pTcb->state)
         {
-            logReset("received a SYN when connection open");
+            logReset("received a SYN on port %d when connection open", TcpHdrSrcPort);
             pTcb->state = TCB_EMPTY;
             return TcpSendReset(pSizeTx, pPacketTx, pTcb);
         }
@@ -159,7 +174,8 @@
         
         pTcb->bytesSentToRem   = TcpHdrACK ? TcpHdrAckNum : 0; //Seq number
         pTcb->bytesAckdToRem   = TcpHdrSeqNum + seqLengthRcvd; //Ack number
-        logReset("TCP - non SYN packet received on a closed connection");
+        logReset("non SYN packet received on a closed connection");
+        pTcb->state = TCB_EMPTY;
         return TcpSendReset(pSizeTx, pPacketTx, pTcb);
     }
     
@@ -170,8 +186,11 @@
     and an acknowledgment indicating the next sequence number expected
     to be received, and the connection remains in the same state.*/
     uint32_t seqRcvdFromRem = TcpHdrSeqNum - pTcb->remIsn;
-    bool resendAck = seqRcvdFromRem != pTcb->bytesAckdToRem;
-    if (resendAck) return TcpResendLastAck(pSizeTx, pPacketTx, pTcb);
+    if (seqRcvdFromRem != pTcb->bytesAckdToRem)
+    {
+        logTraceBack(traceback, "TCP - resending last ACK on port %d as seq rcvd is %d and seq last was %d\r\n", TcpHdrSrcPort, seqRcvdFromRem, pTcb->bytesAckdToRem);
+        return TcpResendLastAck(pSizeTx, pPacketTx, pTcb);
+    }
     
     //Record the number of bytes acked by the remote host
     pTcb->bytesAckdByRem = TcpHdrAckNum - pTcb->locIsn;