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:
- 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;