mirror of
https://github.com/FreeRTOS/FreeRTOS.git
synced 2025-06-17 21:49:29 +08:00
Fix a Bug and corresponding CBMC patch (#84)
* Update remove-static-in-freertos-tcp-ip.patch * Update FreeRTOS_TCP_IP.c * Update remove-static-in-freertos-tcp-ip.patch * Update remove-static-in-freertos-tcp-ip.patch Co-authored-by: Yuhui Zheng <10982575+yuhui-zheng@users.noreply.github.com>
This commit is contained in:

committed by
GitHub

parent
bb9f92f771
commit
f11bcc8acc
@ -210,13 +210,16 @@ static size_t prvSingleStepTCPHeaderOptions( const uint8_t * const pucPtr,
|
||||
FreeRTOS_Socket_t * const pxSocket,
|
||||
BaseType_t xHasSYNFlag );
|
||||
|
||||
/*
|
||||
* Skip past TCP header options when doing Selective ACK, until there are no
|
||||
* more options left.
|
||||
*/
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket );
|
||||
#if( ipconfigUSE_TCP_WIN == 1 )
|
||||
/*
|
||||
* Skip past TCP header options when doing Selective ACK, until there are no
|
||||
* more options left.
|
||||
*/
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket );
|
||||
#endif/* ( ipconfigUSE_TCP_WIN == 1 ) */
|
||||
|
||||
|
||||
/*
|
||||
* Set the initial properties in the options fields, like the preferred
|
||||
@ -1327,47 +1330,50 @@ TCPWindow_t *pxTCPWindow = &( pxSocket->u.xTCP.xTCPWindow );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket )
|
||||
{
|
||||
uint32_t ulFirst = ulChar2u32( &( pucPtr[ uxIndex ] ) );
|
||||
uint32_t ulLast = ulChar2u32( &( pucPtr[ uxIndex + 4U ] ) );
|
||||
uint32_t ulCount = ulTCPWindowTxSack( &( pxSocket->u.xTCP.xTCPWindow ), ulFirst, ulLast );;
|
||||
|
||||
/* ulTCPWindowTxSack( ) returns the number of bytes which have been acked
|
||||
* starting from the head position. Advance the tail pointer in txStream.
|
||||
*/
|
||||
if( ( pxSocket->u.xTCP.txStream != NULL ) && ( ulCount > 0U ) )
|
||||
#if( ipconfigUSE_TCP_WIN == 1 )
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket )
|
||||
{
|
||||
/* Just advancing the tail index, 'ulCount' bytes have been confirmed. */
|
||||
( void ) uxStreamBufferGet( pxSocket->u.xTCP.txStream, 0, NULL, ( size_t ) ulCount, pdFALSE );
|
||||
pxSocket->xEventBits |= ( EventBits_t ) eSOCKET_SEND;
|
||||
uint32_t ulFirst = ulChar2u32( &( pucPtr[ uxIndex ] ) );
|
||||
uint32_t ulLast = ulChar2u32( &( pucPtr[ uxIndex + 4U ] ) );
|
||||
uint32_t ulCount = ulTCPWindowTxSack( &( pxSocket->u.xTCP.xTCPWindow ), ulFirst, ulLast );;
|
||||
|
||||
#if ipconfigSUPPORT_SELECT_FUNCTION == 1
|
||||
/* ulTCPWindowTxSack( ) returns the number of bytes which have been acked
|
||||
* starting from the head position. Advance the tail pointer in txStream.
|
||||
*/
|
||||
if( ( pxSocket->u.xTCP.txStream != NULL ) && ( ulCount > 0U ) )
|
||||
{
|
||||
if( ( pxSocket->xSelectBits & ( EventBits_t ) eSELECT_WRITE ) != 0U )
|
||||
{
|
||||
/* The field 'xEventBits' is used to store regular socket events
|
||||
* (at most 8), as well as 'select events', which will be left-shifted.
|
||||
*/
|
||||
pxSocket->xEventBits |= ( ( EventBits_t ) eSELECT_WRITE ) << SOCKET_EVENT_BIT_COUNT;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Just advancing the tail index, 'ulCount' bytes have been confirmed. */
|
||||
( void ) uxStreamBufferGet( pxSocket->u.xTCP.txStream, 0, NULL, ( size_t ) ulCount, pdFALSE );
|
||||
pxSocket->xEventBits |= ( EventBits_t ) eSOCKET_SEND;
|
||||
|
||||
/* In case the socket owner has installed an OnSent handler,
|
||||
call it now. */
|
||||
#if( ipconfigUSE_CALLBACKS == 1 )
|
||||
{
|
||||
if( ipconfigIS_VALID_PROG_ADDRESS( pxSocket->u.xTCP.pxHandleSent ) )
|
||||
#if ipconfigSUPPORT_SELECT_FUNCTION == 1
|
||||
{
|
||||
pxSocket->u.xTCP.pxHandleSent( pxSocket, ulCount );
|
||||
if( ( pxSocket->xSelectBits & ( EventBits_t ) eSELECT_WRITE ) != 0U )
|
||||
{
|
||||
/* The field 'xEventBits' is used to store regular socket events
|
||||
* (at most 8), as well as 'select events', which will be left-shifted.
|
||||
*/
|
||||
pxSocket->xEventBits |= ( ( EventBits_t ) eSELECT_WRITE ) << SOCKET_EVENT_BIT_COUNT;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* In case the socket owner has installed an OnSent handler,
|
||||
call it now. */
|
||||
#if( ipconfigUSE_CALLBACKS == 1 )
|
||||
{
|
||||
if( ipconfigIS_VALID_PROG_ADDRESS( pxSocket->u.xTCP.pxHandleSent ) )
|
||||
{
|
||||
pxSocket->u.xTCP.pxHandleSent( pxSocket, ulCount );
|
||||
}
|
||||
}
|
||||
#endif /* ipconfigUSE_CALLBACKS == 1 */
|
||||
}
|
||||
#endif /* ipconfigUSE_CALLBACKS == 1 */
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* ( ipconfigUSE_TCP_WIN != 0 ) */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#if( ipconfigUSE_TCP_WIN != 0 )
|
||||
@ -1994,7 +2000,6 @@ int32_t lCount, lLength;
|
||||
|
||||
/* A txStream has been created already, see if the socket has new data for
|
||||
the sliding window.
|
||||
|
||||
uxStreamBufferMidSpace() returns the distance between rxHead and rxMid. It
|
||||
contains new Tx data which has not been passed to the sliding window yet.
|
||||
The oldest data not-yet-confirmed can be found at rxTail. */
|
||||
@ -2004,7 +2009,6 @@ int32_t lCount, lLength;
|
||||
{
|
||||
/* All data between txMid and rxHead will now be passed to the sliding
|
||||
window manager, so it can start transmitting them.
|
||||
|
||||
Hand over the new data to the sliding window handler. It will be
|
||||
split-up in chunks of 1460 bytes each (or less, depending on
|
||||
ipconfigTCP_MSS). */
|
||||
@ -2137,7 +2141,6 @@ uint16_t usLength;
|
||||
|
||||
/* Determine the length and the offset of the user-data sent to this
|
||||
node.
|
||||
|
||||
The size of the TCP header is given in a multiple of 4-byte words (single
|
||||
byte, needs no ntoh() translation). A shift-right 2: is the same as
|
||||
(offset >> 4) * 4. */
|
||||
@ -2213,7 +2216,6 @@ BaseType_t xResult = 0;
|
||||
{
|
||||
/* See if way may accept the data contents and forward it to the socket
|
||||
owner.
|
||||
|
||||
If it can't be "accept"ed it may have to be stored and send a selective
|
||||
ack (SACK) option to confirm it. In that case, lTCPAddRxdata() will be
|
||||
called later to store an out-of-order packet (in case lOffset is
|
||||
@ -3502,4 +3504,3 @@ const ListItem_t *pxEndTCP = ipPOINTER_CAST( const ListItem_t *, listGET_END_MAR
|
||||
#ifdef FREERTOS_TCP_ENABLE_VERIFICATION
|
||||
#include "aws_freertos_tcp_verification_access_tcp_define.h"
|
||||
#endif
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
From afc01793c4531cfbe9f92e7ca2ce9364983d987e Mon Sep 17 00:00:00 2001
|
||||
From: Mark R Tuttle <mrtuttle@amazon.com>
|
||||
Date: Tue, 12 May 2020 15:57:56 +0000
|
||||
From: Aniruddha R Kanhere <kanherea@amazon.com>
|
||||
Date: Wed, 03 June 2020 09:51:25 +0000
|
||||
Subject: [PATCH] modified lib
|
||||
|
||||
---
|
||||
@ -8,7 +7,7 @@ Subject: [PATCH] modified lib
|
||||
1 file changed, 24 insertions(+)
|
||||
|
||||
diff --git a/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_IP.c b/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_IP.c
|
||||
index dc58621..963b576 100644
|
||||
index 7a2c00c68..cb537b347 100644
|
||||
--- a/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_IP.c
|
||||
+++ b/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_IP.c
|
||||
@@ -198,14 +198,22 @@ static BaseType_t prvTCPPrepareConnect( FreeRTOS_Socket_t *pxSocket );
|
||||
@ -34,18 +33,18 @@ index dc58621..963b576 100644
|
||||
size_t uxTotalLength,
|
||||
FreeRTOS_Socket_t * const pxSocket,
|
||||
BaseType_t xHasSYNFlag );
|
||||
@@ -214,7 +222,11 @@ static size_t prvSingleStepTCPHeaderOptions( const uint8_t * const pucPtr,
|
||||
* Skip past TCP header options when doing Selective ACK, until there are no
|
||||
* more options left.
|
||||
*/
|
||||
+#ifdef CBMC
|
||||
+void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+#else
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+#endif
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket );
|
||||
|
||||
@@ -215,7 +223,11 @@ static size_t prvSingleStepTCPHeaderOptions( const uint8_t * const pucPtr,
|
||||
* Skip past TCP header options when doing Selective ACK, until there are no
|
||||
* more options left.
|
||||
*/
|
||||
+ #ifdef CBMC
|
||||
+ void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+ #else
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+ #endif
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket );
|
||||
#endif/* ( ipconfigUSE_TCP_WIN == 1 ) */
|
||||
@@ -1137,7 +1149,11 @@ uint32_t ulInitialSequenceNumber = 0;
|
||||
* that: ((pxTCPHeader->ucTCPOffset & 0xf0) > 0x50), meaning that the TP header
|
||||
* is longer than the usual 20 (5 x 4) bytes.
|
||||
@ -58,7 +57,7 @@ index dc58621..963b576 100644
|
||||
{
|
||||
size_t uxTCPHeaderOffset = ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer );
|
||||
const ProtocolHeaders_t *pxProtocolHeaders = ipPOINTER_CAST( ProtocolHeaders_t *,
|
||||
@@ -1201,7 +1217,11 @@ uint8_t ucLength;
|
||||
@@ -1199,7 +1215,11 @@ uint8_t ucLength;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
@ -70,18 +69,15 @@ index dc58621..963b576 100644
|
||||
size_t uxTotalLength,
|
||||
FreeRTOS_Socket_t * const pxSocket,
|
||||
BaseType_t xHasSYNFlag )
|
||||
@@ -1346,7 +1366,11 @@ TCPWindow_t *pxTCPWindow = &( pxSocket->u.xTCP.xTCPWindow );
|
||||
}
|
||||
@@ -1331,7 +1351,11 @@ TCPWindow_t *pxTCPWindow = &( pxSocket->u.xTCP.xTCPWindow );
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
+#ifdef CBMC
|
||||
+void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+#else
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+#endif
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket )
|
||||
{
|
||||
--
|
||||
2.7.4
|
||||
|
||||
#if( ipconfigUSE_TCP_WIN == 1 )
|
||||
+ #ifdef CBMC
|
||||
+ void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+ #else
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+ #endif
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket )
|
||||
{
|
||||
|
@ -1,6 +1,5 @@
|
||||
From afc01793c4531cfbe9f92e7ca2ce9364983d987e Mon Sep 17 00:00:00 2001
|
||||
From: Mark R Tuttle <mrtuttle@amazon.com>
|
||||
Date: Tue, 12 May 2020 15:57:56 +0000
|
||||
From: Aniruddha R Kanhere <kanherea@amazon.com>
|
||||
Date: Wed, 03 June 2020 09:51:25 +0000
|
||||
Subject: [PATCH] modified lib
|
||||
|
||||
---
|
||||
@ -8,7 +7,7 @@ Subject: [PATCH] modified lib
|
||||
1 file changed, 24 insertions(+)
|
||||
|
||||
diff --git a/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_IP.c b/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_IP.c
|
||||
index dc58621..963b576 100644
|
||||
index 7a2c00c68..cb537b347 100644
|
||||
--- a/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_IP.c
|
||||
+++ b/FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_IP.c
|
||||
@@ -198,14 +198,22 @@ static BaseType_t prvTCPPrepareConnect( FreeRTOS_Socket_t *pxSocket );
|
||||
@ -34,18 +33,18 @@ index dc58621..963b576 100644
|
||||
size_t uxTotalLength,
|
||||
FreeRTOS_Socket_t * const pxSocket,
|
||||
BaseType_t xHasSYNFlag );
|
||||
@@ -214,7 +222,11 @@ static size_t prvSingleStepTCPHeaderOptions( const uint8_t * const pucPtr,
|
||||
* Skip past TCP header options when doing Selective ACK, until there are no
|
||||
* more options left.
|
||||
*/
|
||||
+#ifdef CBMC
|
||||
+void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+#else
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+#endif
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket );
|
||||
|
||||
@@ -215,7 +223,11 @@ static size_t prvSingleStepTCPHeaderOptions( const uint8_t * const pucPtr,
|
||||
* Skip past TCP header options when doing Selective ACK, until there are no
|
||||
* more options left.
|
||||
*/
|
||||
+ #ifdef CBMC
|
||||
+ void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+ #else
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+ #endif
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket );
|
||||
#endif/* ( ipconfigUSE_TCP_WIN == 1 ) */
|
||||
@@ -1137,7 +1149,11 @@ uint32_t ulInitialSequenceNumber = 0;
|
||||
* that: ((pxTCPHeader->ucTCPOffset & 0xf0) > 0x50), meaning that the TP header
|
||||
* is longer than the usual 20 (5 x 4) bytes.
|
||||
@ -58,7 +57,7 @@ index dc58621..963b576 100644
|
||||
{
|
||||
size_t uxTCPHeaderOffset = ipSIZE_OF_ETH_HEADER + xIPHeaderSize( pxNetworkBuffer );
|
||||
const ProtocolHeaders_t *pxProtocolHeaders = ipPOINTER_CAST( ProtocolHeaders_t *,
|
||||
@@ -1201,7 +1217,11 @@ uint8_t ucLength;
|
||||
@@ -1199,7 +1215,11 @@ uint8_t ucLength;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
@ -70,18 +69,15 @@ index dc58621..963b576 100644
|
||||
size_t uxTotalLength,
|
||||
FreeRTOS_Socket_t * const pxSocket,
|
||||
BaseType_t xHasSYNFlag )
|
||||
@@ -1346,7 +1366,11 @@ TCPWindow_t *pxTCPWindow = &( pxSocket->u.xTCP.xTCPWindow );
|
||||
}
|
||||
@@ -1331,7 +1351,11 @@ TCPWindow_t *pxTCPWindow = &( pxSocket->u.xTCP.xTCPWindow );
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
+#ifdef CBMC
|
||||
+void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+#else
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+#endif
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket )
|
||||
{
|
||||
--
|
||||
2.7.4
|
||||
|
||||
#if( ipconfigUSE_TCP_WIN == 1 )
|
||||
+ #ifdef CBMC
|
||||
+ void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+ #else
|
||||
static void prvReadSackOption( const uint8_t * const pucPtr,
|
||||
+ #endif
|
||||
size_t uxIndex,
|
||||
FreeRTOS_Socket_t * const pxSocket )
|
||||
{
|
||||
|
Reference in New Issue
Block a user