]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Labs/Source/FreeRTOS-Plus-TCP/FreeRTOS_Sockets.c
Update TCP to last release versions in preparation for kernel V10.3.0 release.
[freertos] / FreeRTOS-Labs / Source / FreeRTOS-Plus-TCP / FreeRTOS_Sockets.c
index 13feb832a3823d1a461f8fa4f86d2235a3a1744e..bbccb780d19e46159bff8b939b25b2e36ecfea54 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
- * FreeRTOS+TCP 191100 experimental\r
- * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+ * FreeRTOS+TCP 2.2.x Labs copy\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
  * this software and associated documentation files (the "Software"), to deal in\r
@@ -385,7 +385,7 @@ Socket_t xReturn;
                        }\r
                }\r
 \r
-               return ( SocketSet_t ) pxSocketSet;\r
+               return ( SocketSet_t ) pxSocketSet;\r
        }\r
 \r
 #endif /* ipconfigSUPPORT_SELECT_FUNCTION == 1 */\r
@@ -702,9 +702,11 @@ EventBits_t xEventBits = ( EventBits_t ) 0;
                }\r
                taskEXIT_CRITICAL();\r
 \r
-               /* The returned value is the data length, which may have been capped to\r
-               the receive buffer size. */\r
-               lReturn = ( int32_t ) pxNetworkBuffer->xDataLength;\r
+               /* The returned value is the length of the payload data, which is\r
+               calculated at the total packet size minus the headers.\r
+               The validity of `xDataLength` prvProcessIPPacket has been confirmed\r
+               in 'prvProcessIPPacket()'. */\r
+               lReturn = ( int32_t ) ( pxNetworkBuffer->xDataLength - sizeof( UDPPacket_t ) );\r
 \r
                if( pxSourceAddress != NULL )\r
                {\r
@@ -833,7 +835,8 @@ FreeRTOS_Socket_t *pxSocket;
 \r
                        if( pxNetworkBuffer != NULL )\r
                        {\r
-                               pxNetworkBuffer->xDataLength = xTotalDataLength;\r
+                               /* xDataLength is the size of the total packet, including the Ethernet header. */\r
+                               pxNetworkBuffer->xDataLength = xTotalDataLength + sizeof( UDPPacket_t );\r
                                pxNetworkBuffer->usPort = pxDestinationAddress->sin_port;\r
                                pxNetworkBuffer->usBoundPort = ( uint16_t ) socketGET_SOCKET_PORT( pxSocket );\r
                                pxNetworkBuffer->ulIPAddress = pxDestinationAddress->sin_addr;\r
@@ -854,7 +857,7 @@ FreeRTOS_Socket_t *pxSocket;
                                        {\r
                                                if( ipconfigIS_VALID_PROG_ADDRESS( pxSocket->u.xUDP.pxHandleSent ) )\r
                                                {\r
-                                                       pxSocket->u.xUDP.pxHandleSent( (Socket_t *)pxSocket, xTotalDataLength );\r
+                                                       pxSocket->u.xUDP.pxHandleSent( ( Socket_t )pxSocket, xTotalDataLength );\r
                                                }\r
                                        }\r
                                        #endif /* ipconfigUSE_CALLBACKS */\r
@@ -1421,7 +1424,7 @@ FreeRTOS_Socket_t *pxSocket;
                                        break;\r
                        #endif /* ipconfigSOCKET_HAS_USER_SEMAPHORE */\r
 \r
-                       #if( ipconfigSOCKET_HAS_USER_WAKE_CALLBACK != 0 ) || ( ipconfigSOCKET_HAS_USER_WAKE_CALLBACK_WITH_CONTEXT != 0 )\r
+                       #if( ipconfigSOCKET_HAS_USER_WAKE_CALLBACK != 0 )\r
                                case FREERTOS_SO_WAKEUP_CALLBACK:\r
                                {\r
                                        /* Each socket can have a callback function that is executed\r
@@ -1433,16 +1436,6 @@ FreeRTOS_Socket_t *pxSocket;
                                break;\r
                        #endif /* ipconfigSOCKET_HAS_USER_WAKE_CALLBACK */\r
 \r
-                       #if( ipconfigSOCKET_HAS_USER_WAKE_CALLBACK_WITH_CONTEXT != 0 )\r
-                               case FREERTOS_SO_WAKE_CALLBACK_CONTEXT:\r
-                               {\r
-                                       /* Each socket wake callback may be passed a user context. */\r
-                                       pxSocket->pvUserWakeCallbackContext = ( void * ) pvOptionValue;\r
-                                       xReturn = 0;\r
-                               }\r
-                               break;\r
-                       #endif /* ipconfigSOCKET_HAS_USER_WAKE_CALLBACK_WITH_CONTEXT */\r
-\r
                        case FREERTOS_SO_SET_LOW_HIGH_WATER:\r
                                {\r
                                LowHighWater_t *pxLowHighWater = ( LowHighWater_t * ) pvOptionValue;\r
@@ -1664,7 +1657,6 @@ const uint16_t usEphemeralPortCount =
 uint16_t usIterations = usEphemeralPortCount;\r
 uint32_t ulRandomSeed = 0;\r
 uint16_t usResult = 0;\r
-BaseType_t xGotZeroOnce = pdFALSE;\r
 const List_t *pxList;\r
 \r
 #if ipconfigUSE_TCP == 1\r
@@ -1685,21 +1677,10 @@ const List_t *pxList;
        point. */\r
        do\r
        {\r
-               /* Generate a random seed. */\r
-               ulRandomSeed = ipconfigRAND32( );\r
-\r
                /* Only proceed if the random number generator succeeded. */\r
-               if( 0 == ulRandomSeed )\r
+               if( xApplicationGetRandomNumber( &( ulRandomSeed ) ) == pdFALSE )\r
                {\r
-                       if( pdFALSE == xGotZeroOnce )\r
-                       {\r
-                               xGotZeroOnce = pdTRUE;\r
-                               continue;\r
-                       }\r
-                       else\r
-                       {\r
-                               break;\r
-                       }\r
+                       break;\r
                }\r
 \r
                /* Map the random to a candidate port. */\r
@@ -1904,16 +1885,7 @@ void vSocketWakeUpUser( FreeRTOS_Socket_t *pxSocket )
                        pxSocket->pxUserWakeCallback( pxSocket );\r
                }\r
        }\r
-       #endif /* ipconfigSOCKET_HAS_USER_WAKE_CALLBACK */\r
-\r
-       #if( ipconfigSOCKET_HAS_USER_WAKE_CALLBACK_WITH_CONTEXT == 1 )\r
-       {\r
-               if( pxSocket->pxUserWakeCallback != NULL )\r
-               {\r
-                       pxSocket->pxUserWakeCallback( pxSocket, pxSocket->pvUserWakeCallbackContext );\r
-               }\r
-       }\r
-       #endif /* ipconfigSOCKET_HAS_USER_WAKE_CALLBACK_WITH_CONTEXT */\r
+       #endif /* ipconfigSOCKET_HAS_USER_SEMAPHORE */\r
 \r
        #if( ipconfigSUPPORT_SELECT_FUNCTION == 1 )\r
        {\r
@@ -2432,8 +2404,8 @@ void vSocketWakeUpUser( FreeRTOS_Socket_t *pxSocket )
                        xResult = -pdFREERTOS_ERRNO_ENOMEM;\r
                }\r
                else if( pxSocket->u.xTCP.ucTCPState == eCLOSED ||\r
-                                pxSocket->u.xTCP.ucTCPState == eCLOSE_WAIT ||\r
-                                pxSocket->u.xTCP.ucTCPState == eCLOSING )\r
+                 pxSocket->u.xTCP.ucTCPState == eCLOSE_WAIT ||\r
+                 pxSocket->u.xTCP.ucTCPState == eCLOSING )\r
                {\r
                        xResult = -pdFREERTOS_ERRNO_ENOTCONN;\r
                }\r
@@ -2472,25 +2444,25 @@ void vSocketWakeUpUser( FreeRTOS_Socket_t *pxSocket )
        '*pxLength' will contain the number of bytes that may be written. */\r
        uint8_t *FreeRTOS_get_tx_head( Socket_t xSocket, BaseType_t *pxLength )\r
        {\r
-       uint8_t *pucReturn = NULL;\r
+    uint8_t *pucReturn = NULL;\r
        FreeRTOS_Socket_t *pxSocket = ( FreeRTOS_Socket_t * ) xSocket;\r
        StreamBuffer_t *pxBuffer = NULL;\r
 \r
-               *pxLength = 0;\r
+        *pxLength = 0;\r
 \r
-               /* Confirm that this is a TCP socket before dereferencing structure\r
-               member pointers. */\r
-               if( prvValidSocket( pxSocket, FREERTOS_IPPROTO_TCP, pdFALSE ) == pdTRUE )\r
-               {\r
-                       pxBuffer = pxSocket->u.xTCP.txStream;\r
-                       if( pxBuffer != NULL )\r
-                       {\r
-                       BaseType_t xSpace = ( BaseType_t )uxStreamBufferGetSpace( pxBuffer );\r
-                       BaseType_t xRemain = ( BaseType_t )( pxBuffer->LENGTH - pxBuffer->uxHead );\r
+        /* Confirm that this is a TCP socket before dereferencing structure\r
+        member pointers. */\r
+        if( prvValidSocket( pxSocket, FREERTOS_IPPROTO_TCP, pdFALSE ) == pdTRUE )\r
+        {\r
+            pxBuffer = pxSocket->u.xTCP.txStream;\r
+            if( pxBuffer != NULL )\r
+            {\r
+            BaseType_t xSpace = ( BaseType_t )uxStreamBufferGetSpace( pxBuffer );\r
+            BaseType_t xRemain = ( BaseType_t )( pxBuffer->LENGTH - pxBuffer->uxHead );\r
 \r
-                               *pxLength = FreeRTOS_min_BaseType( xSpace, xRemain );\r
-                               pucReturn = pxBuffer->ucArray + pxBuffer->uxHead;\r
-                       }\r
+                *pxLength = FreeRTOS_min_BaseType( xSpace, xRemain );\r
+                pucReturn = pxBuffer->ucArray + pxBuffer->uxHead;\r
+            }\r
                }\r
 \r
                return pucReturn;\r
@@ -2923,20 +2895,20 @@ void vSocketWakeUpUser( FreeRTOS_Socket_t *pxSocket )
 \r
 #if( ipconfigUSE_TCP == 1 )\r
 \r
-       const struct xSTREAM_BUFFER *FreeRTOS_get_rx_buf( Socket_t xSocket )\r
-       {\r
-       FreeRTOS_Socket_t *pxSocket = ( FreeRTOS_Socket_t * )xSocket;\r
-       struct xSTREAM_BUFFER *pxReturn = NULL;\r
+    const struct xSTREAM_BUFFER *FreeRTOS_get_rx_buf( Socket_t xSocket )\r
+    {\r
+    FreeRTOS_Socket_t *pxSocket = ( FreeRTOS_Socket_t * )xSocket;\r
+    struct xSTREAM_BUFFER *pxReturn = NULL;\r
 \r
-               /* Confirm that this is a TCP socket before dereferencing structure\r
-               member pointers. */\r
-               if( prvValidSocket( pxSocket, FREERTOS_IPPROTO_TCP, pdFALSE ) == pdTRUE )\r
-               {\r
-                       pxReturn = pxSocket->u.xTCP.rxStream;\r
-               }\r
+        /* Confirm that this is a TCP socket before dereferencing structure\r
+        member pointers. */\r
+        if( prvValidSocket( pxSocket, FREERTOS_IPPROTO_TCP, pdFALSE ) == pdTRUE )\r
+        {\r
+            pxReturn = pxSocket->u.xTCP.rxStream;\r
+        }\r
 \r
-               return pxReturn;\r
-       }\r
+        return pxReturn;\r
+    }\r
 \r
 #endif /* ipconfigUSE_TCP */\r
 /*-----------------------------------------------------------*/\r
@@ -3100,7 +3072,7 @@ void vSocketWakeUpUser( FreeRTOS_Socket_t *pxSocket )
                                                        break;\r
                                                }\r
 \r
-                                               pxSocket->u.xTCP.pxHandleReceive( (Socket_t *)pxSocket, ( void* )ucReadPtr, ( size_t ) ulCount );\r
+                                               pxSocket->u.xTCP.pxHandleReceive( ( Socket_t )pxSocket, ( void* )ucReadPtr, ( size_t ) ulCount );\r
                                                uxStreamBufferGet( pxStream, 0ul, NULL, ( size_t ) ulCount, pdFALSE );\r
                                        }\r
                                } else\r