]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_TCP_IP.c
Update version number in +TCP code.
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-TCP / FreeRTOS_TCP_IP.c
index b8a6be04e75d735820eb1e067dbd7e6af07964eb..7ec07336c2976f61f5317325aa3cea5c1e8adc4f 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
- * FreeRTOS+TCP V2.0.7\r
+ * FreeRTOS+TCP V2.0.11\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
@@ -349,14 +349,13 @@ static NetworkBufferDescriptor_t *prvTCPBufferResize( FreeRTOS_Socket_t *pxSocke
        static uint8_t prvWinScaleFactor( FreeRTOS_Socket_t *pxSocket );\r
 #endif\r
 \r
-/* \r
+/*\r
  * Generate a randomized TCP Initial Sequence Number per RFC.\r
  */\r
-extern uint32_t ulApplicationGetNextSequenceNumber(\r
-    uint32_t ulSourceAddress,\r
-    uint16_t usSourcePort,\r
-    uint32_t ulDestinationAddress,\r
-    uint16_t usDestinationPort );\r
+extern uint32_t ulApplicationGetNextSequenceNumber( uint32_t ulSourceAddress,\r
+                                                                                                       uint16_t usSourcePort,\r
+                                                                                                       uint32_t ulDestinationAddress,\r
+                                                                                                       uint16_t usDestinationPort );\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
@@ -854,8 +853,8 @@ NetworkBufferDescriptor_t xTempBuffer;
                        vFlip_32( pxTCPPacket->xTCPHeader.ulSequenceNumber, pxTCPPacket->xTCPHeader.ulAckNr );\r
                }\r
 \r
-               pxIPHeader->ucTimeToLive           = ( uint8_t ) ipconfigTCP_TIME_TO_LIVE;\r
-               pxIPHeader->usLength               = FreeRTOS_htons( ulLen );\r
+               pxIPHeader->ucTimeToLive                   = ( uint8_t ) ipconfigTCP_TIME_TO_LIVE;\r
+               pxIPHeader->usLength                       = FreeRTOS_htons( ulLen );\r
                if( ( pxSocket == NULL ) || ( *ipLOCAL_IP_ADDRESS_POINTER == 0ul ) )\r
                {\r
                        /* When pxSocket is NULL, this function is called by prvTCPSendReset()\r
@@ -1023,21 +1022,20 @@ uint32_t ulInitialSequenceNumber = 0;
                xReturn = pdFALSE;\r
        }\r
 \r
-    if( xReturn != pdFALSE )\r
-    {\r
-        /* Get a difficult-to-predict initial sequence number for this 4-tuple. */\r
-        ulInitialSequenceNumber = ulApplicationGetNextSequenceNumber( \r
-            *ipLOCAL_IP_ADDRESS_POINTER, \r
-            pxSocket->usLocalPort, \r
-            pxSocket->u.xTCP.ulRemoteIP, \r
-            pxSocket->u.xTCP.usRemotePort );\r
+       if( xReturn != pdFALSE )\r
+       {\r
+               /* Get a difficult-to-predict initial sequence number for this 4-tuple. */\r
+               ulInitialSequenceNumber = ulApplicationGetNextSequenceNumber( *ipLOCAL_IP_ADDRESS_POINTER,\r
+                                                                                                                                         pxSocket->usLocalPort,\r
+                                                                                                                                         pxSocket->u.xTCP.ulRemoteIP,\r
+                                                                                                                                         pxSocket->u.xTCP.usRemotePort );\r
 \r
-        /* Check for a random number generation error. */\r
-        if( 0 == ulInitialSequenceNumber )\r
-        {\r
-            xReturn = pdFALSE;\r
-        }\r
-    }\r
+               /* Check for a random number generation error. */\r
+               if( 0 == ulInitialSequenceNumber )\r
+               {\r
+                       xReturn = pdFALSE;\r
+               }\r
+       }\r
 \r
        if( xReturn != pdFALSE )\r
        {\r
@@ -1152,17 +1150,17 @@ UBaseType_t uxNewMSS;
        pucLast = pucPtr + (((pxTCPHeader->ucTCPOffset >> 4) - 5) << 2);\r
        pxTCPWindow = &pxSocket->u.xTCP.xTCPWindow;\r
 \r
-    /* Validate options size calculation. */\r
-    if( pucLast > ( pxNetworkBuffer->pucEthernetBuffer + pxNetworkBuffer->xDataLength ) )\r
-    {\r
-        return;\r
-    }\r
+       /* Validate options size calculation. */\r
+       if( pucLast > ( pxNetworkBuffer->pucEthernetBuffer + pxNetworkBuffer->xDataLength ) )\r
+       {\r
+               return;\r
+       }\r
 \r
        /* The comparison with pucLast is only necessary in case the option data are\r
        corrupted, we don't like to run into invalid memory and crash. */\r
        while( pucPtr < pucLast )\r
        {\r
-        UBaseType_t xRemainingOptionsBytes = pucLast - pucPtr;\r
+               UBaseType_t xRemainingOptionsBytes = pucLast - pucPtr;\r
 \r
                if( pucPtr[ 0 ] == TCP_OPT_END )\r
                {\r
@@ -1171,26 +1169,25 @@ UBaseType_t uxNewMSS;
                }\r
                if( pucPtr[ 0 ] == TCP_OPT_NOOP)\r
                {\r
-            /* NOP option, inserted to make the length a multiple of 4. */\r
-            pucPtr++;\r
-            continue;\r
+                       /* NOP option, inserted to make the length a multiple of 4. */\r
+                       pucPtr++;\r
+                       continue;\r
                }\r
 \r
-        /* Any other well-formed option must be at least two bytes: the option\r
-        type byte followed by a length byte. */\r
-        if( xRemainingOptionsBytes < 2 )\r
-        { \r
-            break;\r
-        }\r
+               /* Any other well-formed option must be at least two bytes: the option\r
+               type byte followed by a length byte. */\r
+               if( xRemainingOptionsBytes < 2 )\r
+               {\r
+                       break;\r
+               }\r
 #if( ipconfigUSE_TCP_WIN != 0 )\r
                else if( pucPtr[ 0 ] == TCP_OPT_WSOPT )\r
                {\r
-            /* Confirm that the option fits in the remaining buffer space. */\r
-            if( xRemainingOptionsBytes < TCP_OPT_WSOPT_LEN ||\r
-                pucPtr[ 1 ] != TCP_OPT_WSOPT_LEN )\r
-            {\r
-                break;\r
-            }\r
+                       /* Confirm that the option fits in the remaining buffer space. */\r
+                       if( ( xRemainingOptionsBytes < TCP_OPT_WSOPT_LEN ) || ( pucPtr[ 1 ] != TCP_OPT_WSOPT_LEN ) )\r
+                       {\r
+                               break;\r
+                       }\r
 \r
                        pxSocket->u.xTCP.ucPeerWinScaleFactor = pucPtr[ 2 ];\r
                        pxSocket->u.xTCP.bits.bWinScaling = pdTRUE_UNSIGNED;\r
@@ -1199,25 +1196,24 @@ UBaseType_t uxNewMSS;
 #endif /* ipconfigUSE_TCP_WIN */\r
                else if( pucPtr[ 0 ] == TCP_OPT_MSS )\r
                {\r
-            /* Confirm that the option fits in the remaining buffer space. */\r
-            if( xRemainingOptionsBytes < TCP_OPT_MSS_LEN ||\r
-                pucPtr[ 1 ] != TCP_OPT_MSS_LEN )\r
-            {\r
-                break;\r
-            }\r
-            \r
-            /* An MSS option with the correct option length.  FreeRTOS_htons()\r
+                       /* Confirm that the option fits in the remaining buffer space. */\r
+                       if( ( xRemainingOptionsBytes < TCP_OPT_MSS_LEN )|| ( pucPtr[ 1 ] != TCP_OPT_MSS_LEN ) )\r
+                       {\r
+                               break;\r
+                       }\r
+\r
+                       /* An MSS option with the correct option length.  FreeRTOS_htons()\r
                        is not needed here because usChar2u16() already returns a host\r
                        endian number. */\r
                        uxNewMSS = usChar2u16( pucPtr + 2 );\r
 \r
                        if( pxSocket->u.xTCP.usInitMSS != uxNewMSS )\r
                        {\r
-                /* Perform a basic check on the the new MSS. */\r
-                if( uxNewMSS == 0 )\r
-                {\r
-                    break;\r
-                }\r
+                               /* Perform a basic check on the the new MSS. */\r
+                               if( uxNewMSS == 0 )\r
+                               {\r
+                                       break;\r
+                               }\r
 \r
                                FreeRTOS_debug_printf( ( "MSS change %u -> %lu\n", pxSocket->u.xTCP.usInitMSS, uxNewMSS ) );\r
                        }\r
@@ -1253,10 +1249,10 @@ UBaseType_t uxNewMSS;
                        /* All other options have a length field, so that we easily\r
                        can skip past them. */\r
                        unsigned char len = pucPtr[ 1 ];\r
-                       if( len < 2 || len > xRemainingOptionsBytes )\r
+                       if( ( len < 2 ) || ( len > xRemainingOptionsBytes ) )\r
                        {\r
-                               /* If the length field is too small or too big, the options are malformed. \r
-                Don't process them further. */\r
+                               /* If the length field is too small or too big, the options are malformed.\r
+                               Don't process them further. */\r
                                break;\r
                        }\r
 \r
@@ -1394,7 +1390,7 @@ UBaseType_t uxOptionsLength;
                pxTCPHeader->ucOptdata[ uxOptionsLength + 3 ] = 2;      /* 2: length of this option. */\r
                uxOptionsLength += 4u;\r
 \r
-        return uxOptionsLength; /* bytes, not words. */\r
+               return uxOptionsLength; /* bytes, not words. */\r
        }\r
        #endif  /* ipconfigUSE_TCP_WIN == 0 */\r
 }\r
@@ -1639,8 +1635,8 @@ BaseType_t xResize;
 \r
                if( pxReturn != NULL )\r
                {\r
-            /* Set the actual packet size, in case the returned buffer is larger. */\r
-            pxReturn->xDataLength = lNeeded;\r
+                       /* Set the actual packet size, in case the returned buffer is larger. */\r
+                       pxReturn->xDataLength = lNeeded;\r
 \r
                        /* Copy the existing data to the new created buffer. */\r
                        if( pxNetworkBuffer )\r
@@ -2071,7 +2067,7 @@ int32_t lLength, lTCPHeaderLength, lReceiveLength, lUrgentLength;
        The size of the TCP header is given in a multiple of 4-byte words (single\r
        byte, needs no ntoh() translation).  A shift-right 2: is the same as\r
        (offset >> 4) * 4. */\r
-    lTCPHeaderLength = ( BaseType_t ) ( ( pxTCPHeader->ucTCPOffset & VALID_BITS_IN_TCP_OFFSET_BYTE ) >> 2 );\r
+       lTCPHeaderLength = ( BaseType_t ) ( ( pxTCPHeader->ucTCPOffset & VALID_BITS_IN_TCP_OFFSET_BYTE ) >> 2 );\r
 \r
        /* Let pucRecvData point to the first byte received. */\r
        *ppucRecvData = pxNetworkBuffer->pucEthernetBuffer + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER + lTCPHeaderLength;\r
@@ -2436,7 +2432,7 @@ int32_t lDistance, lSendResult;
                {\r
                        /* xTCPWindowTxDone returns true when all Tx queues are empty. */\r
                        bRxComplete = xTCPWindowRxEmpty( pxTCPWindow );\r
-                       bTxDone     = xTCPWindowTxDone( pxTCPWindow );\r
+                       bTxDone  = xTCPWindowTxDone( pxTCPWindow );\r
 \r
                        if( ( bRxComplete == 0 ) || ( bTxDone == 0 ) )\r
                        {\r
@@ -2905,24 +2901,23 @@ uint32_t ulRemoteIP;
 uint16_t xRemotePort;\r
 BaseType_t xResult = pdPASS;\r
 \r
-    /* Check for a minimum packet size. */\r
-    if( pxNetworkBuffer->xDataLength >= \r
-        ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_TCP_HEADER )\r
-    {\r
-        ucTCPFlags = pxTCPPacket->xTCPHeader.ucTCPFlags;\r
-        ulLocalIP = FreeRTOS_htonl( pxTCPPacket->xIPHeader.ulDestinationIPAddress );\r
-        xLocalPort = FreeRTOS_htons( pxTCPPacket->xTCPHeader.usDestinationPort );\r
-        ulRemoteIP = FreeRTOS_htonl( pxTCPPacket->xIPHeader.ulSourceIPAddress );\r
-        xRemotePort = FreeRTOS_htons( pxTCPPacket->xTCPHeader.usSourcePort );\r
-\r
-        /* Find the destination socket, and if not found: return a socket listing to\r
-        the destination PORT. */\r
-        pxSocket = ( FreeRTOS_Socket_t * )pxTCPSocketLookup( ulLocalIP, xLocalPort, ulRemoteIP, xRemotePort );\r
-    }\r
-    else\r
-    {\r
-        return pdFAIL;\r
-    }\r
+       /* Check for a minimum packet size. */\r
+       if( pxNetworkBuffer->xDataLength >= ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_TCP_HEADER ) )\r
+       {\r
+               ucTCPFlags = pxTCPPacket->xTCPHeader.ucTCPFlags;\r
+               ulLocalIP = FreeRTOS_htonl( pxTCPPacket->xIPHeader.ulDestinationIPAddress );\r
+               xLocalPort = FreeRTOS_htons( pxTCPPacket->xTCPHeader.usDestinationPort );\r
+               ulRemoteIP = FreeRTOS_htonl( pxTCPPacket->xIPHeader.ulSourceIPAddress );\r
+               xRemotePort = FreeRTOS_htons( pxTCPPacket->xTCPHeader.usSourcePort );\r
+\r
+               /* Find the destination socket, and if not found: return a socket listing to\r
+               the destination PORT. */\r
+               pxSocket = ( FreeRTOS_Socket_t * )pxTCPSocketLookup( ulLocalIP, xLocalPort, ulRemoteIP, xRemotePort );\r
+       }\r
+       else\r
+       {\r
+               return pdFAIL;\r
+       }\r
 \r
        if( ( pxSocket == NULL ) || ( prvTCPSocketIsActive( ( UBaseType_t ) pxSocket->u.xTCP.ucTCPState ) == pdFALSE ) )\r
        {\r
@@ -3086,64 +3081,63 @@ TCPPacket_t * pxTCPPacket = ( TCPPacket_t * ) ( pxNetworkBuffer->pucEthernetBuff
 FreeRTOS_Socket_t *pxReturn = NULL;\r
 uint32_t ulInitialSequenceNumber;\r
 \r
-    /* Assume that a new Initial Sequence Number will be required. Request \r
-    it now in order to fail out if necessary. */\r
-    ulInitialSequenceNumber = ulApplicationGetNextSequenceNumber(\r
-        *ipLOCAL_IP_ADDRESS_POINTER,\r
-        pxSocket->usLocalPort,\r
-        pxTCPPacket->xIPHeader.ulSourceIPAddress,\r
-        pxTCPPacket->xTCPHeader.usSourcePort );\r
+       /* Assume that a new Initial Sequence Number will be required. Request\r
+       it now in order to fail out if necessary. */\r
+       ulInitialSequenceNumber = ulApplicationGetNextSequenceNumber( *ipLOCAL_IP_ADDRESS_POINTER,\r
+                                                                                                                                 pxSocket->usLocalPort,\r
+                                                                                                                                 pxTCPPacket->xIPHeader.ulSourceIPAddress,\r
+                                                                                                                                 pxTCPPacket->xTCPHeader.usSourcePort );\r
 \r
        /* A pure SYN (without ACK) has come in, create a new socket to answer\r
        it. */\r
-    if( 0 != ulInitialSequenceNumber )\r
-    {\r
-        if( pxSocket->u.xTCP.bits.bReuseSocket != pdFALSE_UNSIGNED )\r
-        {\r
-            /* The flag bReuseSocket indicates that the same instance of the\r
-            listening socket should be used for the connection. */\r
-            pxReturn = pxSocket;\r
-            pxSocket->u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;\r
-            pxSocket->u.xTCP.pxPeerSocket = pxSocket;\r
-        }\r
-        else\r
-        {\r
-            /* The socket does not have the bReuseSocket flag set meaning create a\r
-            new socket when a connection comes in. */\r
-            pxReturn = NULL;\r
-\r
-            if( pxSocket->u.xTCP.usChildCount >= pxSocket->u.xTCP.usBacklog )\r
-            {\r
-                FreeRTOS_printf( ( "Check: Socket %u already has %u / %u child%s\n",\r
-                    pxSocket->usLocalPort,\r
-                    pxSocket->u.xTCP.usChildCount,\r
-                    pxSocket->u.xTCP.usBacklog,\r
-                    pxSocket->u.xTCP.usChildCount == 1 ? "" : "ren" ) );\r
-                prvTCPSendReset( pxNetworkBuffer );\r
-            }\r
-            else\r
-            {\r
-                FreeRTOS_Socket_t *pxNewSocket = ( FreeRTOS_Socket_t * )\r
-                    FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );\r
-\r
-                if( ( pxNewSocket == NULL ) || ( pxNewSocket == FREERTOS_INVALID_SOCKET ) )\r
-                {\r
-                    FreeRTOS_debug_printf( ( "TCP: Listen: new socket failed\n" ) );\r
-                    prvTCPSendReset( pxNetworkBuffer );\r
-                }\r
-                else if( prvTCPSocketCopy( pxNewSocket, pxSocket ) != pdFALSE )\r
-                {\r
-                    /* The socket will be connected immediately, no time for the\r
-                    owner to setsockopt's, therefore copy properties of the server\r
-                    socket to the new socket.  Only the binding might fail (due to\r
-                    lack of resources). */\r
-                    pxReturn = pxNewSocket;\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    if( 0 != ulInitialSequenceNumber && pxReturn != NULL )\r
+       if( 0 != ulInitialSequenceNumber )\r
+       {\r
+               if( pxSocket->u.xTCP.bits.bReuseSocket != pdFALSE_UNSIGNED )\r
+               {\r
+                       /* The flag bReuseSocket indicates that the same instance of the\r
+                       listening socket should be used for the connection. */\r
+                       pxReturn = pxSocket;\r
+                       pxSocket->u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;\r
+                       pxSocket->u.xTCP.pxPeerSocket = pxSocket;\r
+               }\r
+               else\r
+               {\r
+                       /* The socket does not have the bReuseSocket flag set meaning create a\r
+                       new socket when a connection comes in. */\r
+                       pxReturn = NULL;\r
+\r
+                       if( pxSocket->u.xTCP.usChildCount >= pxSocket->u.xTCP.usBacklog )\r
+                       {\r
+                               FreeRTOS_printf( ( "Check: Socket %u already has %u / %u child%s\n",\r
+                                       pxSocket->usLocalPort,\r
+                                       pxSocket->u.xTCP.usChildCount,\r
+                                       pxSocket->u.xTCP.usBacklog,\r
+                                       pxSocket->u.xTCP.usChildCount == 1 ? "" : "ren" ) );\r
+                               prvTCPSendReset( pxNetworkBuffer );\r
+                       }\r
+                       else\r
+                       {\r
+                               FreeRTOS_Socket_t *pxNewSocket = ( FreeRTOS_Socket_t * )\r
+                                       FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );\r
+\r
+                               if( ( pxNewSocket == NULL ) || ( pxNewSocket == FREERTOS_INVALID_SOCKET ) )\r
+                               {\r
+                                       FreeRTOS_debug_printf( ( "TCP: Listen: new socket failed\n" ) );\r
+                                       prvTCPSendReset( pxNetworkBuffer );\r
+                               }\r
+                               else if( prvTCPSocketCopy( pxNewSocket, pxSocket ) != pdFALSE )\r
+                               {\r
+                                       /* The socket will be connected immediately, no time for the\r
+                                       owner to setsockopt's, therefore copy properties of the server\r
+                                       socket to the new socket.  Only the binding might fail (due to\r
+                                       lack of resources). */\r
+                                       pxReturn = pxNewSocket;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       if( ( 0 != ulInitialSequenceNumber ) && ( pxReturn != NULL ) )\r
        {\r
                pxReturn->u.xTCP.usRemotePort = FreeRTOS_htons( pxTCPPacket->xTCPHeader.usSourcePort );\r
                pxReturn->u.xTCP.ulRemoteIP = FreeRTOS_htonl( pxTCPPacket->xIPHeader.ulSourceIPAddress );\r
@@ -3310,5 +3304,6 @@ BaseType_t xResult = pdFALSE;
 \r
 /* Provide access to private members for testing. */\r
 #ifdef AMAZON_FREERTOS_ENABLE_UNIT_TESTS\r
-    #include "aws_freertos_tcp_test_access_tcp_define.h"\r
+       #include "aws_freertos_tcp_test_access_tcp_define.h"\r
 #endif\r
+\r