Clean up defender demo (#422)

This commit is contained in:
Archit Gupta 2020-11-24 11:50:13 -08:00 committed by GitHub
parent ced1845508
commit 5ba1e4cf95
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 114 additions and 94 deletions

View file

@ -96,8 +96,15 @@
*/
#define DEFENDER_RESPONSE_WAIT_SECONDS ( 2 )
/**
* @brief Name of the report id field in the response from the AWS IoT Device
* Defender service.
*/
#define DEFENDER_RESPONSE_REPORT_ID_FIELD "reportId"
/**
* @brief The length of #DEFENDER_RESPONSE_REPORT_ID_FIELD.
*/
#define DEFENDER_RESPONSE_REPORT_ID_FIELD_LENGTH ( sizeof( DEFENDER_RESPONSE_REPORT_ID_FIELD ) - 1 )
/**

View file

@ -62,23 +62,29 @@ eMetricsCollectorStatus eGetNetworkStats( NetworkStats_t * pxOutNetworkStats )
configASSERT( pxOutNetworkStats != NULL );
if( eStatus == eMetricsCollectorSuccess )
/* Start with everything as zero. */
memset( pxOutNetworkStats, 0, sizeof( NetworkStats_t ) );
/* Get metrics from FreeRTOS+TCP tcp_netstat utility. */
xMetricsStatus = vGetMetrics( &xMetrics );
if( xMetricsStatus != 0 )
{
/* Start with everything as zero. */
memset( pxOutNetworkStats, 0, sizeof( NetworkStats_t ) );
/* Get metrics from FreeRTOS+TCP tcp_netstat utility. */
xMetricsStatus = vGetMetrics( &xMetrics );
if( xMetricsStatus != 0 )
{
eStatus = eMetricsCollectorCollectionFailed;
}
LogError( ( "Failed to acquire metrics from FreeRTOS+TCP tcp_netstat utility. Status: %d.",
( int ) xMetricsStatus ) );
eStatus = eMetricsCollectorCollectionFailed;
}
/* Fill our response with values gotten from FreeRTOS+TCP. */
if( eStatus == eMetricsCollectorSuccess )
{
LogDebug( ( "Network stats read. Bytes received: %u, packets received: %u, "
"bytes sent: %u, packets sent: %u.",
( unsigned int ) xMetrics.xInput.uxByteCount,
( unsigned int ) xMetrics.xInput.uxPacketCount,
( unsigned int ) xMetrics.XOutput.uxByteCount,
( unsigned int ) xMetrics.XOutput.uxPacketCount ) );
pxOutNetworkStats->ulBytesReceived = xMetrics.xInput.uxByteCount;
pxOutNetworkStats->ulPacketsReceived = xMetrics.xInput.uxPacketCount;
pxOutNetworkStats->ulBytesSent = xMetrics.XOutput.uxByteCount;
@ -97,19 +103,19 @@ eMetricsCollectorStatus eGetOpenTcpPorts( uint16_t * pusOutTcpPortsArray,
MetricsType_t xMetrics = { 0 };
BaseType_t xMetricsStatus = 0;
uint32_t ulCopyAmount = 0UL;
/* pusOutTcpPortsArray can be NULL. */
configASSERT( pulOutNumTcpOpenPorts != NULL );
if( eStatus == eMetricsCollectorSuccess )
{
/* Get metrics from FreeRTOS+TCP tcp_netstat utility. */
xMetricsStatus = vGetMetrics( &xMetrics );
/* Get metrics from FreeRTOS+TCP tcp_netstat utility. */
xMetricsStatus = vGetMetrics( &xMetrics );
if( xMetricsStatus != 0 )
{
eStatus = eMetricsCollectorCollectionFailed;
}
if( xMetricsStatus != 0 )
{
LogError( ( "Failed to acquire metrics from FreeRTOS+TCP tcp_netstat utility. Status: %d.",
( int ) xMetricsStatus ) );
eStatus = eMetricsCollectorCollectionFailed;
}
if( eStatus == eMetricsCollectorSuccess )
@ -121,14 +127,16 @@ eMetricsCollectorStatus eGetOpenTcpPorts( uint16_t * pusOutTcpPortsArray,
* given array. */
if( pusOutTcpPortsArray != NULL )
{
/* Lower the amount of ports copied if less are open than will fit
* in the given array. */
if( xMetrics.xTCPPortList.uxCount < ulTcpPortsArrayLength )
ulCopyAmount = xMetrics.xTCPPortList.uxCount;
/* Limit the copied ports to what can fit in the output array. */
if( ulTcpPortsArrayLength < xMetrics.xTCPPortList.uxCount )
{
ulTcpPortsArrayLength = xMetrics.xTCPPortList.uxCount;
LogWarn( ( "Ports returned truncated due to insufficient buffer size." ) );
ulCopyAmount = ulTcpPortsArrayLength;
}
memcpy( pusOutTcpPortsArray, &xMetrics.xTCPPortList.usTCPPortList, ulTcpPortsArrayLength * sizeof( uint16_t ) );
memcpy( pusOutTcpPortsArray, &xMetrics.xTCPPortList.usTCPPortList, ulCopyAmount * sizeof( uint16_t ) );
}
}
@ -144,19 +152,19 @@ eMetricsCollectorStatus eGetOpenUdpPorts( uint16_t * pusOutUdpPortsArray,
MetricsType_t xMetrics = { 0 };
BaseType_t xMetricsStatus = 0;
uint32_t ulCopyAmount = 0UL;
/* pusOutUdpPortsArray can be NULL. */
configASSERT( pulOutNumUdpOpenPorts != NULL );
if( eStatus == eMetricsCollectorSuccess )
{
/* Get metrics from FreeRTOS+TCP tcp_netstat utility. */
xMetricsStatus = vGetMetrics( &xMetrics );
/* Get metrics from FreeRTOS+TCP tcp_netstat utility. */
xMetricsStatus = vGetMetrics( &xMetrics );
if( xMetricsStatus != 0 )
{
eStatus = eMetricsCollectorCollectionFailed;
}
if( xMetricsStatus != 0 )
{
LogError( ( "Failed to acquire metrics from FreeRTOS+TCP tcp_netstat utility. Status: %d.",
( int ) xMetricsStatus ) );
eStatus = eMetricsCollectorCollectionFailed;
}
if( eStatus == eMetricsCollectorSuccess )
@ -167,14 +175,16 @@ eMetricsCollectorStatus eGetOpenUdpPorts( uint16_t * pusOutUdpPortsArray,
* given array. */
if( pusOutUdpPortsArray != NULL )
{
/* Lower the amount of ports copied if less are open than will fit
* in the given array. */
if( xMetrics.xUDPPortList.uxCount < ulUdpPortsArrayLength )
ulCopyAmount = xMetrics.xUDPPortList.uxCount;
/* Limit the copied ports to what can fit in the output array. */
if( ulUdpPortsArrayLength < xMetrics.xUDPPortList.uxCount )
{
ulUdpPortsArrayLength = xMetrics.xUDPPortList.uxCount;
LogWarn( ( "Ports returned truncated due to insufficient buffer size." ) );
ulCopyAmount = ulUdpPortsArrayLength;
}
memcpy( pusOutUdpPortsArray, &xMetrics.xUDPPortList.usUDPPortList, ulUdpPortsArrayLength * sizeof( uint16_t ) );
memcpy( pusOutUdpPortsArray, &xMetrics.xUDPPortList.usUDPPortList, ulCopyAmount * sizeof( uint16_t ) );
}
}
@ -191,20 +201,21 @@ eMetricsCollectorStatus eGetEstablishedConnections( Connection_t * pxOutConnecti
MetricsType_t xMetrics = { 0 };
BaseType_t xMetricsStatus = 0;
uint32_t ulCopyAmount = 0UL;
uint32_t ulLocalIp = 0UL;
uint32_t i;
/* pxOutConnectionsArray can be NULL. */
configASSERT( pulOutNumEstablishedConnections != NULL );
if( eStatus == eMetricsCollectorSuccess )
{
/* Get metrics from FreeRTOS+TCP tcp_netstat utility. */
xMetricsStatus = vGetMetrics( &xMetrics );
/* Get metrics from FreeRTOS+TCP tcp_netstat utility. */
xMetricsStatus = vGetMetrics( &xMetrics );
if( xMetricsStatus != 0 )
{
eStatus = eMetricsCollectorCollectionFailed;
}
if( xMetricsStatus != 0 )
{
LogError( ( "Failed to acquire metrics from FreeRTOS+TCP tcp_netstat utility. Status: %d.",
( int ) xMetricsStatus ) );
eStatus = eMetricsCollectorCollectionFailed;
}
if( eStatus == eMetricsCollectorSuccess )
@ -216,28 +227,27 @@ eMetricsCollectorStatus eGetEstablishedConnections( Connection_t * pxOutConnecti
* the given array. */
if( pxOutConnectionsArray != NULL )
{
ulCopyAmount = xMetrics.xTCPSocketList.uxCount;
/* Get local IP as the tcp_netstat utility does not give it. */
ulLocalIp = FreeRTOS_GetIPAddress();
/* Lower the amount of socket infos populated if less are open than will fit
* in the given array. */
if( xMetrics.xTCPSocketList.uxCount < ulConnectionsArrayLength )
/* Limit the outputted connections to what can fit in the output array. */
if( ulConnectionsArrayLength < xMetrics.xTCPSocketList.uxCount )
{
ulConnectionsArrayLength = xMetrics.xTCPSocketList.uxCount;
LogWarn( ( "Ports returned truncated due to insufficient buffer size." ) );
ulCopyAmount = ulConnectionsArrayLength;
}
/* If xMetrics.xTCPSocketList.uxCount > ulConnectionsArrayLength, we
* return the first ulConnectionsArrayLength ports. */
while( ulConnectionsArrayLength > 0 )
for( i = 0; i < ulCopyAmount; i++ )
{
ulConnectionsArrayLength--;
pxOutConnectionsArray[ ulConnectionsArrayLength ].ulLocalIp = ulLocalIp;
pxOutConnectionsArray[ ulConnectionsArrayLength ].usLocalPort =
xMetrics.xTCPSocketList.xTCPList[ ulConnectionsArrayLength ].usLocalPort;
pxOutConnectionsArray[ ulConnectionsArrayLength ].ulRemoteIp =
xMetrics.xTCPSocketList.xTCPList[ ulConnectionsArrayLength ].ulRemoteIP;
pxOutConnectionsArray[ ulConnectionsArrayLength ].usRemotePort =
xMetrics.xTCPSocketList.xTCPList[ ulConnectionsArrayLength ].usRemotePort;
pxOutConnectionsArray[ i ].ulLocalIp = ulLocalIp;
pxOutConnectionsArray[ i ].usLocalPort =
xMetrics.xTCPSocketList.xTCPList[ i ].usLocalPort;
pxOutConnectionsArray[ i ].ulRemoteIp =
xMetrics.xTCPSocketList.xTCPList[ i ].ulRemoteIP;
pxOutConnectionsArray[ i ].usRemotePort =
xMetrics.xTCPSocketList.xTCPList[ i ].usRemotePort;
}
}
}

View file

@ -34,6 +34,8 @@
#ifndef METRICS_COLLECTOR_H_
#define METRICS_COLLECTOR_H_
#include <stdint.h>
/**
* @brief Return codes from metrics collector APIs.
*/

View file

@ -166,9 +166,9 @@ static eReportBuilderStatus prvWritePortsArray( char * pcBuffer,
uint32_t ulOpenPortsArrayLength,
uint32_t * pulOutCharsWritten )
{
char * pCurrentWritePos = pcBuffer;
char * pcCurrentWritePos = pcBuffer;
uint32_t i, ulRemainingBufferLength = ulBufferLength;
uint32_t ulCharactersWritten;
int32_t ulCharactersWritten;
eReportBuilderStatus eStatus = eReportBuilderSuccess;
configASSERT( pcBuffer != NULL );
@ -178,9 +178,9 @@ static eReportBuilderStatus prvWritePortsArray( char * pcBuffer,
/* Write the JSON array open marker. */
if( ulRemainingBufferLength > 1 )
{
*pCurrentWritePos = reportbuilderJSON_ARRAY_OPEN_MARKER;
*pcCurrentWritePos = reportbuilderJSON_ARRAY_OPEN_MARKER;
ulRemainingBufferLength -= 1;
pCurrentWritePos += 1;
pcCurrentWritePos += 1;
}
else
{
@ -190,7 +190,7 @@ static eReportBuilderStatus prvWritePortsArray( char * pcBuffer,
/* Write the array elements. */
for( i = 0; ( ( i < ulOpenPortsArrayLength ) && ( eStatus == eReportBuilderSuccess ) ); i++ )
{
ulCharactersWritten = snprintf( pCurrentWritePos,
ulCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_PORT_OBJECT_FORMAT,
pusOpenPortsArray[ i ] );
@ -203,7 +203,7 @@ static eReportBuilderStatus prvWritePortsArray( char * pcBuffer,
else
{
ulRemainingBufferLength -= ( uint32_t ) ulCharactersWritten;
pCurrentWritePos += ulCharactersWritten;
pcCurrentWritePos += ulCharactersWritten;
}
}
@ -212,16 +212,16 @@ static eReportBuilderStatus prvWritePortsArray( char * pcBuffer,
/* Discard the last comma. */
if( ulOpenPortsArrayLength > 0 )
{
pCurrentWritePos -= 1;
pcCurrentWritePos -= 1;
ulRemainingBufferLength += 1;
}
/* Write the JSON array close marker. */
if( ulRemainingBufferLength > 1 )
{
*pCurrentWritePos = reportbuilderJSON_ARRAY_CLOSE_MARKER;
*pcCurrentWritePos = reportbuilderJSON_ARRAY_CLOSE_MARKER;
ulRemainingBufferLength -= 1;
pCurrentWritePos += 1;
pcCurrentWritePos += 1;
}
else
{
@ -244,9 +244,9 @@ static eReportBuilderStatus prvWriteConnectionsArray( char * pcBuffer,
uint32_t ulConnectionsArrayLength,
uint32_t * pulOutCharsWritten )
{
char * pCurrentWritePos = pcBuffer;
char * pcCurrentWritePos = pcBuffer;
uint32_t i, ulRemainingBufferLength = ulBufferLength;
uint32_t ulCharactersWritten;
int32_t ulCharactersWritten;
eReportBuilderStatus eStatus = eReportBuilderSuccess;
const Connection_t * pxConn;
@ -257,9 +257,9 @@ static eReportBuilderStatus prvWriteConnectionsArray( char * pcBuffer,
/* Write the JSON array open marker. */
if( ulRemainingBufferLength > 1 )
{
*pCurrentWritePos = reportbuilderJSON_ARRAY_OPEN_MARKER;
*pcCurrentWritePos = reportbuilderJSON_ARRAY_OPEN_MARKER;
ulRemainingBufferLength -= 1;
pCurrentWritePos += 1;
pcCurrentWritePos += 1;
}
else
{
@ -270,7 +270,7 @@ static eReportBuilderStatus prvWriteConnectionsArray( char * pcBuffer,
for( i = 0; ( ( i < ulConnectionsArrayLength ) && ( eStatus == eReportBuilderSuccess ) ); i++ )
{
pxConn = &( pxConnectionsArray[ i ] );
ulCharactersWritten = snprintf( pCurrentWritePos,
ulCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_CONNECTION_OBJECT_FORMAT,
pxConn->usLocalPort,
@ -288,7 +288,7 @@ static eReportBuilderStatus prvWriteConnectionsArray( char * pcBuffer,
else
{
ulRemainingBufferLength -= ulCharactersWritten;
pCurrentWritePos += ulCharactersWritten;
pcCurrentWritePos += ulCharactersWritten;
}
}
@ -297,16 +297,16 @@ static eReportBuilderStatus prvWriteConnectionsArray( char * pcBuffer,
/* Discard the last comma. */
if( ulConnectionsArrayLength > 0 )
{
pCurrentWritePos -= 1;
pcCurrentWritePos -= 1;
ulRemainingBufferLength += 1;
}
/* Write the JSON array close marker. */
if( ulRemainingBufferLength > 1 )
{
*pCurrentWritePos = reportbuilderJSON_ARRAY_CLOSE_MARKER;
*pcCurrentWritePos = reportbuilderJSON_ARRAY_CLOSE_MARKER;
ulRemainingBufferLength -= 1;
pCurrentWritePos += 1;
pcCurrentWritePos += 1;
}
else
{
@ -331,14 +331,15 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
uint32_t ulReportId,
uint32_t * pulOutReportLength )
{
char * pCurrentWritePos = pcBuffer;
char * pcCurrentWritePos = pcBuffer;
uint32_t ulRemainingBufferLength = ulBufferLength, bufferWritten;
eReportBuilderStatus eStatus = eReportBuilderSuccess;
uint32_t ulCharactersWritten;
int32_t ulCharactersWritten;
configASSERT( pcBuffer != NULL );
configASSERT( pxMetrics != NULL );
configASSERT( pulOutReportLength != NULL );
configASSERT( ulBufferLength != 0 );
if( ( pcBuffer == NULL ) ||
( ulBufferLength == 0 ) ||
@ -357,7 +358,7 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
/* Write part1. */
if( eStatus == eReportBuilderSuccess )
{
ulCharactersWritten = snprintf( pCurrentWritePos,
ulCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_REPORT_FORMAT_PART1,
ulReportId,
@ -372,14 +373,14 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
else
{
ulRemainingBufferLength -= ulCharactersWritten;
pCurrentWritePos += ulCharactersWritten;
pcCurrentWritePos += ulCharactersWritten;
}
}
/* Write TCP ports array. */
if( eStatus == eReportBuilderSuccess )
{
eStatus = prvWritePortsArray( pCurrentWritePos,
eStatus = prvWritePortsArray( pcCurrentWritePos,
ulRemainingBufferLength,
pxMetrics->pusOpenTcpPortsArray,
pxMetrics->ulOpenTcpPortsArrayLength,
@ -387,7 +388,7 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
if( eStatus == eReportBuilderSuccess )
{
pCurrentWritePos += bufferWritten;
pcCurrentWritePos += bufferWritten;
ulRemainingBufferLength -= bufferWritten;
}
else
@ -399,7 +400,7 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
/* Write part2. */
if( eStatus == eReportBuilderSuccess )
{
ulCharactersWritten = snprintf( pCurrentWritePos,
ulCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_REPORT_FORMAT_PART2,
pxMetrics->ulOpenTcpPortsArrayLength );
@ -412,14 +413,14 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
else
{
ulRemainingBufferLength -= ulCharactersWritten;
pCurrentWritePos += ulCharactersWritten;
pcCurrentWritePos += ulCharactersWritten;
}
}
/* Write UDP ports array. */
if( eStatus == eReportBuilderSuccess )
{
eStatus = prvWritePortsArray( pCurrentWritePos,
eStatus = prvWritePortsArray( pcCurrentWritePos,
ulRemainingBufferLength,
pxMetrics->pusOpenUdpPortsArray,
pxMetrics->ulOpenUdpPortsArrayLength,
@ -427,7 +428,7 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
if( eStatus == eReportBuilderSuccess )
{
pCurrentWritePos += bufferWritten;
pcCurrentWritePos += bufferWritten;
ulRemainingBufferLength -= bufferWritten;
}
else
@ -439,7 +440,7 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
/* Write part3. */
if( eStatus == eReportBuilderSuccess )
{
ulCharactersWritten = snprintf( pCurrentWritePos,
ulCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_REPORT_FORMAT_PART3,
pxMetrics->ulOpenUdpPortsArrayLength,
@ -456,14 +457,14 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
else
{
ulRemainingBufferLength -= ulCharactersWritten;
pCurrentWritePos += ulCharactersWritten;
pcCurrentWritePos += ulCharactersWritten;
}
}
/* Write connections array. */
if( eStatus == eReportBuilderSuccess )
{
eStatus = prvWriteConnectionsArray( pCurrentWritePos,
eStatus = prvWriteConnectionsArray( pcCurrentWritePos,
ulRemainingBufferLength,
pxMetrics->pxEstablishedConnectionsArray,
pxMetrics->ulEstablishedConnectionsArrayLength,
@ -471,7 +472,7 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
if( eStatus == eReportBuilderSuccess )
{
pCurrentWritePos += bufferWritten;
pcCurrentWritePos += bufferWritten;
ulRemainingBufferLength -= bufferWritten;
}
else
@ -483,7 +484,7 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
/* Write part4. */
if( eStatus == eReportBuilderSuccess )
{
ulCharactersWritten = snprintf( pCurrentWritePos,
ulCharactersWritten = snprintf( pcCurrentWritePos,
ulRemainingBufferLength,
reportbuilderJSON_REPORT_FORMAT_PART4,
pxMetrics->ulEstablishedConnectionsArrayLength );
@ -496,7 +497,7 @@ eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
else
{
ulRemainingBufferLength -= ulCharactersWritten;
pCurrentWritePos += ulCharactersWritten;
pcCurrentWritePos += ulCharactersWritten;
}
}