in source/defender-tools/report_builder.c [443:693]
eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
uint32_t ulBufferLength,
const ReportMetrics_t * pxMetrics,
uint32_t ulMajorReportVersion,
uint32_t ulMinorReportVersion,
uint32_t ulReportId,
uint32_t * pulOutReportLength )
{
char * pcCurrentWritePos = pcBuffer;
uint32_t ulRemainingBufferLength = ulBufferLength, bufferWritten;
eReportBuilderStatus eStatus = eReportBuilderSuccess;
int32_t lCharactersWritten;
configASSERT( pcBuffer != NULL );
configASSERT( pxMetrics != NULL );
configASSERT( pulOutReportLength != NULL );
configASSERT( ulBufferLength != 0 );
if( ( pcBuffer == NULL ) ||
( ulBufferLength == 0 ) ||
( pxMetrics == NULL ) ||
( pulOutReportLength == NULL ) )
{
LogError( ( "Invalid parameters. pcBuffer: %p, ulBufferLength: %u"
" pMetrics: %p, pOutReprotLength: %p.",
pcBuffer,
ulBufferLength,
pxMetrics,
pulOutReportLength ) );
eStatus = eReportBuilderBadParameter;
}
/* Write part1. */
if( eStatus == eReportBuilderSuccess )
{
lCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_REPORT_FORMAT_PART1,
DEFENDER_REPORT_HEADER_KEY,
DEFENDER_REPORT_ID_KEY,
ulReportId,
DEFENDER_REPORT_VERSION_KEY,
ulMajorReportVersion,
ulMinorReportVersion,
DEFENDER_REPORT_METRICS_KEY,
DEFENDER_REPORT_TCP_LISTENING_PORTS_KEY,
DEFENDER_REPORT_PORTS_KEY
);
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
{
LogError( ( "Failed to write part 1." ) );
eStatus = eReportBuilderBufferTooSmall;
}
else
{
ulRemainingBufferLength -= lCharactersWritten;
pcCurrentWritePos += lCharactersWritten;
}
}
/* Write TCP ports array. */
if( eStatus == eReportBuilderSuccess )
{
eStatus = prvWritePortsArray( pcCurrentWritePos,
ulRemainingBufferLength,
pxMetrics->pusOpenTcpPortsArray,
pxMetrics->ulOpenTcpPortsArrayLength,
&( bufferWritten ) );
if( eStatus == eReportBuilderSuccess )
{
pcCurrentWritePos += bufferWritten;
ulRemainingBufferLength -= bufferWritten;
}
else
{
LogError( ( "Failed to write TCP ports array." ) );
}
}
/* Write part2. */
if( eStatus == eReportBuilderSuccess )
{
lCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_REPORT_FORMAT_PART2,
DEFENDER_REPORT_TOTAL_KEY,
pxMetrics->ulOpenTcpPortsArrayLength,
DEFENDER_REPORT_UDP_LISTENING_PORTS_KEY,
DEFENDER_REPORT_PORTS_KEY
);
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
{
LogError( ( "Failed to write part 2." ) );
eStatus = eReportBuilderBufferTooSmall;
}
else
{
ulRemainingBufferLength -= lCharactersWritten;
pcCurrentWritePos += lCharactersWritten;
}
}
/* Write UDP ports array. */
if( eStatus == eReportBuilderSuccess )
{
eStatus = prvWritePortsArray( pcCurrentWritePos,
ulRemainingBufferLength,
pxMetrics->pusOpenUdpPortsArray,
pxMetrics->ulOpenUdpPortsArrayLength,
&( bufferWritten ) );
if( eStatus == eReportBuilderSuccess )
{
pcCurrentWritePos += bufferWritten;
ulRemainingBufferLength -= bufferWritten;
}
else
{
LogError( ( "Failed to write UDP ports array." ) );
}
}
/* Write part3. */
if( eStatus == eReportBuilderSuccess )
{
lCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_REPORT_FORMAT_PART3,
DEFENDER_REPORT_TOTAL_KEY,
pxMetrics->ulOpenUdpPortsArrayLength,
DEFENDER_REPORT_NETWORK_STATS_KEY,
DEFENDER_REPORT_BYTES_IN_KEY,
pxMetrics->pxNetworkStats->ulBytesReceived,
DEFENDER_REPORT_BYTES_OUT_KEY,
pxMetrics->pxNetworkStats->ulBytesSent,
DEFENDER_REPORT_PKTS_IN_KEY,
pxMetrics->pxNetworkStats->ulPacketsReceived,
DEFENDER_REPORT_PKTS_OUT_KEY,
pxMetrics->pxNetworkStats->ulPacketsSent,
DEFENDER_REPORT_TCP_CONNECTIONS_KEY,
DEFENDER_REPORT_ESTABLISHED_CONNECTIONS_KEY,
DEFENDER_REPORT_CONNECTIONS_KEY
);
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
{
LogError( ( "Failed to write part 3." ) );
eStatus = eReportBuilderBufferTooSmall;
}
else
{
ulRemainingBufferLength -= lCharactersWritten;
pcCurrentWritePos += lCharactersWritten;
}
}
/* Write connections array. */
if( eStatus == eReportBuilderSuccess )
{
eStatus = prvWriteConnectionsArray( pcCurrentWritePos,
ulRemainingBufferLength,
pxMetrics->pxEstablishedConnectionsArray,
pxMetrics->ulEstablishedConnectionsArrayLength,
&( bufferWritten ) );
if( eStatus == eReportBuilderSuccess )
{
pcCurrentWritePos += bufferWritten;
ulRemainingBufferLength -= bufferWritten;
}
else
{
LogError( ( "Failed to write established connections array." ) );
}
}
/* Write part4. */
if( eStatus == eReportBuilderSuccess )
{
lCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_REPORT_FORMAT_PART4,
DEFENDER_REPORT_TOTAL_KEY,
pxMetrics->ulEstablishedConnectionsArrayLength,
DEFENDER_REPORT_CUSTOM_METRICS_KEY,
DEFENDER_REPORT_NUMBER_KEY,
pxMetrics->ulStackHighWaterMark,
DEFENDER_REPORT_NUMBER_LIST_KEY
);
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
{
LogError( ( "Failed to write part 4." ) );
eStatus = eReportBuilderBufferTooSmall;
}
else
{
ulRemainingBufferLength -= lCharactersWritten;
pcCurrentWritePos += lCharactersWritten;
}
}
/* Write task ids array. */
if( eStatus == eReportBuilderSuccess )
{
eStatus = prvWriteTaskIdsArray( pcCurrentWritePos,
ulRemainingBufferLength,
pxMetrics->pulTaskIdsArray,
pxMetrics->ulTaskIdsArrayLength,
&( bufferWritten ) );
if( eStatus == eReportBuilderSuccess )
{
pcCurrentWritePos += bufferWritten;
ulRemainingBufferLength -= bufferWritten;
}
else
{
LogError( ( "Failed to write task ids array." ) );
}
}
/* Write part5. */
if( eStatus == eReportBuilderSuccess )
{
lCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_REPORT_FORMAT_PART5 );
if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
{
LogError( ( "Failed to write part 5." ) );
eStatus = eReportBuilderBufferTooSmall;
}
else
{
ulRemainingBufferLength -= lCharactersWritten;
pcCurrentWritePos += lCharactersWritten;
}
}
if( eStatus == eReportBuilderSuccess )
{
*pulOutReportLength = ulBufferLength - ulRemainingBufferLength;
}
return eStatus;
}