/*\r
- * FreeRTOS+TCP V2.0.1\r
+ * FreeRTOS+TCP V2.2.0\r
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.\r
*\r
* Permission is hereby granted, free of charge, to any person obtaining a copy of\r
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
*\r
- * http://www.FreeRTOS.org\r
* http://aws.amazon.com/freertos\r
- *\r
- * 1 tab == 4 spaces!\r
+ * http://www.FreeRTOS.org\r
*/\r
\r
/*\r
pxWhere->pxPrevious = pxNewListItem;\r
\r
/* Remember which list the item is in. */\r
- pxNewListItem->pvContainer = ( void * ) pxList;\r
+ listLIST_ITEM_CONTAINER( pxNewListItem ) = ( void * ) pxList;\r
\r
( pxList->uxNumberOfItems )++;\r
}\r
prvCreateSectors();\r
}\r
\r
- vListInitialise( &( pxWindow->xTxSegments ) );\r
- vListInitialise( &( pxWindow->xRxSegments ) );\r
+ vListInitialise( &pxWindow->xTxSegments );\r
+ vListInitialise( &pxWindow->xRxSegments );\r
\r
- vListInitialise( &( pxWindow->xPriorityQueue ) ); /* Priority queue: segments which must be sent immediately */\r
- vListInitialise( &( pxWindow->xTxQueue ) ); /* Transmit queue: segments queued for transmission */\r
- vListInitialise( &( pxWindow->xWaitQueue ) ); /* Waiting queue: outstanding segments */\r
+ vListInitialise( &pxWindow->xPriorityQueue ); /* Priority queue: segments which must be sent immediately */\r
+ vListInitialise( &pxWindow->xTxQueue ); /* Transmit queue: segments queued for transmission */\r
+ vListInitialise( &pxWindow->xWaitQueue ); /* Waiting queue: outstanding segments */\r
}\r
#endif /* ipconfigUSE_TCP_WIN == 1 */\r
\r
}\r
/*-----------------------------------------------------------*/\r
\r
+#if( ipconfigUSE_TCP_WIN == 1 )\r
+\r
+ void vTCPSegmentCleanup( void )\r
+ {\r
+ /* Free and clear the TCP segments pointer. This function should only be called\r
+ * once FreeRTOS+TCP will no longer be used. No thread-safety is provided for this\r
+ * function. */\r
+ if( xTCPSegments != NULL )\r
+ {\r
+ vPortFreeLarge( xTCPSegments );\r
+ xTCPSegments = NULL;\r
+ }\r
+ }\r
+\r
+#endif /* ipconfgiUSE_TCP_WIN == 1 */\r
+/*-----------------------------------------------------------*/\r
+\r
/*=============================================================================\r
*\r
* ###### # #\r
{\r
ulSavedSequenceNumber = ulCurrentSequenceNumber;\r
\r
- /* See if (part of) this segment has been stored already,\r
- but this rarely happens. */\r
- pxFound = xTCPWindowRxConfirm( pxWindow, ulSequenceNumber, ulLength );\r
- if( pxFound != NULL )\r
- {\r
- ulCurrentSequenceNumber = pxFound->ulSequenceNumber + ( ( uint32_t ) pxFound->lDataLength );\r
-\r
- /* Remove it because it will be passed to user directly. */\r
- vTCPWindowFree( pxFound );\r
- }\r
+ /* Clean up all sequence received between ulSequenceNumber and ulSequenceNumber + ulLength since they are duplicated.\r
+ If the server is forced to retransmit packets several time in a row it might send a batch of concatenated packet for speed.\r
+ So we cannot rely on the packets between ulSequenceNumber and ulSequenceNumber + ulLength to be sequential and it is better to just\r
+ clean them out. */\r
+ do\r
+ {\r
+ pxFound = xTCPWindowRxConfirm( pxWindow, ulSequenceNumber, ulLength );\r
+\r
+ if ( pxFound != NULL )\r
+ {\r
+ /* Remove it because it will be passed to user directly. */\r
+ vTCPWindowFree( pxFound );\r
+ }\r
+ } while ( pxFound );\r
\r
/* Check for following segments that are already in the\r
queue and increment ulCurrentSequenceNumber. */\r