in source/ota.c [2484:2555]
static IngestResult_t processDataBlock( OtaFileContext_t * pFileContext,
uint32_t uBlockIndex,
uint32_t uBlockSize,
OtaPalStatus_t * pCloseResult,
uint8_t * pPayload )
{
IngestResult_t eIngestResult = IngestResultUninitialized;
uint32_t byte = 0;
uint8_t bitMask = 0;
if( validateDataBlock( pFileContext, uBlockIndex, uBlockSize ) == true )
{
/* Create bit mask for use in our bitmap. BITS_PER_BYTE is 8 so it will never overflow. */
bitMask = ( uint8_t ) ( 1U << ( uBlockIndex % BITS_PER_BYTE ) );
/* Calculate byte offset into bitmap. */
byte = uBlockIndex >> LOG2_BITS_PER_BYTE;
/* Check if we have already received this block. */
if( ( ( pFileContext->pRxBlockBitmap[ byte ] ) & bitMask ) == 0U )
{
LogWarn( ( "Received a duplicate block: Block index=%u, Block size=%u",
uBlockIndex, uBlockSize ) );
LogDebug( ( "Number of blocks remaining: %u",
pFileContext->blocksRemaining ) );
eIngestResult = IngestResultDuplicate_Continue;
*pCloseResult = OTA_PAL_COMBINE_ERR( OtaPalSuccess, 0 ); /* This is a success path. */
}
}
else
{
LogError( ( "Block range check failed: Received a block outside of the expected range: "
"Block index=%u, Block size=%u",
uBlockIndex, uBlockSize ) );
eIngestResult = IngestResultBlockOutOfRange;
}
/* Process the received data block. */
if( eIngestResult == IngestResultUninitialized )
{
if( pFileContext->pFile != NULL )
{
int32_t iBytesWritten = otaAgent.pOtaInterface->pal.writeBlock( pFileContext,
( uBlockIndex * OTA_FILE_BLOCK_SIZE ),
pPayload,
uBlockSize );
if( iBytesWritten < 0 )
{
eIngestResult = IngestResultWriteBlockFailed;
LogError( ( "Failed to ingest received block: IngestResult_t=%d",
eIngestResult ) );
}
else
{
/* Mark this block as received in our bitmap. */
pFileContext->pRxBlockBitmap[ byte ] &= ( uint8_t ) ( 0xFF & ( ~bitMask ) );
pFileContext->blocksRemaining--;
eIngestResult = IngestResultAccepted_Continue;
*pCloseResult = OTA_PAL_COMBINE_ERR( OtaPalSuccess, 0 );
}
}
else
{
LogError( ( "Parameter check failed: pFileContext->pFile is NULL." ) );
eIngestResult = IngestResultBadFileHandle;
}
}
return eIngestResult;
}