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
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
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
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
}\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
#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
/* 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
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
\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
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
{\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
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
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
\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