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:
98:b977424ec7f7
Parent:
97:d91f7db00235
Child:
111:3600389d1add
--- a/tcp/tcprecv.c	Wed Jan 02 17:48:38 2019 +0000
+++ b/tcp/tcprecv.c	Thu Jan 03 17:23:38 2019 +0000
@@ -104,6 +104,7 @@
 
 int TcpHandleReceivedPacket(void (*traceback)(void), int sizeRx, void* pPacketRx, int* pSizeTx, void* pPacketTx, int ipType, int remArIndex, int locIpScope)
 {
+    int lastFaultPoint = FaultPoint;
     FaultPoint = FAULT_POINT_TcpHandleReceivedPacket;
     
     int action = DO_NOTHING;
@@ -114,9 +115,10 @@
     if (remArIndex < 0)
     {
         log(traceback, "invalid remote AR index %d -> ignored packet", remArIndex);
-        FaultPoint = 0;
+        FaultPoint = lastFaultPoint;
         return DO_NOTHING;
     }
+    FaultPoint += 100;
     
     int dataLength =   sizeRx - TcpHdrSizeGet();
     int locMss     = *pSizeTx - TcpHdrSizeGet();
@@ -128,6 +130,7 @@
     if (TcpHdrFIN) seqLengthRcvd += 1;          //Add one to acknowledge the FIN
     
     //Filter out unwanted links
+    FaultPoint++;
     switch (TcpHdrDstPort)
     {
         case 80:
@@ -142,18 +145,19 @@
         default: //Send reset if unknown port
             log(traceback, "unhandled local port %hu -> sent reset", TcpHdrDstPort);
             action = sendResetFromPacket(pSizeTx, pPacketTx, ipType, remArIndex, locIpScope, seqLengthRcvd);
-            FaultPoint = 0;
+            FaultPoint = lastFaultPoint;
             return action;
     }
     
     //Get the Transmission Control Block
+    FaultPoint++;
     struct tcb* pTcb = TcbGetExisting(ipType, remArIndex, locIpScope, TcpHdrSrcPort, TcpHdrDstPort);
     if (!pTcb) pTcb = TcbGetEmpty();
     if (!pTcb) //send reset if no more tcbs are available
     {
         log(traceback, "no more tcbs available -> sent reset");
         action = sendResetFromPacket(pSizeTx, pPacketTx, ipType, remArIndex, locIpScope, seqLengthRcvd);
-        FaultPoint = 0;
+        FaultPoint = lastFaultPoint;
         return action;
     }
     pTcb->timeLastRcvd     = MsTimerCount;
@@ -165,6 +169,7 @@
     pTcb->window           = TcpHdrWindow;
     
     //Handle request to reset
+    FaultPoint++;
     if (TcpHdrRST)
     {
         if (pTcb->state)
@@ -172,11 +177,12 @@
             log(traceback, "received reset -> reaped TCB");
             pTcb->state = TCB_EMPTY;
         }
-        FaultPoint = 0;
+        FaultPoint = lastFaultPoint;
         return DO_NOTHING;        //Don't reply
     }
     
     //Handle request to synchronise
+    FaultPoint++;
     if (TcpHdrSYN)
     {
         if (pTcb->state)
@@ -184,7 +190,7 @@
             log(traceback, "received a SYN on an open connection -> sent reset");
             pTcb->state = TCB_EMPTY;
             action = TcpSendReset(pSizeTx, pPacketTx, pTcb);
-            FaultPoint = 0;
+            FaultPoint = lastFaultPoint;
             return action;
         }
         else
@@ -194,17 +200,19 @@
     }
     
     //Handle non SYN packet on an empty connection
+    FaultPoint++;
     if (!TcpHdrSYN && !pTcb->state)
     {
 
         log(traceback, "non SYN packet received on a closed connection -> sent reset");
         pTcb->state = TCB_EMPTY;
         action = sendResetFromPacket(pSizeTx, pPacketTx, ipType, remArIndex, locIpScope, seqLengthRcvd);
-        FaultPoint = 0;
+        FaultPoint = lastFaultPoint;
         return action;
     }
     
     //Check if the acks of bytes sent has progressed and reset the timer
+    FaultPoint++;
     uint32_t ackRcvdFromRem = TcpHdrACK ? TcpHdrAckNum - pTcb->locIsn : 0;
     if (ackRcvdFromRem > pTcb->bytesAckdByRem)
     {
@@ -213,6 +221,7 @@
     }
 
     //Record the number of bytes acked by the remote host
+    FaultPoint++;
     pTcb->bytesAckdByRem = ackRcvdFromRem;
 
     /* If the connection is in a synchronized state
@@ -221,6 +230,7 @@
     acknowledgment segment containing the current send-sequence number
     and an acknowledgment indicating the next sequence number expected
     to be received, and the connection remains in the same state.*/
+    FaultPoint++;
     uint32_t seqRcvdFromRem = TcpHdrSeqNum - pTcb->remIsn;
     if (seqRcvdFromRem != pTcb->bytesAckdToRem)
     {
@@ -230,26 +240,30 @@
             log(traceback, "seq rcvd is %d and last seq ackd was %d -> resent last ACK", seqRcvdFromRem, pTcb->bytesAckdToRem);
         }
         action = TcpResendLastAck(pSizeTx, pPacketTx, pTcb);
-        FaultPoint = 0;
+        FaultPoint = lastFaultPoint;
         return action;
     }
     //Ignore data before established
+    FaultPoint++;
     if (pTcb->state != TCB_ESTABLISHED && dataLength)
     {
         log(traceback, "data received before connection established -> sent reset");
         pTcb->state = TCB_EMPTY;
         action = TcpSendReset(pSizeTx, pPacketTx, pTcb);
-        FaultPoint = 0;
+        FaultPoint = lastFaultPoint;
         return action;
     }
     
     //Handle FIN
+    FaultPoint++;
     if (TcpHdrFIN) pTcb->rcvdFin = true; //When reply is all sent only a passive close is needed
     
     //From now on there are no errors so display traceback if requested
+    FaultPoint++;
     if (traceRequested && NetTraceStack) traceback();
     
     //Record the number of bytes received from the remote host
+    FaultPoint++;
     pTcb->bytesRcvdFromRem += seqLengthRcvd;
 
     switch (pTcb->state) //This is the state of the connection BEFORE this packet arrived
@@ -279,8 +293,9 @@
             
     }
     
+    FaultPoint++;
     action = TcpSend(pSizeTx, pPacketTx, pTcb);
 
-    FaultPoint = 0;
+    FaultPoint = lastFaultPoint;
     return action;
 }