From 2b4f8d4094aa7d6b2409f53579688b8d47cff6b4 Mon Sep 17 00:00:00 2001 From: Archit Gupta <71798289+archigup@users.noreply.github.com> Date: Thu, 19 Nov 2020 18:29:37 -0800 Subject: [PATCH] Port Defender demo from C-SDK (#407) --- .../DemoTasks/DefenderDemoExample.c | 818 ++++++++++++++++++ .../Device_Defender_Demo/FreeRTOSConfig.h | 208 +++++ .../Device_Defender_Demo/FreeRTOSIPConfig.h | 311 +++++++ .../Device_Defender_Demo/WIN32.vcxproj | 629 ++++++++++++++ .../WIN32.vcxproj.filters | 769 ++++++++++++++++ .../Device_Defender_Demo/core_mqtt_config.h | 96 ++ .../Device_Defender_Demo/defender_config.h | 55 ++ .../Device_Defender_Demo/defender_demo.sln | 25 + .../Device_Defender_Demo/demo_config.h | 279 ++++++ .../Device_Defender_Demo/main.c | 381 ++++++++ .../Device_Defender_Demo/mbedtls_config.h | 151 ++++ .../Device_Defender_Demo/metrics_collector.c | 247 ++++++ .../Device_Defender_Demo/metrics_collector.h | 144 +++ .../Device_Defender_Demo/report_builder.c | 506 +++++++++++ .../Device_Defender_Demo/report_builder.h | 81 ++ .../AWS/Mqtt_Demo_Helpers/mqtt_demo_helpers.c | 36 +- .../AWS/Mqtt_Demo_Helpers/mqtt_demo_helpers.h | 18 +- 17 files changed, 4748 insertions(+), 6 deletions(-) create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/DemoTasks/DefenderDemoExample.c create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/FreeRTOSConfig.h create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/FreeRTOSIPConfig.h create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/WIN32.vcxproj create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/WIN32.vcxproj.filters create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/core_mqtt_config.h create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/defender_config.h create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/defender_demo.sln create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/demo_config.h create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/main.c create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/mbedtls_config.h create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/metrics_collector.c create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/metrics_collector.h create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/report_builder.c create mode 100644 FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/report_builder.h diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/DemoTasks/DefenderDemoExample.c b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/DemoTasks/DefenderDemoExample.c new file mode 100644 index 000000000..140c5987b --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/DemoTasks/DefenderDemoExample.c @@ -0,0 +1,818 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Demo for showing how to use the Device Defender library's APIs. The Device + * Defender library provides macros and helper functions for assembling MQTT + * topics strings, and for determining whether an incoming MQTT message is + * related to device defender. The Device Defender library does not depend on + * any particular MQTT library, therefore the code for MQTT operations is + * placed in another file (mqtt_demo_helpers.c). This demo uses the coreMQTT + * library. If needed, mqtt_demo_helpers.c can be modified to replace coreMQTT + * with another MQTT library. This demo requires using the AWS IoT broker as + * Device Defender is an AWS service. + * + * This demo connects to the AWS IoT broker and subscribes to the device + * defender topics. It then collects metrics for the open ports and sockets on + * the device using FreeRTOS+TCP, and generates a device defender report. The + * report is then published, and the demo waits for a response from the device + * defender service. Upon receiving the response or timing out, the demo + * finishes. + * + * This demo sets the report ID to xTaskGetTickCount(), which may collide if + * the device is reset. Reports for a Thing with a previously used report ID + * will be assumed to be duplicates and discarded by the Device Defender + * service. The report ID needs to be unique per report sent with a given + * Thing. We recommend using an increasing unique id such as the current + * timestamp. + */ + +/* Standard includes. */ +#include +#include +#include +#include + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo config. */ +#include "demo_config.h" + +/* JSON Library. */ +#include "core_json.h" + +/* Device Defender Client Library. */ +#include "defender.h" + +/* MQTT operations. */ +#include "mqtt_demo_helpers.h" + +/* Metrics collector. */ +#include "metrics_collector.h" + +/* Report builder. */ +#include "report_builder.h" + +/** + * democonfigTHING_NAME is required. Throw compilation error if it is not defined. + */ +#ifndef democonfigTHING_NAME + #error "Please define democonfigTHING_NAME to the thing name registered with AWS IoT Core in demo_config.h." +#endif + +/** + * @brief The length of #democonfigTHING_NAME. + */ +#define THING_NAME_LENGTH ( ( uint16_t ) ( sizeof( democonfigTHING_NAME ) - 1 ) ) + +/** + * @brief Number of seconds to wait for the response from AWS IoT Device + * Defender service. + */ +#define DEFENDER_RESPONSE_WAIT_SECONDS ( 2 ) + +#define DEFENDER_RESPONSE_REPORT_ID_FIELD "reportId" + +#define DEFENDER_RESPONSE_REPORT_ID_FIELD_LENGTH ( sizeof( DEFENDER_RESPONSE_REPORT_ID_FIELD ) - 1 ) + +/** + * @brief Status values of the device defender report. + */ +typedef enum +{ + ReportStatusNotReceived, + ReportStatusAccepted, + ReportStatusRejected +} ReportStatus_t; +/*-----------------------------------------------------------*/ + +/** + * @brief The MQTT context used for MQTT operation. + */ +static MQTTContext_t xMqttContext; + +/** + * @brief The network context used for mbedTLS operation. + */ +static NetworkContext_t xNetworkContext; + +/** + * @brief Static buffer used to hold MQTT messages being sent and received. + */ +static uint8_t ucSharedBuffer[ democonfigNETWORK_BUFFER_SIZE ]; + +/** + * @brief Static buffer used to hold MQTT messages being sent and received. + */ +static MQTTFixedBuffer_t xBuffer = +{ + ucSharedBuffer, + democonfigNETWORK_BUFFER_SIZE +}; + +/** + * @brief Network Stats. + */ +static NetworkStats_t xNetworkStats; + +/** + * @brief Open TCP ports array. + */ +static uint16_t pusOpenTcpPorts[ democonfigOPEN_TCP_PORTS_ARRAY_SIZE ]; + +/** + * @brief Open UDP ports array. + */ +static uint16_t pusOpenUdpPorts[ democonfigOPEN_UDP_PORTS_ARRAY_SIZE ]; + +/** + * @brief Established connections array. + */ +static Connection_t pxEstablishedConnections[ democonfigESTABLISHED_CONNECTIONS_ARRAY_SIZE ]; + +/** + * @brief All the metrics sent in the device defender report. + */ +static ReportMetrics_t xDeviceMetrics; + +/** + * @brief Report status. + */ +static ReportStatus_t xReportStatus; + +/** + * @brief Buffer for generating the device defender report. + */ +static char pcDeviceMetricsJsonReport[ democonfigDEVICE_METRICS_REPORT_BUFFER_SIZE ]; + +/** + * @brief Report Id sent in the defender report. + */ +static uint32_t ulReportId = 0UL; +/*-----------------------------------------------------------*/ + +/** + * @brief Callback to receive the incoming publish messages from the MQTT broker. + * + * @param[in] pxMqttContext The MQTT context for the MQTT connection. + * @param[in] pxPacketInfo Pointer to publish info of the incoming publish. + * @param[in] pxDeserializedInfo Deserialized information from the incoming publish. + */ +static void prvPublishCallback( MQTTContext_t * pxMqttContext, + MQTTPacketInfo_t * pxPacketInfo, + MQTTDeserializedInfo_t * pxDeserializedInfo ); + +/** + * @brief Collect all the metrics to be sent in the device defender report. + * + * @return true if all the metrics are successfully collected; + * false otherwise. + */ +static bool prvCollectDeviceMetrics( void ); + +/** + * @brief Generate the device defender report. + * + * @param[out] pulOutReportLength Length of the device defender report. + * + * @return true if the report is generated successfully; + * false otherwise. + */ +static bool prvGenerateDeviceMetricsReport( uint32_t * pulOutReportLength ); + +/** + * @brief Subscribe to the device defender topics. + * + * @return true if the subscribe is successful; + * false otherwise. + */ +static bool prvSubscribeToDefenderTopics( void ); + +/** + * @brief Unsubscribe from the device defender topics. + * + * @return true if the unsubscribe is successful; + * false otherwise. + */ +static bool prvUnsubscribeFromDefenderTopics( void ); + +/** + * @brief Publish the generated device defender report. + * + * @param[in] ulReportLength Length of the device defender report. + * + * @return true if the report is published successfully; + * false otherwise. + */ +static bool prvPublishDeviceMetricsReport( uint32_t ulReportLength ); + +/** + * @brief Validate the response received from the AWS IoT Device Defender Service. + * + * This functions checks that a valid JSON is received and the report ID + * is same as was sent in the published report. + * + * @param[in] pcDefenderResponse The defender response to validate. + * @param[in] ulDefenderResponseLength Length of the defender response. + * + * @return true if the response is valid; + * false otherwise. + */ +static bool prvValidateDefenderResponse( const char * pcDefenderResponse, + uint32_t ulDefenderResponseLength ); + +/** + * @brief The task used to demonstrate the Defender API. + * + * This task collects metrics from the device using the functions in + * metrics_collector.h and uses them to build a defender report using functions + * in report_builder.h. Metrics include the number for bytes written and read + * over the network, open TCP and UDP ports, and open TCP sockets. The + * generated report is then published to the AWS IoT Device Defender service. + * + * @param[in] pvParameters Parameters as passed at the time of task creation. + * Not used in this example. + */ +static void prvDefenderDemoTask( void * pvParameters ); + +/*-----------------------------------------------------------*/ + +static bool prvValidateDefenderResponse( const char * pcDefenderResponse, + uint32_t ulDefenderResponseLength ) +{ + bool xStatus = false; + JSONStatus_t eJsonResult = JSONSuccess; + char * ucReportIdString = NULL; + size_t xReportIdStringLength; + uint32_t ulReportIdInResponse; + + configASSERT( pcDefenderResponse != NULL ); + + /* Is the response a valid JSON? */ + eJsonResult = JSON_Validate( pcDefenderResponse, ulDefenderResponseLength ); + + if( eJsonResult != JSONSuccess ) + { + LogError( ( "Invalid response from AWS IoT Device Defender Service: %.*s.", + ( int ) ulDefenderResponseLength, + pcDefenderResponse ) ); + } + + if( eJsonResult == JSONSuccess ) + { + /* Search the ReportId key in the response. */ + eJsonResult = JSON_Search( ( char * ) pcDefenderResponse, + ulDefenderResponseLength, + DEFENDER_RESPONSE_REPORT_ID_FIELD, + DEFENDER_RESPONSE_REPORT_ID_FIELD_LENGTH, + &( ucReportIdString ), + &( xReportIdStringLength ) ); + + if( eJsonResult != JSONSuccess ) + { + LogError( ( "%s key not found in the response from the" + "AWS IoT Device Defender Service: %.*s.", + DEFENDER_RESPONSE_REPORT_ID_FIELD, + ( int ) ulDefenderResponseLength, + pcDefenderResponse ) ); + } + } + + if( eJsonResult == JSONSuccess ) + { + ulReportIdInResponse = ( uint32_t ) strtoul( ucReportIdString, NULL, 10 ); + + /* Is the report ID present in the response same as was sent in the + * published report? */ + if( ulReportIdInResponse == ulReportId ) + { + LogInfo( ( "A valid response with report ID %u received from the " + "AWS IoT Device Defender Service.", ulReportId ) ); + xStatus = true; + } + else + { + LogError( ( "Unexpected %s found in the response from the AWS" + "IoT Device Defender Service. Expected: %u, Found: %u, " + "Complete Response: %.*s.", + DEFENDER_RESPONSE_REPORT_ID_FIELD, + ulReportId, + ulReportIdInResponse, + ( int ) ulDefenderResponseLength, + pcDefenderResponse ) ); + } + } + + return xStatus; +} +/*-----------------------------------------------------------*/ + +static void prvPublishCallback( MQTTContext_t * pxMqttContext, + MQTTPacketInfo_t * pxPacketInfo, + MQTTDeserializedInfo_t * pxDeserializedInfo ) +{ + DefenderStatus_t xStatus; + DefenderTopic_t xApi; + bool xValidationResult; + MQTTPublishInfo_t * pxPublishInfo; + + configASSERT( pxMqttContext != NULL ); + configASSERT( pxPacketInfo != NULL ); + configASSERT( pxDeserializedInfo != NULL ); + + /* Suppress the unused parameter warning when asserts are disabled in + * build. */ + ( void ) pxMqttContext; + + /* Handle an incoming publish. The lower 4 bits of the publish packet + * type is used for the dup, QoS, and retain flags. Hence masking + * out the lower bits to check if the packet is publish. */ + if( ( pxPacketInfo->type & 0xF0U ) == MQTT_PACKET_TYPE_PUBLISH ) + { + configASSERT( pxDeserializedInfo->pPublishInfo != NULL ); + + pxPublishInfo = pxDeserializedInfo->pPublishInfo; + + /* Verify that the publish is for device defender, and if so get which + * defender API it is for */ + xStatus = Defender_MatchTopic( pxPublishInfo->pTopicName, + pxPublishInfo->topicNameLength, + &( xApi ), + NULL, + NULL ); + + if( xStatus == DefenderSuccess ) + { + if( xApi == DefenderJsonReportAccepted ) + { + /* Check if the response is valid and is for the report we + * published. If so, report was accepted. */ + xValidationResult = prvValidateDefenderResponse( pxPublishInfo->pPayload, + pxPublishInfo->payloadLength ); + + if( xValidationResult == true ) + { + LogInfo( ( "The defender report was accepted by the service. Response: %.*s.", + ( int ) pxPublishInfo->payloadLength, + ( const char * ) pxPublishInfo->pPayload ) ); + xReportStatus = ReportStatusAccepted; + } + } + else if( xApi == DefenderJsonReportRejected ) + { + /* Check if the response is valid and is for the report we + * published. If so, report was rejected. */ + xValidationResult = prvValidateDefenderResponse( pxPublishInfo->pPayload, + pxPublishInfo->payloadLength ); + + if( xValidationResult == true ) + { + LogError( ( "The defender report was rejected by the service. Response: %.*s.", + ( int ) pxPublishInfo->payloadLength, + ( const char * ) pxPublishInfo->pPayload ) ); + xReportStatus = ReportStatusRejected; + } + } + else + { + LogError( ( "Unexpected defender API : %d.", xApi ) ); + } + } + else + { + LogError( ( "Unexpected publish message received. Topic: %.*s, Payload: %.*s.", + ( int ) pxPublishInfo->topicNameLength, + ( const char * ) pxPublishInfo->pTopicName, + ( int ) pxPublishInfo->payloadLength, + ( const char * ) ( pxPublishInfo->pPayload ) ) ); + } + } + else + { + vHandleOtherIncomingPacket( pxPacketInfo, pxDeserializedInfo->packetIdentifier ); + } +} +/*-----------------------------------------------------------*/ + +static bool prvCollectDeviceMetrics( void ) +{ + bool xStatus = false; + eMetricsCollectorStatus eMetricsCollectorStatus; + uint32_t ulNumOpenTcpPorts = 0UL, ulNumOpenUdpPorts = 0UL, ulNumEstablishedConnections = 0UL; + + /* Collect bytes and packets sent and received. */ + eMetricsCollectorStatus = eGetNetworkStats( &( xNetworkStats ) ); + + if( eMetricsCollectorStatus != eMetricsCollectorSuccess ) + { + LogError( ( "xGetNetworkStats failed. Status: %d.", + eMetricsCollectorStatus ) ); + } + + /* Collect a list of open TCP ports. */ + if( eMetricsCollectorStatus == eMetricsCollectorSuccess ) + { + eMetricsCollectorStatus = eGetOpenTcpPorts( &( pusOpenTcpPorts[ 0 ] ), + democonfigOPEN_TCP_PORTS_ARRAY_SIZE, + &( ulNumOpenTcpPorts ) ); + + if( eMetricsCollectorStatus != eMetricsCollectorSuccess ) + { + LogError( ( "xGetOpenTcpPorts failed. Status: %d.", + eMetricsCollectorStatus ) ); + } + } + + /* Collect a list of open UDP ports. */ + if( eMetricsCollectorStatus == eMetricsCollectorSuccess ) + { + eMetricsCollectorStatus = eGetOpenUdpPorts( &( pusOpenUdpPorts[ 0 ] ), + democonfigOPEN_UDP_PORTS_ARRAY_SIZE, + &( ulNumOpenUdpPorts ) ); + + if( eMetricsCollectorStatus != eMetricsCollectorSuccess ) + { + LogError( ( "xGetOpenUdpPorts failed. Status: %d.", + eMetricsCollectorStatus ) ); + } + } + + /* Collect a list of established connections. */ + if( eMetricsCollectorStatus == eMetricsCollectorSuccess ) + { + eMetricsCollectorStatus = eGetEstablishedConnections( &( pxEstablishedConnections[ 0 ] ), + democonfigESTABLISHED_CONNECTIONS_ARRAY_SIZE, + &( ulNumEstablishedConnections ) ); + + if( eMetricsCollectorStatus != eMetricsCollectorSuccess ) + { + LogError( ( "GetEstablishedConnections failed. Status: %d.", + eMetricsCollectorStatus ) ); + } + } + + /* Populate device metrics. */ + if( eMetricsCollectorStatus == eMetricsCollectorSuccess ) + { + xStatus = true; + xDeviceMetrics.pxNetworkStats = &( xNetworkStats ); + xDeviceMetrics.pusOpenTcpPortsArray = &( pusOpenTcpPorts[ 0 ] ); + xDeviceMetrics.ulOpenTcpPortsArrayLength = ulNumOpenTcpPorts; + xDeviceMetrics.pusOpenUdpPortsArray = &( pusOpenUdpPorts[ 0 ] ); + xDeviceMetrics.ulOpenUdpPortsArrayLength = ulNumOpenUdpPorts; + xDeviceMetrics.pxEstablishedConnectionsArray = &( pxEstablishedConnections[ 0 ] ); + xDeviceMetrics.ulEstablishedConnectionsArrayLength = ulNumEstablishedConnections; + } + + return xStatus; +} +/*-----------------------------------------------------------*/ + +static bool prvGenerateDeviceMetricsReport( uint32_t * pulOutReportLength ) +{ + bool xStatus = false; + eReportBuilderStatus eReportBuilderStatus; + + /* Generate the metrics report in the format expected by the AWS IoT Device + * Defender Service. */ + eReportBuilderStatus = eGenerateJsonReport( &( pcDeviceMetricsJsonReport[ 0 ] ), + democonfigDEVICE_METRICS_REPORT_BUFFER_SIZE, + &( xDeviceMetrics ), + democonfigDEVICE_METRICS_REPORT_MAJOR_VERSION, + democonfigDEVICE_METRICS_REPORT_MINOR_VERSION, + ulReportId, + pulOutReportLength ); + + if( eReportBuilderStatus != eReportBuilderSuccess ) + { + LogError( ( "GenerateJsonReport failed. Status: %d.", + eReportBuilderStatus ) ); + } + else + { + LogDebug( ( "Generated Report: %.*s.", + *pulOutReportLength, + &( pcDeviceMetricsJsonReport[ 0 ] ) ) ); + xStatus = true; + } + + return xStatus; +} +/*-----------------------------------------------------------*/ + +static bool prvSubscribeToDefenderTopics( void ) +{ + bool xStatus = false; + + /* Subscribe to defender topic for responses for accepted reports. */ + xStatus = xSubscribeToTopic( &xMqttContext, + DEFENDER_API_JSON_ACCEPTED( democonfigTHING_NAME ), + DEFENDER_API_LENGTH_JSON_ACCEPTED( THING_NAME_LENGTH ) ); + + if( xStatus == false ) + { + LogError( ( "Failed to subscribe to defender topic: %.*s.", + DEFENDER_API_LENGTH_JSON_ACCEPTED( THING_NAME_LENGTH ), + DEFENDER_API_JSON_ACCEPTED( democonfigTHING_NAME ) ) ); + } + + if( xStatus == true ) + { + /* Subscribe to defender topic for responses for rejected reports. */ + xStatus = xSubscribeToTopic( &xMqttContext, + DEFENDER_API_JSON_REJECTED( democonfigTHING_NAME ), + DEFENDER_API_LENGTH_JSON_REJECTED( THING_NAME_LENGTH ) ); + + if( xStatus == false ) + { + LogError( ( "Failed to subscribe to defender topic: %.*s.", + DEFENDER_API_LENGTH_JSON_REJECTED( THING_NAME_LENGTH ), + DEFENDER_API_JSON_REJECTED( democonfigTHING_NAME ) ) ); + } + } + + return xStatus; +} +/*-----------------------------------------------------------*/ + +static bool prvUnsubscribeFromDefenderTopics( void ) +{ + bool xStatus = false; + + /* Unsubscribe from defender accepted topic. */ + xStatus = xUnsubscribeFromTopic( &xMqttContext, + DEFENDER_API_JSON_ACCEPTED( democonfigTHING_NAME ), + DEFENDER_API_LENGTH_JSON_ACCEPTED( THING_NAME_LENGTH ) ); + + if( xStatus == true ) + { + /* Unsubscribe from defender rejected topic. */ + xStatus = xUnsubscribeFromTopic( &xMqttContext, + DEFENDER_API_JSON_REJECTED( democonfigTHING_NAME ), + DEFENDER_API_LENGTH_JSON_REJECTED( THING_NAME_LENGTH ) ); + } + + return xStatus; +} +/*-----------------------------------------------------------*/ + +static bool prvPublishDeviceMetricsReport( uint32_t reportLength ) +{ + return xPublishToTopic( &xMqttContext, + DEFENDER_API_JSON_PUBLISH( democonfigTHING_NAME ), + DEFENDER_API_LENGTH_JSON_PUBLISH( THING_NAME_LENGTH ), + &( pcDeviceMetricsJsonReport[ 0 ] ), + reportLength ); +} +/*-----------------------------------------------------------*/ + +/** + * @brief Create the task that demonstrates the Device Defender library API via + * a mutually authenticated MQTT connection with the AWS IoT broker. + */ +void vStartDefenderDemo( void ) +{ + /* This example uses a single application task, which shows that how to use + * Device Defender library to generate and validate AWS IoT Device Defender + * MQTT topics, and use the coreMQTT library to communicate with the AWS + * IoT Device Defender service. */ + xTaskCreate( prvDefenderDemoTask, /* Function that implements the task. */ + "DemoTask", /* Text name for the task - only used for debugging. */ + democonfigDEMO_STACKSIZE, /* Size of stack (in words, not bytes) to allocate for the task. */ + NULL, /* Task parameter - not used in this case. */ + tskIDLE_PRIORITY, /* Task priority, must be between 0 and configMAX_PRIORITIES - 1. */ + NULL ); /* Used to pass out a handle to the created task - not used in this case. */ +} +/*-----------------------------------------------------------*/ + +void prvDefenderDemoTask( void * pvParameters ) +{ + bool xStatus = false; + BaseType_t xExitStatus = EXIT_FAILURE; + uint32_t ulReportLength = 0UL, i, ulMqttSessionEstablished = 0UL; + + /* Remove compiler warnings about unused parameters. */ + ( void ) pvParameters; + + /* Start with report not received. */ + xReportStatus = ReportStatusNotReceived; + + /* Set a report Id to be used. + * + * !!!NOTE!!! + * This demo sets the report ID to xTaskGetTickCount(), which may collide + * if the device is reset. Reports for a Thing with a previously used + * report ID will be assumed to be duplicates and discarded by the Device + * Defender service. The report ID needs to be unique per report sent with + * a given Thing. We recommend using an increasing unique id such as the + * current timestamp. */ + ulReportId = ( uint32_t ) xTaskGetTickCount(); + + /****************************** Connect. ******************************/ + + /* Attempts to connect to the AWS IoT MQTT broker over TCP. If the + * connection fails, retries after a timeout. Timeout value will + * exponentially increase until maximum attempts are reached. */ + LogInfo( ( "Establishing MQTT session..." ) ); + xStatus = xEstablishMqttSession( &xMqttContext, + &xNetworkContext, + &xBuffer, + prvPublishCallback ); + + if( xStatus != true ) + { + LogError( ( "Failed to establish MQTT session." ) ); + } + else + { + ulMqttSessionEstablished = 1; + } + + /******************** Subscribe to Defender topics. *******************/ + + /* Attempt to subscribe to the AWS IoT Device Defender topics. + * Since this demo is using JSON, in prvSubscribeToDefenderTopics() we + * subscribe to the topics to which accepted and rejected responses are + * received from after publishing a JSON report. + * + * This demo uses a constant #democonfigTHING_NAME known at compile time + * therefore we use macros to assemble defender topic strings. + * If the thing name is known at run time, then we could use the API + * #Defender_GetTopic instead. + * + * For example, for the JSON accepted responses topic: + * + * #define TOPIC_BUFFER_LENGTH ( 256U ) + * + * // Every device should have a unique thing name registered with AWS IoT Core. + * // This example assumes that the device has a unique serial number which is + * // registered as the thing name with AWS IoT Core. + * const char * pThingName = GetDeviceSerialNumber(); + * uint16_t thingNameLength = ( uint16_t )strlen( pThingname ); + * char topicBuffer[ TOPIC_BUFFER_LENGTH ] = { 0 }; + * uint16_t topicLength = 0; + * DefenderStatus_t status = DefenderSuccess; + * + * status = Defender_GetTopic( &( topicBuffer[ 0 ] ), + * TOPIC_BUFFER_LENGTH, + * pThingName, + * thingNameLength, + * DefenderJsonReportAccepted, + * &( topicLength ) ); + */ + if( xStatus == true ) + { + LogInfo( ( "Subscribing to defender topics..." ) ); + xStatus = prvSubscribeToDefenderTopics(); + + if( xStatus != true ) + { + LogError( ( "Failed to subscribe to defender topics." ) ); + } + } + + /*********************** Collect device metrics. **********************/ + + /* We then need to collect the metrics that will be sent to the AWS IoT + * Device Defender service. This demo uses the functions declared in + * in metrics_collector.h to collect network metrics. For this demo, the + * implementation of these functions are in metrics_collector.c and + * collects metrics using tcp_netstat utility for FreeRTOS+TCP. */ + if( xStatus == true ) + { + LogInfo( ( "Collecting device metrics..." ) ); + xStatus = prvCollectDeviceMetrics(); + + if( xStatus != true ) + { + LogError( ( "Failed to collect device metrics." ) ); + } + } + + /********************** Generate defender report. *********************/ + + /* The data needs to be incorporated into a JSON formatted report, + * which follows the format expected by the Device Defender service. + * This format is documented here: + * https://docs.aws.amazon.com/iot/latest/developerguide/detect-device-side-metrics.html + */ + if( xStatus == true ) + { + LogInfo( ( "Generating device defender report..." ) ); + xStatus = prvGenerateDeviceMetricsReport( &( ulReportLength ) ); + + if( xStatus != true ) + { + LogError( ( "Failed to generate device defender report." ) ); + } + } + + /********************** Publish defender report. **********************/ + + /* The report is then published to the Device Defender service. This report + * is published to the MQTT topic for publishing JSON reports. As before, + * we use the defender library macros to create the topic string, though + * #Defender_GetTopic could be used if the Thing name is acquired at + * run time */ + if( xStatus == true ) + { + LogInfo( ( "Publishing device defender report..." ) ); + xStatus = prvPublishDeviceMetricsReport( ulReportLength ); + + if( xStatus != true ) + { + LogError( ( "Failed to publish device defender report." ) ); + } + } + + /* Wait for the response to our report. Response will be handled by the + * callback passed to xEstablishMqttSession() earlier. + * The callback will verify that the MQTT messages received are from the + * defender service's topic. Based on whether the response comes from + * the accepted or rejected topics, it updates xReportStatus. */ + if( xStatus == true ) + { + for( i = 0; i < DEFENDER_RESPONSE_WAIT_SECONDS; i++ ) + { + ( void ) xProcessLoop( &xMqttContext ); + + /* xReportStatus is updated in the prvPublishCallback. */ + if( xReportStatus != ReportStatusNotReceived ) + { + break; + } + + /* Wait for sometime between consecutive executions of ProcessLoop. */ + vTaskDelay( 1000 / portTICK_PERIOD_MS ); + } + } + + if( xReportStatus == ReportStatusNotReceived ) + { + LogError( ( "Failed to receive response from AWS IoT Device Defender Service." ) ); + xStatus = false; + } + + /**************************** Disconnect. *****************************/ + + /* Unsubscribe and disconnect if MQTT session was established. Per the MQTT + * protocol spec, it is okay to send UNSUBSCRIBE even if no corresponding + * subscription exists on the broker. Therefore, it is okay to attempt + * unsubscribe even if one more subscribe failed earlier. */ + if( ulMqttSessionEstablished == 1 ) + { + LogInfo( ( "Unsubscribing from defender topics..." ) ); + xStatus = prvUnsubscribeFromDefenderTopics(); + + if( xStatus != true ) + { + LogError( ( "Failed to unsubscribe from defender topics." ) ); + } + + LogInfo( ( "Closing MQTT session..." ) ); + ( void ) xDisconnectMqttSession( &xMqttContext, + &xNetworkContext ); + } + + /****************************** Finish. ******************************/ + + if( ( xStatus == true ) && ( xReportStatus == ReportStatusAccepted ) ) + { + xExitStatus = EXIT_SUCCESS; + LogInfo( ( "Demo completed successfully." ) ); + } + else + { + LogError( ( "Demo failed." ) ); + } + + /* Delete this task. */ + LogInfo( ( "Deleting Defender Demo task." ) ); + vTaskDelete( NULL ); +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/FreeRTOSConfig.h b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/FreeRTOSConfig.h new file mode 100644 index 000000000..8dbad992d --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/FreeRTOSConfig.h @@ -0,0 +1,208 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- +* Application specific definitions. +* +* These definitions should be adjusted for your particular hardware and +* application requirements. +* +* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE +* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. +* http://www.freertos.org/a00110.html +* +* The bottom of this file contains some constants specific to running the UDP +* stack in this demo. Constants specific to FreeRTOS+TCP itself (rather than +* the demo) are contained in FreeRTOSIPConfig.h. +*----------------------------------------------------------*/ +#define configUSE_PREEMPTION 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#define configMAX_PRIORITIES ( 7 ) +#define configTICK_RATE_HZ ( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */ +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 60 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the Win32 thread. */ +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 2048U * 1024U ) ) +#define configMAX_TASK_NAME_LEN ( 15 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 0 +#define configUSE_APPLICATION_TASK_TAG 0 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 0 +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 +#define configENABLE_BACKWARD_COMPATIBILITY 1 +#define configSUPPORT_STATIC_ALLOCATION 1 + +/* Hook function related definitions. */ +#define configUSE_TICK_HOOK 0 +#define configUSE_IDLE_HOOK 0 +#define configUSE_MALLOC_FAILED_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 0 /* Not applicable to the Win32 port. */ + +/* Software timer related definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) +#define configTIMER_QUEUE_LENGTH 5 +#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) + +/* Event group related definitions. */ +#define configUSE_EVENT_GROUPS 1 + +/* Run time stats gathering configuration options. */ +#define configGENERATE_RUN_TIME_STATS 0 + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero + * to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTimerGetTimerTaskHandle 0 +#define INCLUDE_xTaskGetIdleTaskHandle 0 +#define INCLUDE_xQueueGetMutexHolder 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xEventGroupSetBitsFromISR 1 +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_pcTaskGetTaskName 1 + +/* This demo makes use of one or more example stats formatting functions. These + * format the raw data provided by the uxTaskGetSystemState() function in to human + * readable ASCII form. See the notes in the implementation of vTaskList() within + * FreeRTOS/Source/tasks.c for limitations. configUSE_STATS_FORMATTING_FUNCTIONS + * is set to 2 so the formatting functions are included without the stdio.h being + * included in tasks.c. That is because this project defines its own sprintf() + * functions. */ +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 + +/* Assert call defined for debug builds. */ +#ifdef _DEBUG + extern void vAssertCalled( const char * pcFile, + uint32_t ulLine ); + #define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ ) +#endif /* _DEBUG */ + +/* Application specific definitions follow. **********************************/ + +/* Only used when running in the FreeRTOS Windows simulator. Defines the + * priority of the task used to simulate Ethernet interrupts. */ +#define configMAC_ISR_SIMULATOR_PRIORITY ( configMAX_PRIORITIES - 1 ) + +/* This demo creates a virtual network connection by accessing the raw Ethernet + * or WiFi data to and from a real network connection. Many computers have more + * than one real network port, and configNETWORK_INTERFACE_TO_USE is used to tell + * the demo which real port should be used to create the virtual port. The ports + * available are displayed on the console when the application is executed. For + * example, on my development laptop setting configNETWORK_INTERFACE_TO_USE to 4 + * results in the wired network being used, while setting + * configNETWORK_INTERFACE_TO_USE to 2 results in the wireless network being + * used. */ +#define configNETWORK_INTERFACE_TO_USE ( 0L ) + +/* The address to which logging is sent should UDP logging be enabled. */ +#define configUDP_LOGGING_ADDR0 192 +#define configUDP_LOGGING_ADDR1 168 +#define configUDP_LOGGING_ADDR2 0 +#define configUDP_LOGGING_ADDR3 11 + +/* Default MAC address configuration. The demo creates a virtual network + * connection that uses this MAC address by accessing the raw Ethernet/WiFi data + * to and from a real network connection on the host PC. See the + * configNETWORK_INTERFACE_TO_USE definition above for information on how to + * configure the real network connection to use. */ +#define configMAC_ADDR0 0x00 +#define configMAC_ADDR1 0x11 +#define configMAC_ADDR2 0x11 +#define configMAC_ADDR3 0x11 +#define configMAC_ADDR4 0x11 +#define configMAC_ADDR5 0x41 + +/* Default IP address configuration. Used in ipconfigUSE_DNS is set to 0, or + * ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */ +#define configIP_ADDR0 10 +#define configIP_ADDR1 10 +#define configIP_ADDR2 10 +#define configIP_ADDR3 200 + +/* Default gateway IP address configuration. Used in ipconfigUSE_DNS is set to + * 0, or ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */ +#define configGATEWAY_ADDR0 10 +#define configGATEWAY_ADDR1 10 +#define configGATEWAY_ADDR2 10 +#define configGATEWAY_ADDR3 1 + +/* Default DNS server configuration. OpenDNS addresses are 208.67.222.222 and + * 208.67.220.220. Used in ipconfigUSE_DNS is set to 0, or ipconfigUSE_DNS is set + * to 1 but a DNS server cannot be contacted.*/ +#define configDNS_SERVER_ADDR0 208 +#define configDNS_SERVER_ADDR1 67 +#define configDNS_SERVER_ADDR2 222 +#define configDNS_SERVER_ADDR3 222 + +/* Default netmask configuration. Used in ipconfigUSE_DNS is set to 0, or + * ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */ +#define configNET_MASK0 255 +#define configNET_MASK1 0 +#define configNET_MASK2 0 +#define configNET_MASK3 0 + +/* The UDP port to which print messages are sent. */ +#define configPRINT_PORT ( 15000 ) + + +#if ( defined( _MSC_VER ) && ( _MSC_VER <= 1600 ) && !defined( snprintf ) ) + /* Map to Windows names. */ + #define snprintf _snprintf + #define vsnprintf _vsnprintf +#endif + +/* Visual studio does not have an implementation of strcasecmp(). */ +#define strcasecmp _stricmp +#define strncasecmp _strnicmp +#define strcmpi _strcmpi + +/* Prototype for the function used to print out. In this case it prints to the + * console before the network is connected then a UDP port after the network has + * connected. */ +extern void vLoggingPrintf( const char * pcFormatString, + ... ); +#define configPRINTF( X ) vLoggingPrintf X + +#endif /* FREERTOS_CONFIG_H */ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/FreeRTOSIPConfig.h b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/FreeRTOSIPConfig.h new file mode 100644 index 000000000..8893b2055 --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/FreeRTOSIPConfig.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/***************************************************************************** +* +* See the following URL for configuration information. +* http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_IP_Configuration.html +* +*****************************************************************************/ + +#ifndef FREERTOS_IP_CONFIG_H +#define FREERTOS_IP_CONFIG_H + +#include "tcp_netstat.h" + +/* Prototype for the function used to print out. In this case it prints to the + * console before the network is connected then a UDP port after the network has + * connected. */ +extern void vLoggingPrintf( const char * pcFormatString, + ... ); + +/* Set to 1 to print out debug messages. If ipconfigHAS_DEBUG_PRINTF is set to + * 1 then FreeRTOS_debug_printf should be defined to the function used to print + * out the debugging messages. */ +#define ipconfigHAS_DEBUG_PRINTF 0 +#if ( ipconfigHAS_DEBUG_PRINTF == 1 ) + #define FreeRTOS_debug_printf( X ) vLoggingPrintf X +#endif + +/* Set to 1 to print out non debugging messages, for example the output of the + * FreeRTOS_netstat() command, and ping replies. If ipconfigHAS_PRINTF is set to 1 + * then FreeRTOS_printf should be set to the function used to print out the + * messages. */ +#define ipconfigHAS_PRINTF 1 +#if ( ipconfigHAS_PRINTF == 1 ) + #define FreeRTOS_printf( X ) vLoggingPrintf X +#endif + +/* Define the byte order of the target MCU (the MCU FreeRTOS+TCP is executing + * on). Valid options are pdFREERTOS_BIG_ENDIAN and pdFREERTOS_LITTLE_ENDIAN. */ +#define ipconfigBYTE_ORDER pdFREERTOS_LITTLE_ENDIAN + +/* If the network card/driver includes checksum offloading (IP/TCP/UDP checksums) + * then set ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM to 1 to prevent the software + * stack repeating the checksum calculations. */ +#define ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM 1 + +/* Several API's will block until the result is known, or the action has been + * performed, for example FreeRTOS_send() and FreeRTOS_recv(). The timeouts can be + * set per socket, using setsockopt(). If not set, the times below will be + * used as defaults. */ +#define ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME ( 2000 ) +#define ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME ( 5000 ) + +/* Include support for LLMNR: Link-local Multicast Name Resolution + * (non-Microsoft) */ +#define ipconfigUSE_LLMNR ( 0 ) + +/* Include support for NBNS: NetBIOS Name Service (Microsoft) */ +#define ipconfigUSE_NBNS ( 0 ) + +/* Include support for DNS caching. For TCP, having a small DNS cache is very + * useful. When a cache is present, ipconfigDNS_REQUEST_ATTEMPTS can be kept low + * and also DNS may use small timeouts. If a DNS reply comes in after the DNS + * socket has been destroyed, the result will be stored into the cache. The next + * call to FreeRTOS_gethostbyname() will return immediately, without even creating + * a socket. */ +#define ipconfigUSE_DNS_CACHE ( 1 ) +#define ipconfigDNS_CACHE_NAME_LENGTH ( 64 ) +#define ipconfigDNS_CACHE_ENTRIES ( 4 ) +#define ipconfigDNS_REQUEST_ATTEMPTS ( 2 ) + +/* The IP stack executes it its own task (although any application task can make + * use of its services through the published sockets API). ipconfigUDP_TASK_PRIORITY + * sets the priority of the task that executes the IP stack. The priority is a + * standard FreeRTOS task priority so can take any value from 0 (the lowest + * priority) to (configMAX_PRIORITIES - 1) (the highest priority). + * configMAX_PRIORITIES is a standard FreeRTOS configuration parameter defined in + * FreeRTOSConfig.h, not FreeRTOSIPConfig.h. Consideration needs to be given as to + * the priority assigned to the task executing the IP stack relative to the + * priority assigned to tasks that use the IP stack. */ +#define ipconfigIP_TASK_PRIORITY ( configMAX_PRIORITIES - 2 ) + +/* The size, in words (not bytes), of the stack allocated to the FreeRTOS+TCP + * task. This setting is less important when the FreeRTOS Win32 simulator is used + * as the Win32 simulator only stores a fixed amount of information on the task + * stack. FreeRTOS includes optional stack overflow detection, see: + * http://www.freertos.org/Stacks-and-stack-overflow-checking.html */ +#define ipconfigIP_TASK_STACK_SIZE_WORDS ( configMINIMAL_STACK_SIZE * 5 ) + +/* ipconfigRAND32() is called by the IP stack to generate random numbers for + * things such as a DHCP transaction number or initial sequence number. Random + * number generation is performed via this macro to allow applications to use their + * own random number generation method. For example, it might be possible to + * generate a random number by sampling noise on an analogue input. */ +extern UBaseType_t uxRand(); +#define ipconfigRAND32() uxRand() + +/* If ipconfigUSE_NETWORK_EVENT_HOOK is set to 1 then FreeRTOS+TCP will call the + * network event hook at the appropriate times. If ipconfigUSE_NETWORK_EVENT_HOOK + * is not set to 1 then the network event hook will never be called. See + * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/API/vApplicationIPNetworkEventHook.shtml + */ +#define ipconfigUSE_NETWORK_EVENT_HOOK 1 + +/* Sockets have a send block time attribute. If FreeRTOS_sendto() is called but + * a network buffer cannot be obtained then the calling task is held in the Blocked + * state (so other tasks can continue to executed) until either a network buffer + * becomes available or the send block time expires. If the send block time expires + * then the send operation is aborted. The maximum allowable send block time is + * capped to the value set by ipconfigMAX_SEND_BLOCK_TIME_TICKS. Capping the + * maximum allowable send block time prevents prevents a deadlock occurring when + * all the network buffers are in use and the tasks that process (and subsequently + * free) the network buffers are themselves blocked waiting for a network buffer. + * ipconfigMAX_SEND_BLOCK_TIME_TICKS is specified in RTOS ticks. A time in + * milliseconds can be converted to a time in ticks by dividing the time in + * milliseconds by portTICK_PERIOD_MS. */ +#define ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS ( 5000 / portTICK_PERIOD_MS ) + +/* If ipconfigUSE_DHCP is 1 then FreeRTOS+TCP will attempt to retrieve an IP + * address, netmask, DNS server address and gateway address from a DHCP server. If + * ipconfigUSE_DHCP is 0 then FreeRTOS+TCP will use a static IP address. The + * stack will revert to using the static IP address even when ipconfigUSE_DHCP is + * set to 1 if a valid configuration cannot be obtained from a DHCP server for any + * reason. The static configuration used is that passed into the stack by the + * FreeRTOS_IPInit() function call. */ +#define ipconfigUSE_DHCP 1 + +/* When ipconfigUSE_DHCP is set to 1, DHCP requests will be sent out at + * increasing time intervals until either a reply is received from a DHCP server + * and accepted, or the interval between transmissions reaches + * ipconfigMAXIMUM_DISCOVER_TX_PERIOD. The IP stack will revert to using the + * static IP address passed as a parameter to FreeRTOS_IPInit() if the + * re-transmission time interval reaches ipconfigMAXIMUM_DISCOVER_TX_PERIOD without + * a DHCP reply being received. */ +#define ipconfigMAXIMUM_DISCOVER_TX_PERIOD ( 120000 / portTICK_PERIOD_MS ) + +/* The ARP cache is a table that maps IP addresses to MAC addresses. The IP + * stack can only send a UDP message to a remove IP address if it knowns the MAC + * address associated with the IP address, or the MAC address of the router used to + * contact the remote IP address. When a UDP message is received from a remote IP + * address the MAC address and IP address are added to the ARP cache. When a UDP + * message is sent to a remote IP address that does not already appear in the ARP + * cache then the UDP message is replaced by a ARP message that solicits the + * required MAC address information. ipconfigARP_CACHE_ENTRIES defines the maximum + * number of entries that can exist in the ARP table at any one time. */ +#define ipconfigARP_CACHE_ENTRIES 6 + +/* ARP requests that do not result in an ARP response will be re-transmitted a + * maximum of ipconfigMAX_ARP_RETRANSMISSIONS times before the ARP request is + * aborted. */ +#define ipconfigMAX_ARP_RETRANSMISSIONS ( 5 ) + +/* ipconfigMAX_ARP_AGE defines the maximum time between an entry in the ARP + * table being created or refreshed and the entry being removed because it is stale. + * New ARP requests are sent for ARP cache entries that are nearing their maximum + * age. ipconfigMAX_ARP_AGE is specified in tens of seconds, so a value of 150 is + * equal to 1500 seconds (or 25 minutes). */ +#define ipconfigMAX_ARP_AGE 150 + +/* Implementing FreeRTOS_inet_addr() necessitates the use of string handling + * routines, which are relatively large. To save code space the full + * FreeRTOS_inet_addr() implementation is made optional, and a smaller and faster + * alternative called FreeRTOS_inet_addr_quick() is provided. FreeRTOS_inet_addr() + * takes an IP in decimal dot format (for example, "192.168.0.1") as its parameter. + * FreeRTOS_inet_addr_quick() takes an IP address as four separate numerical octets + * (for example, 192, 168, 0, 1) as its parameters. If + * ipconfigINCLUDE_FULL_INET_ADDR is set to 1 then both FreeRTOS_inet_addr() and + * FreeRTOS_indet_addr_quick() are available. If ipconfigINCLUDE_FULL_INET_ADDR is + * not set to 1 then only FreeRTOS_indet_addr_quick() is available. */ +#define ipconfigINCLUDE_FULL_INET_ADDR 1 + +/* ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS defines the total number of network buffer that + * are available to the IP stack. The total number of network buffers is limited + * to ensure the total amount of RAM that can be consumed by the IP stack is capped + * to a pre-determinable value. */ +#define ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS 60 + +/* A FreeRTOS queue is used to send events from application tasks to the IP + * stack. ipconfigEVENT_QUEUE_LENGTH sets the maximum number of events that can + * be queued for processing at any one time. The event queue must be a minimum of + * 5 greater than the total number of network buffers. */ +#define ipconfigEVENT_QUEUE_LENGTH ( ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS + 5 ) + +/* The address of a socket is the combination of its IP address and its port + * number. FreeRTOS_bind() is used to manually allocate a port number to a socket + * (to 'bind' the socket to a port), but manual binding is not normally necessary + * for client sockets (those sockets that initiate outgoing connections rather than + * wait for incoming connections on a known port number). If + * ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND is set to 1 then calling + * FreeRTOS_sendto() on a socket that has not yet been bound will result in the IP + * stack automatically binding the socket to a port number from the range + * socketAUTO_PORT_ALLOCATION_START_NUMBER to 0xffff. If + * ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND is set to 0 then calling FreeRTOS_sendto() + * on a socket that has not yet been bound will result in the send operation being + * aborted. */ +#define ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND 1 + +/* Defines the Time To Live (TTL) values used in outgoing UDP packets. */ +#define ipconfigUDP_TIME_TO_LIVE 128 +#define ipconfigTCP_TIME_TO_LIVE 128 /* also defined in FreeRTOSIPConfigDefaults.h */ + +/* USE_TCP: Use TCP and all its features */ +#define ipconfigUSE_TCP ( 1 ) + +/* Use the TCP socket wake context with a callback. */ +#define ipconfigSOCKET_HAS_USER_WAKE_CALLBACK_WITH_CONTEXT ( 1 ) + +/* USE_WIN: Let TCP use windowing mechanism. */ +#define ipconfigUSE_TCP_WIN ( 1 ) + +/* The MTU is the maximum number of bytes the payload of a network frame can + * contain. For normal Ethernet V2 frames the maximum MTU is 1500. Setting a + * lower value can save RAM, depending on the buffer management scheme used. If + * ipconfigCAN_FRAGMENT_OUTGOING_PACKETS is 1 then (ipconfigNETWORK_MTU - 28) must + * be divisible by 8. */ +#define ipconfigNETWORK_MTU 1200 + +/* Set ipconfigUSE_DNS to 1 to include a basic DNS client/resolver. DNS is used + * through the FreeRTOS_gethostbyname() API function. */ +#define ipconfigUSE_DNS 1 + +/* If ipconfigREPLY_TO_INCOMING_PINGS is set to 1 then the IP stack will + * generate replies to incoming ICMP echo (ping) requests. */ +#define ipconfigREPLY_TO_INCOMING_PINGS 1 + +/* If ipconfigSUPPORT_OUTGOING_PINGS is set to 1 then the + * FreeRTOS_SendPingRequest() API function is available. */ +#define ipconfigSUPPORT_OUTGOING_PINGS 0 + +/* If ipconfigSUPPORT_SELECT_FUNCTION is set to 1 then the FreeRTOS_select() + * (and associated) API function is available. */ +#define ipconfigSUPPORT_SELECT_FUNCTION 1 + +/* If ipconfigFILTER_OUT_NON_ETHERNET_II_FRAMES is set to 1 then Ethernet frames + * that are not in Ethernet II format will be dropped. This option is included for + * potential future IP stack developments. */ +#define ipconfigFILTER_OUT_NON_ETHERNET_II_FRAMES 1 + +/* If ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES is set to 1 then it is the + * responsibility of the Ethernet interface to filter out packets that are of no + * interest. If the Ethernet interface does not implement this functionality, then + * set ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES to 0 to have the IP stack + * perform the filtering instead (it is much less efficient for the stack to do it + * because the packet will already have been passed into the stack). If the + * Ethernet driver does all the necessary filtering in hardware then software + * filtering can be removed by using a value other than 1 or 0. */ +#define ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES 1 + +/* The windows simulator cannot really simulate MAC interrupts, and needs to + * block occasionally to allow other tasks to run. */ +#define configWINDOWS_MAC_INTERRUPT_SIMULATOR_DELAY ( 20 / portTICK_PERIOD_MS ) + +/* Advanced only: in order to access 32-bit fields in the IP packets with + * 32-bit memory instructions, all packets will be stored 32-bit-aligned, plus 16-bits. + * This has to do with the contents of the IP-packets: all 32-bit fields are + * 32-bit-aligned, plus 16-bit(!) */ +#define ipconfigPACKET_FILLER_SIZE 2 + +/* Define the size of the pool of TCP window descriptors. On the average, each + * TCP socket will use up to 2 x 6 descriptors, meaning that it can have 2 x 6 + * outstanding packets (for Rx and Tx). When using up to 10 TP sockets + * simultaneously, one could define TCP_WIN_SEG_COUNT as 120. */ +#define ipconfigTCP_WIN_SEG_COUNT 240 + +/* Each TCP socket has a circular buffers for Rx and Tx, which have a fixed + * maximum size. Define the size of Rx buffer for TCP sockets. */ +#define ipconfigTCP_RX_BUFFER_LENGTH ( 1000 ) + +/* Define the size of Tx buffer for TCP sockets. */ +#define ipconfigTCP_TX_BUFFER_LENGTH ( 1000 ) + +/* When using call-back handlers, the driver may check if the handler points to + * real program memory (RAM or flash) or just has a random non-zero value. */ +#define ipconfigIS_VALID_PROG_ADDRESS( x ) ( ( x ) != NULL ) + +/* Include support for TCP hang protection. All sockets in a connecting or + * disconnecting stage will timeout after a period of non-activity. */ +#define ipconfigTCP_HANG_PROTECTION ( 1 ) +#define ipconfigTCP_HANG_PROTECTION_TIME ( 30 ) + +/* Include support for TCP keep-alive messages. */ +#define ipconfigTCP_KEEP_ALIVE ( 1 ) +#define ipconfigTCP_KEEP_ALIVE_INTERVAL ( 20 ) /* in seconds */ + +#define portINLINE __inline + +#endif /* FREERTOS_IP_CONFIG_H */ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/WIN32.vcxproj b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/WIN32.vcxproj new file mode 100644 index 000000000..c276dcc55 --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/WIN32.vcxproj @@ -0,0 +1,629 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {C686325E-3261-42F7-AEB1-DDE5280E1CEB} + RTOSDemo + 10.0 + + + + Application + false + MultiByte + v142 + + + Application + false + MultiByte + v142 + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + .\Debug\ + .\Debug\ + true + .\Release\ + .\Release\ + false + AllRules.ruleset + + + + .\Debug/WIN32.tlb + + + + + Disabled + ..\..\..\..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\..\..\..\FreeRTOS-Plus\Source\FreeRTOS-Plus-TCP\include;..\..\..\..\..\FreeRTOS-Plus\Source\FreeRTOS-Plus-TCP\portable\BufferManagement;..\..\..\..\..\FreeRTOS-Plus\Source\FreeRTOS-Plus-TCP\portable\Compiler\MSVC;..\..\..\..\..\FreeRTOS-Plus\Source\Utilities\logging;..\..\..\Common\WinPCap;..\..\..\..\..\FreeRTOS\Source\include;..\..\..\..\..\FreeRTOS\Source\portable\MSVC-MingW;..\..\..\..\Source\Application-Protocols\coreMQTT\source\include;..\..\..\..\Source\Application-Protocols\coreMQTT\source\interface;..\..\..\..\Source\Utilities\exponential_backoff;..\..\..\..\Source\Application-Protocols\network_transport\freertos_plus_tcp;..\..\..\..\Source\Application-Protocols\network_transport\freertos_plus_tcp\using_mbedtls;..\..\..\..\Source\Utilities\mbedtls_freertos;..\..\..\..\..\Source\mbedtls_utils;..\..\..\..\ThirdParty\mbedtls\include;..\..\..\..\Source\AWS\device-defender\source\include;..\..\..\..\Source\coreJSON\source\include;..\..\Mqtt_Demo_Helpers;..\..\..\..\Source\FreeRTOS-Plus-TCP\tools\tcp_utilities\include;.;%(AdditionalIncludeDirectories) + MBEDTLS_CONFIG_FILE="mbedtls_config.h";WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;WINVER=0x400;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDLL + .\Debug/WIN32.pch + .\Debug/ + .\Debug/ + .\Debug/ + Level4 + true + false + EditAndContinue + /wd4210 /wd4127 /wd4214 /wd4201 /wd4244 /wd4310 /wd4200 %(AdditionalOptions) + true + NotUsing + false + CompileAsC + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + .\Debug/RTOSDemo.exe + true + true + .\Debug/WIN32.pdb + Console + MachineX86 + wpcap.lib;Bcrypt.lib;%(AdditionalDependencies) + ..\..\..\Common\WinPCap + false + false + + + true + .\Debug/WIN32.bsc + + + + + .\Release/WIN32.tlb + + + + + MaxSpeed + OnlyExplicitInline + _WINSOCKAPI_;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + MultiThreaded + true + .\Release/WIN32.pch + .\Release/ + .\Release/ + .\Release/ + Level3 + true + ..\Common\Utils;..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap;..\Common\ethernet\lwip-1.4.0\src\include\ipv4;..\Common\ethernet\lwip-1.4.0\src\include;..\..\..\..\Source\include;..\..\..\..\Source\portable\MSVC-MingW;..\Common\ethernet\lwip-1.4.0\ports\win32\include;..\Common\Include;.\lwIP_Apps;.;%(AdditionalIncludeDirectories) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + .\Release/RTOSDemo.exe + true + .\Release/WIN32.pdb + Console + MachineX86 + ..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap + wpcap.lib;Bcrypt.lib;%(AdditionalDependencies) + + + true + .\Release/WIN32.bsc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + TurnOffAllWarnings + TurnOffAllWarnings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/WIN32.vcxproj.filters b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/WIN32.vcxproj.filters new file mode 100644 index 000000000..091147d7e --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/WIN32.vcxproj.filters @@ -0,0 +1,769 @@ + + + + + {af3445a1-4908-4170-89ed-39345d90d30c} + + + {f32be356-4763-4cae-9020-974a2638cb08} + *.c + + + {88f409e6-d396-4ac5-94bd-7a99c914be46} + + + {e5ad4ec7-23dc-4295-8add-2acaee488f5a} + + + {d2dcd641-8d91-492b-852f-5563ffadaec6} + + + {8672fa26-b119-481f-8b8d-086419c01a3e} + + + {4570be11-ec96-4b55-ac58-24b50ada980a} + + + {5d93ed51-023a-41ad-9243-8d230165d34b} + + + {b71e974a-9f28-4815-972b-d930ba8a34d0} + + + {60717407-397f-4ea5-8492-3314acdd25f0} + + + {8a90222f-d723-4b4e-8e6e-c57afaf7fa92} + + + {2d17d5e6-ed70-4e42-9693-f7a63baf4948} + + + {7158b0be-01e7-42d1-8d3f-c75118a596a2} + + + {6ad56e6d-c330-4830-8f4b-c75b05dfa866} + + + {84613aa2-91dc-4e1a-a3b3-823b6d7bf0e0} + + + {7bedd2e3-adbb-4c95-9632-445132b459ce} + + + {07a14673-4d02-4780-a099-6b8c654dff91} + + + {e875c5e3-40a2-4408-941e-5e1a951cc663} + + + {fcf93295-15e2-4a84-a5e9-b3c162e9f061} + + + {8a0aa896-6b3a-49b3-997e-681f0d1949ae} + + + {c5a01679-3e7a-4320-97ac-ee5b872c1650} + + + {c992824d-4198-46b2-8d59-5f99ab9946ab} + + + {6a35782c-bc09-42d5-a850-98bcb668a4dc} + + + {20aee693-d2dc-480e-ae21-0db2156e54ac} + + + {0dacb84e-5cc3-4eed-8fb1-68b6e4741f77} + + + + + FreeRTOS\Source\Portable + + + FreeRTOS\Source + + + FreeRTOS\Source + + + FreeRTOS\Source + + + FreeRTOS\Source + + + FreeRTOS+\FreeRTOS+TCP + + + FreeRTOS+\FreeRTOS+TCP + + + FreeRTOS+\FreeRTOS+TCP + + + FreeRTOS+\FreeRTOS+TCP + + + FreeRTOS+\FreeRTOS+TCP\portable + + + FreeRTOS+\FreeRTOS+TCP\portable + + + FreeRTOS+\FreeRTOS+TCP + + + FreeRTOS+\FreeRTOS+TCP + + + FreeRTOS+\FreeRTOS+TCP + + + FreeRTOS+\FreeRTOS+TCP + + + FreeRTOS\Source + + + FreeRTOS\Source\Portable + + + FreeRTOS+\FreeRTOS+TCP + + + FreeRTOS\Source + + + + FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT\src + + + FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT\src + + + FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT\src + + + FreeRTOS+\FreeRTOS IoT Libraries\platform\mbedtls + + + FreeRTOS+\FreeRTOS IoT Libraries\platform\mbedtls + + + FreeRTOS+\FreeRTOS IoT Libraries\platform\freertos + + + FreeRTOS+\FreeRTOS IoT Libraries\platform\transport + + + FreeRTOS+\FreeRTOS IoT Libraries\platform\transport + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\mbedtls\library + + + FreeRTOS+\FreeRTOS IoT Libraries\standard\coreJSON + + + + DemoTasks + + + + + + + + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS\Source\include + + + FreeRTOS\Source\include + + + FreeRTOS\Source\include + + + FreeRTOS\Source\include + + + FreeRTOS\Source\include + + + FreeRTOS\Source\include + + + FreeRTOS\Source\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS+\FreeRTOS+TCP\include + + + + + FreeRTOS+\FreeRTOS+TCP\include + + + FreeRTOS\Source\include + + + FreeRTOS\Source\include + + + + FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT\include + + + FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT\include + + + FreeRTOS+\FreeRTOS IoT Libraries\standard\coreMQTT\include + + + + FreeRTOS+\FreeRTOS IoT Libraries\platform + + + FreeRTOS+\FreeRTOS IoT Libraries\platform + + + + FreeRTOS+\FreeRTOS IoT Libraries\platform\mbedtls + + + FreeRTOS+\FreeRTOS IoT Libraries\platform\mbedtls + + + FreeRTOS+\FreeRTOS IoT Libraries\platform\transport\include + + + FreeRTOS+\FreeRTOS IoT Libraries\platform\transport\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + FreeRTOS+\mbedtls\include + + + + + + + + + + + + \ No newline at end of file diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/core_mqtt_config.h b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/core_mqtt_config.h new file mode 100644 index 000000000..64840d32a --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/core_mqtt_config.h @@ -0,0 +1,96 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef CORE_MQTT_CONFIG_H +#define CORE_MQTT_CONFIG_H + +/**************************************************/ +/******* DO NOT CHANGE the following order ********/ +/**************************************************/ + +/* Include logging header files and define logging macros in the following order: + * 1. Include the header file "logging_levels.h". + * 2. Define the LIBRARY_LOG_NAME and LIBRARY_LOG_LEVEL macros depending on + * the logging configuration for MQTT. + * 3. Include the header file "logging_stack.h", if logging is enabled for MQTT. + */ + +#include "logging_levels.h" + +/* Logging configuration for the MQTT library. */ +#ifndef LIBRARY_LOG_NAME + #define LIBRARY_LOG_NAME "MQTT" +#endif + +#ifndef LIBRARY_LOG_LEVEL + #define LIBRARY_LOG_LEVEL LOG_ERROR +#endif + +/* Prototype for the function used to print to console on Windows simulator + * of FreeRTOS. + * The function prints to the console before the network is connected; + * then a UDP port after the network has connected. */ +extern void vLoggingPrintf( const char * pcFormatString, + ... ); + +/* Map the SdkLog macro to the logging function to enable logging + * on Windows simulator. */ +#ifndef SdkLog + #define SdkLog( message ) vLoggingPrintf message +#endif + +#include "logging_stack.h" + +/************ End of logging configuration ****************/ + +/** + * @brief Determines the maximum number of MQTT PUBLISH messages, pending + * acknowledgement at a time, that are supported for incoming and outgoing + * direction of messages, separately. + * + * QoS 1 and 2 MQTT PUBLISHes require acknowledgement from the server before + * they can be completed. While they are awaiting the acknowledgement, the + * client must maintain information about their state. The value of this + * macro sets the limit on how many simultaneous PUBLISH states an MQTT + * context maintains, separately, for both incoming and outgoing direction of + * PUBLISHes. + * + * @note The MQTT context maintains separate state records for outgoing + * and incoming PUBLISHes, and thus, 2 * MQTT_STATE_ARRAY_MAX_COUNT amount + * of memory is statically allocated for the state records. + */ +#define MQTT_STATE_ARRAY_MAX_COUNT ( 10U ) + +/** + * @brief Number of milliseconds to wait for a ping response to a ping + * request as part of the keep-alive mechanism. + * + * If a ping response is not received before this timeout, then + * #MQTT_ProcessLoop will return #MQTTKeepAliveTimeout. + */ +#define MQTT_PINGRESP_TIMEOUT_MS ( 5000U ) + +#endif /* ifndef CORE_MQTT_CONFIG_H */ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/defender_config.h b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/defender_config.h new file mode 100644 index 000000000..69f25de87 --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/defender_config.h @@ -0,0 +1,55 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef DEFENDER_CONFIG_H_ +#define DEFENDER_CONFIG_H_ + +/**************************************************/ +/******* DO NOT CHANGE the following order ********/ +/**************************************************/ + +/* Include logging header files and define logging macros in the following order: + * 1. Include the header file "logging_levels.h". + * 2. Define the LIBRARY_LOG_NAME and LIBRARY_LOG_LEVEL macros. + * 3. Include the header file "logging_stack.h". + */ + +#include "logging_levels.h" + +/* Logging configuration for the Defender library. */ +#ifndef LIBRARY_LOG_NAME + #define LIBRARY_LOG_NAME "Defender" +#endif + +#ifndef LIBRARY_LOG_LEVEL + #define LIBRARY_LOG_LEVEL LOG_INFO +#endif + +#include "logging_stack.h" + +/************ End of logging configuration ****************/ + +#endif /* ifndef DEFENDER_CONFIG_H_ */ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/defender_demo.sln b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/defender_demo.sln new file mode 100644 index 000000000..dcfc1fe09 --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/defender_demo.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29215.179 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RTOSDemo", "WIN32.vcxproj", "{C686325E-3261-42F7-AEB1-DDE5280E1CEB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.ActiveCfg = Debug|Win32 + {C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.Build.0 = Debug|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {150F08BF-9D61-4CC2-8DBF-1335172A1EA4} + EndGlobalSection + GlobalSection(TestCaseManagementSettings) = postSolution + CategoryFile = FreeRTOS_Plus_TCP_Minimal.vsmdi + EndGlobalSection +EndGlobal diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/demo_config.h b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/demo_config.h new file mode 100644 index 000000000..303470b09 --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/demo_config.h @@ -0,0 +1,279 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef DEMO_CONFIG_H +#define DEMO_CONFIG_H + +/* FreeRTOS config include. */ +#include "FreeRTOSConfig.h" + +/**************************************************/ +/******* DO NOT CHANGE the following order ********/ +/**************************************************/ + +/* Include logging header files and define logging macros in the following order: + * 1. Include the header file "logging_levels.h". + * 2. Define the LIBRARY_LOG_NAME and LIBRARY_LOG_LEVEL macros depending on + * the logging configuration for DEMO. + * 3. Include the header file "logging_stack.h", if logging is enabled for DEMO. + */ + +#include "logging_levels.h" + +/* Logging configuration for the Demo. */ +#ifndef LIBRARY_LOG_NAME + #define LIBRARY_LOG_NAME "DefenderDemo" +#endif + +#ifndef LIBRARY_LOG_LEVEL + #define LIBRARY_LOG_LEVEL LOG_INFO +#endif + +/* Prototype for the function used to print to console on Windows simulator + * of FreeRTOS. + * The function prints to the console before the network is connected; + * then a UDP port after the network has connected. */ +extern void vLoggingPrintf( const char * pcFormatString, + ... ); + +/* Map the SdkLog macro to the logging function to enable logging + * on Windows simulator. */ +#ifndef SdkLog + #define SdkLog( message ) vLoggingPrintf message +#endif + +#include "logging_stack.h" + + +/************ End of logging configuration ****************/ + +/** + * @brief The Thing resource registered on your AWS IoT account to use in the demo. + * A Thing resource is required to communicate with the AWS IoT Device Shadow service. + * + * @note The Things associated with your AWS account can be found in the + * AWS IoT console under Manage/Things, or using the ListThings REST API (that can + * be called with the AWS CLI command line tool). + * + * #define democonfigTHING_NAME "...insert here..." + */ + +#ifndef democonfigCLIENT_IDENTIFIER + +/** + * @brief The MQTT client identifier used in this example. Each client identifier + * must be unique so edit as required to ensure no two clients connecting to the + * same broker use the same client identifier. + * + * @note Appending __TIME__ to the client id string will reduce the possibility of a + * client id collision in the broker. Note that the appended time is the compilation + * time. This client id can cause collision, if more than one instance of the same + * binary is used at the same time to connect to the broker. + */ + #define democonfigCLIENT_IDENTIFIER "testClient"__TIME__ +#endif + +/** + * @brief The AWS IoT broker endpoint to connect to in the demo. + * + * @note Your AWS IoT Core endpoint can be found in the AWS IoT console under + * Settings/Custom Endpoint, or using the DescribeEndpoint REST API (that can + * be called with AWS CLI command line tool). + * + * #define democonfigMQTT_BROKER_ENDPOINT "...insert here..." + */ + +/** + * @brief The port to use for the demo. + * + * In general, port 8883 is for secured MQTT connections. + * + * @note Port 443 requires use of the ALPN TLS extension with the ALPN protocol + * name. Using ALPN with this demo would require additional changes, including + * setting the `pAlpnProtos` member of the `NetworkCredentials_t` struct before + * forming the TLS connection. When using port 8883, ALPN is not required. + * + * #define democonfigMQTT_BROKER_PORT ( insert here. ) + */ + +/** + * @brief AWS root CA certificate. + * + * This certificate is used to identify the AWS IoT server and is publicly available. + * Refer to the link below. + * https://www.amazontrust.com/repository/AmazonRootCA1.pem + * + * @note This certificate should be PEM-encoded. + * + * Must include the PEM header and footer: + * "-----BEGIN CERTIFICATE-----\n"\ + * "...base64 data...\n"\ + * "-----END CERTIFICATE-----\n" + * + */ + +/** + * @brief Client certificate. + * + * Please refer to the AWS documentation below for details + * regarding client authentication. + * https://docs.aws.amazon.com/iot/latest/developerguide/client-authentication.html + * + * @note This certificate should be PEM-encoded. + * + * Must include the PEM header and footer: + * "-----BEGIN CERTIFICATE-----\n"\ + * "...base64 data...\n"\ + * "-----END CERTIFICATE-----\n" + * + * #define democonfigCLIENT_CERTIFICATE_PEM "...insert here..." + */ + +/** + * @brief Client's private key. + * + * Please refer to the AWS documentation below for details + * regarding client authentication. + * https://docs.aws.amazon.com/iot/latest/developerguide/client-authentication.html + * + * @note This private key should be PEM-encoded. + * + * Must include the PEM header and footer: + * "-----BEGIN RSA PRIVATE KEY-----\n"\ + * "...base64 data...\n"\ + * "-----END RSA PRIVATE KEY-----\n" + * + * #define democonfigCLIENT_PRIVATE_KEY_PEM "...insert here..." + */ + +/** + * @brief The username value for authenticating client to the MQTT broker when + * username/password based client authentication is used. + * + * Please refer to the AWS IoT documentation below for + * details regarding client authentication with a username and password. + * https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html + * An authorizer setup needs to be done, as mentioned in the above link, to use + * username/password based client authentication. + * + * #define democonfigCLIENT_USERNAME "...insert here..." + */ + +/** + * @brief The password value for authenticating client to the MQTT broker when + * username/password based client authentication is used. + * + * Please refer to the AWS IoT documentation below for + * details regarding client authentication with a username and password. + * https://docs.aws.amazon.com/iot/latest/developerguide/custom-authentication.html + * An authorizer setup needs to be done, as mentioned in the above link, to use + * username/password based client authentication. + * + * #define democonfigCLIENT_PASSWORD "...insert here..." + */ + +/** + * @brief The name of the operating system that the application is running on. + * The current value is given as an example. Please update for your specific + * operating system. + */ +#define democonfigOS_NAME "FreeRTOS" + +/** + * @brief The version of the operating system that the application is running + * on. The current value is given as an example. Please update for your specific + * operating system version. + */ +#define democonfigOS_VERSION tskKERNEL_VERSION_NUMBER + +/** + * @brief The name of the hardware platform the application is running on. The + * current value is given as an example. Please update for your specific + * hardware platform. + */ +#define democonfigHARDWARE_PLATFORM_NAME "WinSim" + +/** + * @brief The name of the MQTT library used and its version, following an "@" + * symbol. + */ +#define democonfigMQTT_LIB "core-mqtt@1.0.1" + +/** + * @brief Set the stack size of the main demo task. + * + * In the Windows port, this stack only holds a structure. The actual + * stack is created by an operating system thread. + */ +#define democonfigDEMO_STACKSIZE configMINIMAL_STACK_SIZE + +/** + * @brief Size of the network buffer for MQTT packets. + */ +#define democonfigNETWORK_BUFFER_SIZE ( 1024U ) + +/** + * @brief Size of the open TCP ports array. + * + * A maximum of these many open TCP ports will be sent in the device defender + * report. + */ +#define democonfigOPEN_TCP_PORTS_ARRAY_SIZE 10 + +/** + * @brief Size of the open UDP ports array. + * + * A maximum of these many open UDP ports will be sent in the device defender + * report. + */ +#define democonfigOPEN_UDP_PORTS_ARRAY_SIZE 10 + +/** + * @brief Size of the established connections array. + * + * A maximum of these many established connections will be sent in the device + * defender report. + */ +#define democonfigESTABLISHED_CONNECTIONS_ARRAY_SIZE 10 + +/** + * @brief Size of the buffer which contains the generated device defender report. + * + * If the generated report is larger than this, it is rejected. + */ +#define democonfigDEVICE_METRICS_REPORT_BUFFER_SIZE 1000 + +/** + * @brief Major version number of the device defender report. + */ +#define democonfigDEVICE_METRICS_REPORT_MAJOR_VERSION 1 + +/** + * @brief Minor version number of the device defender report. + */ +#define democonfigDEVICE_METRICS_REPORT_MINOR_VERSION 0 + +#endif /* DEMO_CONFIG_H */ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/main.c b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/main.c new file mode 100644 index 000000000..2ce64e1f2 --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/main.c @@ -0,0 +1,381 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*** + * See https://www.FreeRTOS.org/iot-device-defender for configuration and usage instructions. + ***/ + +/* Standard includes. */ +#include +#include +#include + +/* Visual studio intrinsics used so the __debugbreak() function is available + * should an assert get hit. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* TCP/IP stack includes. */ +#include "FreeRTOS_IP.h" +#include "FreeRTOS_Sockets.h" + +/* Demo logging includes. */ +#include "logging.h" + +/* Demo Specific configs. */ +#include "demo_config.h" + + +/* + * Prototypes for the demos that can be started from this project. Note the + * Defender demo is not actually started until the network is already, which is + * indicated by vApplicationIPNetworkEventHook() executing - hence + * vStartDefenderDemo() is called from inside vApplicationIPNetworkEventHook(). + */ +extern void vStartDefenderDemo( void ); + +/* + * Just seeds the simple pseudo random number generator. + * + * !!! NOTE !!! + * This is not a secure method of generating random numbers and production + * devices should use a true random number generator (TRNG). + */ +static void prvSRand( UBaseType_t ulSeed ); + +/* + * Miscellaneous initialization including preparing the logging and seeding the + * random number generator. + */ +static void prvMiscInitialisation( void ); + +/* The default IP and MAC address used by the demo. The address configuration + * defined here will be used if ipconfigUSE_DHCP is 0, or if ipconfigUSE_DHCP is + * 1 but a DHCP server could not be contacted. See the online documentation for + * more information. */ +static const uint8_t ucIPAddress[ 4 ] = { configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 }; +static const uint8_t ucNetMask[ 4 ] = { configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3 }; +static const uint8_t ucGatewayAddress[ 4 ] = { configGATEWAY_ADDR0, configGATEWAY_ADDR1, configGATEWAY_ADDR2, configGATEWAY_ADDR3 }; +static const uint8_t ucDNSServerAddress[ 4 ] = { configDNS_SERVER_ADDR0, configDNS_SERVER_ADDR1, configDNS_SERVER_ADDR2, configDNS_SERVER_ADDR3 }; + +/* Set the following constant to pdTRUE to log using the method indicated by the + * name of the constant, or pdFALSE to not log using the method indicated by the + * name of the constant. Options include to standard out (xLogToStdout), to a disk + * file (xLogToFile), and to a UDP port (xLogToUDP). If xLogToUDP is set to pdTRUE + * then UDP messages are sent to the IP address configured as the UDP logging server + * address (see the configUDP_LOGGING_ADDR0 definitions in FreeRTOSConfig.h) and + * the port number set by configPRINT_PORT in FreeRTOSConfig.h. */ +const BaseType_t xLogToStdout = pdTRUE, xLogToFile = pdFALSE, xLogToUDP = pdFALSE; + +/* Default MAC address configuration. The demo creates a virtual network + * connection that uses this MAC address by accessing the raw Ethernet data + * to and from a real network connection on the host PC. See the + * configNETWORK_INTERFACE_TO_USE definition for information on how to configure + * the real network connection to use. */ +const uint8_t ucMACAddress[ 6 ] = { configMAC_ADDR0, configMAC_ADDR1, configMAC_ADDR2, configMAC_ADDR3, configMAC_ADDR4, configMAC_ADDR5 }; + +/* Used by the pseudo random number generator. */ +static UBaseType_t ulNextRand; +/*-----------------------------------------------------------*/ + +int main( void ) +{ + /*** + * See https://www.FreeRTOS.org/iot-device-shadow for configuration and usage instructions. + ***/ + + /* Miscellaneous initialization including preparing the logging and seeding + * the random number generator. */ + prvMiscInitialisation(); + + /* Initialize the network interface. + * + ***NOTE*** Tasks that use the network are created in the network event hook + * when the network is connected and ready for use (see the implementation of + * vApplicationIPNetworkEventHook() below). The address values passed in here + * are used if ipconfigUSE_DHCP is set to 0, or if ipconfigUSE_DHCP is set to 1 + * but a DHCP server cannot be contacted. */ + FreeRTOS_IPInit( ucIPAddress, ucNetMask, ucGatewayAddress, ucDNSServerAddress, ucMACAddress ); + + /* Start the RTOS scheduler. */ + vTaskStartScheduler(); + + /* If all is well, the scheduler will now be running, and the following + * line will never be reached. If the following line does execute, then + * there was insufficient FreeRTOS heap memory available for the idle and/or + * timer tasks to be created. See the memory management section on the + * FreeRTOS web site for more details (this is standard text that is not + * really applicable to the Win32 simulator port). */ + for( ; ; ) + { + __debugbreak(); + } +} +/*-----------------------------------------------------------*/ + +/* Called by FreeRTOS+TCP when the network connects or disconnects. Disconnect + * events are only received if implemented in the MAC driver. */ +void vApplicationIPNetworkEventHook( eIPCallbackEvent_t eNetworkEvent ) +{ + uint32_t ulIPAddress, ulNetMask, ulGatewayAddress, ulDNSServerAddress; + char cBuffer[ 16 ]; + static BaseType_t xTasksAlreadyCreated = pdFALSE; + + /* If the network has just come up...*/ + if( eNetworkEvent == eNetworkUp ) + { + /* Create the tasks that use the IP stack if they have not already been + * created. */ + if( xTasksAlreadyCreated == pdFALSE ) + { + /* Demos that use the network are created after the network is + * up. */ + LogInfo( ( "---------STARTING DEMO---------\r\n" ) ); + vStartDefenderDemo(); + xTasksAlreadyCreated = pdTRUE; + } + + /* Print out the network configuration, which may have come from a DHCP + * server. */ + FreeRTOS_GetAddressConfiguration( &ulIPAddress, &ulNetMask, &ulGatewayAddress, &ulDNSServerAddress ); + FreeRTOS_inet_ntoa( ulIPAddress, cBuffer ); + LogInfo( ( "\r\n\r\nIP Address: %s\r\n", cBuffer ) ); + + FreeRTOS_inet_ntoa( ulNetMask, cBuffer ); + LogInfo( ( "Subnet Mask: %s\r\n", cBuffer ) ); + + FreeRTOS_inet_ntoa( ulGatewayAddress, cBuffer ); + LogInfo( ( "Gateway Address: %s\r\n", cBuffer ) ); + + FreeRTOS_inet_ntoa( ulDNSServerAddress, cBuffer ); + LogInfo( ( "DNS Server Address: %s\r\n\r\n\r\n", cBuffer ) ); + } +} +/*-----------------------------------------------------------*/ + +void vAssertCalled( const char * pcFile, + uint32_t ulLine ) +{ + volatile uint32_t ulBlockVariable = 0UL; + volatile char * pcFileName = ( volatile char * ) pcFile; + volatile uint32_t ulLineNumber = ulLine; + + ( void ) pcFileName; + ( void ) ulLineNumber; + + printf( "vAssertCalled( %s, %u\n", pcFile, ulLine ); + + /* Setting ulBlockVariable to a non-zero value in the debugger will allow + * this function to be exited. */ + taskDISABLE_INTERRUPTS(); + { + while( ulBlockVariable == 0UL ) + { + __debugbreak(); + } + } + taskENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxRand( void ) +{ + const uint32_t ulMultiplier = 0x015a4e35UL, ulIncrement = 1UL; + + /* + * Utility function to generate a pseudo random number. + * + * !!!NOTE!!! + * This is not a secure method of generating a random number. Production + * devices should use a True Random Number Generator (TRNG). + */ + ulNextRand = ( ulMultiplier * ulNextRand ) + ulIncrement; + return( ( int ) ( ulNextRand >> 16UL ) & 0x7fffUL ); +} +/*-----------------------------------------------------------*/ + +static void prvSRand( UBaseType_t ulSeed ) +{ + /* Utility function to seed the pseudo random number generator. */ + ulNextRand = ulSeed; +} +/*-----------------------------------------------------------*/ + +static void prvMiscInitialisation( void ) +{ + time_t xTimeNow; + uint32_t ulLoggingIPAddress; + + ulLoggingIPAddress = FreeRTOS_inet_addr_quick( configUDP_LOGGING_ADDR0, configUDP_LOGGING_ADDR1, configUDP_LOGGING_ADDR2, configUDP_LOGGING_ADDR3 ); + vLoggingInit( xLogToStdout, xLogToFile, xLogToUDP, ulLoggingIPAddress, configPRINT_PORT ); + + /* + * Seed random number generator. + * + * !!!NOTE!!! + * This is not a secure method of generating a random number. Production + * devices should use a True Random Number Generator (TRNG). + */ + time( &xTimeNow ); + LogDebug( ( "Seed for randomizer: %lu\n", xTimeNow ) ); + prvSRand( ( uint32_t ) xTimeNow ); + LogDebug( ( "Random numbers: %08X %08X %08X %08X\n", ipconfigRAND32(), ipconfigRAND32(), ipconfigRAND32(), ipconfigRAND32() ) ); +} +/*-----------------------------------------------------------*/ + +#if ( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_NBNS != 0 ) || ( ipconfigDHCP_REGISTER_HOSTNAME == 1 ) + + const char * pcApplicationHostnameHook( void ) + { + /* Assign the name "FreeRTOS" to this network node. This function will + * be called during the DHCP: the machine will be registered with an IP + * address plus this name. */ + return mainHOST_NAME; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_NBNS != 0 ) + + BaseType_t xApplicationDNSQueryHook( const char * pcName ) + { + BaseType_t xReturn; + + /* Determine if a name lookup is for this node. Two names are given + * to this node: that returned by pcApplicationHostnameHook() and that set + * by mainDEVICE_NICK_NAME. */ + if( _stricmp( pcName, pcApplicationHostnameHook() ) == 0 ) + { + xReturn = pdPASS; + } + else if( _stricmp( pcName, mainDEVICE_NICK_NAME ) == 0 ) + { + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* if ( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_NBNS != 0 ) */ +/*-----------------------------------------------------------*/ + +/* + * Callback that provides the inputs necessary to generate a randomized TCP + * Initial Sequence Number per RFC 6528. THIS IS ONLY A DUMMY IMPLEMENTATION + * THAT RETURNS A PSEUDO RANDOM NUMBER SO IS NOT INTENDED FOR USE IN PRODUCTION + * SYSTEMS. + */ +extern uint32_t ulApplicationGetNextSequenceNumber( uint32_t ulSourceAddress, + uint16_t usSourcePort, + uint32_t ulDestinationAddress, + uint16_t usDestinationPort ) +{ + ( void ) ulSourceAddress; + ( void ) usSourcePort; + ( void ) ulDestinationAddress; + ( void ) usDestinationPort; + + return uxRand(); +} +/*-----------------------------------------------------------*/ + +/* + * Set *pulNumber to a random number, and return pdTRUE. When the random number + * generator is broken, it shall return pdFALSE. + * The macros ipconfigRAND32() and configRAND32() are not in use + * anymore in FreeRTOS+TCP. + * + * THIS IS ONLY A DUMMY IMPLEMENTATION THAT RETURNS A PSEUDO RANDOM NUMBER SO IS + * NOT INTENDED FOR USE IN PRODUCTION SYSTEMS. + */ +BaseType_t xApplicationGetRandomNumber( uint32_t * pulNumber ) +{ + *pulNumber = uxRand(); + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an + * implementation of vApplicationGetIdleTaskMemory() to provide the memory that is + * used by the Idle task. */ +void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, + StackType_t ** ppxIdleTaskStackBuffer, + uint32_t * pulIdleTaskStackSize ) +{ + /* If the buffers to be provided to the Idle task are declared inside this + * function then they must be declared static - otherwise they will be allocated on + * the stack and so not exists after this function exits. */ + static StaticTask_t xIdleTaskTCB; + static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ]; + + /* Pass out a pointer to the StaticTask_t structure in which the Idle task's + * state will be stored. */ + *ppxIdleTaskTCBBuffer = &xIdleTaskTCB; + + /* Pass out the array that will be used as the Idle task's stack. */ + *ppxIdleTaskStackBuffer = uxIdleTaskStack; + + /* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer. + * Note that, as the array is necessarily of type StackType_t, + * configMINIMAL_STACK_SIZE is specified in words, not bytes. */ + *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; +} +/*-----------------------------------------------------------*/ + +/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the + * application must provide an implementation of vApplicationGetTimerTaskMemory() + * to provide the memory that is used by the Timer service task. */ +void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, + StackType_t ** ppxTimerTaskStackBuffer, + uint32_t * pulTimerTaskStackSize ) +{ + /* If the buffers to be provided to the Timer task are declared inside this + * function then they must be declared static - otherwise they will be allocated on + * the stack and so not exists after this function exits. */ + static StaticTask_t xTimerTaskTCB; + static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ]; + + /* Pass out a pointer to the StaticTask_t structure in which the Timer + * task's state will be stored. */ + *ppxTimerTaskTCBBuffer = &xTimerTaskTCB; + + /* Pass out the array that will be used as the Timer task's stack. */ + *ppxTimerTaskStackBuffer = uxTimerTaskStack; + + /* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer. + * Note that, as the array is necessarily of type StackType_t, + * configMINIMAL_STACK_SIZE is specified in words, not bytes. */ + *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/mbedtls_config.h b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/mbedtls_config.h new file mode 100644 index 000000000..833260b53 --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/mbedtls_config.h @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + * + * This file is provided under the Apache License 2.0, or the + * GNU General Public License v2.0 or later. + * + * ********** + * Apache License 2.0: + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ********** + * + * ********** + * GNU General Public License v2.0 or later: + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * ********** + * + * This repository uses Mbed TLS under Apache 2.0 + */ + +/* This file configures mbed TLS for FreeRTOS. */ + +#ifndef MBEDTLS_CONFIG_H +#define MBEDTLS_CONFIG_H + +/* FreeRTOS include. */ +#include "FreeRTOS.h" + +/* Generate errors if deprecated functions are used. */ +#define MBEDTLS_DEPRECATED_REMOVED + +/* Place AES tables in ROM. */ +#define MBEDTLS_AES_ROM_TABLES + +/* Enable the following cipher modes. */ +#define MBEDTLS_CIPHER_MODE_CBC +#define MBEDTLS_CIPHER_MODE_CFB +#define MBEDTLS_CIPHER_MODE_CTR + +/* Enable the following cipher padding modes. */ +#define MBEDTLS_CIPHER_PADDING_PKCS7 +#define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS +#define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN +#define MBEDTLS_CIPHER_PADDING_ZEROS + +/* Cipher suite configuration. */ +#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES +#define MBEDTLS_ECP_DP_SECP256R1_ENABLED +#define MBEDTLS_ECP_NIST_OPTIM +#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED +#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED + +/* Enable all SSL alert messages. */ +#define MBEDTLS_SSL_ALL_ALERT_MESSAGES + +/* Enable the following SSL features. */ +#define MBEDTLS_SSL_ENCRYPT_THEN_MAC +#define MBEDTLS_SSL_EXTENDED_MASTER_SECRET +#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH +#define MBEDTLS_SSL_PROTO_TLS1_2 +#define MBEDTLS_SSL_ALPN +#define MBEDTLS_SSL_SERVER_NAME_INDICATION + +/* Check certificate key usage. */ +#define MBEDTLS_X509_CHECK_KEY_USAGE +#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE + +/* Disable platform entropy functions. */ +#define MBEDTLS_NO_PLATFORM_ENTROPY + +/* Enable the following mbed TLS features. */ +#define MBEDTLS_AES_C +#define MBEDTLS_ASN1_PARSE_C +#define MBEDTLS_ASN1_WRITE_C +#define MBEDTLS_BASE64_C +#define MBEDTLS_BIGNUM_C +#define MBEDTLS_CIPHER_C +#define MBEDTLS_CTR_DRBG_C +#define MBEDTLS_ECDH_C +#define MBEDTLS_ECDSA_C +#define MBEDTLS_ECP_C +#define MBEDTLS_ENTROPY_C +#define MBEDTLS_GCM_C +#define MBEDTLS_MD_C +#define MBEDTLS_OID_C +#define MBEDTLS_PEM_PARSE_C +#define MBEDTLS_PK_C +#define MBEDTLS_PK_PARSE_C +#define MBEDTLS_PKCS1_V15 +#define MBEDTLS_PLATFORM_C +#define MBEDTLS_RSA_C +#define MBEDTLS_SHA1_C +#define MBEDTLS_SHA256_C +#define MBEDTLS_SSL_CLI_C +#define MBEDTLS_SSL_TLS_C +#define MBEDTLS_THREADING_ALT +#define MBEDTLS_THREADING_C +#define MBEDTLS_X509_USE_C +#define MBEDTLS_X509_CRT_PARSE_C + +/* Set the memory allocation functions on FreeRTOS. */ +void * mbedtls_platform_calloc( size_t nmemb, + size_t size ); +void mbedtls_platform_free( void * ptr ); +#define MBEDTLS_PLATFORM_MEMORY +#define MBEDTLS_PLATFORM_CALLOC_MACRO mbedtls_platform_calloc +#define MBEDTLS_PLATFORM_FREE_MACRO mbedtls_platform_free + +/* The network send and receive functions on FreeRTOS. */ +int mbedtls_platform_send( void * ctx, + const unsigned char * buf, + size_t len ); +int mbedtls_platform_recv( void * ctx, + unsigned char * buf, + size_t len ); + +/* The entropy poll function. */ +int mbedtls_platform_entropy_poll( void * data, + unsigned char * output, + size_t len, + size_t * olen ); + +#include "mbedtls/check_config.h" + +#endif /* ifndef MBEDTLS_CONFIG_H */ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/metrics_collector.c b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/metrics_collector.c new file mode 100644 index 000000000..2d993dee1 --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/metrics_collector.c @@ -0,0 +1,247 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * @file metrics_collector.c + * + * @brief Functions used by the defender demo to collect metrics on the + * device's open ports and sockets. FreeRTOS+TCP tcp_netstat utility + * is used to collect this metrics. + */ + +/* Standard includes. */ +#include +#include +#include +#include +#include + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "FreeRTOS_IP.h" + +/* FreeRTOS+TCP tcp_netstat utility include. */ +#include "tcp_netstat.h" + +/* Demo config. */ +#include "demo_config.h" + +/* Interface include. */ +#include "metrics_collector.h" +/*-----------------------------------------------------------*/ + +eMetricsCollectorStatus eGetNetworkStats( NetworkStats_t * pxOutNetworkStats ) +{ + eMetricsCollectorStatus eStatus = eMetricsCollectorSuccess; + + MetricsType_t xMetrics = { 0 }; + BaseType_t xMetricsStatus = 0; + + 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 ) + { + eStatus = eMetricsCollectorCollectionFailed; + } + } + + /* Fill our response with values gotten from FreeRTOS+TCP. */ + if( eStatus == eMetricsCollectorSuccess ) + { + pxOutNetworkStats->ulBytesReceived = xMetrics.xInput.uxByteCount; + pxOutNetworkStats->ulPacketsReceived = xMetrics.xInput.uxPacketCount; + pxOutNetworkStats->ulBytesSent = xMetrics.XOutput.uxByteCount; + pxOutNetworkStats->ulPacketsSent = xMetrics.XOutput.uxPacketCount; + } + + return eStatus; +} +/*-----------------------------------------------------------*/ + +eMetricsCollectorStatus eGetOpenTcpPorts( uint16_t * pusOutTcpPortsArray, + uint32_t ulTcpPortsArrayLength, + uint32_t * pulOutNumTcpOpenPorts ) +{ + eMetricsCollectorStatus eStatus = eMetricsCollectorSuccess; + + MetricsType_t xMetrics = { 0 }; + BaseType_t xMetricsStatus = 0; + + /* pusOutTcpPortsArray can be NULL. */ + configASSERT( pulOutNumTcpOpenPorts != NULL ); + + if( eStatus == eMetricsCollectorSuccess ) + { + /* Get metrics from FreeRTOS+TCP tcp_netstat utility. */ + xMetricsStatus = vGetMetrics( &xMetrics ); + + if( xMetricsStatus != 0 ) + { + eStatus = eMetricsCollectorCollectionFailed; + } + } + + if( eStatus == eMetricsCollectorSuccess ) + { + /* Set the out value for number of open TCP ports. */ + *pulOutNumTcpOpenPorts = xMetrics.xTCPPortList.uxCount; + + /* Fill the output array with as many TCP ports as will fit in the + * 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 ) + { + ulTcpPortsArrayLength = xMetrics.xTCPPortList.uxCount; + } + + memcpy( pusOutTcpPortsArray, &xMetrics.xTCPPortList.usTCPPortList, ulTcpPortsArrayLength * sizeof( uint16_t ) ); + } + } + + return eMetricsCollectorSuccess; +} +/*-----------------------------------------------------------*/ + +eMetricsCollectorStatus eGetOpenUdpPorts( uint16_t * pusOutUdpPortsArray, + uint32_t ulUdpPortsArrayLength, + uint32_t * pulOutNumUdpOpenPorts ) +{ + eMetricsCollectorStatus eStatus = eMetricsCollectorSuccess; + + MetricsType_t xMetrics = { 0 }; + BaseType_t xMetricsStatus = 0; + + /* pusOutUdpPortsArray can be NULL. */ + configASSERT( pulOutNumUdpOpenPorts != NULL ); + + if( eStatus == eMetricsCollectorSuccess ) + { + /* Get metrics from FreeRTOS+TCP tcp_netstat utility. */ + xMetricsStatus = vGetMetrics( &xMetrics ); + + if( xMetricsStatus != 0 ) + { + eStatus = eMetricsCollectorCollectionFailed; + } + } + + if( eStatus == eMetricsCollectorSuccess ) + { + *pulOutNumUdpOpenPorts = xMetrics.xUDPPortList.uxCount; + + /* Fill the output array with as many UDP ports as will fit in the + * 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 ) + { + ulUdpPortsArrayLength = xMetrics.xUDPPortList.uxCount; + } + + memcpy( pusOutUdpPortsArray, &xMetrics.xUDPPortList.usUDPPortList, ulUdpPortsArrayLength * sizeof( uint16_t ) ); + } + } + + return eMetricsCollectorSuccess; +} + +/*-----------------------------------------------------------*/ + +eMetricsCollectorStatus eGetEstablishedConnections( Connection_t * pxOutConnectionsArray, + uint32_t ulConnectionsArrayLength, + uint32_t * pulOutNumEstablishedConnections ) +{ + eMetricsCollectorStatus eStatus = eMetricsCollectorSuccess; + + MetricsType_t xMetrics = { 0 }; + BaseType_t xMetricsStatus = 0; + uint32_t ulLocalIp = 0UL; + + /* pxOutConnectionsArray can be NULL. */ + configASSERT( pulOutNumEstablishedConnections != NULL ); + + if( eStatus == eMetricsCollectorSuccess ) + { + /* Get metrics from FreeRTOS+TCP tcp_netstat utility. */ + xMetricsStatus = vGetMetrics( &xMetrics ); + + if( xMetricsStatus != 0 ) + { + eStatus = eMetricsCollectorCollectionFailed; + } + } + + if( eStatus == eMetricsCollectorSuccess ) + { + /* We consider only TCP sockets for open connections. */ + *pulOutNumEstablishedConnections = xMetrics.xTCPSocketList.uxCount; + + /* Fill the output array with as many TCP socket infos as will fit in + * the given array. */ + if( pxOutConnectionsArray != NULL ) + { + /* 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 ) + { + ulConnectionsArrayLength = xMetrics.xTCPSocketList.uxCount; + } + + /* If xMetrics.xTCPSocketList.uxCount > ulConnectionsArrayLength, we + * return the first ulConnectionsArrayLength ports. */ + while( ulConnectionsArrayLength > 0 ) + { + 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; + } + } + } + + return eStatus; +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/metrics_collector.h b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/metrics_collector.h new file mode 100644 index 000000000..f6922a1dd --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/metrics_collector.h @@ -0,0 +1,144 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * @file metrics_collector.h + * + * @brief Functions used by the defender demo to collect metrics on the + * device's open ports and sockets. + */ + +#ifndef METRICS_COLLECTOR_H_ +#define METRICS_COLLECTOR_H_ + +/** + * @brief Return codes from metrics collector APIs. + */ +typedef enum +{ + eMetricsCollectorSuccess = 0, + eMetricsCollectorBadParameter, + eMetricsCollectorCollectionFailed +} eMetricsCollectorStatus; + +/** + * @brief Represents network stats. + */ +typedef struct NetworkStats +{ + uint32_t ulBytesReceived; /**< Number of bytes received. */ + uint32_t ulBytesSent; /**< Number of bytes sent. */ + uint32_t ulPacketsReceived; /**< Number of packets (ethernet frames) received. */ + uint32_t ulPacketsSent; /**< Number of packets (ethernet frames) sent. */ +} NetworkStats_t; + +/** + * @brief Represents a network connection. + */ +typedef struct Connection +{ + uint32_t ulLocalIp; + uint32_t ulRemoteIp; + uint16_t usLocalPort; + uint16_t usRemotePort; +} Connection_t; + +/** + * @brief Get network stats. + * + * This function returns the network stats. + * + * @param[out] pxOutNetworkStats The network stats. + * + * @return #MetricsCollectorSuccess if the network stats are successfully obtained; + * #MetricsCollectorBadParameter if invalid parameters are passed; + * #MetricsCollectorCollectionFailed if the collection methods failed. + */ +eMetricsCollectorStatus eGetNetworkStats( NetworkStats_t * pxOutNetworkStats ); + +/** + * @brief Get a list of the open TCP ports. + * + * This function finds the open TCP ports. It can be called with + * @p pusOutTcpPortsArray NULL to get the number of the open TCP ports. + * + * @param[out] pusOutTcpPortsArray The array to write the open TCP ports into. This + * can be NULL, if only the number of open ports is needed. + * @param[in] ulTcpPortsArrayLength Length of the pusOutTcpPortsArray, if it is not + * NULL. + * @param[out] pulOutNumTcpOpenPorts Number of the open TCP ports. + * + * @return #MetricsCollectorSuccess if open TCP ports are successfully obtained; + * #MetricsCollectorBadParameter if invalid parameters are passed; + * #MetricsCollectorCollectionFailed if the collection methods failed. + */ +eMetricsCollectorStatus eGetOpenTcpPorts( uint16_t * pusOutTcpPortsArray, + uint32_t ulTcpPortsArrayLength, + uint32_t * pulOutNumTcpOpenPorts ); + +/** + * @brief Get a list of the open UDP ports. + * + * This function finds the open UDP ports. It can be called with + * @p pusOutUdpPortsArray NULL to get the number of the open UDP ports. + * + * @param[out] pusOutUdpPortsArray The array to write the open UDP ports into. Can + * be NULL, if only number of open ports is needed. + * @param[in] ulUdpPortsArrayLength Length of the pusOutUdpPortsArray, if it is not + * NULL. + * @param[out] pulOutNumUdpOpenPorts Number of the open UDP ports. + * + * @return #MetricsCollectorSuccess if open UDP ports are successfully obtained; + * #MetricsCollectorBadParameter if invalid parameters are passed; + * #MetricsCollectorCollectionFailed if the collection methods failed. + */ +eMetricsCollectorStatus eGetOpenUdpPorts( uint16_t * pusOutUdpPortsArray, + uint32_t ulUdpPortsArrayLength, + uint32_t * pulOutNumUdpOpenPorts ); + +/** + * @brief Get a list of established connections. + * + * This function finds the established TCP connections. + * It can be called with @p pxOutConnectionsArray NULL to get the number of + * established connections. + * + * @param[out] pxOutConnectionsArray The array to write the established connections + * into. This can be NULL, if only the number of established connections is + * needed. + * @param[in] ulConnectionsArrayLength Length of the pxOutConnectionsArray, if it + * is not NULL. + * @param[out] pulOutNumEstablishedConnections Number of the established connections. + * + * @return #MetricsCollectorSuccess if established connections are successfully obtained; + * #MetricsCollectorBadParameter if invalid parameters are passed; + * #MetricsCollectorCollectionFailed if the collection methods failed. + */ +eMetricsCollectorStatus eGetEstablishedConnections( Connection_t * pxOutConnectionsArray, + uint32_t ulConnectionsArrayLength, + uint32_t * pulOutNumEstablishedConnections ); + +#endif /* ifndef METRICS_COLLECTOR_H_ */ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/report_builder.c b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/report_builder.c new file mode 100644 index 000000000..b4a05b07c --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/report_builder.c @@ -0,0 +1,506 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include +#include + +/* Demo config. */ +#include "demo_config.h" + +/* Interface include. */ +#include "report_builder.h" + +/* Various JSON characters. */ +#define reportbuilderJSON_ARRAY_OPEN_MARKER '[' +#define reportbuilderJSON_ARRAY_CLOSE_MARKER ']' +#define reportbuilderJSON_ARRAY_OBJECT_SEPARATOR ',' + +/* Helper macro to check if snprintf was successful. */ +#define reportbuilderSNPRINTF_SUCCESS( retVal, bufLen ) ( ( retVal > 0 ) && ( ( uint32_t ) retVal < bufLen ) ) + +/* Formats used to generate the JSON report. */ +#define reportbuilderJSON_PORT_OBJECT_FORMAT \ + "{" \ + "\"port\": %u" \ + "}," + +#define reportbuilderJSON_CONNECTION_OBJECT_FORMAT \ + "{" \ + "\"local_port\": %u," \ + "\"remote_addr\": \"%u.%u.%u.%u:%u\"" \ + "}," + +#define reportbuilderJSON_REPORT_FORMAT_PART1 \ + "{" \ + "\"header\": {" \ + "\"report_id\": %u," \ + "\"version\": \"%u.%u\"" \ + "}," \ + "\"metrics\": {" \ + "\"listening_tcp_ports\": {" \ + "\"ports\": " + +#define reportbuilderJSON_REPORT_FORMAT_PART2 \ + "," \ + "\"total\": %u" \ + "}," \ + "\"listening_udp_ports\": {" \ + "\"ports\": " + +#define reportbuilderJSON_REPORT_FORMAT_PART3 \ + "," \ + "\"total\": %u" \ + "}," \ + "\"network_stats\": {" \ + "\"bytes_in\": %u," \ + "\"bytes_out\": %u," \ + "\"packets_in\": %u," \ + "\"packets_out\": %u" \ + "}," \ + "\"tcp_connections\": {" \ + "\"established_connections\": {" \ + "\"connections\": " + +#define reportbuilderJSON_REPORT_FORMAT_PART4 \ + "," \ + "\"total\": %u" \ + "}" \ + "}" \ + "}" \ + "}" +/*-----------------------------------------------------------*/ + +/** + * @brief Write ports array to the given buffer in the format expected by the + * AWS IoT Device Defender Service. + * + * This function writes an array of the following format: + * [ + * { + * "port":44207 + * }, + * { + * "port":53 + * } + * ] + * + * @param[in] pcBuffer The buffer to write the ports array. + * @param[in] ulBufferLength The length of the buffer. + * @param[in] pusOpenPortsArray The array containing the open ports. + * @param[in] ulOpenPortsArrayLength Length of the pusOpenPortsArray array. + * @param[out] pulOutCharsWritten Number of characters written to the buffer. + * + * @return #ReportBuilderSuccess if the array is successfully written; + * #ReportBuilderBufferTooSmall if the buffer cannot hold the full array. + */ +static eReportBuilderStatus prvWritePortsArray( char * pcBuffer, + uint32_t ulBufferLength, + const uint16_t * pusOpenPortsArray, + uint32_t ulOpenPortsArrayLength, + uint32_t * pulOutCharsWritten ); + +/** + * @brief Write established connections array to the given buffer in the format + * expected by the AWS IoT Device Defender Service. + * + * This function write array of the following format: + * [ + * { + * "local_port":44207, + * "remote_addr":"127.0.0.1:45148" + * }, + * { + * "local_port":22, + * "remote_addr":"24.16.237.194:63552" + * } + * ] + * + * @param[in] pcBuffer The buffer to write the connections array. + * @param[in] ulBufferLength The length of the buffer. + * @param[in] pxConnectionsArray The array containing the established connections. + * @param[in] ulConnectionsArrayLength Length of the pxConnectionsArray array. + * @param[out] pulOutCharsWritten Number of characters written to the buffer. + * + * @return #ReportBuilderSuccess if the array is successfully written; + * #ReportBuilderBufferTooSmall if the buffer cannot hold the full array. + */ +static eReportBuilderStatus prvWriteConnectionsArray( char * pcBuffer, + uint32_t ulBufferLength, + const Connection_t * pxConnectionsArray, + uint32_t ulConnectionsArrayLength, + uint32_t * pulOutCharsWritten ); +/*-----------------------------------------------------------*/ + +static eReportBuilderStatus prvWritePortsArray( char * pcBuffer, + uint32_t ulBufferLength, + const uint16_t * pusOpenPortsArray, + uint32_t ulOpenPortsArrayLength, + uint32_t * pulOutCharsWritten ) +{ + char * pCurrentWritePos = pcBuffer; + uint32_t i, ulRemainingBufferLength = ulBufferLength; + uint32_t ulCharactersWritten; + eReportBuilderStatus eStatus = eReportBuilderSuccess; + + configASSERT( pcBuffer != NULL ); + configASSERT( pusOpenPortsArray != NULL ); + configASSERT( pulOutCharsWritten != NULL ); + + /* Write the JSON array open marker. */ + if( ulRemainingBufferLength > 1 ) + { + *pCurrentWritePos = reportbuilderJSON_ARRAY_OPEN_MARKER; + ulRemainingBufferLength -= 1; + pCurrentWritePos += 1; + } + else + { + eStatus = eReportBuilderBufferTooSmall; + } + + /* Write the array elements. */ + for( i = 0; ( ( i < ulOpenPortsArrayLength ) && ( eStatus == eReportBuilderSuccess ) ); i++ ) + { + ulCharactersWritten = snprintf( pCurrentWritePos, + ulRemainingBufferLength, + reportbuilderJSON_PORT_OBJECT_FORMAT, + pusOpenPortsArray[ i ] ); + + if( !reportbuilderSNPRINTF_SUCCESS( ulCharactersWritten, ulRemainingBufferLength ) ) + { + eStatus = eReportBuilderBufferTooSmall; + break; + } + else + { + ulRemainingBufferLength -= ( uint32_t ) ulCharactersWritten; + pCurrentWritePos += ulCharactersWritten; + } + } + + if( eStatus == eReportBuilderSuccess ) + { + /* Discard the last comma. */ + if( ulOpenPortsArrayLength > 0 ) + { + pCurrentWritePos -= 1; + ulRemainingBufferLength += 1; + } + + /* Write the JSON array close marker. */ + if( ulRemainingBufferLength > 1 ) + { + *pCurrentWritePos = reportbuilderJSON_ARRAY_CLOSE_MARKER; + ulRemainingBufferLength -= 1; + pCurrentWritePos += 1; + } + else + { + eStatus = eReportBuilderBufferTooSmall; + } + } + + if( eStatus == eReportBuilderSuccess ) + { + *pulOutCharsWritten = ulBufferLength - ulRemainingBufferLength; + } + + return eStatus; +} +/*-----------------------------------------------------------*/ + +static eReportBuilderStatus prvWriteConnectionsArray( char * pcBuffer, + uint32_t ulBufferLength, + const Connection_t * pxConnectionsArray, + uint32_t ulConnectionsArrayLength, + uint32_t * pulOutCharsWritten ) +{ + char * pCurrentWritePos = pcBuffer; + uint32_t i, ulRemainingBufferLength = ulBufferLength; + uint32_t ulCharactersWritten; + eReportBuilderStatus eStatus = eReportBuilderSuccess; + const Connection_t * pxConn; + + configASSERT( pcBuffer != NULL ); + configASSERT( pxConnectionsArray != NULL ); + configASSERT( pulOutCharsWritten != NULL ); + + /* Write the JSON array open marker. */ + if( ulRemainingBufferLength > 1 ) + { + *pCurrentWritePos = reportbuilderJSON_ARRAY_OPEN_MARKER; + ulRemainingBufferLength -= 1; + pCurrentWritePos += 1; + } + else + { + eStatus = eReportBuilderBufferTooSmall; + } + + /* Write the array elements. */ + for( i = 0; ( ( i < ulConnectionsArrayLength ) && ( eStatus == eReportBuilderSuccess ) ); i++ ) + { + pxConn = &( pxConnectionsArray[ i ] ); + ulCharactersWritten = snprintf( pCurrentWritePos, + ulRemainingBufferLength, + reportbuilderJSON_CONNECTION_OBJECT_FORMAT, + pxConn->usLocalPort, + ( pxConn->ulRemoteIp >> 24 ) & 0xFF, + ( pxConn->ulRemoteIp >> 16 ) & 0xFF, + ( pxConn->ulRemoteIp >> 8 ) & 0xFF, + ( pxConn->ulRemoteIp ) & 0xFF, + pxConn->usRemotePort ); + + if( !reportbuilderSNPRINTF_SUCCESS( ulCharactersWritten, ulRemainingBufferLength ) ) + { + eStatus = eReportBuilderBufferTooSmall; + break; + } + else + { + ulRemainingBufferLength -= ulCharactersWritten; + pCurrentWritePos += ulCharactersWritten; + } + } + + if( eStatus == eReportBuilderSuccess ) + { + /* Discard the last comma. */ + if( ulConnectionsArrayLength > 0 ) + { + pCurrentWritePos -= 1; + ulRemainingBufferLength += 1; + } + + /* Write the JSON array close marker. */ + if( ulRemainingBufferLength > 1 ) + { + *pCurrentWritePos = reportbuilderJSON_ARRAY_CLOSE_MARKER; + ulRemainingBufferLength -= 1; + pCurrentWritePos += 1; + } + else + { + eStatus = eReportBuilderBufferTooSmall; + } + } + + if( eStatus == eReportBuilderSuccess ) + { + *pulOutCharsWritten = ulBufferLength - ulRemainingBufferLength; + } + + return eStatus; +} +/*-----------------------------------------------------------*/ + +eReportBuilderStatus eGenerateJsonReport( char * pcBuffer, + uint32_t ulBufferLength, + const ReportMetrics_t * pxMetrics, + uint32_t ulMajorReportVersion, + uint32_t ulMinorReportVersion, + uint32_t ulReportId, + uint32_t * pulOutReportLength ) +{ + char * pCurrentWritePos = pcBuffer; + uint32_t ulRemainingBufferLength = ulBufferLength, bufferWritten; + eReportBuilderStatus eStatus = eReportBuilderSuccess; + uint32_t ulCharactersWritten; + + configASSERT( pcBuffer != NULL ); + configASSERT( pxMetrics != NULL ); + configASSERT( pulOutReportLength != NULL ); + + 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 ) + { + ulCharactersWritten = snprintf( pCurrentWritePos, + ulRemainingBufferLength, + reportbuilderJSON_REPORT_FORMAT_PART1, + ulReportId, + ulMajorReportVersion, + ulMinorReportVersion ); + + if( !reportbuilderSNPRINTF_SUCCESS( ulCharactersWritten, ulRemainingBufferLength ) ) + { + LogError( ( "Failed to write part 1." ) ); + eStatus = eReportBuilderBufferTooSmall; + } + else + { + ulRemainingBufferLength -= ulCharactersWritten; + pCurrentWritePos += ulCharactersWritten; + } + } + + /* Write TCP ports array. */ + if( eStatus == eReportBuilderSuccess ) + { + eStatus = prvWritePortsArray( pCurrentWritePos, + ulRemainingBufferLength, + pxMetrics->pusOpenTcpPortsArray, + pxMetrics->ulOpenTcpPortsArrayLength, + &( bufferWritten ) ); + + if( eStatus == eReportBuilderSuccess ) + { + pCurrentWritePos += bufferWritten; + ulRemainingBufferLength -= bufferWritten; + } + else + { + LogError( ( "Failed to write TCP ports array." ) ); + } + } + + /* Write part2. */ + if( eStatus == eReportBuilderSuccess ) + { + ulCharactersWritten = snprintf( pCurrentWritePos, + ulRemainingBufferLength, + reportbuilderJSON_REPORT_FORMAT_PART2, + pxMetrics->ulOpenTcpPortsArrayLength ); + + if( !reportbuilderSNPRINTF_SUCCESS( ulCharactersWritten, ulRemainingBufferLength ) ) + { + LogError( ( "Failed to write part 2." ) ); + eStatus = eReportBuilderBufferTooSmall; + } + else + { + ulRemainingBufferLength -= ulCharactersWritten; + pCurrentWritePos += ulCharactersWritten; + } + } + + /* Write UDP ports array. */ + if( eStatus == eReportBuilderSuccess ) + { + eStatus = prvWritePortsArray( pCurrentWritePos, + ulRemainingBufferLength, + pxMetrics->pusOpenUdpPortsArray, + pxMetrics->ulOpenUdpPortsArrayLength, + &( bufferWritten ) ); + + if( eStatus == eReportBuilderSuccess ) + { + pCurrentWritePos += bufferWritten; + ulRemainingBufferLength -= bufferWritten; + } + else + { + LogError( ( "Failed to write UDP ports array." ) ); + } + } + + /* Write part3. */ + if( eStatus == eReportBuilderSuccess ) + { + ulCharactersWritten = snprintf( pCurrentWritePos, + ulRemainingBufferLength, + reportbuilderJSON_REPORT_FORMAT_PART3, + pxMetrics->ulOpenUdpPortsArrayLength, + pxMetrics->pxNetworkStats->ulBytesReceived, + pxMetrics->pxNetworkStats->ulBytesSent, + pxMetrics->pxNetworkStats->ulPacketsReceived, + pxMetrics->pxNetworkStats->ulPacketsSent ); + + if( !reportbuilderSNPRINTF_SUCCESS( ulCharactersWritten, ulRemainingBufferLength ) ) + { + LogError( ( "Failed to write part 3." ) ); + eStatus = eReportBuilderBufferTooSmall; + } + else + { + ulRemainingBufferLength -= ulCharactersWritten; + pCurrentWritePos += ulCharactersWritten; + } + } + + /* Write connections array. */ + if( eStatus == eReportBuilderSuccess ) + { + eStatus = prvWriteConnectionsArray( pCurrentWritePos, + ulRemainingBufferLength, + pxMetrics->pxEstablishedConnectionsArray, + pxMetrics->ulEstablishedConnectionsArrayLength, + &( bufferWritten ) ); + + if( eStatus == eReportBuilderSuccess ) + { + pCurrentWritePos += bufferWritten; + ulRemainingBufferLength -= bufferWritten; + } + else + { + LogError( ( "Failed to write established connections array." ) ); + } + } + + /* Write part4. */ + if( eStatus == eReportBuilderSuccess ) + { + ulCharactersWritten = snprintf( pCurrentWritePos, + ulRemainingBufferLength, + reportbuilderJSON_REPORT_FORMAT_PART4, + pxMetrics->ulEstablishedConnectionsArrayLength ); + + if( !reportbuilderSNPRINTF_SUCCESS( ulCharactersWritten, ulRemainingBufferLength ) ) + { + LogError( ( "Failed to write part 4." ) ); + eStatus = eReportBuilderBufferTooSmall; + } + else + { + ulRemainingBufferLength -= ulCharactersWritten; + pCurrentWritePos += ulCharactersWritten; + } + } + + if( eStatus == eReportBuilderSuccess ) + { + *pulOutReportLength = ulBufferLength - ulRemainingBufferLength; + } + + return eStatus; +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/report_builder.h b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/report_builder.h new file mode 100644 index 000000000..615b2491e --- /dev/null +++ b/FreeRTOS-Plus/Demo/AWS/Device_Defender_Windows_Simulator/Device_Defender_Demo/report_builder.h @@ -0,0 +1,81 @@ +/* + * FreeRTOS V202011.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef REPORT_BUILDER_H_ +#define REPORT_BUILDER_H_ + +/* Metrics collector. */ +#include "metrics_collector.h" + +/** + * @brief Return codes from report builder APIs. + */ +typedef enum +{ + eReportBuilderSuccess = 0, + eReportBuilderBadParameter, + eReportBuilderBufferTooSmall +} eReportBuilderStatus; + +/** + * @brief Represents metrics to be included in the report. + */ +typedef struct ReportMetrics +{ + NetworkStats_t * pxNetworkStats; + uint16_t * pusOpenTcpPortsArray; + uint32_t ulOpenTcpPortsArrayLength; + uint16_t * pusOpenUdpPortsArray; + uint32_t ulOpenUdpPortsArrayLength; + Connection_t * pxEstablishedConnectionsArray; + uint32_t ulEstablishedConnectionsArrayLength; +} ReportMetrics_t; + +/** + * @brief Generate a report in the format expected by the AWS IoT Device Defender + * Service. + * + * @param[in] pcBuffer The buffer to write the report into. + * @param[in] ulBufferLength The length of the buffer. + * @param[in] pxMetrics Metrics to write in the generated report. + * @param[in] ulMajorReportVersion Major version of the report. + * @param[in] ulMinorReportVersion Minor version of the report. + * @param[in] ulReportId Value to be used as the ulReportId in the generated report. + * @param[out] pulOutReprotLength The length of the generated report. + * + * @return #ReportBuilderSuccess if the report is successfully generated; + * #ReportBuilderBadParameter if invalid parameters are passed; + * #ReportBuilderBufferTooSmall if the buffer cannot hold the full report. + */ +eReportBuilderStatus eGenerateJsonReport( char * pcBuffer, + uint32_t ulBufferLength, + const ReportMetrics_t * pxMetrics, + uint32_t ulMajorReportVersion, + uint32_t ulMinorReportVersion, + uint32_t ulReportId, + uint32_t * pulOutReportLength ); + +#endif /* ifndef REPORT_BUILDER_H_ */ diff --git a/FreeRTOS-Plus/Demo/AWS/Mqtt_Demo_Helpers/mqtt_demo_helpers.c b/FreeRTOS-Plus/Demo/AWS/Mqtt_Demo_Helpers/mqtt_demo_helpers.c index 29293f75f..c14fb0491 100755 --- a/FreeRTOS-Plus/Demo/AWS/Mqtt_Demo_Helpers/mqtt_demo_helpers.c +++ b/FreeRTOS-Plus/Demo/AWS/Mqtt_Demo_Helpers/mqtt_demo_helpers.c @@ -18,12 +18,16 @@ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * */ /** - * @file shadow_demo_helpers.c + * @file mqtt_demo_helpers.c * - * @brief This file provides helper functions used by the Shadow demo application to + * @brief This file provides helper functions used by the AWS demo applications to * do MQTT operations over a mutually authenticated TLS connection. * * A mutually authenticated TLS connection is used to connect to the AWS IoT @@ -190,7 +194,7 @@ typedef struct PublishPackets static uint32_t ulGlobalEntryTimeMs; /** - * @brief The flag to indicate the mqtt session changed. + * @brief The flag to indicate the MQTT session changed. */ static BaseType_t xMqttSessionEstablished = pdFALSE; @@ -366,7 +370,7 @@ static BaseType_t prvGetNextFreeIndexForOutgoingPublishes( uint8_t * pucIndex ) for( ucIndex = 0; ucIndex < MAX_OUTGOING_PUBLISHES; ucIndex++ ) { /* A free ucIndex is marked by invalid packet id. - * Check if the the ucIndex has a free slot. */ + * Check if the ucIndex has a free slot. */ if( outgoingPublishPackets[ ucIndex ].packetId == MQTT_PACKET_ID_INVALID ) { xReturnStatus = pdPASS; @@ -881,6 +885,30 @@ BaseType_t xPublishToTopic( MQTTContext_t * pxMqttContext, return xReturnStatus; } + +/*-----------------------------------------------------------*/ + +BaseType_t xProcessLoop( MQTTContext_t * pxMqttContext ) +{ + BaseType_t xReturnStatus = pdFAIL; + MQTTStatus_t xMQTTStatus = MQTTSuccess; + + xMQTTStatus = MQTT_ProcessLoop( pxMqttContext, mqttexamplePROCESS_LOOP_TIMEOUT_MS ); + + if( xMQTTStatus != MQTTSuccess ) + { + LogWarn( ( "MQTT_ProcessLoop returned with status = %u.", + xMQTTStatus ) ); + } + else + { + LogDebug( ( "MQTT_ProcessLoop successful." ) ); + xReturnStatus = pdPASS; + } + + return xReturnStatus; +} + /*-----------------------------------------------------------*/ static uint32_t prvGetTimeMs( void ) diff --git a/FreeRTOS-Plus/Demo/AWS/Mqtt_Demo_Helpers/mqtt_demo_helpers.h b/FreeRTOS-Plus/Demo/AWS/Mqtt_Demo_Helpers/mqtt_demo_helpers.h index b6f803263..b2374927e 100644 --- a/FreeRTOS-Plus/Demo/AWS/Mqtt_Demo_Helpers/mqtt_demo_helpers.h +++ b/FreeRTOS-Plus/Demo/AWS/Mqtt_Demo_Helpers/mqtt_demo_helpers.h @@ -18,6 +18,10 @@ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * */ #ifndef MQTT_DEMO_HELPERS_H @@ -38,7 +42,7 @@ * MQTT connection. * @param[in] pxNetworkBuffer The buffer space for initializing the @p pxMqttContext MQTT * context used in the MQTT connection. - * @param[in] appCallback The callback function used to receive incoming + * @param[in] eventCallback The callback function used to receive incoming * publishes and incoming acks from MQTT library. * * @return The status of the final connection attempt. @@ -73,7 +77,7 @@ BaseType_t xDisconnectMqttSession( MQTTContext_t * pxMqttContext, /** * @brief Subscribe to a MQTT topic filter. * - * @param[in] pxMqttContext The MQTT context for the MQTT connection to close. + * @param[in] pxMqttContext The MQTT context for the MQTT connection. * @param[in] pcTopicFilter Pointer to the shadow topic buffer. * @param[in] usTopicFilterLength Indicates the length of the shadow * topic buffer. @@ -118,4 +122,14 @@ BaseType_t xPublishToTopic( MQTTContext_t * pxMqttContext, const char * pcPayload, size_t payloadLength ); +/** + * @brief Invoke the core MQTT library's process loop function. + * + * @param[in] pxMqttContext The MQTT context for the MQTT connection. + * + * @return pdPASS if process loop was successful; + * pdFAIL otherwise. + */ +BaseType_t xProcessLoop( MQTTContext_t * pxMqttContext ); + #endif /* ifndef MQTT_DEMO_HELPERS_H */