Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion source/FreeRTOS_TCP_IP.c
Original file line number Diff line number Diff line change
Expand Up @@ -882,7 +882,8 @@
pxSocket->u.xTCP.xTCPWindow.xSize.ulRxWindowLength ) != pdFALSE ) )
{
/* Send a challenge ACK. */
( void ) prvTCPSendChallengeAck( pxNetworkBuffer );
( void ) prvTCPSendChallengeAck( pxNetworkBuffer, pxSocket->u.xTCP.xTCPWindow.rx.ulCurrentSequenceNumber,
pxSocket->u.xTCP.xTCPWindow.ulOurSequenceNumber );
}
else
{
Expand Down
19 changes: 18 additions & 1 deletion source/FreeRTOS_TCP_Transmission.c
Original file line number Diff line number Diff line change
Expand Up @@ -1352,11 +1352,28 @@
* unexpected but still within the window.
*
* @param[in] pxNetworkBuffer The network buffer descriptor with the packet.
* @param[in] ulCurrentSequenceNumber The current sequence number of the connection.
* @param[in] ulOurSequenceNumber The SEQ number to send out.
*
* @return Returns the value back from #prvTCPSendSpecialPacketHelper.
*/
BaseType_t prvTCPSendChallengeAck( NetworkBufferDescriptor_t * pxNetworkBuffer )
BaseType_t prvTCPSendChallengeAck( NetworkBufferDescriptor_t * pxNetworkBuffer,
uint32_t ulCurrentSequenceNumber,
uint32_t ulOurSequenceNumber )
{
ProtocolHeaders_t * pxProtocolHeaders = ( ( ProtocolHeaders_t * )
&( pxNetworkBuffer->pucEthernetBuffer[ ipSIZE_OF_ETH_HEADER + uxIPHeaderSizePacket( pxNetworkBuffer ) ] ) );

/* In https://tools.ietf.org/html/rfc5961#section-3.2 the field values are defined as follows:
* <SEQ=SND.NXT>
* <ACK=RCV.NXT>
*
* The prvTCPSendSpecialPacketHelper function uses the sequence number of the packet as the
* ACK number and the ACK number as the sequence number, therefore the values are set swapped
* here to match the RFC. */
pxProtocolHeaders->xTCPHeader.ulSequenceNumber = FreeRTOS_htonl( ulCurrentSequenceNumber );
pxProtocolHeaders->xTCPHeader.ulAckNr = FreeRTOS_htonl( ulOurSequenceNumber );

return prvTCPSendSpecialPacketHelper( pxNetworkBuffer, tcpTCP_FLAG_ACK );
}
/*-----------------------------------------------------------*/
Expand Down
4 changes: 3 additions & 1 deletion source/include/FreeRTOS_TCP_Transmission.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,9 @@ BaseType_t prvSendData( FreeRTOS_Socket_t * pxSocket,
* case #3. In summary, an RST was received with a sequence number that is
* unexpected but still within the window.
*/
BaseType_t prvTCPSendChallengeAck( NetworkBufferDescriptor_t * pxNetworkBuffer );
BaseType_t prvTCPSendChallengeAck( NetworkBufferDescriptor_t * pxNetworkBuffer,
uint32_t ulCurrentSequenceNumber,
uint32_t ulOurSequenceNumber );

/*
* Reply to a peer with the RST flag on, in case a packet can not be handled.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2610,11 +2610,13 @@ void test_prvTCPSendChallengeAck( void )
eARPGetCacheEntry_ExpectAnyArgsAndReturn( eResolutionCacheHit );
eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );

Return = prvTCPSendChallengeAck( pxNetworkBuffer );
Return = prvTCPSendChallengeAck( pxNetworkBuffer, 0x3333, 0x4444 );
TEST_ASSERT_EQUAL( pdFALSE, Return );
TEST_ASSERT_EQUAL( 1, NetworkInterfaceOutputFunction_Stub_Called );
TEST_ASSERT_EQUAL( tcpTCP_FLAG_ACK, pxTCPPacket->xTCPHeader.ucTCPFlags );
TEST_ASSERT_EQUAL( 0x50, pxTCPPacket->xTCPHeader.ucTCPOffset );
TEST_ASSERT_EQUAL( 0x3333, FreeRTOS_ntohl( pxTCPPacket->xTCPHeader.ulAckNr ) );
TEST_ASSERT_EQUAL( 0x4444, FreeRTOS_ntohl( pxTCPPacket->xTCPHeader.ulSequenceNumber ) );
}

/* test prvTCPSendReset function */
Expand Down
Loading