forked from epagris/FreeRTOS-Kernel
		
	Fix mixed tabs and spaces in the latest TCP patches.
This commit is contained in:
		
							parent
							
								
									e2750cd388
								
							
						
					
					
						commit
						97a686b2e1
					
				@ -359,19 +359,19 @@ BaseType_t xGivingUp = pdFALSE;
 | 
			
		||||
 | 
			
		||||
				if( xDHCPData.xDHCPTxPeriod <= ipconfigMAXIMUM_DISCOVER_TX_PERIOD )
 | 
			
		||||
				{
 | 
			
		||||
                    xDHCPData.ulTransactionId = ipconfigRAND32( );
 | 
			
		||||
					xDHCPData.ulTransactionId = ipconfigRAND32( );
 | 
			
		||||
 | 
			
		||||
                    if( 0 != xDHCPData.ulTransactionId )
 | 
			
		||||
                    {
 | 
			
		||||
                        xDHCPData.xDHCPTxTime = xTaskGetTickCount( );
 | 
			
		||||
                        xDHCPData.xUseBroadcast = !xDHCPData.xUseBroadcast;
 | 
			
		||||
                        prvSendDHCPDiscover( );
 | 
			
		||||
                        FreeRTOS_debug_printf( ( "vDHCPProcess: timeout %lu ticks\n", xDHCPData.xDHCPTxPeriod ) );
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        FreeRTOS_debug_printf( ( "vDHCPProcess: failed to generate a random Transaction ID\n" ) );
 | 
			
		||||
                    }
 | 
			
		||||
					if( 0 != xDHCPData.ulTransactionId )
 | 
			
		||||
					{
 | 
			
		||||
						xDHCPData.xDHCPTxTime = xTaskGetTickCount( );
 | 
			
		||||
						xDHCPData.xUseBroadcast = !xDHCPData.xUseBroadcast;
 | 
			
		||||
						prvSendDHCPDiscover( );
 | 
			
		||||
						FreeRTOS_debug_printf( ( "vDHCPProcess: timeout %lu ticks\n", xDHCPData.xDHCPTxPeriod ) );
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						FreeRTOS_debug_printf( ( "vDHCPProcess: failed to generate a random Transaction ID\n" ) );
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
@ -592,23 +592,23 @@ TickType_t xTimeoutTime = ( TickType_t ) 0;
 | 
			
		||||
static void prvInitialiseDHCP( void )
 | 
			
		||||
{
 | 
			
		||||
	/* Initialise the parameters that will be set by the DHCP process. Per
 | 
			
		||||
    https://www.ietf.org/rfc/rfc2131.txt, Transaction ID should be a random
 | 
			
		||||
    value chosen by the client. */
 | 
			
		||||
    xDHCPData.ulTransactionId = ipconfigRAND32();
 | 
			
		||||
	https://www.ietf.org/rfc/rfc2131.txt, Transaction ID should be a random
 | 
			
		||||
	value chosen by the client. */
 | 
			
		||||
	xDHCPData.ulTransactionId = ipconfigRAND32();
 | 
			
		||||
 | 
			
		||||
    /* Check for random number generator API failure. */
 | 
			
		||||
    if( 0 != xDHCPData.ulTransactionId )
 | 
			
		||||
    {
 | 
			
		||||
	    xDHCPData.xUseBroadcast = 0;
 | 
			
		||||
	    xDHCPData.ulOfferedIPAddress = 0UL;
 | 
			
		||||
	    xDHCPData.ulDHCPServerAddress = 0UL;
 | 
			
		||||
	    xDHCPData.xDHCPTxPeriod = dhcpINITIAL_DHCP_TX_PERIOD;
 | 
			
		||||
	/* Check for random number generator API failure. */
 | 
			
		||||
	if( 0 != xDHCPData.ulTransactionId )
 | 
			
		||||
	{
 | 
			
		||||
		xDHCPData.xUseBroadcast = 0;
 | 
			
		||||
		xDHCPData.ulOfferedIPAddress = 0UL;
 | 
			
		||||
		xDHCPData.ulDHCPServerAddress = 0UL;
 | 
			
		||||
		xDHCPData.xDHCPTxPeriod = dhcpINITIAL_DHCP_TX_PERIOD;
 | 
			
		||||
 | 
			
		||||
	    /* Create the DHCP socket if it has not already been created. */
 | 
			
		||||
	    prvCreateDHCPSocket();
 | 
			
		||||
	    FreeRTOS_debug_printf( ( "prvInitialiseDHCP: start after %lu ticks\n", dhcpINITIAL_TIMER_PERIOD ) );
 | 
			
		||||
	    vIPReloadDHCPTimer( dhcpINITIAL_TIMER_PERIOD );
 | 
			
		||||
    }
 | 
			
		||||
		/* Create the DHCP socket if it has not already been created. */
 | 
			
		||||
		prvCreateDHCPSocket();
 | 
			
		||||
		FreeRTOS_debug_printf( ( "prvInitialiseDHCP: start after %lu ticks\n", dhcpINITIAL_TIMER_PERIOD ) );
 | 
			
		||||
		vIPReloadDHCPTimer( dhcpINITIAL_TIMER_PERIOD );
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
@ -633,13 +633,13 @@ const uint32_t ulMandatoryOptions = 2ul; /* DHCP server address, and the correct
 | 
			
		||||
 | 
			
		||||
		/* Sanity check. */
 | 
			
		||||
		if( ( lBytes >= sizeof( DHCPMessage_t ) ) &&
 | 
			
		||||
            ( pxDHCPMessage->ulDHCPCookie == ( uint32_t ) dhcpCOOKIE ) &&
 | 
			
		||||
			( pxDHCPMessage->ulDHCPCookie == ( uint32_t ) dhcpCOOKIE ) &&
 | 
			
		||||
			( pxDHCPMessage->ucOpcode == ( uint8_t ) dhcpREPLY_OPCODE ) &&
 | 
			
		||||
			( pxDHCPMessage->ulTransactionID == FreeRTOS_htonl( xDHCPData.ulTransactionId ) ) )
 | 
			
		||||
		{
 | 
			
		||||
			if( memcmp( ( void * ) &( pxDHCPMessage->ucClientHardwareAddress ), 
 | 
			
		||||
                        ( void * ) ipLOCAL_MAC_ADDRESS, 
 | 
			
		||||
                        sizeof( MACAddress_t ) ) == 0 )
 | 
			
		||||
			if( memcmp( ( void * ) &( pxDHCPMessage->ucClientHardwareAddress ),
 | 
			
		||||
						( void * ) ipLOCAL_MAC_ADDRESS,
 | 
			
		||||
						sizeof( MACAddress_t ) ) == 0 )
 | 
			
		||||
			{
 | 
			
		||||
				/* None of the essential options have been processed yet. */
 | 
			
		||||
				ulProcessed = 0ul;
 | 
			
		||||
@ -665,36 +665,36 @@ const uint32_t ulMandatoryOptions = 2ul; /* DHCP server address, and the correct
 | 
			
		||||
						continue;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
                    /* Stop if the response is malformed. */
 | 
			
		||||
                    if( pucByte < pucLastByte - 1 )
 | 
			
		||||
                    {
 | 
			
		||||
                        ucLength = pucByte[ 1 ];
 | 
			
		||||
                        pucByte += 2;
 | 
			
		||||
					/* Stop if the response is malformed. */
 | 
			
		||||
					if( pucByte < pucLastByte - 1 )
 | 
			
		||||
					{
 | 
			
		||||
						ucLength = pucByte[ 1 ];
 | 
			
		||||
						pucByte += 2;
 | 
			
		||||
 | 
			
		||||
                        if( pucByte >= pucLastByte - ucLength )
 | 
			
		||||
                        {
 | 
			
		||||
                            break;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        break;
 | 
			
		||||
                    }                    
 | 
			
		||||
						if( pucByte >= pucLastByte - ucLength )
 | 
			
		||||
						{
 | 
			
		||||
							break;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					/* In most cases, a 4-byte network-endian parameter follows,
 | 
			
		||||
					just get it once here and use later. */
 | 
			
		||||
                    if( ucLength >= sizeof( ulParameter ) )
 | 
			
		||||
                    {
 | 
			
		||||
    					memcpy( ( void * ) &( ulParameter ), 
 | 
			
		||||
                                ( void * ) pucByte, 
 | 
			
		||||
                                ( size_t ) sizeof( ulParameter ) );
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        ulParameter = 0;
 | 
			
		||||
                    }
 | 
			
		||||
					if( ucLength >= sizeof( ulParameter ) )
 | 
			
		||||
					{
 | 
			
		||||
						memcpy( ( void * ) &( ulParameter ),
 | 
			
		||||
								( void * ) pucByte,
 | 
			
		||||
								( size_t ) sizeof( ulParameter ) );
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						ulParameter = 0;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
                    /* Option-specific handling. */
 | 
			
		||||
					/* Option-specific handling. */
 | 
			
		||||
					switch( ucOptionCode )
 | 
			
		||||
					{
 | 
			
		||||
						case dhcpMESSAGE_TYPE_OPTION_CODE	:
 | 
			
		||||
 | 
			
		||||
@ -96,9 +96,9 @@ name field is an offset to the string, rather than the string itself. */
 | 
			
		||||
the query will be responded to with these flags: */
 | 
			
		||||
#define dnsNBNS_QUERY_RESPONSE_FLAGS	( 0x8500 )
 | 
			
		||||
 | 
			
		||||
/* Flag DNS parsing errors in situations where an IPv4 address is the return 
 | 
			
		||||
/* Flag DNS parsing errors in situations where an IPv4 address is the return
 | 
			
		||||
type. */
 | 
			
		||||
#define dnsPARSE_ERROR                      0UL
 | 
			
		||||
#define dnsPARSE_ERROR					  0UL
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Create a socket and bind it to the standard DNS port number.  Return the
 | 
			
		||||
@ -146,7 +146,7 @@ static uint32_t prvGetHostByName( const char *pcHostName, TickType_t xIdentifier
 | 
			
		||||
	{
 | 
			
		||||
		uint32_t ulIPAddress;		/* The IP address of an ARP cache entry. */
 | 
			
		||||
		char pcName[ ipconfigDNS_CACHE_NAME_LENGTH ];  /* The name of the host */
 | 
			
		||||
        uint32_t ulTTL; /* Time-to-Live (in seconds) from the DNS server. */
 | 
			
		||||
		uint32_t ulTTL; /* Time-to-Live (in seconds) from the DNS server. */
 | 
			
		||||
		uint32_t ulTimeWhenAddedInSeconds;
 | 
			
		||||
	} DNSCacheRow_t;
 | 
			
		||||
 | 
			
		||||
@ -189,10 +189,10 @@ typedef struct xDNSTail DNSTail_t;
 | 
			
		||||
#include "pack_struct_start.h"
 | 
			
		||||
struct xDNSAnswerRecord
 | 
			
		||||
{
 | 
			
		||||
    uint16_t usType;
 | 
			
		||||
    uint16_t usClass;
 | 
			
		||||
    uint32_t ulTTL;
 | 
			
		||||
    uint16_t usDataLength;
 | 
			
		||||
	uint16_t usType;
 | 
			
		||||
	uint16_t usClass;
 | 
			
		||||
	uint32_t ulTTL;
 | 
			
		||||
	uint16_t usDataLength;
 | 
			
		||||
}
 | 
			
		||||
#include "pack_struct_end.h"
 | 
			
		||||
typedef struct xDNSAnswerRecord DNSAnswerRecord_t;
 | 
			
		||||
@ -416,67 +416,67 @@ uint32_t ulIPAddress = 0UL;
 | 
			
		||||
TickType_t xReadTimeOut_ms = ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME;
 | 
			
		||||
TickType_t xIdentifier = 0;
 | 
			
		||||
 | 
			
		||||
    /* If the supplied hostname is IP address, convert it to uint32_t
 | 
			
		||||
    and return. */
 | 
			
		||||
    #if( ipconfigINCLUDE_FULL_INET_ADDR == 1 )
 | 
			
		||||
    {
 | 
			
		||||
        ulIPAddress = FreeRTOS_inet_addr( pcHostName );
 | 
			
		||||
    }
 | 
			
		||||
    #endif /* ipconfigINCLUDE_FULL_INET_ADDR == 1 */
 | 
			
		||||
	/* If the supplied hostname is IP address, convert it to uint32_t
 | 
			
		||||
	and return. */
 | 
			
		||||
	#if( ipconfigINCLUDE_FULL_INET_ADDR == 1 )
 | 
			
		||||
	{
 | 
			
		||||
		ulIPAddress = FreeRTOS_inet_addr( pcHostName );
 | 
			
		||||
	}
 | 
			
		||||
	#endif /* ipconfigINCLUDE_FULL_INET_ADDR == 1 */
 | 
			
		||||
 | 
			
		||||
    /* If a DNS cache is used then check the cache before issuing another DNS
 | 
			
		||||
    request. */
 | 
			
		||||
    #if( ipconfigUSE_DNS_CACHE == 1 )
 | 
			
		||||
    {
 | 
			
		||||
        if( ulIPAddress == 0UL )
 | 
			
		||||
        {
 | 
			
		||||
            ulIPAddress = FreeRTOS_dnslookup( pcHostName );
 | 
			
		||||
            if( ulIPAddress != 0 )
 | 
			
		||||
            {
 | 
			
		||||
                FreeRTOS_debug_printf( ( "FreeRTOS_gethostbyname: found '%s' in cache: %lxip\n", pcHostName, ulIPAddress ) );
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                /* prvGetHostByName will be called to start a DNS lookup */
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    #endif /* ipconfigUSE_DNS_CACHE == 1 */
 | 
			
		||||
	/* If a DNS cache is used then check the cache before issuing another DNS
 | 
			
		||||
	request. */
 | 
			
		||||
	#if( ipconfigUSE_DNS_CACHE == 1 )
 | 
			
		||||
	{
 | 
			
		||||
		if( ulIPAddress == 0UL )
 | 
			
		||||
		{
 | 
			
		||||
			ulIPAddress = FreeRTOS_dnslookup( pcHostName );
 | 
			
		||||
			if( ulIPAddress != 0 )
 | 
			
		||||
			{
 | 
			
		||||
				FreeRTOS_debug_printf( ( "FreeRTOS_gethostbyname: found '%s' in cache: %lxip\n", pcHostName, ulIPAddress ) );
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				/* prvGetHostByName will be called to start a DNS lookup */
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	#endif /* ipconfigUSE_DNS_CACHE == 1 */
 | 
			
		||||
 | 
			
		||||
    /* Generate a unique identifier. */
 | 
			
		||||
    if( 0 == ulIPAddress )
 | 
			
		||||
    {
 | 
			
		||||
        xIdentifier = ( TickType_t )ipconfigRAND32( );
 | 
			
		||||
    }
 | 
			
		||||
	/* Generate a unique identifier. */
 | 
			
		||||
	if( 0 == ulIPAddress )
 | 
			
		||||
	{
 | 
			
		||||
		xIdentifier = ( TickType_t )ipconfigRAND32( );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    #if( ipconfigDNS_USE_CALLBACKS != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        if( pCallback != NULL )
 | 
			
		||||
        {
 | 
			
		||||
            if( ulIPAddress == 0UL )
 | 
			
		||||
            {
 | 
			
		||||
                /* The user has provided a callback function, so do not block on recvfrom() */
 | 
			
		||||
                if( 0 != xIdentifier )
 | 
			
		||||
                {
 | 
			
		||||
                    xReadTimeOut_ms = 0;
 | 
			
		||||
                    vDNSSetCallBack( pcHostName, pvSearchID, pCallback, xTimeout, ( TickType_t )xIdentifier );
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                /* The IP address is known, do the call-back now. */
 | 
			
		||||
                pCallback( pcHostName, pvSearchID, ulIPAddress );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    #endif
 | 
			
		||||
	#if( ipconfigDNS_USE_CALLBACKS != 0 )
 | 
			
		||||
	{
 | 
			
		||||
		if( pCallback != NULL )
 | 
			
		||||
		{
 | 
			
		||||
			if( ulIPAddress == 0UL )
 | 
			
		||||
			{
 | 
			
		||||
				/* The user has provided a callback function, so do not block on recvfrom() */
 | 
			
		||||
				if( 0 != xIdentifier )
 | 
			
		||||
				{
 | 
			
		||||
					xReadTimeOut_ms = 0;
 | 
			
		||||
					vDNSSetCallBack( pcHostName, pvSearchID, pCallback, xTimeout, ( TickType_t )xIdentifier );
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				/* The IP address is known, do the call-back now. */
 | 
			
		||||
				pCallback( pcHostName, pvSearchID, ulIPAddress );
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
    if( ulIPAddress == 0UL && 0 != xIdentifier )
 | 
			
		||||
    {
 | 
			
		||||
        ulIPAddress = prvGetHostByName( pcHostName, xIdentifier, xReadTimeOut_ms );
 | 
			
		||||
    }
 | 
			
		||||
	if( ( ulIPAddress == 0UL ) && ( 0 != xIdentifier ) )
 | 
			
		||||
	{
 | 
			
		||||
		ulIPAddress = prvGetHostByName( pcHostName, xIdentifier, xReadTimeOut_ms );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    return ulIPAddress;
 | 
			
		||||
	return ulIPAddress;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
@ -675,71 +675,71 @@ static const DNSMessage_t xDefaultPartDNSHeader =
 | 
			
		||||
	static uint8_t *prvReadNameField( uint8_t *pucByte, size_t xSourceLen, char *pcName, size_t xDestLen )
 | 
			
		||||
	{
 | 
			
		||||
	size_t xNameLen = 0;
 | 
			
		||||
    BaseType_t xCount;
 | 
			
		||||
	BaseType_t xCount;
 | 
			
		||||
 | 
			
		||||
        if( 0 == xSourceLen )
 | 
			
		||||
        {
 | 
			
		||||
            return NULL;
 | 
			
		||||
        }
 | 
			
		||||
		if( 0 == xSourceLen )
 | 
			
		||||
		{
 | 
			
		||||
			return NULL;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Determine if the name is the fully coded name, or an offset to the name
 | 
			
		||||
		elsewhere in the message. */
 | 
			
		||||
		if( ( *pucByte & dnsNAME_IS_OFFSET ) == dnsNAME_IS_OFFSET )
 | 
			
		||||
		{
 | 
			
		||||
			/* Jump over the two byte offset. */
 | 
			
		||||
            if( xSourceLen > sizeof( uint16_t ) )
 | 
			
		||||
            {
 | 
			
		||||
                pucByte += sizeof( uint16_t );
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                pucByte = NULL;
 | 
			
		||||
            }
 | 
			
		||||
			if( xSourceLen > sizeof( uint16_t ) )
 | 
			
		||||
			{
 | 
			
		||||
				pucByte += sizeof( uint16_t );
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				pucByte = NULL;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* pucByte points to the full name. Walk over the string. */
 | 
			
		||||
			while( NULL != pucByte && *pucByte != 0x00 && xSourceLen > 1 )
 | 
			
		||||
			while( ( NULL != pucByte ) && ( *pucByte != 0x00 ) && ( xSourceLen > 1 ) )
 | 
			
		||||
			{
 | 
			
		||||
                /* If this is not the first time through the loop, then add a 
 | 
			
		||||
                separator in the output. */
 | 
			
		||||
                if( xNameLen > 0 && xNameLen < xDestLen - 1 )
 | 
			
		||||
                {
 | 
			
		||||
                    pcName[ xNameLen++ ] = '.';
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                /* Process the first/next sub-string. */
 | 
			
		||||
				for( xCount = *(pucByte++), xSourceLen--;
 | 
			
		||||
                     xCount-- && xSourceLen > 1; 
 | 
			
		||||
                     pucByte++, xSourceLen-- )
 | 
			
		||||
				/* If this is not the first time through the loop, then add a
 | 
			
		||||
				separator in the output. */
 | 
			
		||||
				if( ( xNameLen > 0 ) && ( xNameLen < ( xDestLen - 1 ) ) )
 | 
			
		||||
				{
 | 
			
		||||
                    if( xNameLen < xDestLen - 1 )
 | 
			
		||||
                    {
 | 
			
		||||
                        pcName[ xNameLen++ ] = *( ( char * )pucByte );
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        /* DNS name is too big for the provided buffer. */
 | 
			
		||||
                        pucByte = NULL;
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
					pcName[ xNameLen++ ] = '.';
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* Process the first/next sub-string. */
 | 
			
		||||
				for( xCount = *(pucByte++), xSourceLen--;
 | 
			
		||||
					 xCount-- && xSourceLen > 1;
 | 
			
		||||
					 pucByte++, xSourceLen-- )
 | 
			
		||||
				{
 | 
			
		||||
					if( xNameLen < xDestLen - 1 )
 | 
			
		||||
					{
 | 
			
		||||
						pcName[ xNameLen++ ] = *( ( char * )pucByte );
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						/* DNS name is too big for the provided buffer. */
 | 
			
		||||
						pucByte = NULL;
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
            /* Confirm that a fully formed name was found. */
 | 
			
		||||
            if( NULL != pucByte )
 | 
			
		||||
            {
 | 
			
		||||
                if( 0x00 == *pucByte )
 | 
			
		||||
                {
 | 
			
		||||
                    pucByte++;
 | 
			
		||||
                    xSourceLen--;
 | 
			
		||||
                    pcName[ xNameLen++ ] = '\0';
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    pucByte = NULL;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
			/* Confirm that a fully formed name was found. */
 | 
			
		||||
			if( NULL != pucByte )
 | 
			
		||||
			{
 | 
			
		||||
				if( 0x00 == *pucByte )
 | 
			
		||||
				{
 | 
			
		||||
					pucByte++;
 | 
			
		||||
					xSourceLen--;
 | 
			
		||||
					pcName[ xNameLen++ ] = '\0';
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					pucByte = NULL;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return pucByte;
 | 
			
		||||
@ -749,58 +749,58 @@ static const DNSMessage_t xDefaultPartDNSHeader =
 | 
			
		||||
 | 
			
		||||
static uint8_t *prvSkipNameField( uint8_t *pucByte, size_t xSourceLen )
 | 
			
		||||
{
 | 
			
		||||
    size_t xChunkLength;
 | 
			
		||||
	size_t xChunkLength;
 | 
			
		||||
 | 
			
		||||
    if( 0 == xSourceLen )
 | 
			
		||||
    {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
	if( 0 == xSourceLen )
 | 
			
		||||
	{
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* Determine if the name is the fully coded name, or an offset to the name
 | 
			
		||||
	/* Determine if the name is the fully coded name, or an offset to the name
 | 
			
		||||
	elsewhere in the message. */
 | 
			
		||||
	if( ( *pucByte & dnsNAME_IS_OFFSET ) == dnsNAME_IS_OFFSET )
 | 
			
		||||
	{
 | 
			
		||||
		/* Jump over the two byte offset. */
 | 
			
		||||
        if( xSourceLen > sizeof( uint16_t ) )
 | 
			
		||||
        {
 | 
			
		||||
            pucByte += sizeof( uint16_t );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            pucByte = NULL;
 | 
			
		||||
        }
 | 
			
		||||
		if( xSourceLen > sizeof( uint16_t ) )
 | 
			
		||||
		{
 | 
			
		||||
			pucByte += sizeof( uint16_t );
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			pucByte = NULL;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		/* pucByte points to the full name. Walk over the string. */
 | 
			
		||||
		while( *pucByte != 0x00 && xSourceLen > 1 )
 | 
			
		||||
		while( ( *pucByte != 0x00 ) && ( xSourceLen > 1 ) )
 | 
			
		||||
		{
 | 
			
		||||
            xChunkLength = *pucByte + 1;
 | 
			
		||||
			xChunkLength = *pucByte + 1;
 | 
			
		||||
 | 
			
		||||
            if( xSourceLen > xChunkLength )
 | 
			
		||||
            {
 | 
			
		||||
                xSourceLen -= xChunkLength;
 | 
			
		||||
                pucByte += xChunkLength;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                pucByte = NULL;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
			if( xSourceLen > xChunkLength )
 | 
			
		||||
			{
 | 
			
		||||
				xSourceLen -= xChunkLength;
 | 
			
		||||
				pucByte += xChunkLength;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				pucByte = NULL;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
        /* Confirm that a fully formed name was found. */
 | 
			
		||||
        if( NULL != pucByte )
 | 
			
		||||
        {
 | 
			
		||||
            if( 0x00 == *pucByte )
 | 
			
		||||
            {
 | 
			
		||||
                pucByte++;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                pucByte = NULL;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
		/* Confirm that a fully formed name was found. */
 | 
			
		||||
		if( NULL != pucByte )
 | 
			
		||||
		{
 | 
			
		||||
			if( 0x00 == *pucByte )
 | 
			
		||||
			{
 | 
			
		||||
				pucByte++;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				pucByte = NULL;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pucByte;
 | 
			
		||||
@ -822,12 +822,12 @@ DNSMessage_t *pxDNSMessageHeader;
 | 
			
		||||
	pucUDPPayloadBuffer = pxNetworkBuffer->pucEthernetBuffer + sizeof( UDPPacket_t );
 | 
			
		||||
	pxDNSMessageHeader = ( DNSMessage_t * ) pucUDPPayloadBuffer;
 | 
			
		||||
 | 
			
		||||
    if( pxNetworkBuffer->xDataLength > sizeof( UDPPacket_t ) )
 | 
			
		||||
    {
 | 
			
		||||
        prvParseDNSReply( pucUDPPayloadBuffer, 
 | 
			
		||||
            xPlayloadBufferLength,
 | 
			
		||||
            ( uint32_t )pxDNSMessageHeader->usIdentifier );
 | 
			
		||||
    }
 | 
			
		||||
	if( pxNetworkBuffer->xDataLength > sizeof( UDPPacket_t ) )
 | 
			
		||||
	{
 | 
			
		||||
		prvParseDNSReply( pucUDPPayloadBuffer,
 | 
			
		||||
			xPlayloadBufferLength,
 | 
			
		||||
			( uint32_t )pxDNSMessageHeader->usIdentifier );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* The packet was not consumed. */
 | 
			
		||||
	return pdFAIL;
 | 
			
		||||
@ -841,12 +841,12 @@ DNSMessage_t *pxDNSMessageHeader;
 | 
			
		||||
	UDPPacket_t *pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
 | 
			
		||||
	uint8_t *pucUDPPayloadBuffer = pxNetworkBuffer->pucEthernetBuffer + sizeof( UDPPacket_t );
 | 
			
		||||
 | 
			
		||||
        if( pxNetworkBuffer->xDataLength > sizeof( UDPPacket_t) )
 | 
			
		||||
        {
 | 
			
		||||
		    prvTreatNBNS( pucUDPPayloadBuffer, 
 | 
			
		||||
                          pxNetworkBuffer->xDataLength - sizeof( UDPPacket_t ),
 | 
			
		||||
                          pxUDPPacket->xIPHeader.ulSourceIPAddress );
 | 
			
		||||
        }
 | 
			
		||||
		if( pxNetworkBuffer->xDataLength > sizeof( UDPPacket_t) )
 | 
			
		||||
		{
 | 
			
		||||
			prvTreatNBNS( pucUDPPayloadBuffer,
 | 
			
		||||
						  pxNetworkBuffer->xDataLength - sizeof( UDPPacket_t ),
 | 
			
		||||
						  pxUDPPacket->xIPHeader.ulSourceIPAddress );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* The packet was not consumed. */
 | 
			
		||||
		return pdFAIL;
 | 
			
		||||
@ -870,27 +870,27 @@ uint16_t x, usDataLength, usQuestions;
 | 
			
		||||
	uint16_t usType = 0, usClass = 0;
 | 
			
		||||
#endif
 | 
			
		||||
#if( ipconfigUSE_DNS_CACHE == 1 )
 | 
			
		||||
	char pcName[ ipconfigDNS_CACHE_NAME_LENGTH ] = ""; 
 | 
			
		||||
	char pcName[ ipconfigDNS_CACHE_NAME_LENGTH ] = "";
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /* Ensure that the buffer is of at least minimal DNS message length. */
 | 
			
		||||
    if( xBufferLength < sizeof( DNSMessage_t ) )
 | 
			
		||||
    {
 | 
			
		||||
        return dnsPARSE_ERROR;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        xSourceBytesRemaining = xBufferLength;
 | 
			
		||||
    }
 | 
			
		||||
	/* Ensure that the buffer is of at least minimal DNS message length. */
 | 
			
		||||
	if( xBufferLength < sizeof( DNSMessage_t ) )
 | 
			
		||||
	{
 | 
			
		||||
		return dnsPARSE_ERROR;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		xSourceBytesRemaining = xBufferLength;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* Parse the DNS message header. */
 | 
			
		||||
	/* Parse the DNS message header. */
 | 
			
		||||
	pxDNSMessageHeader = ( DNSMessage_t * ) pucUDPPayloadBuffer;
 | 
			
		||||
 | 
			
		||||
	if( pxDNSMessageHeader->usIdentifier == ( uint16_t ) xIdentifier )
 | 
			
		||||
	{
 | 
			
		||||
		/* Start at the first byte after the header. */
 | 
			
		||||
		pucByte = pucUDPPayloadBuffer + sizeof( DNSMessage_t );
 | 
			
		||||
        xSourceBytesRemaining -= sizeof( DNSMessage_t );
 | 
			
		||||
		xSourceBytesRemaining -= sizeof( DNSMessage_t );
 | 
			
		||||
 | 
			
		||||
		/* Skip any question records. */
 | 
			
		||||
		usQuestions = FreeRTOS_ntohs( pxDNSMessageHeader->usQuestions );
 | 
			
		||||
@ -908,59 +908,59 @@ uint16_t x, usDataLength, usQuestions;
 | 
			
		||||
#if( ipconfigUSE_DNS_CACHE == 1 )
 | 
			
		||||
			if( x == 0 )
 | 
			
		||||
			{
 | 
			
		||||
				pucByte = prvReadNameField( pucByte, 
 | 
			
		||||
                                            xSourceBytesRemaining,
 | 
			
		||||
                                            pcName, 
 | 
			
		||||
                                            sizeof( pcName ) );
 | 
			
		||||
                
 | 
			
		||||
                /* Check for a malformed response. */
 | 
			
		||||
                if( NULL == pucByte )
 | 
			
		||||
                {
 | 
			
		||||
                    return dnsPARSE_ERROR;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    xSourceBytesRemaining = ( pucUDPPayloadBuffer + xBufferLength ) - pucByte;
 | 
			
		||||
                }
 | 
			
		||||
				pucByte = prvReadNameField( pucByte,
 | 
			
		||||
											xSourceBytesRemaining,
 | 
			
		||||
											pcName,
 | 
			
		||||
											sizeof( pcName ) );
 | 
			
		||||
 | 
			
		||||
				/* Check for a malformed response. */
 | 
			
		||||
				if( NULL == pucByte )
 | 
			
		||||
				{
 | 
			
		||||
					return dnsPARSE_ERROR;
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					xSourceBytesRemaining = ( pucUDPPayloadBuffer + xBufferLength ) - pucByte;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
#endif /* ipconfigUSE_DNS_CACHE */
 | 
			
		||||
			{
 | 
			
		||||
				/* Skip the variable length pcName field. */
 | 
			
		||||
				pucByte = prvSkipNameField( pucByte, 
 | 
			
		||||
                                            xSourceBytesRemaining );
 | 
			
		||||
            
 | 
			
		||||
                /* Check for a malformed response. */
 | 
			
		||||
                if( NULL == pucByte )
 | 
			
		||||
                {
 | 
			
		||||
                    return dnsPARSE_ERROR;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    xSourceBytesRemaining = pucUDPPayloadBuffer + xBufferLength - pucByte;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
				pucByte = prvSkipNameField( pucByte,
 | 
			
		||||
											xSourceBytesRemaining );
 | 
			
		||||
 | 
			
		||||
            /* Check the remaining buffer size. */
 | 
			
		||||
            if( xSourceBytesRemaining >= sizeof( uint32_t ) )
 | 
			
		||||
            {
 | 
			
		||||
                #if( ipconfigUSE_LLMNR == 1 )
 | 
			
		||||
                {
 | 
			
		||||
                    /* usChar2u16 returns value in host endianness */
 | 
			
		||||
                    usType = usChar2u16( pucByte );
 | 
			
		||||
                    usClass = usChar2u16( pucByte + 2 );
 | 
			
		||||
                }
 | 
			
		||||
                #endif /* ipconfigUSE_LLMNR */
 | 
			
		||||
				/* Check for a malformed response. */
 | 
			
		||||
				if( NULL == pucByte )
 | 
			
		||||
				{
 | 
			
		||||
					return dnsPARSE_ERROR;
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					xSourceBytesRemaining = pucUDPPayloadBuffer + xBufferLength - pucByte;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
                /* Skip the type and class fields. */
 | 
			
		||||
                pucByte += sizeof( uint32_t );
 | 
			
		||||
                xSourceBytesRemaining -= sizeof( uint32_t );
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                /* Malformed response. */
 | 
			
		||||
                return dnsPARSE_ERROR;
 | 
			
		||||
            }
 | 
			
		||||
			/* Check the remaining buffer size. */
 | 
			
		||||
			if( xSourceBytesRemaining >= sizeof( uint32_t ) )
 | 
			
		||||
			{
 | 
			
		||||
				#if( ipconfigUSE_LLMNR == 1 )
 | 
			
		||||
				{
 | 
			
		||||
					/* usChar2u16 returns value in host endianness */
 | 
			
		||||
					usType = usChar2u16( pucByte );
 | 
			
		||||
					usClass = usChar2u16( pucByte + 2 );
 | 
			
		||||
				}
 | 
			
		||||
				#endif /* ipconfigUSE_LLMNR */
 | 
			
		||||
 | 
			
		||||
				/* Skip the type and class fields. */
 | 
			
		||||
				pucByte += sizeof( uint32_t );
 | 
			
		||||
				xSourceBytesRemaining -= sizeof( uint32_t );
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				/* Malformed response. */
 | 
			
		||||
				return dnsPARSE_ERROR;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Search through the answer records. */
 | 
			
		||||
@ -971,33 +971,33 @@ uint16_t x, usDataLength, usQuestions;
 | 
			
		||||
			for( x = 0; x < pxDNSMessageHeader->usAnswers; x++ )
 | 
			
		||||
			{
 | 
			
		||||
				pucByte = prvSkipNameField( pucByte,
 | 
			
		||||
                                            xSourceBytesRemaining );
 | 
			
		||||
											xSourceBytesRemaining );
 | 
			
		||||
 | 
			
		||||
                /* Check for a malformed response. */
 | 
			
		||||
                if( NULL == pucByte )
 | 
			
		||||
                {
 | 
			
		||||
                    return dnsPARSE_ERROR;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    xSourceBytesRemaining = pucUDPPayloadBuffer + xBufferLength - pucByte;
 | 
			
		||||
                }
 | 
			
		||||
				/* Check for a malformed response. */
 | 
			
		||||
				if( NULL == pucByte )
 | 
			
		||||
				{
 | 
			
		||||
					return dnsPARSE_ERROR;
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					xSourceBytesRemaining = pucUDPPayloadBuffer + xBufferLength - pucByte;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* Is there enough data for an IPv4 A record answer and, if so, 
 | 
			
		||||
                is this an A record? */
 | 
			
		||||
				if( xSourceBytesRemaining >= sizeof( DNSAnswerRecord_t ) + sizeof( uint32_t ) && 
 | 
			
		||||
                    usChar2u16( pucByte ) == dnsTYPE_A_HOST )
 | 
			
		||||
				/* Is there enough data for an IPv4 A record answer and, if so,
 | 
			
		||||
				is this an A record? */
 | 
			
		||||
				if( xSourceBytesRemaining >= sizeof( DNSAnswerRecord_t ) + sizeof( uint32_t ) &&
 | 
			
		||||
					usChar2u16( pucByte ) == dnsTYPE_A_HOST )
 | 
			
		||||
				{
 | 
			
		||||
					/* This is the required record type and is of sufficient size. */
 | 
			
		||||
                    pxDNSAnswerRecord = ( DNSAnswerRecord_t * )pucByte;
 | 
			
		||||
					pxDNSAnswerRecord = ( DNSAnswerRecord_t * )pucByte;
 | 
			
		||||
 | 
			
		||||
					/* Sanity check the data length of an IPv4 answer. */
 | 
			
		||||
					if( FreeRTOS_ntohs( pxDNSAnswerRecord->usDataLength ) == sizeof( uint32_t ) )
 | 
			
		||||
					{
 | 
			
		||||
						/* Copy the IP address out of the record. */
 | 
			
		||||
						memcpy( &ulIPAddress, 
 | 
			
		||||
                                pucByte + sizeof( DNSAnswerRecord_t ),
 | 
			
		||||
                                sizeof( uint32_t ) );
 | 
			
		||||
						memcpy( &ulIPAddress,
 | 
			
		||||
								pucByte + sizeof( DNSAnswerRecord_t ),
 | 
			
		||||
								sizeof( uint32_t ) );
 | 
			
		||||
 | 
			
		||||
						#if( ipconfigUSE_DNS_CACHE == 1 )
 | 
			
		||||
						{
 | 
			
		||||
@ -1012,32 +1012,32 @@ uint16_t x, usDataLength, usQuestions;
 | 
			
		||||
						#endif	/* ipconfigDNS_USE_CALLBACKS != 0 */
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
                    pucByte += sizeof( DNSAnswerRecord_t ) + sizeof( uint32_t );
 | 
			
		||||
                    xSourceBytesRemaining -= ( sizeof( DNSAnswerRecord_t ) + sizeof( uint32_t ) );
 | 
			
		||||
					pucByte += sizeof( DNSAnswerRecord_t ) + sizeof( uint32_t );
 | 
			
		||||
					xSourceBytesRemaining -= ( sizeof( DNSAnswerRecord_t ) + sizeof( uint32_t ) );
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				else if( xSourceBytesRemaining >= sizeof( DNSAnswerRecord_t ) )
 | 
			
		||||
				{
 | 
			
		||||
                    /* It's not an A record, so skip it. Get the header location 
 | 
			
		||||
                    and then jump over the header. */
 | 
			
		||||
                    pxDNSAnswerRecord = ( DNSAnswerRecord_t * )pucByte;
 | 
			
		||||
                    pucByte += sizeof( DNSAnswerRecord_t );
 | 
			
		||||
                    xSourceBytesRemaining -= sizeof( DNSAnswerRecord_t );
 | 
			
		||||
                    
 | 
			
		||||
					/* It's not an A record, so skip it. Get the header location
 | 
			
		||||
					and then jump over the header. */
 | 
			
		||||
					pxDNSAnswerRecord = ( DNSAnswerRecord_t * )pucByte;
 | 
			
		||||
					pucByte += sizeof( DNSAnswerRecord_t );
 | 
			
		||||
					xSourceBytesRemaining -= sizeof( DNSAnswerRecord_t );
 | 
			
		||||
 | 
			
		||||
					/* Determine the length of the answer data from the header. */
 | 
			
		||||
					usDataLength = FreeRTOS_ntohs( pxDNSAnswerRecord->usDataLength );
 | 
			
		||||
 | 
			
		||||
					/* Jump over the answer. */
 | 
			
		||||
                    if( xSourceBytesRemaining >= usDataLength )
 | 
			
		||||
                    {
 | 
			
		||||
                        pucByte += usDataLength;
 | 
			
		||||
                        xSourceBytesRemaining -= usDataLength;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        /* Malformed response. */
 | 
			
		||||
                        return dnsPARSE_ERROR;
 | 
			
		||||
                    }
 | 
			
		||||
					if( xSourceBytesRemaining >= usDataLength )
 | 
			
		||||
					{
 | 
			
		||||
						pucByte += usDataLength;
 | 
			
		||||
						xSourceBytesRemaining -= usDataLength;
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						/* Malformed response. */
 | 
			
		||||
						return dnsPARSE_ERROR;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@ -1055,8 +1055,7 @@ uint16_t x, usDataLength, usQuestions;
 | 
			
		||||
 | 
			
		||||
				if( ( xBufferAllocFixedSize == pdFALSE ) && ( pxNetworkBuffer != NULL ) )
 | 
			
		||||
				{
 | 
			
		||||
				BaseType_t xDataLength = xBufferLength + sizeof( UDPHeader_t ) +
 | 
			
		||||
					sizeof( EthernetHeader_t ) + sizeof( IPHeader_t );
 | 
			
		||||
				BaseType_t xDataLength = xBufferLength + sizeof( UDPHeader_t ) + sizeof( EthernetHeader_t ) + sizeof( IPHeader_t );
 | 
			
		||||
 | 
			
		||||
					/* The field xDataLength was set to the length of the UDP payload.
 | 
			
		||||
					The answer (reply) will be longer than the request, so the packet
 | 
			
		||||
@ -1130,13 +1129,13 @@ uint16_t x, usDataLength, usQuestions;
 | 
			
		||||
		uint8_t ucByte;
 | 
			
		||||
		uint8_t ucNBNSName[ 17 ];
 | 
			
		||||
 | 
			
		||||
        /* Check for minimum buffer size. */
 | 
			
		||||
        if( xBufferLength < sizeof( NBNSRequest_t ) )
 | 
			
		||||
        {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /* Read the request flags in host endianness. */
 | 
			
		||||
		/* Check for minimum buffer size. */
 | 
			
		||||
		if( xBufferLength < sizeof( NBNSRequest_t ) )
 | 
			
		||||
		{
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Read the request flags in host endianness. */
 | 
			
		||||
		usFlags = usChar2u16( pucUDPPayloadBuffer + offsetof( NBNSRequest_t, usFlags ) );
 | 
			
		||||
 | 
			
		||||
		if( ( usFlags & dnsNBNS_FLAGS_OPCODE_MASK ) == dnsNBNS_FLAGS_OPCODE_QUERY )
 | 
			
		||||
@ -1303,22 +1302,22 @@ TickType_t xTimeoutTime = pdMS_TO_TICKS( 200 );
 | 
			
		||||
		pxIPHeader = &pxUDPPacket->xIPHeader;
 | 
			
		||||
		pxUDPHeader = &pxUDPPacket->xUDPHeader;
 | 
			
		||||
		/* HT: started using defines like 'ipSIZE_OF_xxx' */
 | 
			
		||||
		pxIPHeader->usLength               = FreeRTOS_htons( lNetLength + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_UDP_HEADER );
 | 
			
		||||
		pxIPHeader->usLength			   = FreeRTOS_htons( lNetLength + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_UDP_HEADER );
 | 
			
		||||
		/* HT:endian: should not be translated, copying from packet to packet */
 | 
			
		||||
		pxIPHeader->ulDestinationIPAddress = pxIPHeader->ulSourceIPAddress;
 | 
			
		||||
		pxIPHeader->ulSourceIPAddress      = *ipLOCAL_IP_ADDRESS_POINTER;
 | 
			
		||||
		pxIPHeader->ucTimeToLive           = ipconfigUDP_TIME_TO_LIVE;
 | 
			
		||||
		pxIPHeader->usIdentification       = FreeRTOS_htons( usPacketIdentifier );
 | 
			
		||||
		pxIPHeader->ulSourceIPAddress	   = *ipLOCAL_IP_ADDRESS_POINTER;
 | 
			
		||||
		pxIPHeader->ucTimeToLive		   = ipconfigUDP_TIME_TO_LIVE;
 | 
			
		||||
		pxIPHeader->usIdentification	   = FreeRTOS_htons( usPacketIdentifier );
 | 
			
		||||
		usPacketIdentifier++;
 | 
			
		||||
		pxUDPHeader->usLength              = FreeRTOS_htons( lNetLength + ipSIZE_OF_UDP_HEADER );
 | 
			
		||||
		pxUDPHeader->usLength			   = FreeRTOS_htons( lNetLength + ipSIZE_OF_UDP_HEADER );
 | 
			
		||||
		vFlip_16( pxUDPPacket->xUDPHeader.usSourcePort, pxUDPPacket->xUDPHeader.usDestinationPort );
 | 
			
		||||
 | 
			
		||||
		#if( ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM == 0 )
 | 
			
		||||
		{
 | 
			
		||||
			/* calculate the IP header checksum */
 | 
			
		||||
			pxIPHeader->usHeaderChecksum       = 0x00;
 | 
			
		||||
			pxIPHeader->usHeaderChecksum       = usGenerateChecksum( 0UL, ( uint8_t * ) &( pxIPHeader->ucVersionHeaderLength ), ipSIZE_OF_IPv4_HEADER );
 | 
			
		||||
			pxIPHeader->usHeaderChecksum       = ~FreeRTOS_htons( pxIPHeader->usHeaderChecksum );
 | 
			
		||||
			pxIPHeader->usHeaderChecksum	   = 0x00;
 | 
			
		||||
			pxIPHeader->usHeaderChecksum	   = usGenerateChecksum( 0UL, ( uint8_t * ) &( pxIPHeader->ucVersionHeaderLength ), ipSIZE_OF_IPv4_HEADER );
 | 
			
		||||
			pxIPHeader->usHeaderChecksum	   = ~FreeRTOS_htons( pxIPHeader->usHeaderChecksum );
 | 
			
		||||
 | 
			
		||||
			/* calculate the UDP checksum for outgoing package */
 | 
			
		||||
			usGenerateProtocolChecksum( ( uint8_t* ) pxUDPPacket, lNetLength, pdTRUE );
 | 
			
		||||
@ -1341,8 +1340,7 @@ TickType_t xTimeoutTime = pdMS_TO_TICKS( 200 );
 | 
			
		||||
	{
 | 
			
		||||
	BaseType_t x;
 | 
			
		||||
	BaseType_t xFound = pdFALSE;
 | 
			
		||||
    uint32_t ulCurrentTimeSeconds = 
 | 
			
		||||
        xTaskGetTickCount( ) / portTICK_PERIOD_MS / 1000;
 | 
			
		||||
	uint32_t ulCurrentTimeSeconds = ( xTaskGetTickCount() / portTICK_PERIOD_MS ) / 1000;
 | 
			
		||||
	static BaseType_t xFreeEntry = 0;
 | 
			
		||||
 | 
			
		||||
		/* For each entry in the DNS cache table. */
 | 
			
		||||
@ -1358,24 +1356,22 @@ TickType_t xTimeoutTime = pdMS_TO_TICKS( 200 );
 | 
			
		||||
				/* Is this function called for a lookup or to add/update an IP address? */
 | 
			
		||||
				if( xLookUp != pdFALSE )
 | 
			
		||||
				{
 | 
			
		||||
                    /* Confirm that the record is still fresh. */
 | 
			
		||||
                    if( ulCurrentTimeSeconds < 
 | 
			
		||||
                            xDNSCache[ x ].ulTimeWhenAddedInSeconds + 
 | 
			
		||||
                            FreeRTOS_ntohl( xDNSCache[ x ].ulTTL ) )
 | 
			
		||||
                    {
 | 
			
		||||
                        *pulIP = xDNSCache[ x ].ulIPAddress;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        /* Age out the old cached record. */
 | 
			
		||||
                        xDNSCache[ x ].pcName[ 0 ] = 0;
 | 
			
		||||
                    }
 | 
			
		||||
					/* Confirm that the record is still fresh. */
 | 
			
		||||
					if( ulCurrentTimeSeconds < ( xDNSCache[ x ].ulTimeWhenAddedInSeconds + FreeRTOS_ntohl( xDNSCache[ x ].ulTTL ) ) )
 | 
			
		||||
					{
 | 
			
		||||
						*pulIP = xDNSCache[ x ].ulIPAddress;
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						/* Age out the old cached record. */
 | 
			
		||||
						xDNSCache[ x ].pcName[ 0 ] = 0;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					xDNSCache[ x ].ulIPAddress = *pulIP;
 | 
			
		||||
                    xDNSCache[ x ].ulTTL = ulTTL;
 | 
			
		||||
                    xDNSCache[ x ].ulTimeWhenAddedInSeconds = ulCurrentTimeSeconds;
 | 
			
		||||
					xDNSCache[ x ].ulTTL = ulTTL;
 | 
			
		||||
					xDNSCache[ x ].ulTimeWhenAddedInSeconds = ulCurrentTimeSeconds;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				xFound = pdTRUE;
 | 
			
		||||
@ -1392,20 +1388,20 @@ TickType_t xTimeoutTime = pdMS_TO_TICKS( 200 );
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				/* Add or update the item. */
 | 
			
		||||
                if( strlen( pcName ) < ipconfigDNS_CACHE_NAME_LENGTH )
 | 
			
		||||
                {
 | 
			
		||||
                    strcpy( xDNSCache[ xFreeEntry ].pcName, pcName );
 | 
			
		||||
				if( strlen( pcName ) < ipconfigDNS_CACHE_NAME_LENGTH )
 | 
			
		||||
				{
 | 
			
		||||
					strcpy( xDNSCache[ xFreeEntry ].pcName, pcName );
 | 
			
		||||
 | 
			
		||||
                    xDNSCache[ xFreeEntry ].ulIPAddress = *pulIP;
 | 
			
		||||
                    xDNSCache[ xFreeEntry ].ulTTL = ulTTL;
 | 
			
		||||
                    xDNSCache[ xFreeEntry ].ulTimeWhenAddedInSeconds = ulCurrentTimeSeconds;
 | 
			
		||||
					xDNSCache[ xFreeEntry ].ulIPAddress = *pulIP;
 | 
			
		||||
					xDNSCache[ xFreeEntry ].ulTTL = ulTTL;
 | 
			
		||||
					xDNSCache[ xFreeEntry ].ulTimeWhenAddedInSeconds = ulCurrentTimeSeconds;
 | 
			
		||||
 | 
			
		||||
                    xFreeEntry++;
 | 
			
		||||
                    if( xFreeEntry == ipconfigDNS_CACHE_ENTRIES )
 | 
			
		||||
                    {
 | 
			
		||||
                        xFreeEntry = 0;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
					xFreeEntry++;
 | 
			
		||||
					if( xFreeEntry == ipconfigDNS_CACHE_ENTRIES )
 | 
			
		||||
					{
 | 
			
		||||
						xFreeEntry = 0;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -1423,5 +1419,6 @@ TickType_t xTimeoutTime = pdMS_TO_TICKS( 200 );
 | 
			
		||||
 | 
			
		||||
/* Provide access to private members for testing. */
 | 
			
		||||
#ifdef AMAZON_FREERTOS_ENABLE_UNIT_TESTS
 | 
			
		||||
    #include "aws_freertos_tcp_test_access_dns_define.h"
 | 
			
		||||
	#include "aws_freertos_tcp_test_access_dns_define.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -357,7 +357,8 @@ struct freertos_sockaddr xAddress;
 | 
			
		||||
		/* Wait until there is something to do. If the following call exits
 | 
			
		||||
		 * due to a time out rather than a message being received, set a
 | 
			
		||||
		 * 'NoEvent' value. */
 | 
			
		||||
		if ( xQueueReceive( xNetworkEventQueue, ( void * ) &xReceivedEvent, xNextIPSleep ) == pdFALSE ) {
 | 
			
		||||
		if ( xQueueReceive( xNetworkEventQueue, ( void * ) &xReceivedEvent, xNextIPSleep ) == pdFALSE ) 
 | 
			
		||||
		{
 | 
			
		||||
			xReceivedEvent.eEventType = eNoEvent;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -803,9 +804,8 @@ void *pvReturn;
 | 
			
		||||
 | 
			
		||||
	if( pxNetworkBuffer != NULL )
 | 
			
		||||
	{
 | 
			
		||||
        /* Set the actual packet size in case a bigger buffer was returned. */
 | 
			
		||||
        pxNetworkBuffer->xDataLength = 
 | 
			
		||||
            sizeof( UDPPacket_t ) + xRequestedSizeBytes;
 | 
			
		||||
		/* Set the actual packet size in case a bigger buffer was returned. */
 | 
			
		||||
		pxNetworkBuffer->xDataLength = sizeof( UDPPacket_t ) + xRequestedSizeBytes;
 | 
			
		||||
 | 
			
		||||
		/* Leave space for the UPD header. */
 | 
			
		||||
		pvReturn = ( void * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipUDP_PAYLOAD_OFFSET_IPv4 ] );
 | 
			
		||||
@ -831,11 +831,11 @@ NetworkBufferDescriptor_t * pxNewBuffer;
 | 
			
		||||
 | 
			
		||||
	if( pxNewBuffer != NULL )
 | 
			
		||||
	{
 | 
			
		||||
        /* Set the actual packet size in case a bigger buffer than requested 
 | 
			
		||||
        was returned. */
 | 
			
		||||
        pxNewBuffer->xDataLength = xNewLength;
 | 
			
		||||
		/* Set the actual packet size in case a bigger buffer than requested
 | 
			
		||||
		was returned. */
 | 
			
		||||
		pxNewBuffer->xDataLength = xNewLength;
 | 
			
		||||
 | 
			
		||||
        /* Copy the original packet information. */
 | 
			
		||||
		/* Copy the original packet information. */
 | 
			
		||||
		pxNewBuffer->ulIPAddress = pxNetworkBuffer->ulIPAddress;
 | 
			
		||||
		pxNewBuffer->usPort = pxNetworkBuffer->usPort;
 | 
			
		||||
		pxNewBuffer->usBoundPort = pxNetworkBuffer->usBoundPort;
 | 
			
		||||
@ -995,13 +995,13 @@ BaseType_t xReturn = pdFALSE;
 | 
			
		||||
			memcpy( ( void * ) ipLOCAL_MAC_ADDRESS, ( void * ) ucMACAddress, ( size_t ) ipMAC_ADDRESS_LENGTH_BYTES );
 | 
			
		||||
 | 
			
		||||
			/* Prepare the sockets interface. */
 | 
			
		||||
            xReturn = vNetworkSocketsInit();
 | 
			
		||||
            
 | 
			
		||||
            if( pdTRUE == xReturn )
 | 
			
		||||
            {
 | 
			
		||||
                /* Create the task that processes Ethernet and stack events. */
 | 
			
		||||
                xReturn = xTaskCreate( prvIPTask, "IP-task", ( uint16_t )ipconfigIP_TASK_STACK_SIZE_WORDS, NULL, ( UBaseType_t )ipconfigIP_TASK_PRIORITY, &xIPTaskHandle );
 | 
			
		||||
            }
 | 
			
		||||
			xReturn = vNetworkSocketsInit();
 | 
			
		||||
 | 
			
		||||
			if( pdTRUE == xReturn )
 | 
			
		||||
			{
 | 
			
		||||
				/* Create the task that processes Ethernet and stack events. */
 | 
			
		||||
				xReturn = xTaskCreate( prvIPTask, "IP-task", ( uint16_t )ipconfigIP_TASK_STACK_SIZE_WORDS, NULL, ( UBaseType_t )ipconfigIP_TASK_PRIORITY, &xIPTaskHandle );
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
@ -1350,47 +1350,47 @@ eFrameProcessingResult_t eReturned = eReleaseBuffer;
 | 
			
		||||
	configASSERT( pxNetworkBuffer );
 | 
			
		||||
 | 
			
		||||
	/* Interpret the Ethernet frame. */
 | 
			
		||||
    if( pxNetworkBuffer->xDataLength >= sizeof( EthernetHeader_t ) )
 | 
			
		||||
    {
 | 
			
		||||
        eReturned = ipCONSIDER_FRAME_FOR_PROCESSING( pxNetworkBuffer->pucEthernetBuffer );
 | 
			
		||||
        pxEthernetHeader = ( EthernetHeader_t * )( pxNetworkBuffer->pucEthernetBuffer );
 | 
			
		||||
	if( pxNetworkBuffer->xDataLength >= sizeof( EthernetHeader_t ) )
 | 
			
		||||
	{
 | 
			
		||||
		eReturned = ipCONSIDER_FRAME_FOR_PROCESSING( pxNetworkBuffer->pucEthernetBuffer );
 | 
			
		||||
		pxEthernetHeader = ( EthernetHeader_t * )( pxNetworkBuffer->pucEthernetBuffer );
 | 
			
		||||
 | 
			
		||||
        if( eReturned == eProcessBuffer )
 | 
			
		||||
        {
 | 
			
		||||
            /* Interpret the received Ethernet packet. */
 | 
			
		||||
            switch( pxEthernetHeader->usFrameType )
 | 
			
		||||
            {
 | 
			
		||||
            case ipARP_FRAME_TYPE:
 | 
			
		||||
                /* The Ethernet frame contains an ARP packet. */
 | 
			
		||||
                if( pxNetworkBuffer->xDataLength >= sizeof( ARPPacket_t ) )
 | 
			
		||||
                {
 | 
			
		||||
                    eReturned = eARPProcessPacket( ( ARPPacket_t * )pxNetworkBuffer->pucEthernetBuffer );
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    eReturned = eReleaseBuffer;
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
		if( eReturned == eProcessBuffer )
 | 
			
		||||
		{
 | 
			
		||||
			/* Interpret the received Ethernet packet. */
 | 
			
		||||
			switch( pxEthernetHeader->usFrameType )
 | 
			
		||||
			{
 | 
			
		||||
			case ipARP_FRAME_TYPE:
 | 
			
		||||
				/* The Ethernet frame contains an ARP packet. */
 | 
			
		||||
				if( pxNetworkBuffer->xDataLength >= sizeof( ARPPacket_t ) )
 | 
			
		||||
				{
 | 
			
		||||
					eReturned = eARPProcessPacket( ( ARPPacket_t * )pxNetworkBuffer->pucEthernetBuffer );
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					eReturned = eReleaseBuffer;
 | 
			
		||||
				}
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
            case ipIPv4_FRAME_TYPE:
 | 
			
		||||
                /* The Ethernet frame contains an IP packet. */
 | 
			
		||||
                if( pxNetworkBuffer->xDataLength >= sizeof( IPPacket_t ) )
 | 
			
		||||
                {
 | 
			
		||||
                    eReturned = prvProcessIPPacket( ( IPPacket_t * )pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer );
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    eReturned = eReleaseBuffer;
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
			case ipIPv4_FRAME_TYPE:
 | 
			
		||||
				/* The Ethernet frame contains an IP packet. */
 | 
			
		||||
				if( pxNetworkBuffer->xDataLength >= sizeof( IPPacket_t ) )
 | 
			
		||||
				{
 | 
			
		||||
					eReturned = prvProcessIPPacket( ( IPPacket_t * )pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer );
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					eReturned = eReleaseBuffer;
 | 
			
		||||
				}
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                /* No other packet types are handled.  Nothing to do. */
 | 
			
		||||
                eReturned = eReleaseBuffer;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
			default:
 | 
			
		||||
				/* No other packet types are handled.  Nothing to do. */
 | 
			
		||||
				eReturned = eReleaseBuffer;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Perform any actions that resulted from processing the Ethernet frame. */
 | 
			
		||||
	switch( eReturned )
 | 
			
		||||
@ -1513,14 +1513,14 @@ IPHeader_t * pxIPHeader = &( pxIPPacket->xIPHeader );
 | 
			
		||||
UBaseType_t uxHeaderLength = ( UBaseType_t ) ( ( pxIPHeader->ucVersionHeaderLength & 0x0Fu ) << 2 );
 | 
			
		||||
uint8_t ucProtocol;
 | 
			
		||||
 | 
			
		||||
    /* Bound the calculated header length: take away the Ethernet header size,
 | 
			
		||||
    then check if the IP header is claiming to be longer than the remaining
 | 
			
		||||
    total packet size. Also check for minimal header field length. */
 | 
			
		||||
    if( uxHeaderLength > pxNetworkBuffer->xDataLength - ipSIZE_OF_ETH_HEADER ||
 | 
			
		||||
        uxHeaderLength < ipSIZE_OF_IPv4_HEADER )
 | 
			
		||||
    {
 | 
			
		||||
        return eReleaseBuffer;
 | 
			
		||||
    }
 | 
			
		||||
	/* Bound the calculated header length: take away the Ethernet header size,
 | 
			
		||||
	then check if the IP header is claiming to be longer than the remaining
 | 
			
		||||
	total packet size. Also check for minimal header field length. */
 | 
			
		||||
	if( ( uxHeaderLength > ( pxNetworkBuffer->xDataLength - ipSIZE_OF_ETH_HEADER ) ) ||
 | 
			
		||||
		( uxHeaderLength < ipSIZE_OF_IPv4_HEADER ) )
 | 
			
		||||
	{
 | 
			
		||||
		return eReleaseBuffer;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ucProtocol = pxIPPacket->xIPHeader.ucProtocol;
 | 
			
		||||
	/* Check if the IP headers are acceptable and if it has our destination. */
 | 
			
		||||
@ -1544,10 +1544,9 @@ uint8_t ucProtocol;
 | 
			
		||||
			memmove( pucTarget, pucSource, xMoveLen );
 | 
			
		||||
			pxNetworkBuffer->xDataLength -= optlen;
 | 
			
		||||
 | 
			
		||||
            /* Fix-up new version/header length field in IP packet. */
 | 
			
		||||
            pxIPHeader->ucVersionHeaderLength =
 | 
			
		||||
                ( pxIPHeader->ucVersionHeaderLength & 0xF0 ) | /* High nibble is the version. */
 | 
			
		||||
                ( ( ipSIZE_OF_IPv4_HEADER >> 2 ) & 0x0F ); /* Low nibble is the header size, in bytes, divided by four. */
 | 
			
		||||
			/* Fix-up new version/header length field in IP packet. */
 | 
			
		||||
			pxIPHeader->ucVersionHeaderLength = ( pxIPHeader->ucVersionHeaderLength & 0xF0 ) | /* High nibble is the version. */
 | 
			
		||||
												( ( ipSIZE_OF_IPv4_HEADER >> 2 ) & 0x0F ); /* Low nibble is the header size, in bytes, divided by four. */
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Add the IP and MAC addresses to the ARP table if they are not
 | 
			
		||||
@ -1573,18 +1572,18 @@ uint8_t ucProtocol;
 | 
			
		||||
				be able to validate what it receives. */
 | 
			
		||||
				#if ( ipconfigREPLY_TO_INCOMING_PINGS == 1 ) || ( ipconfigSUPPORT_OUTGOING_PINGS == 1 )
 | 
			
		||||
				{
 | 
			
		||||
                    if( pxNetworkBuffer->xDataLength >= sizeof( ICMPPacket_t ) )
 | 
			
		||||
                    {
 | 
			
		||||
                        ICMPPacket_t *pxICMPPacket = ( ICMPPacket_t * )( pxNetworkBuffer->pucEthernetBuffer );
 | 
			
		||||
                        if( pxIPHeader->ulDestinationIPAddress == *ipLOCAL_IP_ADDRESS_POINTER )
 | 
			
		||||
                        {
 | 
			
		||||
                            eReturn = prvProcessICMPPacket( pxICMPPacket );
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        eReturn = eReleaseBuffer;
 | 
			
		||||
                    }
 | 
			
		||||
					if( pxNetworkBuffer->xDataLength >= sizeof( ICMPPacket_t ) )
 | 
			
		||||
					{
 | 
			
		||||
						ICMPPacket_t *pxICMPPacket = ( ICMPPacket_t * )( pxNetworkBuffer->pucEthernetBuffer );
 | 
			
		||||
						if( pxIPHeader->ulDestinationIPAddress == *ipLOCAL_IP_ADDRESS_POINTER )
 | 
			
		||||
						{
 | 
			
		||||
							eReturn = prvProcessICMPPacket( pxICMPPacket );
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						eReturn = eReleaseBuffer;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				#endif /* ( ipconfigREPLY_TO_INCOMING_PINGS == 1 ) || ( ipconfigSUPPORT_OUTGOING_PINGS == 1 ) */
 | 
			
		||||
				break;
 | 
			
		||||
@ -1594,47 +1593,46 @@ uint8_t ucProtocol;
 | 
			
		||||
					/* The IP packet contained a UDP frame. */
 | 
			
		||||
					UDPPacket_t *pxUDPPacket = ( UDPPacket_t * ) ( pxNetworkBuffer->pucEthernetBuffer );
 | 
			
		||||
 | 
			
		||||
                    /* Only proceed if the payload length indicated in the header
 | 
			
		||||
                    appears to be valid. */
 | 
			
		||||
                    if ( pxNetworkBuffer->xDataLength >= sizeof( UDPPacket_t ) )
 | 
			
		||||
                    {
 | 
			
		||||
                        /* Ensure that downstream UDP packet handling has the lesser
 | 
			
		||||
                         * of: the actual network buffer Ethernet frame length, or 
 | 
			
		||||
                         * the sender's UDP packet header payload length, minus the
 | 
			
		||||
                         * size of the UDP header. 
 | 
			
		||||
                         *
 | 
			
		||||
                         * The size of the UDP packet structure in this implementation 
 | 
			
		||||
                         * includes the size of the Ethernet header, the size of 
 | 
			
		||||
                         * the IP header, and the size of the UDP header.
 | 
			
		||||
                         */
 | 
			
		||||
                         
 | 
			
		||||
                        pxNetworkBuffer->xDataLength -= sizeof( UDPPacket_t );
 | 
			
		||||
                        if( ( FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) - sizeof( UDPHeader_t ) ) <
 | 
			
		||||
                                pxNetworkBuffer->xDataLength )
 | 
			
		||||
                        {
 | 
			
		||||
                            pxNetworkBuffer->xDataLength = FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) - 
 | 
			
		||||
                                    sizeof( UDPHeader_t );
 | 
			
		||||
                        }
 | 
			
		||||
					/* Only proceed if the payload length indicated in the header
 | 
			
		||||
					appears to be valid. */
 | 
			
		||||
					if ( pxNetworkBuffer->xDataLength >= sizeof( UDPPacket_t ) )
 | 
			
		||||
					{
 | 
			
		||||
						/* Ensure that downstream UDP packet handling has the lesser
 | 
			
		||||
						 * of: the actual network buffer Ethernet frame length, or
 | 
			
		||||
						 * the sender's UDP packet header payload length, minus the
 | 
			
		||||
						 * size of the UDP header.
 | 
			
		||||
						 *
 | 
			
		||||
						 * The size of the UDP packet structure in this implementation
 | 
			
		||||
						 * includes the size of the Ethernet header, the size of
 | 
			
		||||
						 * the IP header, and the size of the UDP header.
 | 
			
		||||
						 */
 | 
			
		||||
 | 
			
		||||
                        /* Fields in pxNetworkBuffer (usPort, ulIPAddress) are network order. */
 | 
			
		||||
                        pxNetworkBuffer->usPort = pxUDPPacket->xUDPHeader.usSourcePort;
 | 
			
		||||
                        pxNetworkBuffer->ulIPAddress = pxUDPPacket->xIPHeader.ulSourceIPAddress;
 | 
			
		||||
						pxNetworkBuffer->xDataLength -= sizeof( UDPPacket_t );
 | 
			
		||||
						if( ( FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) - sizeof( UDPHeader_t ) ) <
 | 
			
		||||
								pxNetworkBuffer->xDataLength )
 | 
			
		||||
						{
 | 
			
		||||
							pxNetworkBuffer->xDataLength = FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) - sizeof( UDPHeader_t );
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
                        /* ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM:
 | 
			
		||||
                         * In some cases, the upper-layer checksum has been calculated
 | 
			
		||||
                         * by the NIC driver.
 | 
			
		||||
                         * 
 | 
			
		||||
                         * Pass the packet payload to the UDP sockets implementation. */
 | 
			
		||||
                        if( xProcessReceivedUDPPacket( pxNetworkBuffer, 
 | 
			
		||||
                                                       pxUDPPacket->xUDPHeader.usDestinationPort ) == pdPASS )
 | 
			
		||||
                        {
 | 
			
		||||
                            eReturn = eFrameConsumed;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        eReturn = eReleaseBuffer;
 | 
			
		||||
                    }
 | 
			
		||||
						/* Fields in pxNetworkBuffer (usPort, ulIPAddress) are network order. */
 | 
			
		||||
						pxNetworkBuffer->usPort = pxUDPPacket->xUDPHeader.usSourcePort;
 | 
			
		||||
						pxNetworkBuffer->ulIPAddress = pxUDPPacket->xIPHeader.ulSourceIPAddress;
 | 
			
		||||
 | 
			
		||||
						/* ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM:
 | 
			
		||||
						 * In some cases, the upper-layer checksum has been calculated
 | 
			
		||||
						 * by the NIC driver.
 | 
			
		||||
						 *
 | 
			
		||||
						 * Pass the packet payload to the UDP sockets implementation. */
 | 
			
		||||
						if( xProcessReceivedUDPPacket( pxNetworkBuffer,
 | 
			
		||||
													   pxUDPPacket->xUDPHeader.usDestinationPort ) == pdPASS )
 | 
			
		||||
						{
 | 
			
		||||
							eReturn = eFrameConsumed;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						eReturn = eReleaseBuffer;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
@ -1803,47 +1801,46 @@ uint8_t ucProtocol;
 | 
			
		||||
	const char *pcType;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /* Check for minimum packet size. */
 | 
			
		||||
    if( uxBufferLength < sizeof( IPPacket_t ) )
 | 
			
		||||
    {
 | 
			
		||||
        return ipINVALID_LENGTH;
 | 
			
		||||
    }
 | 
			
		||||
	/* Check for minimum packet size. */
 | 
			
		||||
	if( uxBufferLength < sizeof( IPPacket_t ) )
 | 
			
		||||
	{
 | 
			
		||||
		return ipINVALID_LENGTH;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* Parse the packet length. */
 | 
			
		||||
	/* Parse the packet length. */
 | 
			
		||||
	pxIPPacket = ( const IPPacket_t * ) pucEthernetBuffer;
 | 
			
		||||
    
 | 
			
		||||
    /* Per https://tools.ietf.org/html/rfc791, the four-bit Internet Header 
 | 
			
		||||
    Length field contains the length of the internet header in 32-bit words. */
 | 
			
		||||
	uxIPHeaderLength = ( UBaseType_t ) 
 | 
			
		||||
        ( sizeof( uint32_t ) * ( pxIPPacket->xIPHeader.ucVersionHeaderLength & 0x0Fu ) ); 
 | 
			
		||||
 | 
			
		||||
    /* Check for minimum packet size. */
 | 
			
		||||
    if( uxBufferLength < sizeof( IPPacket_t ) + uxIPHeaderLength - ipSIZE_OF_IPv4_HEADER )
 | 
			
		||||
    {
 | 
			
		||||
        return ipINVALID_LENGTH;
 | 
			
		||||
    }
 | 
			
		||||
    if( uxBufferLength < FreeRTOS_ntohs( pxIPPacket->xIPHeader.usLength ) )
 | 
			
		||||
    {
 | 
			
		||||
        return ipINVALID_LENGTH;
 | 
			
		||||
    }
 | 
			
		||||
	/* Per https://tools.ietf.org/html/rfc791, the four-bit Internet Header
 | 
			
		||||
	Length field contains the length of the internet header in 32-bit words. */
 | 
			
		||||
	uxIPHeaderLength = ( UBaseType_t ) ( sizeof( uint32_t ) * ( pxIPPacket->xIPHeader.ucVersionHeaderLength & 0x0Fu ) );
 | 
			
		||||
 | 
			
		||||
    /* Identify the next protocol. */
 | 
			
		||||
    ucProtocol = pxIPPacket->xIPHeader.ucProtocol; 
 | 
			
		||||
	/* Check for minimum packet size. */
 | 
			
		||||
	if( uxBufferLength < sizeof( IPPacket_t ) + uxIPHeaderLength - ipSIZE_OF_IPv4_HEADER )
 | 
			
		||||
	{
 | 
			
		||||
		return ipINVALID_LENGTH;
 | 
			
		||||
	}
 | 
			
		||||
	if( uxBufferLength < FreeRTOS_ntohs( pxIPPacket->xIPHeader.usLength ) )
 | 
			
		||||
	{
 | 
			
		||||
		return ipINVALID_LENGTH;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* N.B., if this IP packet header includes Options, then the following 
 | 
			
		||||
    assignment results in a pointer into the protocol packet with the Ethernet 
 | 
			
		||||
    and IP headers incorrectly aligned. However, either way, the "third"
 | 
			
		||||
    protocol (Layer 3 or 4) header will be aligned, which is the convenience 
 | 
			
		||||
    of this calculation. */
 | 
			
		||||
    pxProtPack = ( ProtocolPacket_t * ) ( pucEthernetBuffer + ( uxIPHeaderLength - ipSIZE_OF_IPv4_HEADER ) );
 | 
			
		||||
	/* Identify the next protocol. */
 | 
			
		||||
	ucProtocol = pxIPPacket->xIPHeader.ucProtocol;
 | 
			
		||||
 | 
			
		||||
    /* Switch on the Layer 3/4 protocol. */
 | 
			
		||||
	/* N.B., if this IP packet header includes Options, then the following
 | 
			
		||||
	assignment results in a pointer into the protocol packet with the Ethernet
 | 
			
		||||
	and IP headers incorrectly aligned. However, either way, the "third"
 | 
			
		||||
	protocol (Layer 3 or 4) header will be aligned, which is the convenience
 | 
			
		||||
	of this calculation. */
 | 
			
		||||
	pxProtPack = ( ProtocolPacket_t * ) ( pucEthernetBuffer + ( uxIPHeaderLength - ipSIZE_OF_IPv4_HEADER ) );
 | 
			
		||||
 | 
			
		||||
	/* Switch on the Layer 3/4 protocol. */
 | 
			
		||||
	if( ucProtocol == ( uint8_t ) ipPROTOCOL_UDP )
 | 
			
		||||
	{
 | 
			
		||||
        if( uxBufferLength < uxIPHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_UDP_HEADER )
 | 
			
		||||
        {
 | 
			
		||||
            return ipINVALID_LENGTH;
 | 
			
		||||
        }
 | 
			
		||||
		if( uxBufferLength < ( uxIPHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_UDP_HEADER ) )
 | 
			
		||||
		{
 | 
			
		||||
			return ipINVALID_LENGTH;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pusChecksum = ( uint16_t * ) ( &( pxProtPack->xUDPPacket.xUDPHeader.usChecksum ) );
 | 
			
		||||
		#if( ipconfigHAS_DEBUG_PRINTF != 0 )
 | 
			
		||||
@ -1854,12 +1851,12 @@ uint8_t ucProtocol;
 | 
			
		||||
	}
 | 
			
		||||
	else if( ucProtocol == ( uint8_t ) ipPROTOCOL_TCP )
 | 
			
		||||
	{
 | 
			
		||||
        if( uxBufferLength < uxIPHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_TCP_HEADER )
 | 
			
		||||
        {
 | 
			
		||||
            return ipINVALID_LENGTH;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        pusChecksum = ( uint16_t * ) ( &( pxProtPack->xTCPPacket.xTCPHeader.usChecksum ) );
 | 
			
		||||
		if( uxBufferLength < ( uxIPHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_TCP_HEADER ) )
 | 
			
		||||
		{
 | 
			
		||||
			return ipINVALID_LENGTH;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pusChecksum = ( uint16_t * ) ( &( pxProtPack->xTCPPacket.xTCPHeader.usChecksum ) );
 | 
			
		||||
		#if( ipconfigHAS_DEBUG_PRINTF != 0 )
 | 
			
		||||
		{
 | 
			
		||||
			pcType = "TCP";
 | 
			
		||||
@ -1869,12 +1866,12 @@ uint8_t ucProtocol;
 | 
			
		||||
	else if( ( ucProtocol == ( uint8_t ) ipPROTOCOL_ICMP ) ||
 | 
			
		||||
			( ucProtocol == ( uint8_t ) ipPROTOCOL_IGMP ) )
 | 
			
		||||
	{
 | 
			
		||||
        if( uxBufferLength < uxIPHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_ICMP_HEADER )
 | 
			
		||||
        {
 | 
			
		||||
            return ipINVALID_LENGTH;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        pusChecksum = ( uint16_t * ) ( &( pxProtPack->xICMPPacket.xICMPHeader.usChecksum ) );
 | 
			
		||||
		if( uxBufferLength < ( uxIPHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_ICMP_HEADER ) )
 | 
			
		||||
		{
 | 
			
		||||
			return ipINVALID_LENGTH;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pusChecksum = ( uint16_t * ) ( &( pxProtPack->xICMPPacket.xICMPHeader.usChecksum ) );
 | 
			
		||||
		#if( ipconfigHAS_DEBUG_PRINTF != 0 )
 | 
			
		||||
		{
 | 
			
		||||
			if( ucProtocol == ( uint8_t ) ipPROTOCOL_ICMP )
 | 
			
		||||
@ -1894,8 +1891,8 @@ uint8_t ucProtocol;
 | 
			
		||||
		return ipUNHANDLED_PROTOCOL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    /* The protocol and checksum field have been identified. Check the direction
 | 
			
		||||
    of the packet. */
 | 
			
		||||
	/* The protocol and checksum field have been identified. Check the direction
 | 
			
		||||
	of the packet. */
 | 
			
		||||
	if( xOutgoingPacket != pdFALSE )
 | 
			
		||||
	{
 | 
			
		||||
		/* This is an outgoing packet. Before calculating the checksum, set it
 | 
			
		||||
@ -2021,12 +2018,12 @@ uint8_t ucProtocol;
 | 
			
		||||
 *
 | 
			
		||||
 * Arguments:
 | 
			
		||||
 *   ulSum: This argument provides a value to initialize the progressive summation
 | 
			
		||||
 *     of the header's values to. It is often 0, but protocols like TCP or UDP
 | 
			
		||||
 *     can have pseudo-header fields which need to be included in the checksum.
 | 
			
		||||
 *	 of the header's values to. It is often 0, but protocols like TCP or UDP
 | 
			
		||||
 *	 can have pseudo-header fields which need to be included in the checksum.
 | 
			
		||||
 *   pucNextData: This argument contains the address of the first byte which this
 | 
			
		||||
 *     method should process. The method's memory iterator is initialized to this value.
 | 
			
		||||
 *	 method should process. The method's memory iterator is initialized to this value.
 | 
			
		||||
 *   uxDataLengthBytes: This argument contains the number of bytes that this method
 | 
			
		||||
 *     should process.
 | 
			
		||||
 *	 should process.
 | 
			
		||||
 */
 | 
			
		||||
uint16_t usGenerateChecksum( uint32_t ulSum, const uint8_t * pucNextData, size_t uxDataLengthBytes )
 | 
			
		||||
{
 | 
			
		||||
@ -2226,8 +2223,8 @@ uint32_t FreeRTOS_GetNetmask( void )
 | 
			
		||||
 | 
			
		||||
void FreeRTOS_UpdateMACAddress( const uint8_t ucMACAddress[ipMAC_ADDRESS_LENGTH_BYTES] )
 | 
			
		||||
{
 | 
			
		||||
    /* Copy the MAC address at the start of the default packet header fragment. */
 | 
			
		||||
    memcpy( ( void * )ipLOCAL_MAC_ADDRESS, ( void * )ucMACAddress, ( size_t )ipMAC_ADDRESS_LENGTH_BYTES );
 | 
			
		||||
	/* Copy the MAC address at the start of the default packet header fragment. */
 | 
			
		||||
	memcpy( ( void * )ipLOCAL_MAC_ADDRESS, ( void * )ucMACAddress, ( size_t )ipMAC_ADDRESS_LENGTH_BYTES );
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -48,16 +48,16 @@ port number. */
 | 
			
		||||
 | 
			
		||||
/* Test if a socket it bound which means it is either included in
 | 
			
		||||
xBoundUDPSocketsList or xBoundTCPSocketsList */
 | 
			
		||||
#define socketSOCKET_IS_BOUND( pxSocket )      ( listLIST_ITEM_CONTAINER( & ( pxSocket )->xBoundSocketListItem ) != NULL )
 | 
			
		||||
#define socketSOCKET_IS_BOUND( pxSocket )	  ( listLIST_ITEM_CONTAINER( & ( pxSocket )->xBoundSocketListItem ) != NULL )
 | 
			
		||||
 | 
			
		||||
/* If FreeRTOS_sendto() is called on a socket that is not bound to a port
 | 
			
		||||
number then, depending on the FreeRTOSIPConfig.h settings, it might be that a
 | 
			
		||||
port number is automatically generated for the socket.  Automatically generated
 | 
			
		||||
port numbers will be between socketAUTO_PORT_ALLOCATION_START_NUMBER and
 | 
			
		||||
0xffff. 
 | 
			
		||||
0xffff.
 | 
			
		||||
 | 
			
		||||
Per https://tools.ietf.org/html/rfc6056, "the dynamic ports consist of the range
 | 
			
		||||
49152-65535. However, ephemeral port selection algorithms should use the whole 
 | 
			
		||||
49152-65535. However, ephemeral port selection algorithms should use the whole
 | 
			
		||||
range 1024-65535" excluding those already in use (inbound or outbound). */
 | 
			
		||||
#if !defined( socketAUTO_PORT_ALLOCATION_START_NUMBER )
 | 
			
		||||
	#define socketAUTO_PORT_ALLOCATION_START_NUMBER ( ( uint16_t ) 0x0400 )
 | 
			
		||||
@ -190,15 +190,15 @@ BaseType_t xReturn = pdTRUE;
 | 
			
		||||
 | 
			
		||||
BaseType_t vNetworkSocketsInit( void )
 | 
			
		||||
{
 | 
			
		||||
    vListInitialise( &xBoundUDPSocketsList );
 | 
			
		||||
	vListInitialise( &xBoundUDPSocketsList );
 | 
			
		||||
 | 
			
		||||
    #if( ipconfigUSE_TCP == 1 )
 | 
			
		||||
    {
 | 
			
		||||
        vListInitialise( &xBoundTCPSocketsList );
 | 
			
		||||
    }
 | 
			
		||||
    #endif  /* ipconfigUSE_TCP == 1 */
 | 
			
		||||
	#if( ipconfigUSE_TCP == 1 )
 | 
			
		||||
	{
 | 
			
		||||
		vListInitialise( &xBoundTCPSocketsList );
 | 
			
		||||
	}
 | 
			
		||||
	#endif  /* ipconfigUSE_TCP == 1 */
 | 
			
		||||
 | 
			
		||||
    return pdTRUE;
 | 
			
		||||
	return pdTRUE;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
@ -232,7 +232,7 @@ FreeRTOS_Socket_t *pxSocket;
 | 
			
		||||
			if( xType != FREERTOS_SOCK_DGRAM )
 | 
			
		||||
			{
 | 
			
		||||
				xReturn = pdFAIL;
 | 
			
		||||
                configASSERT( xReturn );
 | 
			
		||||
				configASSERT( xReturn );
 | 
			
		||||
			}
 | 
			
		||||
			/* In case a UDP socket is created, do not allocate space for TCP data. */
 | 
			
		||||
			*pxSocketSize = ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xUDP );
 | 
			
		||||
@ -243,7 +243,7 @@ FreeRTOS_Socket_t *pxSocket;
 | 
			
		||||
			if( xType != FREERTOS_SOCK_STREAM )
 | 
			
		||||
			{
 | 
			
		||||
				xReturn = pdFAIL;
 | 
			
		||||
                configASSERT( xReturn );
 | 
			
		||||
				configASSERT( xReturn );
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			*pxSocketSize = ( sizeof( *pxSocket ) - sizeof( pxSocket->u ) ) + sizeof( pxSocket->u.xTCP );
 | 
			
		||||
@ -252,7 +252,7 @@ FreeRTOS_Socket_t *pxSocket;
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			xReturn = pdFAIL;
 | 
			
		||||
            configASSERT( xReturn );
 | 
			
		||||
			configASSERT( xReturn );
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	/* In case configASSERT() is not used */
 | 
			
		||||
@ -317,9 +317,9 @@ Socket_t xReturn;
 | 
			
		||||
			listSET_LIST_ITEM_OWNER( &( pxSocket->xBoundSocketListItem ), ( void * ) pxSocket );
 | 
			
		||||
 | 
			
		||||
			pxSocket->xReceiveBlockTime = ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME;
 | 
			
		||||
			pxSocket->xSendBlockTime    = ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME;
 | 
			
		||||
			pxSocket->xSendBlockTime	= ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME;
 | 
			
		||||
			pxSocket->ucSocketOptions   = ( uint8_t ) FREERTOS_SO_UDPCKSUM_OUT;
 | 
			
		||||
			pxSocket->ucProtocol        = ( uint8_t ) xProtocol; /* protocol: UDP or TCP */
 | 
			
		||||
			pxSocket->ucProtocol		= ( uint8_t ) xProtocol; /* protocol: UDP or TCP */
 | 
			
		||||
 | 
			
		||||
			#if( ipconfigUSE_TCP == 1 )
 | 
			
		||||
			{
 | 
			
		||||
@ -327,7 +327,7 @@ Socket_t xReturn;
 | 
			
		||||
				{
 | 
			
		||||
					/* StreamSize is expressed in number of bytes */
 | 
			
		||||
					/* Round up buffer sizes to nearest multiple of MSS */
 | 
			
		||||
					pxSocket->u.xTCP.usInitMSS    = pxSocket->u.xTCP.usCurMSS = ipconfigTCP_MSS;
 | 
			
		||||
					pxSocket->u.xTCP.usInitMSS	= pxSocket->u.xTCP.usCurMSS = ipconfigTCP_MSS;
 | 
			
		||||
					pxSocket->u.xTCP.uxRxStreamSize = ( size_t ) ipconfigTCP_RX_BUFFER_LENGTH;
 | 
			
		||||
					pxSocket->u.xTCP.uxTxStreamSize = ( size_t ) FreeRTOS_round_up( ipconfigTCP_TX_BUFFER_LENGTH, ipconfigTCP_MSS );
 | 
			
		||||
					/* Use half of the buffer size of the TCP windows */
 | 
			
		||||
@ -1009,11 +1009,11 @@ List_t *pxSocketList;
 | 
			
		||||
	{
 | 
			
		||||
		if( pxAddress->sin_port == 0u )
 | 
			
		||||
		{
 | 
			
		||||
			pxAddress->sin_port = prvGetPrivatePortNumber( ( BaseType_t )pxSocket->ucProtocol );            
 | 
			
		||||
            if( 0 == pxAddress->sin_port )
 | 
			
		||||
            {
 | 
			
		||||
                return -pdFREERTOS_ERRNO_EADDRNOTAVAIL;
 | 
			
		||||
            }
 | 
			
		||||
			pxAddress->sin_port = prvGetPrivatePortNumber( ( BaseType_t )pxSocket->ucProtocol );
 | 
			
		||||
			if( 0 == pxAddress->sin_port )
 | 
			
		||||
			{
 | 
			
		||||
				return -pdFREERTOS_ERRNO_EADDRNOTAVAIL;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* If vSocketBind() is called from the API FreeRTOS_bind() it has been
 | 
			
		||||
@ -1610,9 +1610,9 @@ FreeRTOS_Socket_t *pxSocket;
 | 
			
		||||
/* Find an available port number per https://tools.ietf.org/html/rfc6056. */
 | 
			
		||||
static uint16_t prvGetPrivatePortNumber( BaseType_t xProtocol )
 | 
			
		||||
{
 | 
			
		||||
const uint16_t usEphemeralPortCount = 
 | 
			
		||||
    socketAUTO_PORT_ALLOCATION_MAX_NUMBER - socketAUTO_PORT_ALLOCATION_START_NUMBER + 1;
 | 
			
		||||
uint16_t usIterations = usEphemeralPortCount; 
 | 
			
		||||
const uint16_t usEphemeralPortCount =
 | 
			
		||||
	socketAUTO_PORT_ALLOCATION_MAX_NUMBER - socketAUTO_PORT_ALLOCATION_START_NUMBER + 1;
 | 
			
		||||
uint16_t usIterations = usEphemeralPortCount;
 | 
			
		||||
uint32_t ulRandomSeed = 0;
 | 
			
		||||
uint16_t usResult = 0;
 | 
			
		||||
BaseType_t xGotZeroOnce = pdFALSE;
 | 
			
		||||
@ -1632,52 +1632,52 @@ const List_t *pxList;
 | 
			
		||||
	/* Avoid compiler warnings if ipconfigUSE_TCP is not defined. */
 | 
			
		||||
	( void ) xProtocol;
 | 
			
		||||
 | 
			
		||||
    /* Find the next available port using the random seed as a starting 
 | 
			
		||||
    point. */
 | 
			
		||||
    do
 | 
			
		||||
    {
 | 
			
		||||
        /* Generate a random seed. */
 | 
			
		||||
        ulRandomSeed = ipconfigRAND32( );
 | 
			
		||||
	/* Find the next available port using the random seed as a starting
 | 
			
		||||
	point. */
 | 
			
		||||
	do
 | 
			
		||||
	{
 | 
			
		||||
		/* Generate a random seed. */
 | 
			
		||||
		ulRandomSeed = ipconfigRAND32( );
 | 
			
		||||
 | 
			
		||||
        /* Only proceed if the random number generator succeeded. */
 | 
			
		||||
        if( 0 == ulRandomSeed )
 | 
			
		||||
        {
 | 
			
		||||
            if( pdFALSE == xGotZeroOnce )
 | 
			
		||||
            {
 | 
			
		||||
                xGotZeroOnce = pdTRUE;
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
		/* Only proceed if the random number generator succeeded. */
 | 
			
		||||
		if( 0 == ulRandomSeed )
 | 
			
		||||
		{
 | 
			
		||||
			if( pdFALSE == xGotZeroOnce )
 | 
			
		||||
			{
 | 
			
		||||
				xGotZeroOnce = pdTRUE;
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
        /* Map the random to a candidate port. */
 | 
			
		||||
        usResult =
 | 
			
		||||
            socketAUTO_PORT_ALLOCATION_START_NUMBER +
 | 
			
		||||
            ( ( ( uint16_t )ulRandomSeed ) % usEphemeralPortCount );
 | 
			
		||||
		/* Map the random to a candidate port. */
 | 
			
		||||
		usResult =
 | 
			
		||||
			socketAUTO_PORT_ALLOCATION_START_NUMBER +
 | 
			
		||||
			( ( ( uint16_t )ulRandomSeed ) % usEphemeralPortCount );
 | 
			
		||||
 | 
			
		||||
        /* Check if there's already an open socket with the same protocol
 | 
			
		||||
        and port. */
 | 
			
		||||
        if( NULL == pxListFindListItemWithValue( 
 | 
			
		||||
            pxList, 
 | 
			
		||||
            ( TickType_t )FreeRTOS_htons( usResult ) ) )
 | 
			
		||||
        {
 | 
			
		||||
            usResult = FreeRTOS_htons( usResult );
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            usResult = 0;
 | 
			
		||||
        }
 | 
			
		||||
		/* Check if there's already an open socket with the same protocol
 | 
			
		||||
		and port. */
 | 
			
		||||
		if( NULL == pxListFindListItemWithValue(
 | 
			
		||||
			pxList,
 | 
			
		||||
			( TickType_t )FreeRTOS_htons( usResult ) ) )
 | 
			
		||||
		{
 | 
			
		||||
			usResult = FreeRTOS_htons( usResult );
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			usResult = 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
        usIterations--;
 | 
			
		||||
    }
 | 
			
		||||
    while( usIterations > 0 );
 | 
			
		||||
    
 | 
			
		||||
    return usResult;
 | 
			
		||||
} 
 | 
			
		||||
		usIterations--;
 | 
			
		||||
	}
 | 
			
		||||
	while( usIterations > 0 );
 | 
			
		||||
 | 
			
		||||
	return usResult;
 | 
			
		||||
}
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/* pxListFindListItemWithValue: find a list item in a bound socket list
 | 
			
		||||
@ -3339,7 +3339,7 @@ void vSocketWakeUpUser( FreeRTOS_Socket_t *pxSocket )
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			FreeRTOS_printf( ( "Prot Port IP-Remote       : Port  R/T Status       Alive  tmout Child\n" ) );
 | 
			
		||||
			FreeRTOS_printf( ( "Prot Port IP-Remote	   : Port  R/T Status	   Alive  tmout Child\n" ) );
 | 
			
		||||
			for( pxIterator  = ( ListItem_t * ) listGET_HEAD_ENTRY( &xBoundTCPSocketsList );
 | 
			
		||||
				 pxIterator != ( ListItem_t * ) listGET_END_MARKER( &xBoundTCPSocketsList );
 | 
			
		||||
				 pxIterator  = ( ListItem_t * ) listGET_NEXT( pxIterator ) )
 | 
			
		||||
 | 
			
		||||
@ -349,14 +349,13 @@ static NetworkBufferDescriptor_t *prvTCPBufferResize( FreeRTOS_Socket_t *pxSocke
 | 
			
		||||
	static uint8_t prvWinScaleFactor( FreeRTOS_Socket_t *pxSocket );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
/*
 | 
			
		||||
 * Generate a randomized TCP Initial Sequence Number per RFC.
 | 
			
		||||
 */
 | 
			
		||||
extern uint32_t ulApplicationGetNextSequenceNumber(
 | 
			
		||||
    uint32_t ulSourceAddress,
 | 
			
		||||
    uint16_t usSourcePort,
 | 
			
		||||
    uint32_t ulDestinationAddress,
 | 
			
		||||
    uint16_t usDestinationPort );
 | 
			
		||||
extern uint32_t ulApplicationGetNextSequenceNumber( uint32_t ulSourceAddress,
 | 
			
		||||
													uint16_t usSourcePort,
 | 
			
		||||
													uint32_t ulDestinationAddress,
 | 
			
		||||
													uint16_t usDestinationPort );
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
@ -854,8 +853,8 @@ NetworkBufferDescriptor_t xTempBuffer;
 | 
			
		||||
			vFlip_32( pxTCPPacket->xTCPHeader.ulSequenceNumber, pxTCPPacket->xTCPHeader.ulAckNr );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pxIPHeader->ucTimeToLive           = ( uint8_t ) ipconfigTCP_TIME_TO_LIVE;
 | 
			
		||||
		pxIPHeader->usLength               = FreeRTOS_htons( ulLen );
 | 
			
		||||
		pxIPHeader->ucTimeToLive		   = ( uint8_t ) ipconfigTCP_TIME_TO_LIVE;
 | 
			
		||||
		pxIPHeader->usLength			   = FreeRTOS_htons( ulLen );
 | 
			
		||||
		if( ( pxSocket == NULL ) || ( *ipLOCAL_IP_ADDRESS_POINTER == 0ul ) )
 | 
			
		||||
		{
 | 
			
		||||
			/* When pxSocket is NULL, this function is called by prvTCPSendReset()
 | 
			
		||||
@ -1023,21 +1022,20 @@ uint32_t ulInitialSequenceNumber = 0;
 | 
			
		||||
		xReturn = pdFALSE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    if( xReturn != pdFALSE )
 | 
			
		||||
    {
 | 
			
		||||
        /* Get a difficult-to-predict initial sequence number for this 4-tuple. */
 | 
			
		||||
        ulInitialSequenceNumber = ulApplicationGetNextSequenceNumber( 
 | 
			
		||||
            *ipLOCAL_IP_ADDRESS_POINTER, 
 | 
			
		||||
            pxSocket->usLocalPort, 
 | 
			
		||||
            pxSocket->u.xTCP.ulRemoteIP, 
 | 
			
		||||
            pxSocket->u.xTCP.usRemotePort );
 | 
			
		||||
	if( xReturn != pdFALSE )
 | 
			
		||||
	{
 | 
			
		||||
		/* Get a difficult-to-predict initial sequence number for this 4-tuple. */
 | 
			
		||||
		ulInitialSequenceNumber = ulApplicationGetNextSequenceNumber( *ipLOCAL_IP_ADDRESS_POINTER,
 | 
			
		||||
																	  pxSocket->usLocalPort,
 | 
			
		||||
																	  pxSocket->u.xTCP.ulRemoteIP,
 | 
			
		||||
																	  pxSocket->u.xTCP.usRemotePort );
 | 
			
		||||
 | 
			
		||||
        /* Check for a random number generation error. */
 | 
			
		||||
        if( 0 == ulInitialSequenceNumber )
 | 
			
		||||
        {
 | 
			
		||||
            xReturn = pdFALSE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
		/* Check for a random number generation error. */
 | 
			
		||||
		if( 0 == ulInitialSequenceNumber )
 | 
			
		||||
		{
 | 
			
		||||
			xReturn = pdFALSE;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( xReturn != pdFALSE )
 | 
			
		||||
	{
 | 
			
		||||
@ -1152,17 +1150,17 @@ UBaseType_t uxNewMSS;
 | 
			
		||||
	pucLast = pucPtr + (((pxTCPHeader->ucTCPOffset >> 4) - 5) << 2);
 | 
			
		||||
	pxTCPWindow = &pxSocket->u.xTCP.xTCPWindow;
 | 
			
		||||
 | 
			
		||||
    /* Validate options size calculation. */
 | 
			
		||||
    if( pucLast > ( pxNetworkBuffer->pucEthernetBuffer + pxNetworkBuffer->xDataLength ) )
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
	/* Validate options size calculation. */
 | 
			
		||||
	if( pucLast > ( pxNetworkBuffer->pucEthernetBuffer + pxNetworkBuffer->xDataLength ) )
 | 
			
		||||
	{
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* The comparison with pucLast is only necessary in case the option data are
 | 
			
		||||
	corrupted, we don't like to run into invalid memory and crash. */
 | 
			
		||||
	while( pucPtr < pucLast )
 | 
			
		||||
	{
 | 
			
		||||
        UBaseType_t xRemainingOptionsBytes = pucLast - pucPtr;
 | 
			
		||||
		UBaseType_t xRemainingOptionsBytes = pucLast - pucPtr;
 | 
			
		||||
 | 
			
		||||
		if( pucPtr[ 0 ] == TCP_OPT_END )
 | 
			
		||||
		{
 | 
			
		||||
@ -1171,26 +1169,25 @@ UBaseType_t uxNewMSS;
 | 
			
		||||
		}
 | 
			
		||||
		if( pucPtr[ 0 ] == TCP_OPT_NOOP)
 | 
			
		||||
		{
 | 
			
		||||
            /* NOP option, inserted to make the length a multiple of 4. */
 | 
			
		||||
            pucPtr++;
 | 
			
		||||
            continue;
 | 
			
		||||
			/* NOP option, inserted to make the length a multiple of 4. */
 | 
			
		||||
			pucPtr++;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
        /* Any other well-formed option must be at least two bytes: the option
 | 
			
		||||
        type byte followed by a length byte. */
 | 
			
		||||
        if( xRemainingOptionsBytes < 2 )
 | 
			
		||||
        { 
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
		/* Any other well-formed option must be at least two bytes: the option
 | 
			
		||||
		type byte followed by a length byte. */
 | 
			
		||||
		if( xRemainingOptionsBytes < 2 )
 | 
			
		||||
		{
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
#if( ipconfigUSE_TCP_WIN != 0 )
 | 
			
		||||
		else if( pucPtr[ 0 ] == TCP_OPT_WSOPT )
 | 
			
		||||
		{
 | 
			
		||||
            /* Confirm that the option fits in the remaining buffer space. */
 | 
			
		||||
            if( xRemainingOptionsBytes < TCP_OPT_WSOPT_LEN ||
 | 
			
		||||
                pucPtr[ 1 ] != TCP_OPT_WSOPT_LEN )
 | 
			
		||||
            {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
			/* Confirm that the option fits in the remaining buffer space. */
 | 
			
		||||
			if( ( xRemainingOptionsBytes < TCP_OPT_WSOPT_LEN ) || ( pucPtr[ 1 ] != TCP_OPT_WSOPT_LEN ) )
 | 
			
		||||
			{
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			pxSocket->u.xTCP.ucPeerWinScaleFactor = pucPtr[ 2 ];
 | 
			
		||||
			pxSocket->u.xTCP.bits.bWinScaling = pdTRUE_UNSIGNED;
 | 
			
		||||
@ -1199,25 +1196,24 @@ UBaseType_t uxNewMSS;
 | 
			
		||||
#endif	/* ipconfigUSE_TCP_WIN */
 | 
			
		||||
		else if( pucPtr[ 0 ] == TCP_OPT_MSS )
 | 
			
		||||
		{
 | 
			
		||||
            /* Confirm that the option fits in the remaining buffer space. */
 | 
			
		||||
            if( xRemainingOptionsBytes < TCP_OPT_MSS_LEN ||
 | 
			
		||||
                pucPtr[ 1 ] != TCP_OPT_MSS_LEN )
 | 
			
		||||
            {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            /* An MSS option with the correct option length.  FreeRTOS_htons()
 | 
			
		||||
			/* Confirm that the option fits in the remaining buffer space. */
 | 
			
		||||
			if( ( xRemainingOptionsBytes < TCP_OPT_MSS_LEN )|| ( pucPtr[ 1 ] != TCP_OPT_MSS_LEN ) )
 | 
			
		||||
			{
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/* An MSS option with the correct option length.  FreeRTOS_htons()
 | 
			
		||||
			is not needed here because usChar2u16() already returns a host
 | 
			
		||||
			endian number. */
 | 
			
		||||
			uxNewMSS = usChar2u16( pucPtr + 2 );
 | 
			
		||||
 | 
			
		||||
			if( pxSocket->u.xTCP.usInitMSS != uxNewMSS )
 | 
			
		||||
			{
 | 
			
		||||
                /* Perform a basic check on the the new MSS. */
 | 
			
		||||
                if( uxNewMSS == 0 )
 | 
			
		||||
                {
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
				/* Perform a basic check on the the new MSS. */
 | 
			
		||||
				if( uxNewMSS == 0 )
 | 
			
		||||
				{
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				FreeRTOS_debug_printf( ( "MSS change %u -> %lu\n", pxSocket->u.xTCP.usInitMSS, uxNewMSS ) );
 | 
			
		||||
			}
 | 
			
		||||
@ -1253,10 +1249,10 @@ UBaseType_t uxNewMSS;
 | 
			
		||||
			/* All other options have a length field, so that we easily
 | 
			
		||||
			can skip past them. */
 | 
			
		||||
			unsigned char len = pucPtr[ 1 ];
 | 
			
		||||
			if( len < 2 || len > xRemainingOptionsBytes )
 | 
			
		||||
			if( ( len < 2 ) || ( len > xRemainingOptionsBytes ) )
 | 
			
		||||
			{
 | 
			
		||||
				/* If the length field is too small or too big, the options are malformed. 
 | 
			
		||||
                Don't process them further. */
 | 
			
		||||
				/* If the length field is too small or too big, the options are malformed.
 | 
			
		||||
				Don't process them further. */
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -1394,7 +1390,7 @@ UBaseType_t uxOptionsLength;
 | 
			
		||||
		pxTCPHeader->ucOptdata[ uxOptionsLength + 3 ] = 2;	/* 2: length of this option. */
 | 
			
		||||
		uxOptionsLength += 4u;
 | 
			
		||||
 | 
			
		||||
        return uxOptionsLength; /* bytes, not words. */
 | 
			
		||||
		return uxOptionsLength; /* bytes, not words. */
 | 
			
		||||
	}
 | 
			
		||||
	#endif	/* ipconfigUSE_TCP_WIN == 0 */
 | 
			
		||||
}
 | 
			
		||||
@ -1639,8 +1635,8 @@ BaseType_t xResize;
 | 
			
		||||
 | 
			
		||||
		if( pxReturn != NULL )
 | 
			
		||||
		{
 | 
			
		||||
            /* Set the actual packet size, in case the returned buffer is larger. */
 | 
			
		||||
            pxReturn->xDataLength = lNeeded;
 | 
			
		||||
			/* Set the actual packet size, in case the returned buffer is larger. */
 | 
			
		||||
			pxReturn->xDataLength = lNeeded;
 | 
			
		||||
 | 
			
		||||
			/* Copy the existing data to the new created buffer. */
 | 
			
		||||
			if( pxNetworkBuffer )
 | 
			
		||||
@ -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
 | 
			
		||||
	byte, needs no ntoh() translation).  A shift-right 2: is the same as
 | 
			
		||||
	(offset >> 4) * 4. */
 | 
			
		||||
    lTCPHeaderLength = ( BaseType_t ) ( ( pxTCPHeader->ucTCPOffset & VALID_BITS_IN_TCP_OFFSET_BYTE ) >> 2 );
 | 
			
		||||
	lTCPHeaderLength = ( BaseType_t ) ( ( pxTCPHeader->ucTCPOffset & VALID_BITS_IN_TCP_OFFSET_BYTE ) >> 2 );
 | 
			
		||||
 | 
			
		||||
	/* Let pucRecvData point to the first byte received. */
 | 
			
		||||
	*ppucRecvData = pxNetworkBuffer->pucEthernetBuffer + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER + lTCPHeaderLength;
 | 
			
		||||
@ -2436,7 +2432,7 @@ int32_t lDistance, lSendResult;
 | 
			
		||||
		{
 | 
			
		||||
			/* xTCPWindowTxDone returns true when all Tx queues are empty. */
 | 
			
		||||
			bRxComplete = xTCPWindowRxEmpty( pxTCPWindow );
 | 
			
		||||
			bTxDone     = xTCPWindowTxDone( pxTCPWindow );
 | 
			
		||||
			bTxDone	 = xTCPWindowTxDone( pxTCPWindow );
 | 
			
		||||
 | 
			
		||||
			if( ( bRxComplete == 0 ) || ( bTxDone == 0 ) )
 | 
			
		||||
			{
 | 
			
		||||
@ -2905,24 +2901,23 @@ uint32_t ulRemoteIP;
 | 
			
		||||
uint16_t xRemotePort;
 | 
			
		||||
BaseType_t xResult = pdPASS;
 | 
			
		||||
 | 
			
		||||
    /* Check for a minimum packet size. */
 | 
			
		||||
    if( pxNetworkBuffer->xDataLength >= 
 | 
			
		||||
        ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_TCP_HEADER )
 | 
			
		||||
    {
 | 
			
		||||
        ucTCPFlags = pxTCPPacket->xTCPHeader.ucTCPFlags;
 | 
			
		||||
        ulLocalIP = FreeRTOS_htonl( pxTCPPacket->xIPHeader.ulDestinationIPAddress );
 | 
			
		||||
        xLocalPort = FreeRTOS_htons( pxTCPPacket->xTCPHeader.usDestinationPort );
 | 
			
		||||
        ulRemoteIP = FreeRTOS_htonl( pxTCPPacket->xIPHeader.ulSourceIPAddress );
 | 
			
		||||
        xRemotePort = FreeRTOS_htons( pxTCPPacket->xTCPHeader.usSourcePort );
 | 
			
		||||
	/* Check for a minimum packet size. */
 | 
			
		||||
	if( pxNetworkBuffer->xDataLength >= ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER + ipSIZE_OF_TCP_HEADER ) )
 | 
			
		||||
	{
 | 
			
		||||
		ucTCPFlags = pxTCPPacket->xTCPHeader.ucTCPFlags;
 | 
			
		||||
		ulLocalIP = FreeRTOS_htonl( pxTCPPacket->xIPHeader.ulDestinationIPAddress );
 | 
			
		||||
		xLocalPort = FreeRTOS_htons( pxTCPPacket->xTCPHeader.usDestinationPort );
 | 
			
		||||
		ulRemoteIP = FreeRTOS_htonl( pxTCPPacket->xIPHeader.ulSourceIPAddress );
 | 
			
		||||
		xRemotePort = FreeRTOS_htons( pxTCPPacket->xTCPHeader.usSourcePort );
 | 
			
		||||
 | 
			
		||||
        /* Find the destination socket, and if not found: return a socket listing to
 | 
			
		||||
        the destination PORT. */
 | 
			
		||||
        pxSocket = ( FreeRTOS_Socket_t * )pxTCPSocketLookup( ulLocalIP, xLocalPort, ulRemoteIP, xRemotePort );
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        return pdFAIL;
 | 
			
		||||
    }
 | 
			
		||||
		/* Find the destination socket, and if not found: return a socket listing to
 | 
			
		||||
		the destination PORT. */
 | 
			
		||||
		pxSocket = ( FreeRTOS_Socket_t * )pxTCPSocketLookup( ulLocalIP, xLocalPort, ulRemoteIP, xRemotePort );
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		return pdFAIL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if( ( pxSocket == NULL ) || ( prvTCPSocketIsActive( ( UBaseType_t ) pxSocket->u.xTCP.ucTCPState ) == pdFALSE ) )
 | 
			
		||||
	{
 | 
			
		||||
@ -3086,64 +3081,63 @@ TCPPacket_t * pxTCPPacket = ( TCPPacket_t * ) ( pxNetworkBuffer->pucEthernetBuff
 | 
			
		||||
FreeRTOS_Socket_t *pxReturn = NULL;
 | 
			
		||||
uint32_t ulInitialSequenceNumber;
 | 
			
		||||
 | 
			
		||||
    /* Assume that a new Initial Sequence Number will be required. Request 
 | 
			
		||||
    it now in order to fail out if necessary. */
 | 
			
		||||
    ulInitialSequenceNumber = ulApplicationGetNextSequenceNumber(
 | 
			
		||||
        *ipLOCAL_IP_ADDRESS_POINTER,
 | 
			
		||||
        pxSocket->usLocalPort,
 | 
			
		||||
        pxTCPPacket->xIPHeader.ulSourceIPAddress,
 | 
			
		||||
        pxTCPPacket->xTCPHeader.usSourcePort );
 | 
			
		||||
	/* Assume that a new Initial Sequence Number will be required. Request
 | 
			
		||||
	it now in order to fail out if necessary. */
 | 
			
		||||
	ulInitialSequenceNumber = ulApplicationGetNextSequenceNumber( *ipLOCAL_IP_ADDRESS_POINTER,
 | 
			
		||||
																  pxSocket->usLocalPort,
 | 
			
		||||
																  pxTCPPacket->xIPHeader.ulSourceIPAddress,
 | 
			
		||||
																  pxTCPPacket->xTCPHeader.usSourcePort );
 | 
			
		||||
 | 
			
		||||
	/* A pure SYN (without ACK) has come in, create a new socket to answer
 | 
			
		||||
	it. */
 | 
			
		||||
    if( 0 != ulInitialSequenceNumber )
 | 
			
		||||
    {
 | 
			
		||||
        if( pxSocket->u.xTCP.bits.bReuseSocket != pdFALSE_UNSIGNED )
 | 
			
		||||
        {
 | 
			
		||||
            /* The flag bReuseSocket indicates that the same instance of the
 | 
			
		||||
            listening socket should be used for the connection. */
 | 
			
		||||
            pxReturn = pxSocket;
 | 
			
		||||
            pxSocket->u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
 | 
			
		||||
            pxSocket->u.xTCP.pxPeerSocket = pxSocket;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            /* The socket does not have the bReuseSocket flag set meaning create a
 | 
			
		||||
            new socket when a connection comes in. */
 | 
			
		||||
            pxReturn = NULL;
 | 
			
		||||
	if( 0 != ulInitialSequenceNumber )
 | 
			
		||||
	{
 | 
			
		||||
		if( pxSocket->u.xTCP.bits.bReuseSocket != pdFALSE_UNSIGNED )
 | 
			
		||||
		{
 | 
			
		||||
			/* The flag bReuseSocket indicates that the same instance of the
 | 
			
		||||
			listening socket should be used for the connection. */
 | 
			
		||||
			pxReturn = pxSocket;
 | 
			
		||||
			pxSocket->u.xTCP.bits.bPassQueued = pdTRUE_UNSIGNED;
 | 
			
		||||
			pxSocket->u.xTCP.pxPeerSocket = pxSocket;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			/* The socket does not have the bReuseSocket flag set meaning create a
 | 
			
		||||
			new socket when a connection comes in. */
 | 
			
		||||
			pxReturn = NULL;
 | 
			
		||||
 | 
			
		||||
            if( pxSocket->u.xTCP.usChildCount >= pxSocket->u.xTCP.usBacklog )
 | 
			
		||||
            {
 | 
			
		||||
                FreeRTOS_printf( ( "Check: Socket %u already has %u / %u child%s\n",
 | 
			
		||||
                    pxSocket->usLocalPort,
 | 
			
		||||
                    pxSocket->u.xTCP.usChildCount,
 | 
			
		||||
                    pxSocket->u.xTCP.usBacklog,
 | 
			
		||||
                    pxSocket->u.xTCP.usChildCount == 1 ? "" : "ren" ) );
 | 
			
		||||
                prvTCPSendReset( pxNetworkBuffer );
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                FreeRTOS_Socket_t *pxNewSocket = ( FreeRTOS_Socket_t * )
 | 
			
		||||
                    FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
 | 
			
		||||
			if( pxSocket->u.xTCP.usChildCount >= pxSocket->u.xTCP.usBacklog )
 | 
			
		||||
			{
 | 
			
		||||
				FreeRTOS_printf( ( "Check: Socket %u already has %u / %u child%s\n",
 | 
			
		||||
					pxSocket->usLocalPort,
 | 
			
		||||
					pxSocket->u.xTCP.usChildCount,
 | 
			
		||||
					pxSocket->u.xTCP.usBacklog,
 | 
			
		||||
					pxSocket->u.xTCP.usChildCount == 1 ? "" : "ren" ) );
 | 
			
		||||
				prvTCPSendReset( pxNetworkBuffer );
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				FreeRTOS_Socket_t *pxNewSocket = ( FreeRTOS_Socket_t * )
 | 
			
		||||
					FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
 | 
			
		||||
 | 
			
		||||
                if( ( pxNewSocket == NULL ) || ( pxNewSocket == FREERTOS_INVALID_SOCKET ) )
 | 
			
		||||
                {
 | 
			
		||||
                    FreeRTOS_debug_printf( ( "TCP: Listen: new socket failed\n" ) );
 | 
			
		||||
                    prvTCPSendReset( pxNetworkBuffer );
 | 
			
		||||
                }
 | 
			
		||||
                else if( prvTCPSocketCopy( pxNewSocket, pxSocket ) != pdFALSE )
 | 
			
		||||
                {
 | 
			
		||||
                    /* The socket will be connected immediately, no time for the
 | 
			
		||||
                    owner to setsockopt's, therefore copy properties of the server
 | 
			
		||||
                    socket to the new socket.  Only the binding might fail (due to
 | 
			
		||||
                    lack of resources). */
 | 
			
		||||
                    pxReturn = pxNewSocket;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
				if( ( pxNewSocket == NULL ) || ( pxNewSocket == FREERTOS_INVALID_SOCKET ) )
 | 
			
		||||
				{
 | 
			
		||||
					FreeRTOS_debug_printf( ( "TCP: Listen: new socket failed\n" ) );
 | 
			
		||||
					prvTCPSendReset( pxNetworkBuffer );
 | 
			
		||||
				}
 | 
			
		||||
				else if( prvTCPSocketCopy( pxNewSocket, pxSocket ) != pdFALSE )
 | 
			
		||||
				{
 | 
			
		||||
					/* The socket will be connected immediately, no time for the
 | 
			
		||||
					owner to setsockopt's, therefore copy properties of the server
 | 
			
		||||
					socket to the new socket.  Only the binding might fail (due to
 | 
			
		||||
					lack of resources). */
 | 
			
		||||
					pxReturn = pxNewSocket;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    if( 0 != ulInitialSequenceNumber && pxReturn != NULL )
 | 
			
		||||
	if( ( 0 != ulInitialSequenceNumber ) && ( pxReturn != NULL ) )
 | 
			
		||||
	{
 | 
			
		||||
		pxReturn->u.xTCP.usRemotePort = FreeRTOS_htons( pxTCPPacket->xTCPHeader.usSourcePort );
 | 
			
		||||
		pxReturn->u.xTCP.ulRemoteIP = FreeRTOS_htonl( pxTCPPacket->xIPHeader.ulSourceIPAddress );
 | 
			
		||||
@ -3310,5 +3304,6 @@ BaseType_t xResult = pdFALSE;
 | 
			
		||||
 | 
			
		||||
/* Provide access to private members for testing. */
 | 
			
		||||
#ifdef AMAZON_FREERTOS_ENABLE_UNIT_TESTS
 | 
			
		||||
    #include "aws_freertos_tcp_test_access_tcp_define.h"
 | 
			
		||||
	#include "aws_freertos_tcp_test_access_tcp_define.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -244,7 +244,7 @@ FreeRTOS_Socket_t *pxSocket;
 | 
			
		||||
UDPPacket_t *pxUDPPacket = (UDPPacket_t *) pxNetworkBuffer->pucEthernetBuffer;
 | 
			
		||||
 | 
			
		||||
	/* Caller must check for minimum packet size. */
 | 
			
		||||
    pxSocket = pxUDPSocketLookup( usPort );
 | 
			
		||||
	pxSocket = pxUDPSocketLookup( usPort );
 | 
			
		||||
 | 
			
		||||
	if( pxSocket )
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
@ -389,9 +389,9 @@ from the FreeRTOSIPConfig.h configuration header file. */
 | 
			
		||||
 | 
			
		||||
#if( ipconfigUSE_DNS_CACHE != 0 )
 | 
			
		||||
	#ifndef ipconfigDNS_CACHE_NAME_LENGTH
 | 
			
		||||
        /* Per https://tools.ietf.org/html/rfc1035, 253 is the maximum string length
 | 
			
		||||
        of a DNS name. The following default accounts for a null terminator. */
 | 
			
		||||
        #define ipconfigDNS_CACHE_NAME_LENGTH   254
 | 
			
		||||
		/* Per https://tools.ietf.org/html/rfc1035, 253 is the maximum string length
 | 
			
		||||
		of a DNS name. The following default accounts for a null terminator. */
 | 
			
		||||
		#define ipconfigDNS_CACHE_NAME_LENGTH   254
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#ifndef ipconfigDNS_CACHE_ENTRIES
 | 
			
		||||
@ -535,7 +535,7 @@ connections, hang protection can help reduce the impact of SYN floods. */
 | 
			
		||||
 | 
			
		||||
/* Non-activity timeout is expressed in seconds. */
 | 
			
		||||
#ifndef ipconfigTCP_HANG_PROTECTION_TIME
 | 
			
		||||
    #define ipconfigTCP_HANG_PROTECTION_TIME 30
 | 
			
		||||
	#define ipconfigTCP_HANG_PROTECTION_TIME 30
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef ipconfigTCP_IP_SANITY
 | 
			
		||||
 | 
			
		||||
@ -80,9 +80,9 @@ typedef struct xTCP_WINSIZE
 | 
			
		||||
 */
 | 
			
		||||
/* Keep this as a multiple of 4 */
 | 
			
		||||
#if( ipconfigUSE_TCP_WIN == 1 )
 | 
			
		||||
    #define ipSIZE_TCP_OPTIONS	16u
 | 
			
		||||
	#define ipSIZE_TCP_OPTIONS	16u
 | 
			
		||||
#else
 | 
			
		||||
    #define ipSIZE_TCP_OPTIONS   12u
 | 
			
		||||
	#define ipSIZE_TCP_OPTIONS   12u
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user