]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_WIN.c
Sync FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP with the version in GitHub at (23665258ca...
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-TCP / FreeRTOS_TCP_WIN.c
index aa732ecb9f2a56d31e2f04d7a1aa85d710180eb9..cda8acd1cea63bc755ede7e0ee4e223ab5a901d7 100644 (file)
@@ -1,5 +1,5 @@
 /*\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
@@ -294,7 +292,7 @@ void vListInsertGeneric( List_t * const pxList, ListItem_t * const pxNewListItem
        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
@@ -599,12 +597,12 @@ void vTCPWindowCreate( TCPWindow_t *pxWindow, uint32_t ulRxWindowLength,
                        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
@@ -675,6 +673,23 @@ const int32_t l500ms = 500;
 }\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
@@ -790,16 +805,20 @@ const int32_t l500ms = 500;
                                {\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