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
Diff: tcp/tcprecv.c
- 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; }