Skip to content

Commit 9147cd1

Browse files
committed
Use the expected sequence number for challenge ACK messages
That avoids avoid endless ACK/RST retransmissions. FreeRTOS-Plus-TCP issue #1235
1 parent 3436954 commit 9147cd1

File tree

4 files changed

+14
-4
lines changed

4 files changed

+14
-4
lines changed

source/FreeRTOS_TCP_IP.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,7 @@
882882
pxSocket->u.xTCP.xTCPWindow.xSize.ulRxWindowLength ) != pdFALSE ) )
883883
{
884884
/* Send a challenge ACK. */
885-
( void ) prvTCPSendChallengeAck( pxNetworkBuffer );
885+
( void ) prvTCPSendChallengeAck( pxNetworkBuffer, pxSocket->u.xTCP.xTCPWindow.rx.ulCurrentSequenceNumber );
886886
}
887887
else
888888
{

source/FreeRTOS_TCP_Transmission.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1352,11 +1352,20 @@
13521352
* unexpected but still within the window.
13531353
*
13541354
* @param[in] pxNetworkBuffer The network buffer descriptor with the packet.
1355+
* @param[in] ulCurrentSequenceNumber The current sequence number of the connection.
13551356
*
13561357
* @return Returns the value back from #prvTCPSendSpecialPacketHelper.
13571358
*/
1358-
BaseType_t prvTCPSendChallengeAck( NetworkBufferDescriptor_t * pxNetworkBuffer )
1359+
BaseType_t prvTCPSendChallengeAck( NetworkBufferDescriptor_t * pxNetworkBuffer,
1360+
uint32_t ulCurrentSequenceNumber )
13591361
{
1362+
ProtocolHeaders_t * pxProtocolHeaders = ( ( ProtocolHeaders_t * )
1363+
&( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + uxIPHeaderSizePacket( pxNetworkBuffer ) ] ) );
1364+
1365+
/* Correct the sequence number to avoid an endless ACK/RST sequence. When sending the
1366+
* same number again the next RST will not match as well. */
1367+
pxProtocolHeaders->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( ulCurrentSequenceNumber );
1368+
13601369
return prvTCPSendSpecialPacketHelper( pxNetworkBuffer, tcpTCP_FLAG_ACK );
13611370
}
13621371
/*-----------------------------------------------------------*/

source/include/FreeRTOS_TCP_Transmission.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ BaseType_t prvSendData( FreeRTOS_Socket_t * pxSocket,
149149
* case #3. In summary, an RST was received with a sequence number that is
150150
* unexpected but still within the window.
151151
*/
152-
BaseType_t prvTCPSendChallengeAck( NetworkBufferDescriptor_t * pxNetworkBuffer );
152+
BaseType_t prvTCPSendChallengeAck( NetworkBufferDescriptor_t * pxNetworkBuffer,
153+
uint32_t ulCurrentSequenceNumber );
153154

154155
/*
155156
* Reply to a peer with the RST flag on, in case a packet can not be handled.

test/unit-test/FreeRTOS_TCP_Transmission/FreeRTOS_TCP_Transmission_utest.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2610,7 +2610,7 @@ void test_prvTCPSendChallengeAck( void )
26102610
eARPGetCacheEntry_ExpectAnyArgsAndReturn( eResolutionCacheHit );
26112611
eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
26122612

2613-
Return = prvTCPSendChallengeAck( pxNetworkBuffer );
2613+
Return = prvTCPSendChallengeAck( pxNetworkBuffer, 0x3333 );
26142614
TEST_ASSERT_EQUAL( pdFALSE, Return );
26152615
TEST_ASSERT_EQUAL( 1, NetworkInterfaceOutputFunction_Stub_Called );
26162616
TEST_ASSERT_EQUAL( tcpTCP_FLAG_ACK, pxTCPPacket->xTCPHeader.ucTCPFlags );

0 commit comments

Comments
 (0)