in source/core_sntp_client.c [427:505]
SntpStatus_t Sntp_SendTimeRequest( SntpContext_t * pContext,
uint32_t randomNumber,
uint32_t blockTimeMs )
{
SntpStatus_t status = SntpSuccess;
/* Validate the context parameter. */
status = validateContext( pContext );
if( status == SntpSuccess )
{
const SntpServerInfo_t * pServer = NULL;
/* Set local variable for the currently indexed server to use for time
* query. */
pServer = &pContext->pTimeServers[ pContext->currentServerIndex ];
LogDebug( ( "Using server %.*s for time query", ( int ) pServer->serverNameLen, pServer->pServerName ) );
/* Perform DNS resolution of the currently indexed server in the list
* of configured servers. */
if( pContext->resolveDnsFunc( pServer, &pContext->currentServerAddr ) == false )
{
LogError( ( "Unable to send time request: DNS resolution failed: Server=%.*s",
( int ) pServer->serverNameLen, pServer->pServerName ) );
status = SntpErrorDnsFailure;
}
else
{
LogDebug( ( "Server DNS resolved: Address=0x%08X", pContext->currentServerAddr ) );
}
if( status == SntpSuccess )
{
/* Obtain current system time to generate SNTP request packet. */
pContext->getTimeFunc( &pContext->lastRequestTime );
LogDebug( ( "Obtained current time for SNTP request packet: Time=%us %ums",
pContext->lastRequestTime.seconds, FRACTIONS_TO_MS( pContext->lastRequestTime.fractions ) ) );
/* Generate SNTP request packet with the current system time and
* the passed random number. */
status = Sntp_SerializeRequest( &pContext->lastRequestTime,
randomNumber,
pContext->pNetworkBuffer,
pContext->bufferSize );
/* The serialization should be successful as all parameter validation has
* been done before. */
assert( status == SntpSuccess );
}
/* If an authentication interface has been configured, call the function to append client
* authentication data to SNTP request buffer. */
if( ( status == SntpSuccess ) && ( pContext->authIntf.generateClientAuth != NULL ) )
{
status = addClientAuthentication( pContext );
}
if( status == SntpSuccess )
{
LogInfo( ( "Sending serialized SNTP request packet to the server: Addr=%u, Port=%u",
pContext->currentServerAddr,
pContext->pTimeServers[ pContext->currentServerIndex ].port ) );
/* Send the request packet over the network to the time server. */
status = sendSntpPacket( &pContext->networkIntf,
pContext->currentServerAddr,
pContext->pTimeServers[ pContext->currentServerIndex ].port,
pContext->getTimeFunc,
pContext->pNetworkBuffer,
pContext->sntpPacketSize,
blockTimeMs );
}
}
return status;
}