/* Define FreeRTOS_gethostbyname() as a normal blocking call. */ uint32_t FreeRTOS_gethostbyname( const char *pcHostName ) { return FreeRTOS_gethostbyname_a( pcHostName, ( FOnDNSEvent ) NULL, ( void* )NULL, 0 ); }
static void prvNTPTask( void *pvParameters ) { BaseType_t xServerIndex = 3; struct freertos_sockaddr xAddress; #if( ipconfigUSE_CALLBACKS != 0 ) F_TCP_UDP_Handler_t xHandler; #endif /* ipconfigUSE_CALLBACKS != 0 */ xStatus = EStatusLookup; #if( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 ) || ( ipconfigUSE_CALLBACKS != 0 ) { xNTPWakeupSem = xSemaphoreCreateBinary(); } #endif #if( ipconfigUSE_CALLBACKS != 0 ) { memset( &xHandler, '\0', sizeof ( xHandler ) ); xHandler.pOnUdpReceive = xOnUdpReceive; FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_UDP_RECV_HANDLER, ( void * ) &xHandler, sizeof( xHandler ) ); } #endif #if( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 ) { FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_SET_SEMAPHORE, ( void * ) &xNTPWakeupSem, sizeof( xNTPWakeupSem ) ); } #endif for( ; ; ) { switch( xStatus ) { case EStatusLookup: if( ( ulIPAddressFound == 0ul ) || ( ulIPAddressFound == ~0ul ) ) { if( ++xServerIndex == sizeof pcTimeServers / sizeof pcTimeServers[ 0 ] ) { xServerIndex = 0; } FreeRTOS_printf( ( "Looking up server '%s'\n", pcTimeServers[ xServerIndex ] ) ); FreeRTOS_gethostbyname_a( pcTimeServers[ xServerIndex ], vDNS_callback, (void *)NULL, 1200 ); } else { xStatus = EStatusAsking; } break; case EStatusAsking: { char pcBuf[16]; prvNTPPacketInit( ); xAddress.sin_addr = ulIPAddressFound; xAddress.sin_port = FreeRTOS_htons( NTP_PORT ); FreeRTOS_inet_ntoa( xAddress.sin_addr, pcBuf ); FreeRTOS_printf( ( "Sending UDP message to %s:%u\n", pcBuf, FreeRTOS_ntohs( xAddress.sin_port ) ) ); uxSendTime = xTaskGetTickCount( ); FreeRTOS_sendto( xUDPSocket, ( void * )&xNTPPacket, sizeof( xNTPPacket ), 0, &xAddress, sizeof( xAddress ) ); } break; case EStatusPause: break; case EStatusFailed: break; } #if( ipconfigUSE_CALLBACKS != 0 ) { xSemaphoreTake( xNTPWakeupSem, 5000 ); } #else { uint32_t xAddressSize; BaseType_t xReturned; xAddressSize = sizeof( xAddress ); xReturned = FreeRTOS_recvfrom( xUDPSocket, ( void * ) cRecvBuffer, sizeof( cRecvBuffer ), 0, &xAddress, &xAddressSize ); switch( xReturned ) { case 0: case -pdFREERTOS_ERRNO_EAGAIN: case -pdFREERTOS_ERRNO_EINTR: break; default: if( xReturned < sizeof( xNTPPacket ) ) { FreeRTOS_printf( ( "FreeRTOS_recvfrom: returns %ld\n", xReturned ) ); } else { prvReadTime( ( struct SNtpPacket *)cRecvBuffer ); if( xStatus != EStatusPause ) { xStatus = EStatusPause; } } break; } } #endif } }