Skip to content

Commit 7680800

Browse files
Use the expected sequence number for challenge ACK messages (#1236)
* Use the expected sequence number for challenge ACK messages That avoids avoid endless ACK/RST retransmissions. FreeRTOS-Plus-TCP issue #1235 * Corrected acknowledge number in challenge ACK packets * Update source/FreeRTOS_TCP_Transmission.c Co-authored-by: Ahmed Ismail <[email protected]> --------- Co-authored-by: Ahmed Ismail <[email protected]>
1 parent 3436954 commit 7680800

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

source/FreeRTOS_TCP_IP.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,8 @@
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,
886+
pxSocket->u.xTCP.xTCPWindow.ulOurSequenceNumber );
886887
}
887888
else
888889
{

source/FreeRTOS_TCP_Transmission.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1352,11 +1352,28 @@
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 expected sequence value by the connection.
1356+
* @param[in] ulOurSequenceNumber The SEQ number to send out.
13551357
*
13561358
* @return Returns the value back from #prvTCPSendSpecialPacketHelper.
13571359
*/
1358-
BaseType_t prvTCPSendChallengeAck( NetworkBufferDescriptor_t * pxNetworkBuffer )
1360+
BaseType_t prvTCPSendChallengeAck( NetworkBufferDescriptor_t * pxNetworkBuffer,
1361+
uint32_t ulCurrentSequenceNumber,
1362+
uint32_t ulOurSequenceNumber )
13591363
{
1364+
ProtocolHeaders_t * pxProtocolHeaders = ( ( ProtocolHeaders_t * )
1365+
&( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + uxIPHeaderSizePacket( pxNetworkBuffer ) ] ) );
1366+
1367+
/* In https://tools.ietf.org/html/rfc5961#section-3.2 the field values are defined as follows:
1368+
* <SEQ=SND.NXT>
1369+
* <ACK=RCV.NXT>
1370+
*
1371+
* The prvTCPSendSpecialPacketHelper function uses the sequence number of the packet as the
1372+
* ACK number and the ACK number as the sequence number, therefore the values are set swapped
1373+
* here to match the RFC. */
1374+
pxProtocolHeaders->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( ulCurrentSequenceNumber );
1375+
pxProtocolHeaders->xTCPHeader.ulAckNr = FreeRTOS_htonl( ulOurSequenceNumber );
1376+
13601377
return prvTCPSendSpecialPacketHelper( pxNetworkBuffer, tcpTCP_FLAG_ACK );
13611378
}
13621379
/*-----------------------------------------------------------*/

source/include/FreeRTOS_TCP_Transmission.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,9 @@ 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,
154+
uint32_t ulOurSequenceNumber );
153155

154156
/*
155157
* 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: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2610,11 +2610,13 @@ void test_prvTCPSendChallengeAck( void )
26102610
eARPGetCacheEntry_ExpectAnyArgsAndReturn( eResolutionCacheHit );
26112611
eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
26122612

2613-
Return = prvTCPSendChallengeAck( pxNetworkBuffer );
2613+
Return = prvTCPSendChallengeAck( pxNetworkBuffer, 0x3333, 0x4444 );
26142614
TEST_ASSERT_EQUAL( pdFALSE, Return );
26152615
TEST_ASSERT_EQUAL( 1, NetworkInterfaceOutputFunction_Stub_Called );
26162616
TEST_ASSERT_EQUAL( tcpTCP_FLAG_ACK, pxTCPPacket->xTCPHeader.ucTCPFlags );
26172617
TEST_ASSERT_EQUAL( 0x50, pxTCPPacket->xTCPHeader.ucTCPOffset );
2618+
TEST_ASSERT_EQUAL( 0x3333, FreeRTOS_ntohl( pxTCPPacket->xTCPHeader.ulAckNr ) );
2619+
TEST_ASSERT_EQUAL( 0x4444, FreeRTOS_ntohl( pxTCPPacket->xTCPHeader.ulSequenceNumber ) );
26182620
}
26192621

26202622
/* test prvTCPSendReset function */

0 commit comments

Comments
 (0)